Createur de chemin pour Sprite
Createur de chemin pour Sprite
Petit exemple de creation de chemin pour sprite type Space invader
qui peut servir aussi faire defiler un texte !!!
voir le code plus bas !! reediter le 21/11/2004 !!
qui peut servir aussi faire defiler un texte !!!
voir le code plus bas !! reediter le 21/11/2004 !!
Dernière modification par Backup le dim. 21/nov./2004 13:06, modifié 2 fois.
Ca y est, t'as gouté au modernisme.
Fini le ZX81
C'est bien, ton truc, mais il y a un autre moyen, que ceux qui ont déjà fait des maps pour des jeux comme Unreal ou Half-Life connaissent. C'est la pose de points de passage (waypoints).
Tu poses des points à une certaine distance les uns des autres, ce qui définit un chemin que les bots (les joueurs commandés par l'ordinateur)suivent.
Quand il y a le choix entre plusieurs directions possibles pour une même destination, tu poses un point à la bifurcation, et des points dans toutes les directions possibles, puis tu attribues une valeur à chaque direction, selon le bénéfice ou le handicap que tu veux lui donner.
Si les valeurs sont assez proches l'une de l'autre, et que le bot ne voit pas le joueur, il suivra l'une ou l'autre direction de manière aléatoire, mais toujours avec l'intention de se retrouver au même endroit que le joueur humain pour lui peter la tronche.
Par contre, si il le "voit", il suivra le chemin le plus direct.
J'avais commencé à faire un truc, un peu dans ce genre là, mais je l'ai laissé en plan, comme beaucoup d'autres
L'avantage, par rapport à ta méthode, c'est qu'il n'y a pas une multitude de points à gérer. Tu peux couvrir une map complète avec seulement une centaine de waypoints.
C'est le genre de système qui pourrait être utilisé en 2D, dans un jeu de style Pacman, par exemple.
Chris
Fini le ZX81

C'est bien, ton truc, mais il y a un autre moyen, que ceux qui ont déjà fait des maps pour des jeux comme Unreal ou Half-Life connaissent. C'est la pose de points de passage (waypoints).
Tu poses des points à une certaine distance les uns des autres, ce qui définit un chemin que les bots (les joueurs commandés par l'ordinateur)suivent.
Quand il y a le choix entre plusieurs directions possibles pour une même destination, tu poses un point à la bifurcation, et des points dans toutes les directions possibles, puis tu attribues une valeur à chaque direction, selon le bénéfice ou le handicap que tu veux lui donner.
Si les valeurs sont assez proches l'une de l'autre, et que le bot ne voit pas le joueur, il suivra l'une ou l'autre direction de manière aléatoire, mais toujours avec l'intention de se retrouver au même endroit que le joueur humain pour lui peter la tronche.

Par contre, si il le "voit", il suivra le chemin le plus direct.
J'avais commencé à faire un truc, un peu dans ce genre là, mais je l'ai laissé en plan, comme beaucoup d'autres


L'avantage, par rapport à ta méthode, c'est qu'il n'y a pas une multitude de points à gérer. Tu peux couvrir une map complète avec seulement une centaine de waypoints.
C'est le genre de système qui pourrait être utilisé en 2D, dans un jeu de style Pacman, par exemple.
Chris

oui les points de passage je connais !!
moi je l'applique pour la 3D (Darkbasic)
la j'ai precisé dans le style de space invader l'attaque des ennemies !!!
les courbes etant dessinées a la main c'est plus facile de "délirer"
tu peut mem creer des pauses, des sauts (teleportation)
en arretant de cliquer bouton gauche , tu deplace ta souris tu reclick bouton gauche , tu dessine a nouveau , et tu sauve
pour moi le coté sympath c'est le cote naturel du mouvement
j'appel cette methode "l'echantillonage humain !!"
ce genre d'editeur existait dans le "Stos Basic"
puis pour faire des defilé de text style "DemoMaker"
ou pour faire defiler une ribambelle de Boules (sphere)
pour une demo !!!
le but de ceci est surtout d' apprendre au debutant a gerer
un fichier et a afficher des sprite pour les jeux !!

moi je l'applique pour la 3D (Darkbasic)
la j'ai precisé dans le style de space invader l'attaque des ennemies !!!
les courbes etant dessinées a la main c'est plus facile de "délirer"
tu peut mem creer des pauses, des sauts (teleportation)
en arretant de cliquer bouton gauche , tu deplace ta souris tu reclick bouton gauche , tu dessine a nouveau , et tu sauve
pour moi le coté sympath c'est le cote naturel du mouvement
j'appel cette methode "l'echantillonage humain !!"
ce genre d'editeur existait dans le "Stos Basic"
puis pour faire des defilé de text style "DemoMaker"
ou pour faire defiler une ribambelle de Boules (sphere)
pour une demo !!!
le but de ceci est surtout d' apprendre au debutant a gerer
un fichier et a afficher des sprite pour les jeux !!

- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
tiens voici un exemple qui reprend les 2 modes !!!
si tu click a 4,ou 5,6,7 bref ! endroit different et qu'en plus tu fait des courbes
le sprite ira d'un point clicker a un autre , et lorsqu'il rencontrera une courbe dessiné il la suivra !!
bref les 2 mode dans le meme chemin !!!
voici le code :
CE CODE A ETE REEDITER APRES CORRECTION LE 21/11/2004
si tu click a 4,ou 5,6,7 bref ! endroit different et qu'en plus tu fait des courbes
le sprite ira d'un point clicker a un autre , et lorsqu'il rencontrera une courbe dessiné il la suivra !!
bref les 2 mode dans le meme chemin !!!

voici le code :
CE CODE A ETE REEDITER APRES CORRECTION LE 21/11/2004
Code : Tout sélectionner
; code : Dobro
; Rapport de bug : Le Soldat inconnu (Merci ! )
; Exemple de creation d'un chemin pour jeux video 2D
; du Type Space invader
; Mode DESSIN CONTINU
; dessinez avec le bouton gauche de la souris
; tenir cliqué pendant tout le temps du dessin
; Mode dessin "PATH FINDING"
; maintenir cliqué puis faire une petite trace pour arrondir les angles ou un seul click !!
; relacher puis a nouveau ailleurs dans l'ecran recommencer
; fin du dessin avec le bouton droit de la souris
; automatiquement le sprite repasse sur le chemin dessiné !!
#Police=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello")
WindowID = WindowID(1)
Result = OpenWindowedScreen(WindowID,0,0, 640,480, 1, 0,0)
Resultat = InitMouse()
NewList liste1() :;cree une liste
Resultat = CreateSprite(2, 10, 10, 0) :;on cree un sprite
StartDrawing( SpriteOutput(2) ) : ; on va dessiner une boite verte dans le sprite
Box(0, 0, 10, 10 ,RGB(0,255,0) )
StopDrawing() :; voila c'est fait notre sprite est pret !!
Repeat
Resultat = ExamineMouse()
Event=WaitWindowEvent() :;multitache !!
DisplaySprite(2, MouseX(), MouseY())
;ClearScreen(0, 0, 0) :;efface l'ecran
;******************* GENERATEUR DE CHEMIN **********************
;**********************************************************************
;************************** PHASE 1 ***********************************
; dessin et enregistrement des coordonnes dans un fichier ***********
;************* "chemin.ini *******************************************
;**********************************************************************
;**********************************************************************
If MouseButton(1): ;enregistre les coordonees dessiné
AddElement(liste1()) :; ajoute coordonee x a la liste
liste1()= MouseX()
AddElement(liste1()) :; ajoute coordonnee y a la liste
liste1()= MouseY()
StartDrawing( SpriteOutput(2) )
Box(0, 0, 10, 10 ,RGB(255,0,0) )
StopDrawing()
FlipBuffers():; affiche l'ecran
EndIf
If MouseButton(2):; stop l'enregistrement
; ********* Cree le fichier qui contien les coordonnees
Resultat = CreateFile(1,"chemin.ini")
ResetList(liste1()) :; on se place avant le premier element de la liste
While NextElement(liste1()):; boucle tant que la liste n'est pas fini
WriteWord(liste1())
Wend
CloseFile(1)
dess=1
EndIf
;**********************************************************************
;*********************CECI peut etre dans le programe de jeux **********
;************************** PHASE 2 ***********************************
; ****************** Lecture des coordonnes dans un fichier ***********
;************* "chemin.ini *******************************************
;**********************************************************************
;**********************************************************************
If dess=1
NewList chemin() :;cree une liste
Resultat = OpenFile(1, "chemin.ini")
While Eof(1)=0 :; tant que fin de fichier pas atteinte
coordx = ReadWord() :;lit la coordonee x
coordy = ReadWord() :;lit la coordonee y
AddElement(chemin()) :; ajoute coordonee x a la liste
chemin()= coordx
AddElement(chemin()) :; ajoute coordonnee y a la liste
chemin()= coordy
Wend
Resultat = CreateSprite(1, 10, 10, 0) :;on cree un sprite
StartDrawing( SpriteOutput(1) ) : ; on va dessiner une boite verte dans le sprite
Box(0, 0, 10, 10 ,RGB(0,255,0) )
StopDrawing() :; voila c'est fait notre sprite est pret !!
nbr=CountList(chemin())
ResetList(chemin()) :; on se place avant le premier element de la liste
For i=0 To nbr Step 2 ;boucle tant que la liste n'est pas fini
SelectElement(chemin(),i)
; ASTUCE : le step 2 fait que les coordonnes d'arrivé deviennent les coordonées de depart !
; ********* Cree le fichier qui contien les coordonnees
x=chemin() :; lit d'abord la coordonee x
SelectElement(chemin(),i+1):; passe a la donnee suivante dans la liste
y=chemin():; lit la coordonnee y
SelectElement(chemin(),i+2):; passe a la donnee suivante dans la liste
x2=chemin() :; lit d'abord la coordonee x
SelectElement(chemin(),i+3):; passe a la donnee suivante dans la liste
y2=chemin():; lit la coordonnee y
; Boucle pour le path finding (faire une petite trace a chaque click !! pas seulement un point !)
cour=1 ; force a regarder si les coordonne d'arriver sont different des coordonées de depart !
While cour=1 : ; on regarde !
If x<x2:x=x+1:cour=1: DisplaySprite(1, x, y):FlipBuffers(): ClearScreen(0, 0, 0) :EndIf
If x>x2:x=x-1:cour=1: DisplaySprite(1, x, y):FlipBuffers(): ClearScreen(0, 0, 0) :EndIf
If y<y2:y=y+1:cour=1: DisplaySprite(1, x, y):FlipBuffers(): ClearScreen(0, 0, 0) :EndIf
If y>y2:y=y-1:cour=1: DisplaySprite(1, x, y):FlipBuffers(): ClearScreen(0, 0, 0) :EndIf
If x=x2 And y=y2 ; le sprite est arrivé a destination !
cour=0 ; sort de la boucle de dessin du sprite sur les points de passage !
EndIf
Wend
Next i
End
EndIf
If MouseButton(1)=0
StartDrawing( SpriteOutput(2) )
Box(0, 0, 10, 10 ,RGB(0,255,0) )
StopDrawing()
FlipBuffers():; affiche l'ecran
ClearScreen(0, 0, 0) :;efface l'ecran
EndIf
;
Until Event=#PB_Event_CloseWindow
Dernière modification par Backup le dim. 21/nov./2004 13:05, modifié 1 fois.