Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.08.2011, 20:57

Gegner laufen nicht :)

Hiho!
Ich wollte es nochmal probieren und nun, ich bin mir nicht sicher warum sich mein Gegner nicht bewegt.
Bislang ist er eher monoton, er bewegt sich nur an einer festen Position nach unten, deshalb weiß ich nicht ob es mehrere sind oder nur einer, weil er ja als an der selben Position ist.
Dies würde sich ändern wenn er sich ja bewegen würde. :lol:
Ich habe eine List vom Typ sf::Sprite erstellt, ich weiß einfach nicht was ich sonst in der Hinsicht als Listentyp nehmen soll, so ohne Klassen.
Hier mal mein Code, wäre dankbar für jede Hilfe! :thumbsup:
Alles Nötige in main.hpp inkludiert. ^^

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "main.hpp"

int main()
{
    ///Variablen, Klasseninstanzen, Iteratoren usw.
    //Window
    sf::RenderWindow App(sf::VideoMode(600, 800, 32), "Autospiel", sf::Style::Titlebar);

    //Musik
    sf::Music m;

    //Timer
    sf::Clock ClockPlayer;
    sf::Clock ClockEnemy;
    float     fPlayerTimer=0.f;
    float     fEnemyTimer=0.f;

    //Listen und Iteratoren
    list<sf::Sprite> EnemyList;
    list<sf::Sprite>::iterator EnemyIt;

    //Images
    sf::Image ImgPlayer;
    sf::Image ImgEnemy;
    sf::Image ImgBackground;

    //Sprites
    sf::Sprite      SprEnemy;
    sf::Sprite     SprPlayer;
    sf::Sprite SprBackground;

    //Vektoren for Player and Enemy
    sf::Vector2f fVektorPl(0.f, 750.f);
    sf::Vector2f fVektorEn(0.f, 0.f);

    //Event
    sf::Event Eventii;

    //Files laden
    if(!ImgPlayer.LoadFromFile("Autos.png"))
        return 3;
    if(!ImgEnemy.LoadFromFile("Gegner.png"))
        return 3;
    if(!ImgBackground.LoadFromFile("Background.png"))
        return 3;
    if(!m.OpenFromFile("Musik.ogg"))
        return 3;

    //Bind Images to Sprite
    SprPlayer.SetImage    (ImgPlayer    );
    SprBackground.SetImage(ImgBackground);

    //Play Music
    //m.Play();
    //m.SetLoop(true);

    while(App.IsOpened())
    {
        ///Calculating of Time
        //Player
        fPlayerTimer     = ClockPlayer.GetElapsedTime();
        //Enemy
        fEnemyTimer      = ClockEnemy.GetElapsedTime();

        ///Enemy-System
        //Moving
        if(fEnemyTimer>=1.f)
        {
            fVektorEn.y+=187.5f;
            ClockEnemy.Reset();
        }
        //Spawning
        if(fEnemyTimer>=1.f)
        {
            if(EnemyList.size()<5)
            {
                SprEnemy.SetImage  (ImgEnemy);
                EnemyList.push_back(SprEnemy);
            }
            for(EnemyIt=EnemyList.begin(); EnemyIt!=EnemyList.end(); ++EnemyIt)
            {
                EnemyIt->SetPosition (fVektorEn);
            }
        }


        //Set Positions
        SprPlayer.SetPosition(fVektorPl);

        //Eventloop
        while(App.GetEvent(Eventii))
        {
            //Window closed?
            if(Eventii.Type == sf::Event::Closed)
                App.Close();
            //Escape pressed?
            if((Eventii.Type == sf::Event::KeyPressed)&&(Eventii.Key.Code == sf::Key::Escape))
                App.Close();
            //Leftkey pressed?
            if((Eventii.Type == sf::Event::KeyPressed)&&(Eventii.Key.Code == sf::Key::Left))
            {
                if(fPlayerTimer>=0.75f)
                {
                    if(fVektorPl.x>0.f)
                        fVektorPl.x-=100.f;
                    else
                    {
                        fVektorPl.y=750.f;
                        fVektorPl.x=500.f;
                    }
                    ClockPlayer.Reset();
                }
            }
            //Rightkey pressed?
            if((Eventii.Type == sf::Event::KeyPressed)&&(Eventii.Key.Code == sf::Key::Right))
            {
                if(fPlayerTimer>=0.75f)
                {
                    if(fVektorPl.x<500.f)
                        fVektorPl.x+=100.f;
                    else
                    {
                        fVektorPl.y=750.f;
                        fVektorPl.x=0.f;
                    }
                    ClockPlayer.Reset();
                }
            }
        }

        ///Draw
        App.Clear(             );
        App.Draw (SprBackground);
        App.Draw (SprPlayer    );
        App.Draw (SprEnemy     );
        App.Display (          );
    }

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

3

02.08.2011, 22:49

Schoene Geschichte!


Danke, hat mir echt geholfen. :|

4

02.08.2011, 23:25

Schoene Geschichte!


Danke, hat mir echt geholfen. :|
Und die Moral der Geschicht, schlechte Fragen stellt man nicht!




(Link)
Wer nicht kommt zur rechten Zeit ist danach nur halb so breit!

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

5

02.08.2011, 23:30

Wie kommst du darauf, dass es an deinem Listentyp liegen könnte? Wenn ich mir deinen Code so ansehe, dann wird da relativ kompliziert immer jeder Gegner bewegt, sodass natürlich alle an der gleichen Position sind.
Es ist also nicht das Problem irgendeines falschen Datentyps, sondern einfach ein Problem in deiner Bewegung. Aber spawne doch die Gegner einfach schon mal auf verschiedenen Positionen. Dann würden sie sich zwar immer noch gleich bewegen, aber sie wären zumindest an verschiedenen Stellen ;).

