Problème camera, vie, IA, Monde Rond et tir tous en 3D

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message par guerrier001 »

je ne sait pas faire de collision
Anonyme

Message 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.
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message 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
Anonyme

Message 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
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message par guerrier001 »

oui j'avais compris mais merci quand même pour l'explication , quel est l'étape suivante prof ?
Anonyme

Message 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.
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message par guerrier001 »

Je ne suis pas arriver. Desoler
Anonyme

Message par Anonyme »

Sur quoi tu échoue ?
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

guerrier001 a écrit :Je ne suis pas arriver. Desoler
au collège, on apprend les coordonnées x et y... courage !
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

Question svp :

Pourquoi .i aprés Rayon?
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message 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.
Anonyme

Message 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:
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message par guerrier001 »

Merci ,c'est juste que j'ai oublier de mettre = , est ce que jedoit faire que la souris controle la raquette droite ?
Anonyme

Message par Anonyme »

C'est toi qui décide.
guerrier001
Messages : 130
Inscription : dim. 11/janv./2009 15:04

Message 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 ?
Répondre