2D Tastatur-/Maussteuerung

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

ZIFFar

Betreff: 2D Tastatur-/Maussteuerung

BeitragMo, Sep 08, 2008 8:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich bin neu hier also wollte ich mich erstmal vorstellen. Very Happy

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. Confused
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. Wink

grüße

ZiFFar

kriD

BeitragMo, Sep 08, 2008 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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 und cos die richtung bestimmen, in die die figur laufen soll (in diese richtung fliegen denn auch die schüsse).
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 und acos berechnen (wenn mich nicht alles täuscht).

lg kriD


EDIT: OK.. hab grad gesehen, dass BMax gefordert ist (aber erstmal posten Wink). ich lass einfach mal meinen beitrag hier stehen, da ich nicht weiß, inwieweit meine vorgehensweise für BMax richtig ist (glaub, es gibt echtzeitdrehung von bildern).
Wenn ich du wäre, wäre ich lieber ich!

Goodjee

BeitragMo, Sep 08, 2008 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
atan2 ist für bestimmen der winkel besser geeigenet als asin und acos Wink
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

ZIFFar

BeitragMo, Sep 08, 2008 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal Danke für deine Antwort kriD.

Die Idee mit dem Winkel ist mir heute bei der Arbeit gekommen Wink aber die Umsetzung ist da noch
nicht ganz geklärt. Confused

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. Smile

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

BeitragMo, Sep 08, 2008 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

ZIFFar

BeitragMo, Sep 08, 2008 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Goodjee.

Ich schaue mal ob ich das umgesetzt bekomme. Ein Beispiel währe trotzdem super. Wink
  • Zuletzt bearbeitet von ZIFFar am Mi, Sep 10, 2008 0:20, insgesamt einmal bearbeitet
 

ZIFFar

BeitragMi, Sep 10, 2008 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Sep 10, 2008 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 12, 2008 1:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Okt 04, 2008 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group