Schuss-Platzierung im Raum

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Dogg0

Betreff: Schuss-Platzierung im Raum

BeitragMo, Sep 05, 2005 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe es geschafft mit Hilfe ein paar Tutorials einen kleinen 2D Spaceshooter zu coden, bis jetzt habe ich aber nur Einzelschuss drin. Jeder Schuss startet immer von der Mitte eines Raumschiffs.
Die Richtung eines Schusses wird so berechnet, was ich aus einem Tut habe:
x# = x# - Cos(mwinkel#) * speed#
y# = y# - Sin(mwinkel#) * speed#

Jetzt wollte ich einen neuen Schuss einführen: 2 Kugeln
Die sollen aber nicht übereinander in der Mitte starten sonden getrennt, jeweils links und rechts von einem Raumschiff.

Da ich Mathe-Noob bin habe ich wild drauflosprobiert mit cos, sin und tan, aber ich kriegs nicht hin.

Hat jemand einen Plan wie das gehen könnte?
 

Ava

Gast

BeitragMo, Sep 05, 2005 11:29
Antworten mit Zitat
Wenn es Dir nur darum geht, an welcher Position Deine Schüsse starten, dann hat das ja nicht direkt etwas mit ihrer Flugbahn bzw. deren Berechnung zu tun, sondern lediglich mit deren erster Positionierung. Demnach ist es eigentlich super simple, denn Du brauch nur den x und y Wert verschieben.

Bei einem horizontalen Spaceshooter wäre die Verschiebung für zwei nebeneinander fliegende Geschosse zb.: y - 16 für Schuss 1, y + 16 für Schuss 2.

Bei einem vertikalen Spaceshooter wäre die Verschiebung zb.: x - 16 für Schuss 1 und x + 16 für Schuss 2.

+-16 sind willkürlich gewählt, es ist die Weite des Abstands.

Wenn ich Dein Problem falsch verstanden habe und du möchtest, dass die zwei Schüsse in gegensätzliche Richtungen fliegen, dann musst Du den Schusswinkel des zweiten Geschosses um 180° erhöhen.
 

Dogg0

BeitragMo, Sep 05, 2005 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die antwort aber so einfach ist es leider nicht
habe vergessen zu erwähnen dass man das Raumschiff in 360 Richtungen - je nach Winkel steuern kann.
Bei Richtungsänderung addiere oder subtrahiere ich zum Richtungswinkel dazu
Wenn ich jetzt einfach was zur x oder y position addiere oder subtrahiere steht der schuss bei einem anderen winkel wieder an einer anderen position

wenn ich den schuss in der Bewegungsrichtung verschieben will geht das so
x# = x# - Cos(mwinkel#) * speed#
y# = y# - Sin(mwinkel#) * speed#

speed ist die geschwindigkeit des schusses
mwinkel ist der richtungswinkel

jetzt will ich den schuss aber nicht in der Bewegungsrichtung ändern sondern in der anderen
konnte ihn schon anders positionieren nur ändert sich die position bei jeder winkeländerung wieder
 

Ava

Gast

BeitragMo, Sep 05, 2005 12:31
Antworten mit Zitat
Achso, ja dann müsste das in etwa so klappen:

x = x + cos(winkel) * x_verschiebung + sin(winkel) * y_verschiebung
y = y + cos(winkel) * y_verschiebung + sin(winkel) * x_verschiebung

Also das ist die Formel für die Startplatzierung.

*hoffentlich kein Denkfehler drin*

8)
 

Dogg0

BeitragMo, Sep 05, 2005 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die hilfe aber es klappt immer noch nicht so ganz Sad

x = x + cos(winkel) * x_verschiebung + sin(winkel) * y_verschiebung
y = y + cos(winkel) * y_verschiebung + sin(winkel) * x_verschiebung

wenn ich für die x_verschiebung einen wert eingebe und für y_verschiebung 0 dann wird der schuss in bewegungsrichtung verschoben

wenn ich für y_richtung einen wert angebe und für x_richtung 0 dann wird zwar richtig verschoben aber wenn ich eine kurve fliege und sich der winkel ändert dann ändert sich auch die startposition des schusses
Shocked
 

Ava

Gast

BeitragMo, Sep 05, 2005 13:50
Antworten mit Zitat
Die Possitionsverschiebung darfst Du natürlich nur für die Initialisierung des Geschosses ausrechnen. D.h. wenn Du ein neues Geschoss erstellst, rechnest Du so die Position aus:

x_geschoss = x_raumschiff + cos(winkel_raumschiff) * x_verschiebung + sin(winkel_raumschiff) * y_verschiebung

Dann speicherst Du zudem in einer Variable:

winkel_geschoss = winkel_raumschiff


In jedem Update des Geschosses rechnest Du von da an:

x_geschoss = x_geschoss + cos(winkel_geschoss) * x_geschoss_geschwindigkeit + sin(winkel_geschoss) * y_geschoss_geschwindigkeit


Die "Speed" Variable, die Du bisher verwendest hast, würde der x_geschoss_geschwindigkeit entsprechend.


Hoffe, dass klappt nun endlich ? Wink




[/edit]

