Page 1 sur 1

[resolu]Soucis de SpriteCollision..

Publié : dim. 24/janv./2010 14:53
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


Re: Soucis de SpriteCollision..

Publié : dim. 24/janv./2010 16:06
par flaith
Pour la collision :

Code : Tout sélectionner

CollisionMur = SpriteCollision(1, PosXball, PosYball, 2, Xplafond, Yplafond)
:mrgreen:

Re: Soucis de SpriteCollision..

Publié : dim. 24/janv./2010 16:27
par Backup
si tu utilisait une structure , ce serai beaucoup plus simple a mon avis ....
et cela evite les erreurs de nom de variable ... :)

Re: Soucis de SpriteCollision..

Publié : dim. 24/janv./2010 18:54
par Ar-S
Arf quelle buse, ok merci Flaith,.

@Dobro, je vais regarder l'organisation avec les structures.

Re: Soucis de SpriteCollision..

Publié : lun. 25/janv./2010 8:06
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 !!