[resolu]Soucis de SpriteCollision..

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[resolu]Soucis de SpriteCollision..

Message par Ar-S »

Yo,
Toujours dans ma découverte de la 2D, je teste la collision. Rien de tels qu'une palette, une balle est un plafond pour ça...
Et ba c'est pas si simple...

Mon soucis pour le moment est que je ne ne pige pas pourquoi mon spritecollision ne détecte pas la collision de la balle (sprite 1) sur le plafond (sprite 2)
Y'a d'autres soucis mais pour le moment j'aimerai comprendre cette histoire de collision ô combien importante.

// Trucs réglés
- Stop la palette à gauche et à droite de l'écran
- La balle est centrée sur la palette
- La balle monte lorsque l'on appuie sur "Espace"

// Trucs à faire
- Comprendre pourquoi la collision chie
- Lorsque la balle est sur la palette, qu'elle reste centrée sur celle-ci quand la palette atteint un bord de l'écran (droite gauche)

Voilà le code.
Il peut surement être optimisé, que pourriez vous me conseiller comme approche pour simplifier tout ça ?

D'avance merci :)

Code : Tout sélectionner

; PB 4.40
;Mon 1er test 2D - palette + balle + plafond
InitSprite() : InitKeyboard()

Global gauche,droite,vitesse,Hfenetre,Lfenetre,Hscreen,Lscreen,haut,bas,Vitesse_Verticale,gauche,droite

; Dimensions de la palette
LPalette=100 : HPalette=10 ; Dimension de la palette

;fenêtre
Lfenetre=GetSystemMetrics_(#SM_CXSCREEN)  ; recup la resolution de l'ecran en cours
Hfenetre=GetSystemMetrics_(#SM_CYSCREEN)
If Lfenetre>400 And Hfenetre>400
  Lfenetre=400 : Hfenetre=400
EndIf
Lscreen=Lfenetre : Hscreen=Hfenetre-20

; Positions de la palette
centre=Lscreen/2-LPalette/2 ; on trouve le centre de la fdenetre
PosXpalette=centre ; on centre la palette par defaut dans l'ecran
PosYpalette=Hscreen-HPalette*2 ; on positionne la palette verticalement

;position balle
PosXball=PosXpalette+LPalette/2-8 ; Centre la balle sur la palette
PosXballMin=PosXpalette+LPalette/2-8 ; Centre la balle sur la palette
PosYball=PosYpalette-16 ; position de la balle sur la palette
PosYballMin=PosYpalette-16 ; position verticale minimum avant perdue
PosYballMax=0 ; position verticale maximum avant plafond

; Position et taille du Plafond
Lplafond=Lscreen ; plafond aussi large que l'ecran de jeu
Hplafond=15 ; epaisseur
Xplafond=0 : Yplafond=0

; Autre paramettres
vitesse = 20 ; vitesse de deplacement de la palette
Vitesse_Verticale = 10 ; Vitesse de deplacement de la balle
gauche=-vitesse
droite=vitesse
haut=-Vitesse_Verticale
bas=Vitesse_Verticale
cogne=0

OpenWindow(0, #PB_Ignore, #PB_Ignore, Lfenetre, Hfenetre, "Window", #PB_Window_ScreenCentered)
ButtonGadget(0, 0, Hfenetre-20, 100, 20, "Quitter")
If OpenWindowedScreen(WindowID(0), 0, 0, Lscreen, Hscreen, 0, 0, 0)
  
  ; CREATION DES SPRITES--------------------
  CreateSprite(0, LPalette, HPalette)
  If StartDrawing(SpriteOutput(0))
      Box(0, 0, LPalette, HPalette, RGB(55, 100, 255)) ; palette
    StopDrawing() 
  EndIf
  
  CreateSprite(1,16,16)
  If StartDrawing(SpriteOutput(1))
      Circle(8,8,8,#yellow) ; la balle
    StopDrawing()
  EndIf 
  
  CreateSprite(2,Lplafond,Hplafond)
  If StartDrawing(SpriteOutput(2))
      Box(Xplafond,Yplafond,Lplafond,Hplafond,#red) ; Le plafond
    StopDrawing()
  EndIf 
  ; ---------------------------------------
EndIf

;{- Event loop
Repeat
  
  ; Il est très important de traiter tous les événements restants dans la file d'attente à chaque tour
  Repeat
    Event = WindowEvent()
    Select Event  
      Case #PB_Event_Gadget
        If EventGadget() = 0
          End
        EndIf
    EndSelect
  Until Event = 0
  
  FlipBuffers() 
  ClearScreen(RGB(0, 0,0))
  
  ExamineKeyboard()
  DisplaySprite(0, PosXpalette, PosYpalette)
  DisplaySprite(1,PosXball,PosYball)
  DisplaySprite(2, 0, 0)
  
  If KeyboardPushed(#PB_Key_Left)
    PosXpalette+gauche
    If PosYball=PosYballMin
      PosXball+gauche
    EndIf
    If PosXpalette <= 0 ; Si la palette arrive a gauche
      PosXpalette=0 ; alors elle s'arrette
    EndIf 
  EndIf
  
  If KeyboardPushed(#PB_Key_Right)
    PosXpalette+droite
    If PosYball=PosYballMin
      PosXball+droite
    EndIf
    If PosXpalette >= Lscreen-LPalette
      PosXpalette=Lscreen-LPalette 
    EndIf
    Debug PosXpalette
  EndIf
  
  If KeyboardPushed(#PB_Key_Space)
    ;PosYball-10
      CollisionMur = SpriteCollision(1, PosXball, PosYball, 2, Lplafond, Hplafond)
      Debug CollisionMur
     If CollisionMur=0
      PosYball+haut ; la balle monte de 20px
      Debug CollisionMur
     Else
        ;PosYball<= Hplafond 
        PosYball+bas
      EndIf
    
    Debug PosYball
    Debug Yplafond
  EndIf
  
  If KeyboardPushed(#PB_Key_Escape)
    PosXpalette=centre
    PosYpalette=Hscreen-HPalette*2
    ;position balle
    PosXball=PosXpalette+LPalette/2-8
    PosYball=PosYpalette-16
  EndIf
  
  Delay(2)
ForEver

Dernière modification par Ar-S le lun. 25/janv./2010 11:54, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Soucis de SpriteCollision..

Message par flaith »

Pour la collision :

Code : Tout sélectionner

CollisionMur = SpriteCollision(1, PosXball, PosYball, 2, Xplafond, Yplafond)
:mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Soucis de SpriteCollision..

Message par Backup »

si tu utilisait une structure , ce serai beaucoup plus simple a mon avis ....
et cela evite les erreurs de nom de variable ... :)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Soucis de SpriteCollision..

Message par Ar-S »

Arf quelle buse, ok merci Flaith,.

@Dobro, je vais regarder l'organisation avec les structures.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Soucis de SpriteCollision..

Message par Cool Dji »

Salut la buse :mrgreen: :mrgreen:

Utilise le spritecollision pour des surfaces non linéaires. Pour un plafond droit, un simple de test de coordonnées fera très bien l'affaire :wink:
En tous les cas, bonne apprenance !!
Only PureBasic makes it possible
Répondre