[game] follow path
Publié : mer. 12/mars/2014 19:09
salut
En ce moment, je réalise un petit tower defense (pour android).
En gros, j'ai des mobs qui suivent un chemin.
J'utilise ça comme technique, je me demandais s'il y avait une technique mieux ou plus optimisée ?
Si vous avez une autre idée, un truc mieux ou plus optimisé, n'hésitez pas à poster
.
En ce moment, je réalise un petit tower defense (pour android).
En gros, j'ai des mobs qui suivent un chemin.
J'utilise ça comme technique, je me demandais s'il y avait une technique mieux ou plus optimisée ?
Code : Tout sélectionner
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Error", "Sprite system can't be initialized", 0)
End
EndIf
Structure Smob
x.d
y.d
node.a
speed.d
time.i
EndStructure
Global Dim Mob.sMob(15)
For i = 0 To 15
mob(i)\x = -100
mob(i)\y = 256
mob(i)\time = 80 * i
mob(i)\speed = 0.5 +Random(10)/10
Next i
Structure sNode
x.w
y.w
EndStructure
nbnode = 5
Global Dim Path.sNode(nbnode)
; j'ajoute les points du chemin pour tester
Path(0)\x = 0
path(0)\y = 256
Path(1)\x = 256
path(1)\y = 256
Path(2)\x = 256
path(2)\y = 384
Path(3)\x = 512
path(3)\y = 384
Path(4)\x = 512
path(4)\y = 256
Path(5)\x = 800
path(5)\y = 256
OpenWindow(0, 0, 0, 800, 600, "Path test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
EndIf
; le mob
w = 32
CreateSprite(0, w,w)
If StartDrawing(SpriteOutput(0))
Box(0,0,w,w,RGB(125,125,125))
StopDrawing()
EndIf
; le point du path
CreateSprite(1, 16,16)
If StartDrawing(SpriteOutput(1))
Box(0,0,16,16,RGB(255,255,125))
StopDrawing()
EndIf
Repeat
event = WindowEvent()
ClearScreen(RGB(60,60,60))
For i = 0 To nbnode
DisplaySprite(1, path(i)\x-8, path(i)\y-8)
Next i
For i = 0 To 15
If mob(i)\time <= 0
If mob(i)\x > path(mob(i)\node)\x
mob(i)\x - mob(i)\speed
If mob(i)\x < path(mob(i)\node)\x
mob(i)\x = path(mob(i)\node)\x
EndIf
ElseIf mob(i)\x < path(mob(i)\node)\x
mob(i)\x + mob(i)\speed
If mob(i)\x > path(mob(i)\node)\x
mob(i)\x = path(mob(i)\node)\x
EndIf
EndIf
If mob(i)\y > path(mob(i)\node)\y
mob(i)\y - mob(i)\speed
If mob(i)\y < path(mob(i)\node)\y
mob(i)\y = path(mob(i)\node)\y
EndIf
ElseIf mob(i)\y < path(mob(i)\node)\y
mob(i)\y + mob(i)\speed
If mob(i)\y > path(mob(i)\node)\y
mob(i)\y = path(mob(i)\node)\y
EndIf
EndIf
If mob(i)\y = path(mob(i)\node)\y And mob(i)\x = path(mob(i)\node)\x
If mob(i)\node < nbnode
mob(i)\node = mob(i)\node + 1
EndIf
EndIf
DisplaySprite(0, mob(i)\x-w/2, mob(i)\y-w/2)
Else
mob(i)\time = mob(i)\time - 1
EndIf
Next i
If StartDrawing(ScreenOutput())
For i = 0 To 15
;t$ = Str(Round(mob(i)\y,2) ) + "/" +Str( path(mob(i)\node)\y)
t$ = StrD(mob(i)\speed)
DrawText(mob(i)\x-w/2, mob(i)\y-w, t$)
Next i
StopDrawing()
EndIf
Delay(1)
FlipBuffers()
Until event = #PB_Event_CloseWindow
Si vous avez une autre idée, un truc mieux ou plus optimisé, n'hésitez pas à poster
