Page 5 sur 6

Publié : sam. 17/janv./2009 22:11
par guerrier001
je ne sait pas faire de collision

Publié : sam. 17/janv./2009 22:21
par Anonyme
As tu réussis à dessiner le jeu ? ( les 2 raquettes , et la balle)

Les Raquettes avec la commande Box()
la balle avec la commande Circle()

Nous verrons ensuite ensemble comment mettre le tout en mouvement , tu verras c'est simple , un minimum de math s'impose , càd des additions , et des soustractions.

Une fois que tu auras dessiner ton jeu , nous attaquerons dans un 1° temps
les mouvements de la balles , les collisions de la balle à l'écran , puis les mouvements des raquettes , les collisions sur les raquettes , une approche de l'IA , la gestion du score.

Publié : sam. 17/janv./2009 22:32
par guerrier001
le voila

Code : Tout sélectionner

InitSprite()  : InitKeyboard() ;le demarrage du sprite et du clavier
InitMouse() ;j'ai démarrer la souris
ScreenX.i = 1024 ;la longueur de la fenetre en plein ecran
ScreenY.i = 768 ; La largeur de la fenetre en plein ecran

Rayon.i = 20 ;j'ai agrandi le rayon du cercle


; Direction de la babale
Dir_Haut = 1
Dir_Bas = 0
Dir_Droite = 1
Dir_Gauche =0

Vitesse = 5

BalleX= ScreenX / 2
BalleY= ScreenY / 2



OpenScreen(ScreenX,ScreenY,32,"MonProgramme modifier") ; l'ouverture de la fentre en mode plein ecran avec son titre et le nombre de couleur


Repeat ;repete la meme procedure a chaque fois
  ClearScreen(RGB(0,0,0)) ; la scene a une couleur verte
    ExamineKeyboard()
    ExamineMouse() ;Examine la position de la souris je crois
   
    x = MouseX() 
    y = MouseY()



    ;Mouvement de la balle
    If Dir_Haut = 1
          BalleY - Vitesse
    EndIf

    If Dir_Bas = 1
          BalleY + Vitesse
    EndIf

    If Dir_Droite = 1
          BalleX + Vitesse
    EndIf

    If Dir_Gauche = 1
          BalleX - Vitesse
    EndIf


    ;Colllision avec le Haut de l'écran. le haut est egal a 0
    If   BalleY-Rayon < 0
      Dir_Bas=1
      Dir_Haut=0
    EndIf

    ;Colllision avec le Bas de l'écran. le bas est egal a ScreenY
    If   BalleY+Rayon > ScreenY
      Dir_Bas=0
      Dir_Haut=1
    EndIf

    ;Colllision avec la droite de l'écran. egal a 0
    If   BalleX-Rayon < 0
      Dir_Gauche=0
      Dir_Droite=1
    EndIf

    ;Colllision avec la gauche de l'écran. egal a 0 ScreenX
    If   BalleX+Rayon > ScreenX
      Dir_Gauche=1
      Dir_Droite=0
    EndIf







StartDrawing(ScreenOutput()) ;on recommence a faire a dessiner grace a la commande repeat
Box(850,y-50,25,100,RGB(255,255,255))
Box(150,BalleY-50,25,100,RGB(255,255,255))
Circle(BalleX,BalleY , Rayon,RGB(255,255,255))
;le cercle est egal a la position x et y de la souris grace a Repeat le cercle renouvelle a
;chaque fois la position de la souris ce qui fait que le cercle suit la souris et qu'il a une couleur marron
StopDrawing() ;on arrete supprime (ou arrete le dessin





  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) ;on appuie sur echap pour quitter

Publié : sam. 17/janv./2009 22:39
par Anonyme
T'es un killer , parfait , à tu compris le principe des collisions sur les bords de l'écran ?

si non , je t'explique.


Ton écran à une résolution admettons 1024x768

le coin haut-gauche sont les coordonées 0,0 en bas à droite 1024,768
en haut a droite 1024,0 et en bas à gauche 0,768

On connais la position de la balle : ballex,balley
et son rayon. les coordonnées de la balle représente le centre de la balle , on peut donc déterminer les extrémités de la balle facilement.

si je veut connaitre l'extrémité gauche , alors :
Ballex - rayon
on connais aussi le bord gauche de l'écran , qui vaut 0

donc si Ballex - rayon est plus petit que 0 alors on change de direction.

Code : Tout sélectionner

If BalleX-Rayon < 0  ; le bord gauche de la balle sort de l'écran
      Dir_Gauche=0 ; elle ne va plus a gauche
      Dir_Droite=1 ; mais a droite
    EndIf  ; fin de la condition

Publié : sam. 17/janv./2009 22:45
par guerrier001
oui j'avais compris mais merci quand même pour l'explication , quel est l'étape suivante prof ?

Publié : sam. 17/janv./2009 23:03
par Anonyme
La raquette gauche contre la balle :
InitSprite() : InitKeyboard() ;le demarrage du sprite et du clavier
InitMouse() ;j'ai démarrer la souris
ScreenX.i = 1024 ;la longueur de la fenetre en plein ecran
ScreenY.i = 768 ; La largeur de la fenetre en plein ecran

