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

31.05.2022, 09:27

SFML Bullet shot Richtung

Hallo,
ich habe ein Problem wo ich nicht weiterkomme, vielleicht weiss es einer von euch. Und zwar programmiere ich gerade ein 2d Spiel mit Sfml. Das Spiel ist relativ simpel, der Player ist von der Seite zu sehen und kann nach Links und rechts gehen. Über eine dritte Taste kann er Schiessen. Leider bekomme ich es nicht hin, dass Die Kugel in die Richtung fliegt, in der der Spieler schaut. Im Netz gibt es Tutorials aber immer nut in eine Richtung :( hier sind ausschnitte aus meinem Code:

Hier der code für die Kugel

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(isFiring == true){
        
        if(plr.plrSprite.getScale().x <=0)
        {
newBullet.bltSetPos(Vector2f(plr.plrSprite.getPosition().x  + 60, plr.plrSprite.getPosition().y - 100));

          }
      if(plr.plrSprite.getScale().x >=0)
         {
newBullet.bltSetPos(Vector2f(plr.plrSprite.getPosition().x  + 60, plr.plrSprite.getPosition().y + 100));

          }

        
    bulletVec.push_back(newBullet);
            
    
    isFiring = false;


Und hier ist das Problem:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for (int i = 0; i < bulletVec.size(); i++) 
 {
    
        
 bulletVec[i].bltDraw(window);
 
 
 bulletVec[i].bltFire( 0, 10); 
              
 
 }


In der bltFire ist die Funktion move, sodass die Kugel mit der Geschwindigkeit 10 fliegt. Aber halt nur in die eine Richtung. Ich suche ein Codeschnipsel der der Kugel sagt, dass sie in die Richtung fliegen soll, in der der Spieler schaut.

2

31.05.2022, 09:58

Ich würde beim erstellen des Bullet Objekts zusätzlich die Richtung in die die Kugel fliegen soll speichern.

Wenn die Kugel nach links fliegen soll:
newBullet.direction = Vector2f(-1, 0);

Wenn die Kugel nach rechts fliegen soll:
newBullet.direction = Vector2f( 1, 0);

und wenn du die Bullets bewegst:
Vector2f move = bulletVec.direction * speed * deltaT;
bulletVec[i].bltFire(move.x, move.y);

Ich hoffe ich konnte dir helfen.

3

31.05.2022, 12:50

Erstmal danke für die Antwort, aber irgendwie klappt das nicht oder ich hab die Werte falsch eingegeben.

Also ich hab in der bullet.h datei

C-/C++-Quelltext

1
2
3
4
5
6
public:

Vector2f direction;

//u.a. auch:
void bltFire(Vector2f moveBullet);


In der bullet.cpp ist

C-/C++-Quelltext

1
2
3
4
5
6
void bullet::bltFire(Vector2f moveBullet){
    
    bulletRec.move(moveBullet);
    

}


Und in der main.cpp befindet sich:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int i = 0; i < bulletVec.size(); i++) 
 {
    
    newBullet.direction = Vector2f( 0, 1);
     newBullet.direction=Vector2f( 0, -1);
    
    Vector2f mover = bulletVec[i].direction * speed ;
    
        
 bulletVec[i].bltDraw(window);
 
 
 bulletVec[i].bltFire(Vector2f(mover.x, mover.y)); 
    
          
 
 }


der Player schießt weiterhin nur in eine Richtung, ich schätze mal der übernimmt nur den letzten direction Vector (0, -1), hab ich da irgendetwas irgendwo falsch deklariert?

4

31.05.2022, 14:17

Ich glaub eine x Skalierung um -1 Spiegelt die Sprite horizontal.
Somit bekommst du mit folgendem Code raus, das der Spieler gespiegelt ist und sich somit nach links bewegt und ansonsten nach rechts.
Und du speicherst dort die Startposition und die Bewegungsrichtung.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
if(plr.plrSprite.getScale().x < 0) // nach links ausgerichtet
{
newBullet.bltSetPos(/* setze die Startposition */ );
newBullet.direction = Vector2f(-1, 0);
}
else if(plr.plrSprite.getScale().x > 0) // nach rechts ausgerichtet
{
newBullet.bltSetPos(/* setze die Startposition */ );
newBullet.direction = Vector2f( 1, 0);
}


Im Update Code berechnest du dann die Bewegung, verschiebst die Objekte und malst sie dann:

C-/C++-Quelltext

1
2
3
4
5
6
for (int i = 0; i < bulletVec.size(); i++) 
{
Vector2f move = bulletVec[i].direction * speed;
bulletVec[i].bltFire(move);
bulletVec[i].bltDraw(window);
}


Klappt es jetzt?

5

31.05.2022, 15:13

Ja hat geklappt, vielen vielen Dank, hab mir jetzt seit 2 Wochen den kopf zerbrochen

Werbeanzeige