Problème camera, vie, IA, Monde Rond et tir tous en 3D
-
- Messages : 130
- Inscription : dim. 11/janv./2009 15:04
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.
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.
-
- Messages : 130
- Inscription : dim. 11/janv./2009 15:04
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
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 :
donc si Ballex - rayon est plus petit que 0 alors on change de direction.
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 :
on connais aussi le bord gauche de l'écran , qui vaut 0Ballex - rayon
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
-
- Messages : 130
- Inscription : dim. 11/janv./2009 15:04
La raquette gauche contre la balle :
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.
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.
-
- Messages : 130
- Inscription : dim. 11/janv./2009 15:04
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
-
- Messages : 1501
- Inscription : dim. 18/avr./2004 15:04
- Localisation : sud de la france
-
- Messages : 130
- Inscription : dim. 11/janv./2009 15:04
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.
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.

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 :

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.

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.

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 :

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.

-
- Messages : 130
- Inscription : dim. 11/janv./2009 15:04
-
- Messages : 130
- Inscription : dim. 11/janv./2009 15:04
ok alors :
Maintenant on passe a une autre , la 3d ou on a autre chose a aprendre ?
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