6

02.08.2011, 23:41

Stimmt. :O
Ich habe nicht daran gedacht, das ich die gleich bewegen will. :thumbdown:
Nur bewegen sie sich halt noch nicht. Aber schrittweise vorgehen, ich werde mal versuchen die auf eine zufällige Position zu setzen.
Würde es sich da anbieten mehrere Vektoren zu nutzen, oder hat wer eine Idee das mit einem zu tun? Ich hab sie nicht. :lol:
Mein Fenster ist 600x800 groß, (ist Absicht ;D) ich habe oben 6 Felder auf denen ein Gegner kommen kann, also habe ich in etwas folgende Zeilen:

C-/C++-Quelltext

1
2
srand(time(NULL));
___einzelnerGegner___.SetPosition(600.f/rand()%6, 0.f);


Was ich aber nicht weiß, wie spreche ich einen einzelnen Gegner aus der Liste an? Buffer bauen und damit herum jonglieren? :wacko:
Hatte auf cplusplus.com nachgeschaut, aber da hab ich nichts hilfreiches gefunden.
Eigentlich wäre das doch meine for-Schleife?


Ach Ja, danke Fred! Und RebornX: Es gibt keine dummen Fragen, nur dumme Antworten, und die habe ich, bis auf Fred seine, bekommen. Wäre nett wenn man das unterlassen könnte. ^^

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »MisterX« (02.08.2011, 23:57)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

02.08.2011, 23:58

HrHr der Toleranz Thread und die Antworten in letzter Zeit sind echt genial überschneidend.
@Thread Ersteller: Waren wir uns nicht insofern einig, dass du wieder bei den Grundlagen startest?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

8

03.08.2011, 00:07

Ich sollte kleine Projekte machen, keiner redete von Grundlagen. :D

Hab jetzt das: (an welcher Stelle das im Code ist dürfte klar sein)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(fEnemyTimer>=1.f)
        {
            fVektorEn.y+=187.5f;
            ClockEnemy.Reset();
        }
        //Spawning
        if(fEnemyTimer>=1.f)
        {
            if(EnemyList.size()<5)
            {
                SprEnemy.SetImage  (ImgEnemy);
                EnemyList.push_back(SprEnemy);
            }
            for(EnemyIt=EnemyList.begin(); EnemyIt!=EnemyList.end(); ++EnemyIt)
            {
                float needed = static_cast<float>(600/rand()%6);
                fVektorEn2.x=needed;
                EnemyIt->SetPosition (fVektorEn2);
            }
        }


Doch der?/die? Gegner bleiben allerdings immer noch auf Position 1. :S

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

9

03.08.2011, 08:09

Was ich aber nicht weiß, wie spreche ich einen einzelnen Gegner aus der Liste an?
Ich dachte du kannst C++? Und jetzt weisst du nicht mal, wie man durch eine Liste iteriert? Dann lies das mal schleunigst nach. Und debugge mal, was in deiner needed Variable steht. Vermutlich Schwachsinn.

10

03.08.2011, 09:42

Ich schrieb nicht das ich vollends alles kann und ein Guru bin, was das anbelangt. :|

In meiner needed Value steht Schwachsinn, oh ja... 8|
Aber die Liste wird doch so "iteriert":

C-/C++-Quelltext

1
2
3
4
for(EnemyIt=EnemyList.begin(); EnemyIt!=EnemyList.end(); ++EnemyIt)
{
 //...
}


Und wie man jetzt einzelne Objekte an festen Plätzen anspricht weiß ich nun auch, aber das brauch ich hier nicht. Das ist Schwachsinn, die Schleife sollte doch richtig sein. :whistling:

Ich finde es halt schwer mehrere Gegner ohne Klasse zu erstellen. :thumbdown:
Beim letzten mal lag es an der Übersicht. ^^

Werbeanzeige