Määääh, Du hast recht, irgendetwas klappt da noch nicht richtig. Verdammt! Evil or Very Mad ... habsch doch irgendwo einen Denkfehler eingebaut .... aber keine Sorge, dass bekommen wir hin! Tante Ava probiert eben mal ein bisschen rum! 8)
 

Dogg0

BeitragMo, Sep 05, 2005 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
so mach ich das auch aber es funzt nicht
das problem ist glaub woanders

initialisierung der startposition ax,ay = raumschiffposition
x1 = ax + cos(awinkel) * 30 + sin(awinkel) * 0
y1 = ay + cos(awinkel) * 0 + sin(awinkel) * 30
wenn ich das so mach verschiebt sich die startposition nur in der richtung in der der schuss auch fliegt


wenn ich das so mache:
x1 = ax + cos(awinkel) * 0 + sin(awinkel) * 30
y1 = ay + cos(awinkel) * 30 + sin(awinkel) * 0
passt sich die startposition des schusses an den winkel an
das heisst wenn sich der richtungswinkel ändert startet der schuss an einer anderen position, aber immerhin auf der richtigen achse

das problem ist also die startposition konstant zu halten auch wenn sich der richtungswinkel ändert
Crying or Very sad Wink
 

Ava

Gast

BeitragMo, Sep 05, 2005 14:33
Antworten mit Zitat
BlitzBasic:

Graphics 640, 480, 0



Global raumschiff_x:Float = GraphicsWidth() Shr 1
Global raumschiff_y:Float = GraphicsHeight() Shr 1
Global raumschiff_winkel:Float = 0.00



Type t_geschoss

Global liste:TList
Field x:Float, y:Float, winkel:Float
Field geschwindigkeit_x:Float, geschwindigkeit_y:Float


Function erstellen(x:Float, y:Float, winkel:Float, verschiebung_x:Float, verschiebung_y:Float, geschwindigkeit_x:Float, geschwindigkeit_y:Float)

Local geschoss:t_geschoss = New t_geschoss

ListAddLast liste, geschoss

geschoss.x = x + Cos(winkel) * verschiebung_x - Sin(winkel) * verschiebung_y
geschoss.y = y + Sin(winkel) * verschiebung_x + Cos(winkel) * verschiebung_y
geschoss.winkel = winkel
geschoss.geschwindigkeit_x = geschwindigkeit_x
geschoss.geschwindigkeit_y = geschwindigkeit_y

EndFunction


Function update()

For geschoss:t_geschoss = EachIn liste

geschoss.x = geschoss.x + Cos(geschoss.winkel) * geschoss.geschwindigkeit_x - Sin(geschoss.winkel) * geschoss.geschwindigkeit_y
geschoss.y = geschoss.y + Cos(geschoss.winkel) * geschoss.geschwindigkeit_y + Sin(geschoss.winkel) * geschoss.geschwindigkeit_x

Next

EndFunction


Function zeichnen()

For geschoss:t_geschoss = EachIn liste

SetColor 250, 0, 0
DrawOval geschoss.x - 4, geschoss.y - 4, 8, 8

Next

EndFunction


EndType



t_geschoss.liste = CreateList()



Repeat


Cls

If KeyDown(key_left) Then raumschiff_winkel = raumschiff_winkel - 1.00
If KeyDown(key_right) Then raumschiff_winkel = raumschiff_winkel + 1.00


If KeyHit(key_space)

t_geschoss.erstellen(raumschiff_x, raumschiff_y, raumschiff_winkel, 0, -16, 8, 2)
t_geschoss.erstellen(raumschiff_x, raumschiff_y, raumschiff_winkel, 0, 16, 8, -2)

t_geschoss.erstellen(raumschiff_x, raumschiff_y, raumschiff_winkel, 0, 0, 0, -8)
t_geschoss.erstellen(raumschiff_x, raumschiff_y, raumschiff_winkel, 0, 0, 0, 8)

EndIf


t_geschoss.update
t_geschoss.zeichnen

zeichneRaumschiff


Flip


Until KeyDown(key_escape) End



Function zeichneRaumschiff()


SetColor 125, 125, 125
DrawOval raumschiff_x - 16, raumschiff_y - 16, 32, 32

SetColor 255, 255, 255
DrawLine raumschiff_x, raumschiff_y, raumschiff_x + 48 * Cos(raumschiff_winkel), raumschiff_y + 48 * Sin(raumschiff_winkel)

SetColor 175, 175, 175
DrawOval raumschiff_x - Sin(raumschiff_winkel) * 16 - 8, raumschiff_y + Cos(raumschiff_winkel) * 16 - 8, 16, 16
DrawOval raumschiff_x - Sin(raumschiff_winkel) * -16 - 8, raumschiff_y + Cos(raumschiff_winkel) * -16 - 8, 16, 16


EndFunction





Kopier Dir das mal in Dein BlitzMax rein und schau es Dir an! Smile
 

Dogg0

BeitragMo, Sep 05, 2005 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen, vielen, vielen Dank !
ich werde dir ewig dankbar sein

Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy
 

Ava

Gast

BeitragMo, Sep 05, 2005 14:54
Antworten mit Zitat
Freut mich, dass ich Dir helfen konnte! Very Happy

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group