Hindernisrennen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Nooby

Betreff: Hindernisrennen

BeitragSo, Apr 09, 2006 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallihallo,
Ich will mal wissen, wie bei den ganzen Strategiespielen die Einheiten immer genau wissen, wo sie langgehen müssen um ein bestimmtes Ziel zu erreichen. Angenommen die Einheiten können nur auf Diagonalen, Waagerechten und Senkrechten laufen und das Spielfeldist ein 2d-Koordinatensystem (also nur Quadrate als felder für die Einheiten und keine 6-Ecke, wie bei Siedler). So ist es noch einfach:

Code: [AUSKLAPPEN]

----------------
-----*----------
-----#----------
-----#----------
-----#----------
-----#----------
-----#----------
------#---------
-------#--------
--------#-------
---------#------
----------#-----
-----------#----
------------+---

Einheit "*" will zu Ziel "+".
"#" ist der Weg.

Es gibt natürlich zwei Wege (wenn man nicht im zickzack gehen will), aber wir geben mal vor, dass der "gerade" Weg Vorrang hat.

Mein Code dafür ist:

Code: [AUSKLAPPEN]

Graphics 800,600,32,1
SetBuffer BackBuffer()

Dim richtung(0,2)      ;gibt an wohin der Punkt bewegt werden soll (Punktnummer,[x/y]) = [-1/0/+1]
Dim position(0,1,1)      ;Position eines Männeken und seines Ziels (Punktnummer,[Ziel/Typ],[x/y])

position(0,0,0)=40
position(0,0,1)=30
position(0,1,0)=40
position(0,1,1)=30

MoveMouse 400,300

Global anzpunkte=1

ms=MilliSecs()

Repeat

 Delay 10
 Cls

 If MouseHit(1)
  position(0,1,0)=Floor(MouseX()/10)
  position(0,1,1)=Floor(MouseY()/10)
 EndIf

 If MilliSecs()=>ms
  ms=MilliSecs()+100
  punktebewegen
 EndIf

 Color 255,255,255
 Oval position(0,0,0)*10,position(0,0,1)*10,10,10
 Rect MouseX(),MouseY(),1,1
 Color 255,0,0
 Oval position(0,1,0)*10+2,position(0,1,1)*10+2,6,6


 Flip

Until KeyHit(1)

End




Function punktebewegen()      ;rechnet die x- und y-Richtungen aus

 For a=0 To anztypen-1
  xdif=position(a,1,0)-position(a,0,0)
  ydif=position(a,1,1)-position(a,0,1)

  xbewegen=0
  ybewegen=0
  If Abs(xdif)>Abs(ydif)
   xbewegen=1
  ElseIf Abs(ydif)>Abs(xdif)
   ybewegen=1
  Else
   xbewegen=1
   ybewegen=1
  EndIf

  If xdif=0
   xrichtung=0
  Else
   xrichtung=xbewegen*(xdif/Abs(xdif))
  EndIf

  If ydif=0
   yrichtung=0
  Else
   yrichtung=ybewegen*(ydif/Abs(ydif))
  EndIf

  position(a,0,0)=position(a,0,0)+xrichtung
  position(a,0,1)=position(a,0,1)+yrichtung

 Next

End Function

(keine Bilder erforderlich)

Confused Schwierig wirds erst, wenn man Hindernisse einbaut:
Code: [AUSKLAPPEN]

--------------
-----*##------
--------#-----
---------#----
----------#---
-----------#--
%%%%%%%%%%%%#-
------------#-
------------#-
------------#-
------------#-
-----------#--
----------#---
---------+----


Wie bringe ich das mit ein? Oder ist das vielleicht zu kompliziert?
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Nooby

BeitragSo, Apr 09, 2006 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Pardon
Fehler im Code... Rolling Eyes
Code: [AUSKLAPPEN]

Graphics 800,600,32,1
SetBuffer BackBuffer()

Dim richtung(0,2)      ;gibt an wohin der Punkt bewegt werden soll (Punktnummer,[x/y]) = [-1/0/+1]
Dim position(0,1,1)      ;Position eines Männeken und seines Ziels (Punktnummer,[Ziel/Punkt],[x/y])

position(0,0,0)=40
position(0,0,1)=30
position(0,1,0)=40
position(0,1,1)=30

MoveMouse 400,300

Global anzpunkte=1

ms=MilliSecs()

Repeat

 Delay 10
 Cls

 If MouseHit(1)
  position(0,1,0)=Floor(MouseX()/10)
  position(0,1,1)=Floor(MouseY()/10)
 EndIf

 If MilliSecs()=>ms
  ms=MilliSecs()+100
  punktebewegen
 EndIf

 Color 255,255,255
 Oval position(0,0,0)*10,position(0,0,1)*10,10,10
 Rect MouseX(),MouseY(),1,1
 Color 255,0,0
 Oval position(0,1,0)*10+2,position(0,1,1)*10+2,6,6


 Flip

Until KeyHit(1)

End




Function punktebewegen()      ;rechnet die x- und y-Richtungen aus

 For a=0 To anzpunkte-1
  xdif=position(a,1,0)-position(a,0,0)
  ydif=position(a,1,1)-position(a,0,1)

  xbewegen=0
  ybewegen=0
  If Abs(xdif)>Abs(ydif)
   xbewegen=1
  ElseIf Abs(ydif)>Abs(xdif)
   ybewegen=1
  Else
   xbewegen=1
   ybewegen=1
  EndIf

  If xdif=0
   xrichtung=0
  Else
   xrichtung=xbewegen*(xdif/Abs(xdif))
  EndIf

  If ydif=0
   yrichtung=0
  Else
   yrichtung=ybewegen*(ydif/Abs(ydif))
  EndIf

  position(a,0,0)=position(a,0,0)+xrichtung
  position(a,0,1)=position(a,0,1)+yrichtung

 Next

End Function

sorry
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

DC

Sieger des B2D Retro Wettbewerb / Aug 04

BeitragSo, Apr 09, 2006 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
... wieso benutzt du nicht einfach die editier-Funktion?!
Core i5 4670K | 4 x 3,40 GHZ | 16 GB Ram | GeForce GTX 960 | HTC Vive | Win 10 Pro
www.UnrealSoftware.de | www.StrandedOnline.de | www.CS2D.com |
www.CarnageContest.com | www.Stranded3.com

Hubsi

BeitragSo, Apr 09, 2006 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf www.blitzbase.de gibts eine Pathfinding-Routine. Das sollte genau das sein was Du brauchst Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group