Rayon.i = 20 ;j'ai agrandi le rayon du cercle


; Direction de la babale
Dir_Haut = 1
Dir_Bas = 0
Dir_Droite = 1
Dir_Gauche =0

Vitesse = 5

BalleX= ScreenX / 2
BalleY= ScreenY / 2


RaquetteGaucheX= 100
RaquetteGaucheY= 384
RaquetteHauteur= 100
RaquetteLargeur= 20



OpenScreen(ScreenX,ScreenY,32,"MonProgramme modifier") ; l'ouverture de la fentre en mode plein ecran avec son titre et le nombre de couleur


Repeat ;repete la meme procedure a chaque fois
ClearScreen(RGB(0,0,0)) ; la scene a une couleur verte
ExamineKeyboard()
ExamineMouse() ;Examine la position de la souris je crois

x = MouseX()
y = MouseY()



;Mouvement de la balle
If Dir_Haut = 1
BalleY - Vitesse
EndIf

If Dir_Bas = 1
BalleY + Vitesse
EndIf

If Dir_Droite = 1
BalleX + Vitesse
EndIf

If Dir_Gauche = 1
BalleX - Vitesse
EndIf


;Colllision avec le Haut de l'écran. le haut est egal a 0
If BalleY-Rayon < 0
Dir_Bas=1
Dir_Haut=0
EndIf

;Colllision avec le Bas de l'écran. le bas est egal a ScreenY
If BalleY+Rayon > ScreenY
Dir_Bas=0
Dir_Haut=1
EndIf

;Colllision avec la GAUCHE de l'écran. egal a 0
If BalleX-Rayon < 0
Dir_Gauche=0
Dir_Droite=1
EndIf

;Colllision avec la DROITE de l'écran. egal a 0 ScreenX
If BalleX+Rayon > ScreenX
Dir_Gauche=1
Dir_Droite=0
EndIf



;Collision avec la raquettes gauche

If Ballex-Rayon < RaquetteGaucheX + RaquetteLargeur ; La balle dépasse la raquette gauche

; COLLISION !!!!
If balley+Rayon > RaquetteGaucheY And balley-Rayon < RaquetteGaucheY + RaquetteHauteur
Dir_Gauche=0
Dir_Droite=1
EndIf

EndIf


RaquetteGaucheY = BalleY - RaquetteHauteur/2

StartDrawing(ScreenOutput()) ;on recommence a faire a dessiner grace a la commande repeat
Box(850,y-50,25,100,RGB(255,255,255))



Box(RaquetteGaucheX, RaquetteGaucheY ,RaquetteLargeur,RaquetteHauteur,RGB(255,255,255))


Circle(BalleX,BalleY , Rayon,RGB(255,255,255))
;le cercle est egal a la position x et y de la souris grace a Repeat le cercle renouvelle a
;chaque fois la position de la souris ce qui fait que le cercle suit la souris et qu'il a une couleur marron
StopDrawing() ;on arrete supprime (ou arrete le dessin





FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) ;on appuie sur echap pour quitter


Fait en sorte que la raquette de droite fasse pareil , regarde bien le code.
n'hésite pas à t'aider un papier et un crayon pour la compréhension des calculs de collisions.

Publié : dim. 18/janv./2009 1:17
par guerrier001
Je ne suis pas arriver. Desoler

Publié : dim. 18/janv./2009 1:21
par Anonyme
Sur quoi tu échoue ?

Publié : dim. 18/janv./2009 2:02
par beauregard
guerrier001 a écrit :Je ne suis pas arriver. Desoler
au collège, on apprend les coordonnées x et y... courage !

Publié : dim. 18/janv./2009 9:21
par jbernard13
Question svp :

Pourquoi .i aprés Rayon?

Publié : dim. 18/janv./2009 10:51
par guerrier001
il y a .i apres rayon , c'est pour signifier la longueur de la variable , et i signifie Integer et que l'on peut mettre des variable entre -2147483648 à +2147483647. Si tu veux en savoir plus va sur le tutorial d'aprentissage de mon prof. Je connait les coordonner. La premiere ligne est facile car normalement il doit cogner sur la partie gauche de la raquette et j'ai fait en sorte que ce soit le contraire. Le truc le pus dur et qui me casse la tete c'est au moment de la collision. et j'ai fait que quand il y a collision il s'arrete vers la droite pour aller vers la gauche , mais je n'y arrive pas et meme quand je change les position de la raquette y avec la hauteur.

Publié : dim. 18/janv./2009 12:21
par Anonyme
Tout dabord , tu dois testé le sens de la balle , si elle va à droite , pas besoin
de testé les collisions avec la gauche.


une fois la direction testé , tu vérifies aussi le sens vertical
si elle va vers le bas , on testera donc BalleY+Rayon ( schéma)
si elle va vers le haut BalleY-Rayon.
je te rappelle aussi que BalleY-Rayon est le bord haut de la balle et inversement.

