Page 1 sur 1

Createur de chemin pour Sprite

Publié : jeu. 03/juin/2004 0:26
par Backup
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 !!

Publié : jeu. 03/juin/2004 0:59
par Chris
Ca y est, t'as gouté au modernisme.

Fini le ZX81 :lol:

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. :lol:

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 :lol: :oops:

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 :)

Publié : jeu. 03/juin/2004 1:29
par Backup
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 !!

:D

Publié : jeu. 03/juin/2004 1:32
par Chris
Ah, mais j'ai pas dit que c'était pas bien, ton systeme.

Ca peut avoir aussi ses avantages. C'est une autre façon de faire, voilà tout :wink:

Chris :)

Publié : jeu. 03/juin/2004 1:34
par Backup
j'ai pas dit que tu avait dit que c'etait pas bien !! :D

Publié : jeu. 03/juin/2004 1:55
par Chris
J'ai pas dit que tu avais dit que j'avais pas dit.... non, c'est pas ça ! 8O
j'ai pas dit que tu avais pas dit que .... non, c'est pas ça non plus! :x
j'ai pas dit que j'avais dit que... Oh.. puis merde..... !!!! :mad:

Chris :)

Publié : jeu. 03/juin/2004 2:05
par Backup
:lol: :lol: :lol:


tu dors pas toi il est 3 heures du mat !!!
t'es comme moi t'es tombé du lit ???
:D

Publié : jeu. 03/juin/2004 9:23
par cederavic
Purebasic c'est une vrai drogue!!! :lol:

Publié : jeu. 03/juin/2004 9:26
par Crystal Noir
Je serais curieux de voir un exemple simple de waypoints...

Publié : jeu. 03/juin/2004 9:39
par cederavic
regarde sur le musée, il me semble que j'en avais fait un (et d'autre aussi)

Publié : jeu. 03/juin/2004 10:24
par Backup
tu reprend mon exemple plus haut et au lieu de tracer plein de points
tu en trace que 5 ou 6 puis tu rajoute une boucle pour que le sprite se deplace lineairement entre les points dessiné !!
ya juste cette boucle a rajouter !!!
:D

Publié : jeu. 03/juin/2004 11:14
par Backup
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 !!! :D
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

Publié : ven. 04/juin/2004 18:09
par Patrick88
j'ose plus venir sur ce forum, c'est devenu trop balaise.... :oops:
à chaque fois je prends une claque....

patrick

Publié : ven. 04/juin/2004 18:18
par Backup
tu rigole !! regarde bien comment c'est fait apres une ou 2 lectures
tu verra c'est tout con !! c'est de l'esbrouffe !!! :D :D
j'ai meme pas utilisé les structures et autres machin du genre ! :)

Publié : ven. 04/juin/2004 19:08
par Anonyme2
Dobro a écrit : j'ai meme pas utilisé les structures et autres machin du genre ! :)
Allez, le plus dur c'est de commencer :mrgreen: :mrgreen: :mrgreen: