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

03.01.2010, 11:27

Vector und List!

Hallo,

Ich hab mal wieder ein Problem nur ist es das gleiche was
ich beim letzen Thread auch hatte, nur wollte ich es nicht wieder
entstauben, hatte leider wenig Zeit um da weiter zu machen.

So nun ist es aber so das ich möchte das mit nur einem Spirit
im Spiel immer nach einer bestimmten Zeit ein nächster Spirit
runter kommt. Um genau zu sein es sollen Asteroiden sein die
nach bestimmten Zeitablauf runterfliegen.
Natürlich geht das wiedermal nicht. :?

So siehts aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        App.Clear();

        float Random = sf::Randomizer::Random(-1.f, 400.f);
        if(Clock.GetElapsedTime() < 5.f)
        {
        if(Leben < 0) {}
        else{
        SAsteroid.SetPosition(Random, 0);
        SAsteroid.Move(0, 200 * ElapsedTime);

        VSAsteroid.push_back(SAsteroid);
        App.Draw(VSAsteroid.at(0));
        Clock.Reset();
        }
        }
App.Display();


Nun die Probleme, der Asteroid platziert sich immer in der
Mitte Sprich es ist kein Random Wert. Außerdem komt
kein neuer Asteroid nachdem die Zeit abgelaufen ist...
Wenn ich ihn abknalle haut das ding ab. Und der Asteroid
kommt nicht runter also SAsteroid.Move(...) haut nicht hin.

In der SDL hatte ich das immer so gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    if (m_EEnemyZähler >= 0.10f)
    {
        CEnemy Enemy;
        int XPosition = rand()%336; 
        Enemy.Initialisieren (m_pSpriteEnemy, static_cast<float>(XPosition), -20.0f);
        m_EnemyListe.push_back (Enemy);
        m_EEnemyZähler = 0.0f;
    }
//Hatte ich von einem Buch... Name vergessen... :oops:


Lg Genro Hoffe auf Hilfe!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

03.01.2010, 11:58

Hmm. Also ich würde mal sagen, dass du den Randomizer noch initialisieren musst?

Ansonsten würde ich dir empfehlen da mal mit dem Debugger zu schauen. Da siehst du recht genau, was abgeht und was eben nicht. ;)

3

03.01.2010, 12:20

Ich seh da nix auschlag gebendes (beim Debuggen).

C-/C++-Quelltext

1
    std::vector <sf::Sprite> VSAsteroid;

Hab ich vergessen zu posten.

Die Random Zahlen sind mir jetzt garnicht (kann ja auch den float wert nach jedem durchgang um 1 erhöhen.. würde auch gehen.) sowichtig
sondern eher das halt nur mit einem Spirit mehrere auf dem
Bildschirm kommen. Ich möchte nich immer es so machen
müssen...

C-/C++-Quelltext

1
2
3
4
5
sf::Sprite Nummereins(Nummer);
sf::Sprite Nummerzwei(Nummer);
...
App.Draw(Nummereins);
App.Draw(Nummerzwei);


Sondern halt nur mit einen Spirite, mehrere auf dem Bildschirm
bringen. Ist es also richtig was ich mache?
Weil bei mir wird nur einer angezeigt der sich nichtmal
runter bewegt obwohl er das tuhen sollte. Liegt das vielleicht daran
das sich alle auf einem haufen bilden?

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

4

03.01.2010, 12:22

Mit einem Sprite mehere auf dem Bildschirm bekommen??
Kannst du schon. Du könntest das Sprite immer verschieben, und dann zeichnen, dann wieder verschieben und wieder zeichnen.

Würde aber dafür mehrere Sprites mit ein und dem selben Image nehmen.


EDIT: du zeichnest ja auch immer nur einen Asteroiden. Den du zuvor dann immer an die selbe Position setzt.

Und etwas mehr Code wär vielleicht nicht schlecht! :)

5

03.01.2010, 13:42

Das ist es ja eben was ich nicht will.

Ich möchte es so haben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sf::Image NureinImage;
//LoadImage

sf::Sprite NureinSpirte(NureinImage); //Nur ein Spirite Laden


//Was jetzt kommt geht natürlich nicht soll nur erklären

//was ich meine...


int Var = 1;
if(Var == 1)
{
App.Draw(NureinSprite(zwanzigmalzeichnen));
NureinSpirite.SetPosition(floatwert, 0);
//floart wert nach jedem Schleifen durchlauf erhöhen damit

//Jedes Spirite der 20mal gezeichneten Spirites immer auf einer anderen

//Stelle positioniert wird.

}


Ich will ja eben nicht mehrere Spirits hincoden, da dass
für mich viel zu umständlich ist. Es soll halt der ein und Selbe
Sprite öfters gerendert werden und immer an einer anderen
Position, und der Spirite soll dann sich halt nach unten bewegen.

Oder hab ich dich nicht verstanden, kannst du mir vielleicht ein
Code Beispiel geben?

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

6

03.01.2010, 14:28

Ich würd eine Klasse machen. (Ist in C++ für Spieleprogrammierer auch so ähnlich gemacht)

C-/C++-Quelltext

1
2
3
4
class Asteroid
{
  sf::Sprite Sprite;
}


Die sieht ungefähr so aus.

Die Klasse kannst du dann beliebig erweitern. Z.b. Mit der Position, oder mit einer bool-Variable, ob der Asteroid noch aktiv ist, ansonsten kannst du ihn löschen. Und, und, und...

Das Image brauchst du nur einmal. Kannst du dann z.B. dem Konstruktor der Klasse übergeben.

C-/C++-Quelltext

1
sf::Image NurEinImage;


und dann kannst in einer Schleife so viele Instanzen dieser Klasse erstellen, wie du brauchst.

C-/C++-Quelltext

1
2
3
4
5
for(int i = 0; i < 10; i++)
{
  Asteroid EinAsteroid;
  Vector.push_back(EinAsteroid); //diesen Vector hast du zuvor noch erstellt

}


Und dann hast du in der Liste 10 Asteroiden.
Ich hoff, ich konnte dir helfen! :)

7

03.01.2010, 16:12

Danke schonmal. Aber wie kann ich jetzt alles was ich über push_back
an den Vector anfüge per App.Draw() Zeichnen, bewegen, positionieren?

8

03.01.2010, 16:21

Einfach den Vector durchgehen.

for (size_t i = 0; i<Vector.size (); i++)
{
Vector bzw. Vector.at(i).Draw ();
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

03.01.2010, 16:23

Zitat von »"E122"«

for (size_t i = 0; i<Vector.size (); i++)
{
Vector bzw. Vector.at(i).Draw ();
}


diese schleife sollte absolut unbedenklich sein also kannsu den schnelleren indizierungoperator nehmen oder nicht?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

10

03.01.2010, 16:26

Zitat

diese schleife sollte absolut unbedenklich sein also kannsu den schnelleren indizierungoperator nehmen oder nicht?

Also ich hätt jetzt den indizierungoperator genommen, wollt nur noch mal auf die andere Möglichkeit hinweisen.

Werbeanzeige