2D Tastatur-/Maussteuerung
Übersicht

ZIFFarBetreff: 2D Tastatur-/Maussteuerung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
ich bin neu hier also wollte ich mich erstmal vorstellen. ![]() Daniel ist mein Name, ich werde in kürze 20 und habe erst vor kurzem BlitzMax entdeckt. Es ist mir gelungen mit meinen erbärmlichen C++ Schulkenntnissen einen kleinen "Space Invaders" Klon zu erstellen aber jetzt gehts nicht weiter. ![]() Ich möchte ein wenig Experimentieren und einen 2D Shooter erstellen allerdings gelingt es mir nicht die Steuerung um zu setzten. Der Spieler sieht sein "Digitales Ich" aus der Vogelperspektive. Die Figur wird per Pfeiltasten gesteuert. (bis hierhin klappt noch alles wunderbar) Mein Problem ist folgendes: Ich möchte per Maus zielen. Die Spielfigur soll sich immer nach der Position des Mauszeigers ausrichten und auch in diese Richtung feuern. Ich habe keine Idee wie ich dies umsetzen soll. Ich bin für alle Vorschläge und Ideen offen. ![]() grüße ZiFFar |
||
![]() |
kriD |
![]() Antworten mit Zitat ![]() |
---|---|---|
hallo ZIFFar
gönn deiner spielfigur einfach eine winkelvariable, in der du den winkel speicherst, um den sie gerade gedreht ist. dann kannst du mit sin ![]() ![]() am besten schaust du dir mal das GTA-Steuerungs Tutorial auf der ROBSITE an. da sollte das eben beschriebene noch besser erklärt sein. das player zur maus drehen kommt danach. hier musst du aus der differenz von maus X bzw. Y- und player-X bzw. Y-koordinate den winkel mittels asin ![]() ![]() lg kriD EDIT: OK.. hab grad gesehen, dass BMax gefordert ist (aber erstmal posten ![]() |
||
Wenn ich du wäre, wäre ich lieber ich! |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
atan2 ist für bestimmen der winkel besser geeigenet als asin und acos ![]() |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
ZIFFar |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal Danke für deine Antwort kriD.
Die Idee mit dem Winkel ist mir heute bei der Arbeit gekommen ![]() nicht ganz geklärt. ![]() Ich versuche das ganze Objektorientiert umzusetzen bin aber neu auf dem Gebiet. Es währe sehr Hilfreich wenn mir vielleicht jemand ein BlitzMax taugliches Beispiel liefern könnte. Es muss nicht funktionieren ich brauche nur eine grobe Idee wie das ganze auszusehen hat. ASin und ACos funktionieren auch in BMax wie es scheint also mal sehen wie weit ich mit deinen Infos komme. ![]() grüße ZiFFar P.S. Ich habe ein altes BB Buch durchforstet aber dort wird das Thema überhaupt nicht behandelt. Kannst du mir vielleicht ein gutes BMax Buch empfehlen? EDIT: Oh gleich der Nächste. ^^ atan2? Eine Erklärung währe hilfreich. Danke. |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
nunja:
atan2(yabstand,xabstand) gibt den winkel zwischen 2 punkten wieder, früher musste man immer noch 180° hinzufügen, aber das findest du durch ausporbieren raus ![]() |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
ZIFFar |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke Goodjee.
Ich schaue mal ob ich das umgesetzt bekomme. Ein Beispiel währe trotzdem super. ![]() |
||
- Zuletzt bearbeitet von ZIFFar am Mi, Sep 10, 2008 0:20, insgesamt einmal bearbeitet
ZIFFar |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ein kleines Statusupdate.
Ich bin soweit das ich die Spielfigur nun per Tastatur in verschiedene Richtungen bewegen kann. Ich habe jedoch noch 2 Probleme: 1. Die abgefeuerten Geschosse fliegen immer in die selbe Richtung. 2. Ich schaffe es nicht die Ausrichtung der Spielfigur auf die Maus zu legen. Sobald ich mein Codegewirr sortiert habe werde ich ihn hier posten. |
||
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi ZIFFar.
@Abfeuern: Damit die Geschosse in die Abschussrichtung fliegen müsste man folgendes machen: Wir erstellen das Geschoss: Code: [AUSKLAPPEN] geschoss.x=x+Cos(Abschusswinkel)*Abschussversatz
geschoss.y=y+Sin(Abschusswinkel)*Abschussversatz geschoss.winkel=Abschusswinkel Damit haben wir die Startposition und die Richtung gesetzt. Jetzt müssen wir das Geschoss in Bewegung setzten. Das geht so: Code: [AUSKLAPPEN] geschoss.x:+Cos(geschoss.winkel)*Geschwindigkeit
geschoss.y:+Sin(geschoss.winkel)*Geschwindigkeit @Maus: Um den Blickwinkel des Spielers zur Maus ausrechnen zu können, müssen wir die Spielerposition und die Mausposition kennen. Nun rechnen wir den Winkel aus: Code: [AUSKLAPPEN] spieler.winkel=ATan2(spieler.y-MouseY(),spieler.x-MouseX())+180
Hier ist noch ein kleines Beispiel: Code: [AUSKLAPPEN] SuperStrict
Framework brl.glmax2d Import brl.math Import brl.linkedlist Type TEntity Field x:Float ' x-Position Field y:Float ' y-Position Field angle:Float ' Blickwinkel Field link:TLink ' Listeneintrag Method New() ' In die Liste eintragen und den Eintrag speichern damit er später ' nicht gesucht werden muss. ( = Schnelleres entfernen aus der Liste) link=List.addLast(Self) EndMethod Method free() ' Bin ich noch in der Liste eingetragen? If link ' Aus der Liste entfernen link.remove() link=Null EndIf EndMethod Method draw() Abstract Method update() Abstract Function RenderAll() For Local entity:TEntity=EachIn List entity.draw() entity.update() Next EndFunction Global List:TList=New TList EndType Type TBullet Extends TEntity Field speed:Float ' Wie schnell soll sich der Schuss bewegen? Method draw() DrawLine x,y,x+Cos(angle)*10,y+Sin(angle)*10 EndMethod Method update() ' Vorwärts x:+Cos(angle)*speed y:+Sin(angle)*speed ' Löschen wenn weg If x<0 Or y<0 Or x>GraphicsWidth() Or y>GraphicsHeight() free() EndIf EndMethod EndType Type TActor Extends TEntity Field speed:Float=5 Method draw() DrawOval x-5,y-5,10,10 DrawLine x,y,x+Cos(angle)*10,y+Sin(angle)*10 EndMethod EndType Type TPlayer Extends TActor Method shoot() Local bullet:TBullet=New TBullet ' Schuss positionieren bullet.x=x+Cos(angle)*5 bullet.y=y+Sin(angle)*5 bullet.angle=angle bullet.speed=10 EndMethod Method update() ' Blick auf die Maus ausrichten angle=ATan2(y-MouseY(),x-MouseX())+180 If KeyDown(KEY_D) ' Seitlich nach Rechts x:+Cos(angle+90)*speed y:+Sin(angle+90)*speed EndIf If KeyDown(KEY_A) ' Seitlich nach Links x:-Cos(angle+90)*speed y:-Sin(angle+90)*speed EndIf If KeyDown(KEY_W) ' Vorwärts x:+Cos(angle)*speed y:+Sin(angle)*speed EndIf If KeyDown(KEY_S) ' Rückwärts x:-Cos(angle)*speed y:-Sin(angle)*speed EndIf If MouseHit(MOUSE_LEFT) shoot() EndIf EndMethod EndType ' Spieler erstellen Local player:TPlayer=New TPlayer player.x=400 player.y=300 Graphics 800,600,0,60 Repeat Cls TEntity.RenderAll() DrawText "Blickwinkel: "+player.angle,0,0 DrawText "Anzahl Entities: "+TEntity.List.count(),0,16 Flip Until AppTerminate() Or KeyDown(KEY_ESCAPE) (Bewegen: WASD, Schießen: Linke Maustaste) Grüße, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
ZIFFar |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi FOODy
Du hast mich echt gerettet. Ich habe schon so einiges aus deinem Beispiel gelernt aber habe auch noch ein paar Fragen. Wegen Zeitmangels kann ich jetzt nicht näher darauf eingehen aber ich werde mich asap melden und hoffe doch, dass ihr mich auch weiterhin so tatkräftig unterstützt. Es ist echt nicht leicht sowas allein durch zu ziehen. Soweit erstmal ein großes Danke an euch! grüße ZiFFar |
||
![]() |
DaysShadow |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du könntest dir auch noch das Sample hitoro/tilerocket.bmx, das ist bei BlitzMax eben als Beispiel dabei, ansehen, ich denke das ist so ziemlich das was du suchst.
MfG DaysShadow |
||
Blessed is the mind too small for doubt |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group