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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

18.06.2015, 17:07

[C++ | SFML] Zufallspositionen durch Zufallsgenerator

Hallo Leute,

ich programmiere ein 2D Spiel, dass alle halbe Sekunde ein neues Objekt erstellt. Das soll per Zufallsgenerator ablaufen. Ich hoffe, dass der Quellcode selbsterklärend ist (habe ihn mit Kommentaren vollgepackt):

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
        int iXPos = 0;
        int iYPos = 0;
        int iXMax = 1900;
        int iYMax = 1000;

        // Zufallsgenerator initalisieren
        srand(timeGetTime());

        // gelber Klotz (Sprite & Texture)
        Texture YellowThingTexture;                             // Textur vom gelben Klotz
        Sprite YellowThing_Sprite (YellowThingTexture);         // Sprite vom gelben Klotz

        // Uhr
        //
        Clock clock2;
        int iElapsedTime = clock2.restart().asSeconds();    // Vergangene Zeit in Sekunden bekommen

        // Wenn eine halbe sekunde vergangen ist,
        // neuen gelben Klotz spawnen
        if (iElapsedTime >= 0.5f)
        {
            // Zufällige X-Position
            iXPos = (rand()%iXMax)+1;

            // Zufällige Y-Position
            iYPos = (rand()%iYMax)+1;

            YellowThingTexture.loadFromFile ("Data/Spawns.png");    // gelben Klotz laden
            YellowThing_Sprite.setOrigin (10, 10);                  // Mittelpunkt setzen
            YellowThing_Sprite.setPosition (iXPos, iYPos);

        }

        iElapsedTime = 0;   // Vergangene Zeit zurücksetzten
        clock2.restart();   // Uhr zurücksetzten


PS: Er erstellt einfach nicht das Objekt! Was ist der Fehler?

Vielen Dank im Voraus :)

2

18.06.2015, 17:19

Du musst das erstellte Objekt wohl noch in eine Liste packen ;)

ERROR

Alter Hase

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

3

18.06.2015, 17:20

Ich nehme mal an, das ganze ist in einer Art Loop? Falls dem so ist, solltest du dir mal über den Code-Aufbau Gedanken machen. Denn ich nehme an, dass die Zeit anders ist, als du erwartest. Wenn du eine Clock erstellst und in der nächsten Zeile die verstrichene Zeit abfragst, dann wird die sehr sehr klein sein und insbesondere um einiges kleiner als 0.5 Sekunden. Lass dir einfach mal an bestimmten Stellen, zB vor und nach der if, die Zeit auszugeben.

Du solltest also erstmal damit anfangen Clock clock2 und die Texture und das Sprite vor dem Loop zu schreiben ;)

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

4

18.06.2015, 17:41

Ich habe jetzt nochmal alles Überarbeitet, aber es klappt immernoch nicht :dash: . Was ist mien Fehler?

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
    // Liste
    //
    list<CGame*> lYellow;
    list<CGame*>::iterator i;
    CGame* Yellows;
//[...]

        if (iElapsedTime >= 0.5f)
        {
            CGame Yellow;

            // Zufällige X-Position
            iXPos = (rand()%iXMax)+1;

            // Zufällige Y-Position
            iYPos = (rand()%iYMax)+1;

            YellowThingTexture.loadFromFile ("Data/Spawns.png");    // gelben Klotz laden
            YellowThing_Sprite.setOrigin (10, 10);                  // Mittelpunkt setzen
            YellowThing_Sprite.setPosition (iXPos, iYPos);

            Yellows = new CGame;

            lYellow.push_back (Yellows);

        }

//[...]

        // Escape?
        if (Keyboard::isKeyPressed(Keyboard::Escape))
        {
            window.close ();
            system ("cls");
            delete(*i);
            (*i) = NULL;
            lYellow.clear ();


PS: Ich bekomme keine Fehlermeldung.

5

18.06.2015, 17:49

Was ist CGame? Deine Spielklasse? Warum erstellst du die, wenn eine gelbe Box gespawnt wird?! Du speicherst die erstellte Box immer noch nicht in einer Liste, stattdessen aber hast du eine Liste von Spielen? Wat? :D
Übrigens würde ich am Anfang die Uhr einmal zurücketzen, warten bis die Zeit überschritten wird, das Ding spawnen und die Uhr dann zurücksetzen. Würde man im Reallife ja auch so machen.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

6

18.06.2015, 17:53

Also müsste ich jetzt eine neue Klasse (z.B. CYellows) erstellen, welche den ganzen Kram erledigt, was im der Antwort oben steht und die Liste CYellows nennen? Tut mir leid, für die dummen Fragen...

7

18.06.2015, 18:00

Quellcode

1
2
3
4
5
6
7
8
> Liste von Klötzen erstellen
> uhr zurücksetzen
> hauptschleife
  > wenn escape -> break
  > alle klötze in der liste zeichnen
  > alle klötze in der liste bewegen
  > wenn uhr klingelt-> neuen klotz in liste tun und uhr zurücksetzen
  > von vorn beginnen


Wasdu für klassen hast, ist deine sache. Ich würde eine Gameklasse haben, die das fenster und einaben managt. Dann noch eine Levelklasse, die sich um eben diese klötze und den spieler kümmernt. Dann eine klotzklasse, die methoden für das selbstzeichnen und bewegen anbieten. oder so ähnlich.
denk dir einfach was aus undzwar so, dass dein spiel einfach und strukturiert ist.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

18.06.2015, 18:08

C-/C++-Quelltext

1
2
3
4
5
6
        Clock clock2;
        int iElapsedTime = clock2.restart().asSeconds();    // Vergangene Zeit in Sekunden bekommen

        // Wenn eine halbe sekunde vergangen ist,
        // neuen gelben Klotz spawnen
        if (iElapsedTime >= 0.5f)

Das wird wohl niemals true. Eindeutig. Wie auch? iElapsedTime wird immer 0 sein. Zudem ist ein Vergleich von int zu float reichlich unsinnig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

9

18.06.2015, 18:44

Ok. Ich habe jetzt alles geordnet. Aber jetzt bekomme ich zwei Fehlermeldungen:
1) error C2011: 'CPlayer': 'class' Typneudefinition
2) error C2027: Verwendung des undefinierten Typs "CPlayer"

Hier der Code:

Header-Datei

C-/C++-Quelltext

1
2
3
4
5
6
7
class CPlayer
{
public:
    void Player (float fElapsedTime, float fSpeed, Sprite Grafic1_Sprite);
    

};


Quell-Datei

C-/C++-Quelltext

1
2
3
4
void CPlayer::Player (float fElapsedTime, float fSpeed, Sprite Grafic1_Sprite)
{
//
}

10

18.06.2015, 18:47

Mal ganz doof gefragt: Schaust du dir deinen Quelltext überhaupt an?

MfG
Check

Werbeanzeige