Mon espèce de "jeu" :]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Xpetera
Messages : 52
Inscription : sam. 02/févr./2008 22:25

Mon espèce de "jeu" :]

Message par Xpetera »

Salut à tous


voilà j'ai fait une espèce de "jeu" bizarre sans vraiment de sens :

Le zip des images et là : http://bb.xieke.com/files/images.zip

Il faut une lib spéciale je ne sais plus laquelle pour la fonction SetWinBackgroundImage

Code : Tout sélectionner

Enumeration
#imgfond
#imgpersonne
#imgvoiture

#imper
#deadppl
#forclick
#imgclk
EndEnumeration
UsePNGImageDecoder()
Global imgfond
Global imgpersonne
Global voiture
imgfond = CatchImage(#imgfond,?imgfond)
imgpersonne = CatchImage(#imgpersonne,?imgpersonne)
voiture = CatchImage(#imgvoiture,?voiture)


timer1 = ElapsedMilliseconds()
timer2 = ElapsedMilliseconds()
timer3 = ElapsedMilliseconds()
timer4 = ElapsedMilliseconds()
DataSection
imgfond: 
IncludeBinary "I:\Documents and Settings\dorian\Mes documents\Mes Images\snipergame\fond.bmp"
imgpersonne:
IncludeBinary "I:\Documents And Settings\dorian\Mes documents\Mes Images\snipergame\personne.png"
voiture:
IncludeBinary "I:\Documents And Settings\dorian\Mes documents\Mes Images\snipergame\voiture.PNG"

EndDataSection

OpenWindow(0,150,150,300,200,"w1")
CreateGadgetList(WindowID(0) )


CreateImage(#imgclk,21,23)

ImageGadget(#imper,-20,5,50,50,ImageID(#imgpersonne),#PB_EventType_LeftClick)
SetWinBackgroundImage(WindowID(0),ImageID(#imgfond))
ImageGadget(4,290,66,114,62,ImageID(#imgvoiture),#PB_EventType_LeftClick)


Repeat
event = WindowEvent()



timer_1 = ElapsedMilliseconds()-timer1
timer_2 = ElapsedMilliseconds()-timer2
timer_3 = ElapsedMilliseconds()-timer3
timer_4 = ElapsedMilliseconds()-timer4
If timer_1 > 100

ResizeGadget(#imper,GadgetX(#imper)+5,GadgetY(#imper),#PB_Ignore,#PB_Ignore)

timer1 = ElapsedMilliseconds()
EndIf

If timer_2 > 15956
HideGadget(#imper,0)
ResizeGadget(#imper,-20,5,#PB_Ignore,#PB_Ignore)
timer2 = ElapsedMilliseconds()
EndIf

If timer_3 > 100

ResizeGadget(4,GadgetX(4)-10,GadgetY(4),#PB_Ignore,#PB_Ignore)
timer3 = ElapsedMilliseconds()
EndIf

If timer_4 > 32265
ResizeGadget(4,290,66,#PB_Ignore,#PB_Ignore)
timer4 = ElapsedMilliseconds()
EndIf

If event = #PB_Event_Gadget
Select EventGadget()
Case #imper
x_ligne = GadgetX(#imper)+30+Random(30)
y_ligne = 5+Random(50)


x_ligne2 = GadgetX(#imper)+30+Random(30)
y_ligne2 = 5+Random(50)

x_cercle = GadgetX(#imper)+30+Random(30)
y_cercle = GadgetY(#imper)+Random(30)


x_pointsang = GadgetX(#imper)




HideGadget(#imper,1)

StartDrawing(WindowOutput(0))
For i = 0 To 300
Plot(x_pointsang+30+Random(40),5+Random(40),RGB(255,10,10))
Next





LineXY(x_ligne,y_ligne,x_ligne+Random(15),y_ligne+Random(15))


LineXY(x_ligne2,y_ligne2,x_ligne2+Random(15),y_ligne2+Random(15))


LineXY(x_ligne,y_ligne,x_ligne+Random(15),y_ligne+Random(15))


LineXY(x_ligne2,y_ligne2,x_ligne2+Random(15),y_ligne2+Random(15))


Circle(x_cercle,y_cercle,10)
Delay(150)



StopDrawing()

Case 4
For i = 0 To 15
ResizeGadget(4,GadgetX(4)-5,GadgetY(4)+5,#PB_Ignore,#PB_Ignore)
Delay(50)
Next
EndSelect


EndIf

Until event = #WM_CLOSE

Bon désolé pour ceux qui veulent lire attentivement la source , le code est sale et pas commenté :(


Comme vous le voyez j'ai un problème avec les images , et comme je ne sais pas gérer les sprites qui a mon avis seraient mieux pour ça , j'ai essayé de la transparence avec PNG mais ca ne marche pas , je ne sais pas comment régler ça. :(
Dernière modification par Xpetera le dim. 11/mai/2008 11:48, modifié 1 fois.
didier69
Messages : 61
Inscription : mer. 30/avr./2008 12:50
Localisation : Villeurbanne (Lyon)

Message par didier69 »

Hum, SetWinBackgroundImage() est introuvable ...
pb 5.31
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Mon espèce de "jeu" :]

Message par Backup »

Xpetera a écrit : Comme vous le voyez j'ai un problème avec les images , et comme je ne sais pas gérer les sprites qui a mon avis seraient mieux pour ça , j'ai essayé de la transparence avec PNG mais ca ne marche pas , je ne sais pas comment régler ça. :(
tu repond toi meme :)

met toi aux sprite , c'est tres facile !!
en plus il y a des Tuto en rubrique debutant :D

il faut retenir qu'un sprite en pure basic est en fait une cellule vide
un "cadre" dans lequel on utilise les fonctions de la librairie 2D pour dessiner ce que l'on veux dedans !! y compris une image chargé auparavant !!

ensuite cette cellule , tu peux la placer ou tu veux sur l'ecran, ou bien, lui affecter des effets de transparence ou de rotations..

les fonctions Sprite sont relatives a cette petite cellule que tu aura créé
donc tu pourra detecter une collision, ou bien la mettre hors de l'ecran , la faire reaparaitre, bref la cellule "Sprite" contenant ton dessin ou ton image
pourra etre manipulé a souhaits :D


si vraiment tu coince on te fera un tuto sur les sprites rien que pour toi , suffis d'abord d'essayer :D


tiens un exemple simple utilisant un sprite
dans lequel je dessine un rond rouge :D

Code : Tout sélectionner


#dobro =1
#Police =1
#sprite=1

InitKeyboard () : ; j'espere qu'il y a un clavier au moins !!
Resultat = InitSprite () ; initialisation de la gestion des  Sprites par Purebasic

; ************** definition des variables ****************
EcranX = 800
EcranY = 600
; ***************************************************


; *********** ouvre une fenetre aucentre de l'ecran sans bordure, mais ayant la petite croix pour fermer *****************
WindowID = OpenWindow (1, 0, 0,EcranX, EcranY, "hello" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
; **************************************************************************************************

;********** placement d'un ecran graphique dans notre fenetre préalablement crée *************************    
Result = OpenWindowedScreen ( WindowID (1),0,0, EcranX,EcranY, 1, 0,0)
; *****************************************************************************************
    
; ******* creation d'un sprite ************
If CreateSprite (1,32,32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
    StartDrawing ( SpriteOutput (#sprite) ) ; on va dessiner dedans !
        Circle (16,16,16, RGB (255,0,0)) ; on dessine un cercle rouge
    StopDrawing ()
EndIf
    ; ******************************************

; ********* preparation du point de depart de notre sprite *************************
x_sprite=EcranX/2 ; on centre les coordonées du sprite
y_sprite=EcranY/2 ; on centre les coordonées du sprite
    ; **************************************************************************
    
    
Repeat  ;*********  debut de boucle principale  **************************
    
    ExamineKeyboard (); on regarde si le clavier a ete touché par l'utilisateur 
    
    
    ; ************************ ecriture dans l'ecran *********************
    StartDrawing ( ScreenOutput ()) ; on va ecrire dans le fond de l'ecran
        Resultat = DrawText (50, 50, "appuyez sur les touches flechées" , RGB (255,255,0), RGB (0,0,0) )
        Resultat = DrawText (50, 150, "pour faire bouger le sprite" , RGB (255,255,0), RGB (0,0,0) )
    StopDrawing ()
    ; ******************************************************************
    
    ; le clavier a ete touché !!! 
    ; ********** gestion du clavier ***********************************
    If KeyboardPushed ( #PB_Key_Up ) ; press touche fleche haut
        Debug "press touche haut"
        y_sprite= y_sprite-1 ; diminue la coordonée Y du sprite 
    EndIf
    If KeyboardPushed ( #PB_Key_Down ) ; press touchefleche bas
        Debug " press touche bas"
        y_sprite= y_sprite+1 ; augmente la coordonée Y du sprite 
    EndIf
    If KeyboardPushed ( #PB_Key_Left ) ; press touche flechegauche
        Debug " press touche gauche"
        x_sprite= x_sprite-1  ; diminue la coordonée x du sprite 
    EndIf
    If KeyboardPushed ( #PB_Key_Right ) ; press touche flechedroit
        Debug " press touche droit"
        x_sprite= x_sprite+1  ; diminue la coordonée X du sprite 
    EndIf
    ; ****************************************************************
    
    
    ; ******* affichage du sprite ****************************************
    DisplaySprite (#sprite, x_sprite, y_sprite) ; affiche le sprite au coordonées modifié par les touches
    ; ****************************************************************
    
    ; *************** affiche l'ecran ********************************
    FlipBuffers (): ; affiche l'ecran
    ; **************************************************************
    
    
    ; **** ok on nettoie pour le prochain affichage **********************
    ClearScreen ( RGB (0, 0, 0)) : ;efface l'ecran
    ; ***************************************************************
    
    Event= WindowEvent ()
    Delay (2)
Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press touche droit 
remarque la facilité avec lequel on cree un sprite

Code : Tout sélectionner

; ******* creation d'un sprite ************
If CreateSprite (1,32,32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1 (#sprite)
    StartDrawing ( SpriteOutput (#sprite) ) ; on va dessiner dedans !
        Circle (16,16,16, RGB (255,0,0)) ; on dessine un cercle rouge
    StopDrawing ()
EndIf
    ; ******************************************
les fonction de dessin sont les meme que pour ecrire sur l'ecran mais


StartDrawing ( SpriteOutput (#sprite)
elle sont redirigé vers la cellule sprite !! :D

notre cellule (sprite) contenant notre dessin 2D rond Rouge
peut ensuite etre placer ou l'on veut :D

Code : Tout sélectionner

DisplaySprite (#sprite, x_sprite, y_sprite)
plus simple , tu meurt !! :lol:

j'ajoute que :

un sprite peut aussi servir pour le ou les fond d'ecran !!
puisque les sprites les premier affichés, sont les plus Profond dans l'ecran

une particularité de Purebasic c'est qu'un sprite n'est pas un objet !!
il peut etre present a different endroit de l'ecran en meme temps !! :)
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Re: Mon espèce de "jeu" :]

Message par Le psychopathe »

Dobro a écrit :
Xpetera a écrit : une particularité de Purebasic c'est qu'un sprite n'est pas un objet !!
il peut etre present a different endroit de l'ecran en meme temps !! :)
Tu peux expliquer car là je comprends pas trop.
Tu dédoubles les sprites ?
Xpetera
Messages : 52
Inscription : sam. 02/févr./2008 22:25

Message par Xpetera »

Ok c'est ce que je pensais , les images directes ne sont pas adaptées pour des programmes du genre. ^^ encore un fois merci Dobro tu règles encore mon problème xD
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Mon espèce de "jeu" :]

Message par Backup »

Le psychopathe a écrit : une particularité de Purebasic c'est qu'un sprite n'est pas un objet !!
il peut etre present a different endroit de l'ecran en meme temps !
! :)

Tu peux expliquer car là je comprends pas trop.
Tu dédoubles les sprites ?
oui !!
voici le meme exemple que tout a l'heure mais en utilisant 2 DisplaySprite avec la meme image

DisplaySprite (#sprite, x_sprite, y_sprite) ; affiche le sprite au coordonées modifié par les touches
DisplaySprite (#sprite, x_sprite+50, y_sprite+50)
dans un basic ordinaire un sprite est un objet, qui ne peut etre qu'a un seul endroit de l'ecran a un moment donné!! comme en Dark Basic par exemple :)

en purebasic une fois que la cellule (sprite) est crée, elle peut etre affiché autant de fois que l'on veux !!

ce qui permet avec une seule cellule ayant un dessin d'etoile
de repeter cette cellule dans tout l'ecran pour faire l'univers :D

s'il on veux pouvoir utiliser les collision, il faut cependant utiliser un INDICE de sprite different :)

mais temps que l'on fait de l'affichage , un seul sprite ayant une image peut etre mis autant de fois que l'on veux a l'ecran :)

EXEMPLE : je repete le rond rouge seulement en l'affichant a 2 endroits en meme temps :D


Code : Tout sélectionner


#dobro =1
#Police =1
#sprite=1

InitKeyboard () : ; j'espere qu'il y a un clavier au moins !!
Resultat = InitSprite () ; initialisation de la gestion des  Sprites par Purebasic

; ************** definition des variables ****************
EcranX = 800
EcranY = 600
; ***************************************************


; *********** ouvre une fenetre aucentre de l'ecran sans bordure, mais ayant la petite croix pour fermer *****************
WindowID = OpenWindow (1, 0, 0,EcranX, EcranY, "hello" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
; **************************************************************************************************

;********** placement d'un ecran graphique dans notre fenetre préalablement crée *************************    
Result = OpenWindowedScreen ( WindowID (1),0,0, EcranX,EcranY, 1, 0,0)
; *****************************************************************************************
    
; ******* creation d'un sprite ************
If CreateSprite (1,32,32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
    StartDrawing ( SpriteOutput (#sprite) ) ; on va dessiner dedans !
        Circle (16,16,16, RGB (255,0,0)) ; on dessine un cercle rouge
    StopDrawing ()
EndIf
    ; ******************************************

; ********* preparation du point de depart de notre sprite *************************
x_sprite=EcranX/2 ; on centre les coordonées du sprite
y_sprite=EcranY/2 ; on centre les coordonées du sprite
    ; **************************************************************************
    
    
Repeat  ;*********  debut de boucle principale  **************************
    
    ExamineKeyboard (); on regarde si le clavier a ete touché par l'utilisateur 
    
    
    ; ************************ ecriture dans l'ecran *********************
    StartDrawing ( ScreenOutput ()) ; on va ecrire dans le fond de l'ecran
        Resultat = DrawText (50, 50, "appuyez sur les touches flechées" , RGB (255,255,0), RGB (0,0,0) )
        Resultat = DrawText (50, 150, "pour faire bouger le sprite" , RGB (255,255,0), RGB (0,0,0) )
    StopDrawing ()
    ; ******************************************************************
    
    ; le clavier a ete touché !!! 
    ; ********** gestion du clavier ***********************************
    If KeyboardPushed ( #PB_Key_Up ) ; press touche fleche haut
        Debug "press touche haut"
        y_sprite= y_sprite-1 ; diminue la coordonée Y du sprite 
    EndIf
    If KeyboardPushed ( #PB_Key_Down ) ; press touchefleche bas
        Debug " press touche bas"
        y_sprite= y_sprite+1 ; augmente la coordonée Y du sprite 
    EndIf
    If KeyboardPushed ( #PB_Key_Left ) ; press touche flechegauche
        Debug " press touche gauche"
        x_sprite= x_sprite-1  ; diminue la coordonée x du sprite 
    EndIf
    If KeyboardPushed ( #PB_Key_Right ) ; press touche flechedroit
        Debug " press touche droit"
        x_sprite= x_sprite+1  ; diminue la coordonée X du sprite 
    EndIf
    ; ****************************************************************
    
    
    ; ******* affichage du sprite ****************************************
    DisplaySprite (#sprite, x_sprite, y_sprite) ; affiche le sprite au coordonées modifié par les touches
    DisplaySprite (#sprite, x_sprite+50, y_sprite+50)
    
    ; ****************************************************************
    
    ; *************** affiche l'ecran ********************************
    FlipBuffers (): ; affiche l'ecran
    ; **************************************************************
    
    
    ; **** ok on nettoie pour le prochain affichage **********************
    ClearScreen ( RGB (0, 0, 0)) : ;efface l'ecran
    ; ***************************************************************
    
    Event= WindowEvent ()
    Delay (2)
Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press touche droit 
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

OK merci, j'étais resté bloqué dans le modèle darkbasic ;)
autant pour moi
Xpetera
Messages : 52
Inscription : sam. 02/févr./2008 22:25

Message par Xpetera »

Bon désolé y'a plein de topics dessus , mais je comprend pas avec les sprites les collisions , avec la fonction SpriteCollision je comprend pas le fonctionnement des param' x1 , x2 et y1 y2 , a quoi ils servent ?? merci pour ceux qui m'expliqueront :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Xpetera a écrit :Bon désolé y'a plein de topics dessus , mais je comprend pas avec les sprites les collisions , avec la fonction SpriteCollision je comprend pas le fonctionnement des param' x1 , x2 et y1 y2 , a quoi ils servent ?? merci pour ceux qui m'expliqueront :D
c'est pourtant clair
Resultat = SpriteCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)
Description

Teste si les deux Sprites se chevauchent. Si ce n'est pas le cas, Resultat = 0. La hauteur et la largeur des sprites sont déjà connues de Purebasic, seules les coordonnées x et y de chaque sprite sont nécessaires.

Cette fonction teste une zone rectangulaire, ce qui la rend rapide mais peu précise, mais cependant très utile dans des jeux d'arcade.
la fonction regarde si les coordonés x1 et y1 du #sprite1 correspond aux coordonées X2 et y2 du #sprite2


voici un petit exemple (j'utilise ici les Structures, mais je te ferai un autre exemple plus simple)


; Collisions
; codé par Dobro
rezx=1024
rezy=768
nombre_sprite=300


#sprite =0
#Fenetre =1
Structure etoile
    x.l
    y.l
    sensy.l
    sensx.l
    Couleur.l
EndStructure
Dim etoile.etoile(1001)



InitMouse ()
InitSprite ()
InitKeyboard ()
OpenWindow ( #Fenetre , 1,1,rezx, rezy, "clicker pour dessiner , click droit pour sortir" , #PB_Window_SystemMenu ) ; on ouvre une fenetre
OpenWindowedScreen ( WindowID ( #Fenetre ) , 0, 0,rezx, rezy, 1, 1, 1) ; on met un ecran dedans !!

CreateSprite ( #sprite ,4,4)
StartDrawing ( SpriteOutput ( #sprite ))
Circle (2, 2, 2 , RGB (0,255,255))
StopDrawing ()

For i=0 To nombre_sprite
    etoile(i)\x= Random (rezx)
    etoile(i)\y= Random (rezy)
    etoile(i)\sensy=2
    etoile(i)\sensx=2
    etoile(i)\Couleur= RGB ( Random (rezy) , Random (rezy) , Random (rezy) )
     CreateSprite (i,4,4)
     StartDrawing ( SpriteOutput (i))
     Circle (2, 2, 2 , RGB ( Random (255), Random (255), Random (255)))
     StopDrawing ()
Next i



Repeat
    Event= WindowEvent ()
    
     For i=0 To nombre_sprite
         ExamineKeyboard ()
        etoile(i)\y=etoile(i)\y+etoile(i)\sensy
         etoile(i)\x=etoile(i)\x+etoile(i)\sensx
         If etoile(i)\y> rezy :etoile(i)\sensy=-etoile(i)\sensy: EndIf
         If etoile(i)\y< 0 :etoile(i)\sensy=-etoile(i)\sensy: EndIf
        
         If etoile(i)\x> rezx :etoile(i)\sensx=-etoile(i)\sensx: EndIf
         If etoile(i)\x< 0 :etoile(i)\sensx=-etoile(i)\sensx: EndIf
        
        
         DisplaySprite (i,etoile(i)\x,etoile(i)\y)

         For o=0 To nombre_sprite
             If SpriteCollision (o, etoile(o)\x, etoile(o)\y,i, etoile(i)\x,etoile(i)\y)
                etoile(i)\sensx=-etoile(i)\sensx
                etoile(i)\sensy=-etoile(i)\sensy
                etoile(o)\sensx=-etoile(o)\sensx
                etoile(o)\sensy=-etoile(o)\sensy
         EndIf
     Next o
        
        
     Next i
     FlipBuffers (1) ;
     ClearScreen ( RGB (0,0,0))
Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_All ) ;
Dernière modification par Backup le dim. 11/mai/2008 23:54, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

autre exemple :D


#dobro =1
#Police =1
#brique =1
#ball =2
; ***********************************
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, "hello" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    
     WindowID = WindowID (1)
    Result = OpenWindowedScreen ( WindowID ,0,0, EcranX, EcranY, 1, 0,0)
    
    
     ; creation d'un Sprite
     CreateSprite ( #brique , 350, 150) ; cree un sprite brique
     StartDrawing ( SpriteOutput ( #brique ) ) ; on dessine dedans
         Box (0, 0, 350, 150, RGB (255,0,255) ) ; un carre violet
     StopDrawing ()
    
     CreateSprite ( #ball , 32, 32) ; cree un sprite ball
     StartDrawing ( SpriteOutput ( #ball ) ) ; on dessine dedans
         Circle (16,16, 16 , RGB (255,255,255) )
     StopDrawing ()
    
    Resultat = InitMouse ()
    
    xpas=20
    ypas=10
    xb=100
    yb=450
    xbrique=EcranX/2-150
    ybrique=EcranY/2-50
     Repeat
         ExamineMouse ()
        Event= WindowEvent ()
         Delay (1)
         If MouseButton (2)
             End
         EndIf
        
        xb=xb+xpas
        yb=yb+ypas
        
        
         DisplaySprite ( #ball , xb,yb) ; affiche la balle
         DisplaySprite ( #brique , xbrique,ybrique) ; affiche la brique
        
         If xb>EcranX-20 : xpas=-xpas: EndIf
         If xb<4 : xpas=-xpas: EndIf
         If yb>EcranY-20 :ypas=-ypas: EndIf
         If yb<4 :ypas=-ypas: EndIf
        
         If SpriteCollision ( #ball , xb, yb, #brique , xbrique, ybrique)<>0 And xb<xbrique
             StartDrawing ( SpriteOutput ( #brique ) ) ; on dessine dedans
                 DrawText (1,1, "touche a gauche " )
             StopDrawing ()
            xpas= Random (5)+2
            xpas=-xpas
             Goto su ; sort du test !!!
         EndIf
         If SpriteCollision ( #ball , xb, yb, #brique , xbrique, ybrique)<>0 And xb>xbrique+330
             StartDrawing ( SpriteOutput ( #brique ) ) ; on dessine dedans
                 DrawText (1,1, "touche a droite " )
             StopDrawing ()
            xpas= Random (5)+2
            
             Goto su ; sort du test !!!
         EndIf
        
         If SpriteCollision ( #ball , xb, yb, #brique , xbrique, ybrique)<>0 And yb<ybrique
             StartDrawing ( SpriteOutput ( #brique ) ) ; on dessine dedans
                 DrawText (1,1, "touche au dessus " )
             StopDrawing ()
            
            ypas=-ypas
             Goto su ; sort du test !!!
            
         EndIf
         If SpriteCollision ( #ball , xb, yb, #brique , xbrique, ybrique)<>0 And yb>ybrique+130
             StartDrawing ( SpriteOutput ( #brique ) ) ; on dessine dedans
                 DrawText (1,1, "touche au dessous " )
             StopDrawing ()
            
            ypas=-ypas
             Goto su ; sort du test !!!
            
         EndIf
        su:
        
        
        
        
        
        
        
        
         FlipBuffers (): ; affiche l'ecran
         ClearScreen ( RGB (0, 0,0 )) : ;efface l'ecran
        
     Until Event= #PB_Event_CloseWindow
Xpetera
Messages : 52
Inscription : sam. 02/févr./2008 22:25

Message par Xpetera »

Merci , mais pourtant c'est bien ce que j'avais compris , mais quand j'ai testé il me disait qu'ils étaient tout le temps en collision :(
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Xpetera a écrit :Merci , mais pourtant c'est bien ce que j'avais compris , mais quand j'ai testé il me disait qu'ils étaient tout le temps en collision :(
on ne peut t'aider QUE si tu post ton code !!

tu peux poster toute sorte de Code ici, personne ne va te voler ton code
n'ais pas peur.. :)

il n'y a que comme ça que tu progressera .. :)
Xpetera
Messages : 52
Inscription : sam. 02/févr./2008 22:25

Message par Xpetera »

Voici mon code

Code : Tout sélectionner

Enumeration
#spr1
#sprd1

#spr2
#sprd1_touch

EndEnumeration
InitSprite()
InitSprite3D()
UsePNGImageDecoder()


OpenWindow(0,150,150,300,400,"w1")
CreateGadgetList(WindowID(0))
ButtonGadget(3,1,1,50,25,"test")

OpenWindowedScreen(WindowID(0),0,0,300,300,1,0,0)
CreateSprite(#spr1,32,32,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr1))
Box(0,0,32,32,RGB(0,0,255))
StopDrawing()
CreateSprite3D(#sprd1,#spr1)


CreateSprite(#spr2,32,32)
StartDrawing(SpriteOutput(#spr2))
Circle(32,32,16)
StopDrawing()

CreateSprite(#sprd1_touch,32,32)
StartDrawing(SpriteOutput(#sprd1_touch))
Box(0,0,32,32,RGB(255,255,255))
StopDrawing()



xspr = 50
yspr = 50
xspr2 = 75
yspr2 = 150

Repeat
event = WindowEvent() ; la boucle pour éviter que ca se ferme direct



Start3D()
DisplaySprite(#sprd1_touch,xspr,yspr)
DisplaySprite(#spr2,xspr2,yspr2)

xrand = Random(10)
yrand = Random(10)

If xrand > 5
xspr2 - 8
ElseIf xrand < 5
xspr2 + 8
EndIf

If yrand > 5
yspr2 - 8
ElseIf yrand < 5
yspr2 + 8
EndIf

If xspr2 < 0
For i = 0 To 10
DisplaySprite(#spr2,xspr2,yspr2)
xspr2 + 2
Next
EndIf

If xspr2 > 268
For i = 0 To 10
DisplaySprite(#spr2,xspr2,yspr2)
xspr2 - 2
Next
EndIf



If yspr2 < 0
For i = 0 To 10
DisplaySprite(#spr2,xspr2,yspr2)
yspr2 + 2
Next
EndIf

If yspr2 >300
For i = 0 To 10
yspr2 - 2
DisplaySprite(#spr2,xspr2,yspr2)
Next
EndIf




DisplaySprite3D(#sprd1,xspr,yspr)



RotateSprite3D(#sprd1,10,1)
Stop3D()

If GetAsyncKeyState_(#VK_UP)
yspr - 1
EndIf

If GetAsyncKeyState_(#VK_DOWN)
yspr + 1
EndIf

If GetAsyncKeyState_(#VK_LEFT)
xspr - 1
EndIf

If GetAsyncKeyState_(#VK_RIGHT)
xspr + 1
EndIf






Start3D()

FlipBuffers()
ClearScreen($FFFFFF)
Stop3D()



If SpriteCollision(#sprd1_touch,1,1,#spr2,1,1)
StartDrawing(ScreenOutput())
DrawText(1,30,"woot",RGB(Random(255),Random(255),Random(255)),RGB(Random(255),Random(255),Random(255)))
StopDrawing()
EndIf

If event = #PB_Event_Gadget

Select EventGadget()


EndSelect


EndIf

Until event = #WM_CLOSE

Normalement il y a une image d'une scie circulaire (faite a paint xD) qui tourne et d'un stickman mais j'ai mis des rectangles pour éviter de vous faire télécharger des images et de changer le chemin etc :)


Si on lis le code , vous voyez qu'à la collision ca fait changer de couleur le "woot" , et ben le problème c'est que le woot change tout le temps de couleur , donc c'est comme si la collision était permanente
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

normal !! :lol:

lorsque tu fait
If SpriteCollision(#sprd1_touch,1,1,#spr2,1,1)
tu force en quelque sorte une collision sur le point de coordoné 1,1 pour les deux sprite !!

il faut faire
If SpriteCollision(#sprd1_touch,xspr,yspr,#spr2,xspr2,yspr2)
car ce sont les coordonnés des sprites qu'il faut comparer, pas une coordoné Figée de l'ecran !! :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voila j'ai amelioré le deplacement aleatoire de ton cube Noir :D
regarde bien comment j'ai fais, c'est instructif je pense
car c'est la base d'un jeu video :o)


Enumeration
     #spr1
     #sprd1
    
     #spr2
     #sprd1_touch
    
EndEnumeration
InitSprite ()
InitSprite3D ()
UsePNGImageDecoder ()


OpenWindow (0,150,150,300,400, "w1" )
CreateGadgetList ( WindowID (0))
ButtonGadget (3,1,1,50,25, "test" )

OpenWindowedScreen ( WindowID (0),0,0,300,300,1,0,0)
CreateSprite ( #spr1 ,32,32, #PB_Sprite_Texture )
StartDrawing ( SpriteOutput ( #spr1 ))
     Box (0,0,32,32, RGB (0,0,255))
StopDrawing ()
CreateSprite3D ( #sprd1 , #spr1 )


CreateSprite ( #spr2 ,32,32)
StartDrawing ( SpriteOutput ( #spr2 ))
     Circle (32,32,16)
StopDrawing ()

CreateSprite ( #sprd1_touch ,32,32)
StartDrawing ( SpriteOutput ( #sprd1_touch ))
     Box (0,0,32,32, RGB (255,255,255))
StopDrawing ()



xspr = 50
yspr = 50
xspr2 = 75
yspr2 = 150
pasx=2
pasy=2
Repeat
    Event = WindowEvent () ; la boucle pour éviter que ca se ferme direct
    
    
    
     Start3D ()
         DisplaySprite ( #sprd1_touch ,xspr,yspr)
         DisplaySprite ( #spr2 ,xspr2,yspr2)
        
        
        de= Random (100)+1 ; on tire un chiffre parmis 100 mais seul 8 compte cela laisse un delai pour le deplacement du cube noir
        
         Select de ; <----------------- c'est plus propre qu'une serie de if endif : o)
                 ; indiquera le sens du deplacement du cube noir
             Case 1 ; va vers le haut
                pasy=-2
             Case 2 ; va vers le bas
                pasy=2
             Case 3 ; va vers la droite
                pasx=2
             Case 4 ; va vers la gauche
                pasx=-2
             Case 5 ; va vers haut droit
                pasx=2
                pasy=-2
             Case 6 ; va vers haut gauche
                pasx=-2
                pasy=-2
             Case 7 ; va vers bas gauche
                pasx=-2
                pasy=2
             Case 8 ; va vers bas droit
                pasx=2
                pasy=2
         EndSelect
        
        yspr2=yspr2+pasy ; ceci est important on additionne en permanence , mais des fois le "PAs" est negatif cequi fait faire marche arriere ;o)
        xspr2=xspr2+pasx
        
         ; ********** test les Sortie d'ecran *********************
         ; danc ce cas on ne tien plus compte du tirage aleatoire on force la direction
         ; pour rammener le cube dans la zone : oD
         If xspr2 < 0
            pasx =2
             DisplaySprite ( #spr2 ,xspr2,yspr2)
         EndIf
        
         If xspr2 > 268
            pasx =-2
             DisplaySprite ( #spr2 ,xspr2,yspr2)
         EndIf
        
         If yspr2 < 0
            pasy=2
             DisplaySprite ( #spr2 ,xspr2,yspr2)
         EndIf
        
         If yspr2 >300
            pasy=-2
             DisplaySprite ( #spr2 ,xspr2,yspr2)
         EndIf
         ; ************************************************
        
        
        
         DisplaySprite3D ( #sprd1 ,xspr,yspr)
        
        
         RotateSprite3D ( #sprd1 ,10,1)
     Stop3D ()
    
     If GetAsyncKeyState_ ( #VK_UP )
        yspr - 1
     EndIf
    
     If GetAsyncKeyState_ ( #VK_DOWN )
        yspr + 1
     EndIf
    
     If GetAsyncKeyState_ ( #VK_LEFT )
        xspr - 1
     EndIf
    
     If GetAsyncKeyState_ ( #VK_RIGHT )
        xspr + 1
     EndIf
    
    
     Start3D ()
        
         FlipBuffers ()
         ClearScreen ($FFFFFF)
     Stop3D ()
    
     If SpriteCollision ( #sprd1_touch ,xspr,yspr, #spr2 ,xspr2,yspr2)
         StartDrawing ( ScreenOutput ())
             DrawText (1,30, "woot" , RGB ( Random (255), Random (255), Random (255)), RGB ( Random (255), Random (255), Random (255)))
         StopDrawing ()
     EndIf
    
     If Event = #PB_Event_Gadget
         Select EventGadget ()
         EndSelect
     EndIf
    
Until Event = #WM_CLOSE
Répondre