Image

Donc , Si elle va vers le bas/droite

Alors on vérifie que :

BalleY+Rayon est plus grand que RaquetteY et que BalleY+Rayon est plus petit que RaquetteY+RaquetteHauteur
(RaquetteHauteur) est la taille de la raquette hein...

si c'est le cas , alors on passe au schéma suivant :



Image


Si BalleX + Rayon => RaquetteX alors collision , on change de direction.


Fait ce genre de schéma sur papier pendant que tu codes.
et reprends mon code plus haut.
tu vois , même pour un pong , sans aucune notion , c'est pas si facile.



:wink:

Publié : dim. 18/janv./2009 12:42
par guerrier001
Merci ,c'est juste que j'ai oublier de mettre = , est ce que jedoit faire que la souris controle la raquette droite ?

Publié : dim. 18/janv./2009 13:12
par Anonyme
C'est toi qui décide.

Publié : dim. 18/janv./2009 13:32
par guerrier001
ok alors :

Code : Tout sélectionner

InitSprite() : InitKeyboard() ;le demarrage du sprite et du clavier
InitMouse() ;j'ai démarrer la souris
ScreenX.i = 1024 ;la longueur de la fenetre en plein ecran
ScreenY.i = 768 ; La largeur de la fenetre en plein ecran

Rayon.i = 20 ;j'ai agrandi le rayon du cercle


; Direction de la babale
Dir_Haut = 1
Dir_Bas = 0
Dir_Droite = 1
Dir_Gauche =0

Vitesse = 5

BalleX= ScreenX / 2
BalleY= ScreenY / 2


RaquetteGaucheX= 100
RaquetteGaucheY= 384
RaquetteDroiteX= 900
RaquetteDroiteY= 100
RaquetteHauteur= 100
RaquetteLargeur= 20



OpenScreen(ScreenX,ScreenY,32,"MonProgramme modifier") ; l'ouverture de la fentre en mode plein ecran avec son titre et le nombre de couleur


Repeat ;repete la meme procedure a chaque fois
ClearScreen(RGB(0,0,0)) ; la scene a une couleur verte
ExamineKeyboard()




;Mouvement de la balle
If Dir_Haut = 1
BalleY - Vitesse
EndIf

If Dir_Bas = 1
BalleY + Vitesse
EndIf

If Dir_Droite = 1
BalleX + Vitesse
EndIf

If Dir_Gauche = 1
BalleX - Vitesse
EndIf


;Colllision avec le Haut de l'écran. le haut est egal a 0
If BalleY-Rayon < 0
Dir_Bas=1
Dir_Haut=0
EndIf

;Colllision avec le Bas de l'écran. le bas est egal a ScreenY
If BalleY+Rayon > ScreenY
Dir_Bas=0
Dir_Haut=1
EndIf

;Colllision avec la GAUCHE de l'écran. egal a 0
If BalleX-Rayon < 0
Dir_Gauche=0
Dir_Droite=1
EndIf

;Colllision avec la DROITE de l'écran. egal a 0 ScreenX
If BalleX+Rayon > ScreenX
Dir_Gauche=1
Dir_Droite=0
EndIf



;Collision avec la raquettes gauche

If Ballex-Rayon => RaquetteDroiteX - RaquetteLargeur ; La balle dépasse la raquette gauche

; COLLISION !!!!
If balley+Rayon > RaquetteDroiteY And balley-Rayon < RaquetteDroiteY + RaquetteHauteur
Dir_Gauche=1
Dir_Droite=0
EndIf

EndIf

RaquetteDroiteY = BalleY - RaquetteHauteur/2


;Collision avec la raquettes gauche

If Ballex-Rayon < RaquetteGaucheX + RaquetteLargeur ; La balle dépasse la raquette gauche

; COLLISION !!!!
If balley+Rayon > RaquetteGaucheY And balley-Rayon < RaquetteGaucheY + RaquetteHauteur
Dir_Gauche=0
Dir_Droite=1
EndIf

EndIf

RaquetteGaucheY = BalleY - RaquetteHauteur/2

StartDrawing(ScreenOutput()) ;on recommence a faire a dessiner grace a la commande repeat


Box(RaquetteDroiteX,RaquetteDroiteY  ,RaquetteLargeur,RaquetteHauteur,RGB(255,255,255))

Box(RaquetteGaucheX, RaquetteGaucheY ,RaquetteLargeur,RaquetteHauteur,RGB(255,255,255))


Circle(BalleX,BalleY , Rayon,RGB(255,255,255))
;le cercle est egal a la position x et y de la souris grace a Repeat le cercle renouvelle a
;chaque fois la position de la souris ce qui fait que le cercle suit la souris et qu'il a une couleur marron
StopDrawing() ;on arrete supprime (ou arrete le dessin





FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) ;on appuie sur echap pour quitter
Maintenant on passe a une autre , la 3d ou on a autre chose a aprendre ?