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

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

1

16.02.2012, 20:21

[Java] 2D Shooter, Schuss in eine Richtung "lenken"

Hallo,

ich stehe momentan bei meinem Spiel vor einem Problem. Ich bastel gerade an einer Art Space-Shooter in 2D, das ganze mache ich in Java. Man lenkt mit den Tasten WASD sein Raumschiff und kann schießen. Kollisionserkennung, Gegner usw. funktioniert alles einwandfrei.
Ich habe für die Schüsse eine extra Klasse mit der Methode move(). In Dieser wird im jetzigen Zustand lediglich die x- und y-Koordinate um 4 erhöht, d.h. der Schuss geht immer in dieselbe Richtung.
Geplant ist das natürlich nicht so, der Schuss soll genau in die Richtung gehen, in wo die Maus gerade ist.
Ich übergebe der Klasse Laser also die aktuelle Position des Schiffs und die Zielkoordianten, doch nun das Problem:
Wie lenke ich den Schuss in diese Richtung? Ich muss ja bestimmt erstmal ne Fallunterscheidung machen, in welche Richtung das ganze gehen soll und dann mit Vektoren?

Ich wäre über jede Hilfe dankbar.

DarioFrodo

Treue Seele

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

2

17.02.2012, 09:28

Hattest du schonmal mit Vektorrechnung in der Schule zu tun?
Für dein Problem benötigst du ja im Prinzip einen Richtungsvektor vom Schiff zum Zielpunkt.
Du hast zum Beispiel das Schiff an der Position: (10, 5) und das Ziel an der Position (12,17).
Mir hilft es immer solche Probleme zu visualisieren um sie zu verstehen.
Z.B. könntest du dir ein kariertes Blatt schnappen, ein Koordinatensystem aufmalen und die Punkte einzeichnen.
Dann verbindest du die Punkte mit einem Strich und hast den Vektor.

Um den Verbindungsvektor zwischen zwei Punkten zu berechnen, ziehst du den 2. vom ersten ab.
In diesem Fall also (12,17) - (10,5) = (2,12).
Damit hast du also als Richtungsvektor (2,12).

Nun kannst du den Laser in jedem Frame soweit in die Richtung bewegen wie du möchtest.
z.B. wenn du ihn um 3 Pixel pro Sekunde bewegen möchtest:
Dann normaliesierst du den Vektor (teilst ihn durch seine Länge) was ungefähr so aussieht:
Wurzel(2*2+12*12) = Vektorlänge = 12.17
(2,12)/12.17 = (0.16, 0.9)
Nun musst du wissen wie viel Zeit zwischen den Frame vergeht (bei 60 FPs zum Beispiel 0.01666667 sekunden) und multiplizierst das mit dem Vektor.
Dann hast du die Bewegung um Pixel pro Sekunde, und multiplizierst du es noch mit der Geschwindigkeit (also z.B. 3 Pixel pro Sekunde):
(0.16, 0.9)*0.01666667 *3 = (0.008219949, 0.049319696)
jetzt kannst du die aktuelle Position des Lasers um 3 Pixel pro Sekunde updaten:
Das ist mal ein bisschen Pseudo-Code jedoch in C++. Aber vielleicht hilft es dir ja es für die Umsetzung zu verstehen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float Vector2::length()
{
  return sqrtf(this->x*this->x+this->y*this->y);
}
void Laser::create(Vector2 laserStartPosition, Vector2 zielPosition)
{
   this->richtungsVektor = zielPosition - laserStartPosition;
   this->richtungsVektor = this->richtungsVektor / this->richtungsVektor.length();
}
// fTime = seconds between frames
int Laser::move(float fTime)
{
   float speed = 3.0f;
   this->currentPosition +=  this->richtungsVektor * fTime * speed;
}
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

17.02.2012, 14:11

Das ganze mal kürzer:

Du berechnest Zielpunkt-Startpunkt, normalisierst das ganze (also teilst x und y durch die Länge des Vektors) nimmst es mit einem beliebigen Faktor mal (Geschwindigkeit) und addierst dann zu der Position des Schusses diesen Vektor (also x+vx und y+vy).

Werbeanzeige