Flipper 2D et sa physique
+5
Urbinou
Ricco59_59
Dobro
Tryphon
drfloyd
9 participants
Page 1 sur 5
Page 1 sur 5 • 1, 2, 3, 4, 5
Flipper 2D et sa physique
Depuis longtemps je chercher à réaliser un jeu de flipper 2D avec une physique crédible.... j'aimerai réussir à faire ça :
j'ai du mal... mon moteur physique n'est pas au point... Appel aux génies de la programmations sur gamopat !
j'ai du mal... mon moteur physique n'est pas au point... Appel aux génies de la programmations sur gamopat !
Dernière édition par drfloyd le Mar 26 Nov 2019 - 17:05, édité 1 fois
_______________________________________________________
Re: Flipper 2D et sa physique
Si Dobro t'aide pas, je pense que je peux (mais je suis pas mal pris avec Shinobi pour l'instant)...
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Flipper 2D et sa physique
sans moi sur ce coup la...
manque de temps et de compétences ...
ça fait appel aux maths ....
perso pour faire un truc vraiment nickel , je le ferai en 3D
avec vu de dessus pour simuler une 2d ...
apres en 2D, moyennant des formules mathématiques magiques, ça doit se faire....
le gros probleme de Purebasic, c'est qu'il ne gere pas les collisions si les sprites sont en rotation ..... un sprite a 45 degres , ne répercute pas les rebonds en fonction de son angle....(c'est seulement une collision par pixel)
la solution c'est d'en passer par les Maths et se fabriquer une collision maison....
d'ou mon choix d'utiliser un moteur 3D , qui par définition a une physique bien foutu
il y avait un moteur 3D/2D "Mp3d" super bien foutu, mais il semble arrêté .. plus de nouvelle de l'auteur
manque de temps et de compétences ...
ça fait appel aux maths ....
perso pour faire un truc vraiment nickel , je le ferai en 3D
avec vu de dessus pour simuler une 2d ...
apres en 2D, moyennant des formules mathématiques magiques, ça doit se faire....
le gros probleme de Purebasic, c'est qu'il ne gere pas les collisions si les sprites sont en rotation ..... un sprite a 45 degres , ne répercute pas les rebonds en fonction de son angle....(c'est seulement une collision par pixel)
la solution c'est d'en passer par les Maths et se fabriquer une collision maison....
d'ou mon choix d'utiliser un moteur 3D , qui par définition a une physique bien foutu
il y avait un moteur 3D/2D "Mp3d" super bien foutu, mais il semble arrêté .. plus de nouvelle de l'auteur
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
Tryphon a écrit:Si Dobro t'aide pas, je pense que je peux (mais je suis pas mal pris avec Shinobi pour l'instant)...
Shinobi est prioritaire !
Dans ce type de flipper 2D est ce que tu penses comme moi qu'il y en fond un masque invisible d'une unique couleur pour définir la zone de la balle dont elle ne peut s'echapper ?
_______________________________________________________
Re: Flipper 2D et sa physique
je vois surtout que tout les "mur" sont en fait entouré de pixel noir
je pense que la collision doit etre du type lecture de point (de couleur de point)
et que si la balle dans sa direction actuelle "lit" un point noir, elle change de direction
si le point se situe dans sa partie superieur ou inferieur elle inverse ses y
si le point se situe a sa gauche ou droite , elle inverse des x
(du genre x=-x ) ....
en fait ça depends des langages, certains proposent des fonctions de collision toute faite .. d'autre utilise les couleurs ... bref
avec le Purebasic on peut utiliser les 2 methodes ...
ici j'avais utilisé la fonction de collision de Purebasic
que j'ai amélioré pour determiner si la collision avait lieu au dessus , au dessous , a gauche , a droite ou meme dans les coins de la brique ....
mais je pense que la detection par la couleur des point() devrai etre la plus efficace
pour ce genre de collision ...(les flipers)
je te laisse quand meme mon code pour collision en fonction du coté
ça peut te servir un jour
(pour un casse brique par exemple ) le fait de savoir du quel coté a lieu la collision
sur la raquette permet de faire rebondir en fonction
je pense que la collision doit etre du type lecture de point (de couleur de point)
et que si la balle dans sa direction actuelle "lit" un point noir, elle change de direction
si le point se situe dans sa partie superieur ou inferieur elle inverse ses y
si le point se situe a sa gauche ou droite , elle inverse des x
(du genre x=-x ) ....
en fait ça depends des langages, certains proposent des fonctions de collision toute faite .. d'autre utilise les couleurs ... bref
avec le Purebasic on peut utiliser les 2 methodes ...
ici j'avais utilisé la fonction de collision de Purebasic
que j'ai amélioré pour determiner si la collision avait lieu au dessus , au dessous , a gauche , a droite ou meme dans les coins de la brique ....
mais je pense que la detection par la couleur des point() devrai etre la plus efficace
pour ce genre de collision ...(les flipers)
je te laisse quand meme mon code pour collision en fonction du coté
ça peut te servir un jour
(pour un casse brique par exemple ) le fait de savoir du quel coté a lieu la collision
sur la raquette permet de faire rebondir en fonction
- Code:
; prg realisé par Dobro
#dobro=1
#Police=1
#sprite=1
Declare.s super_collision(sprite_numero1, x_sprite1, y_sprite1, sprite_numero2, x_sprite2, y_sprite2)
; cette procedure renvoie du quelle coté le sprite a été touché !
; sprite_numero1= le numero du sprite 1 a tester
; largeur_spr1 = largeur en pixel du sprite numero 1
; hauteur_spr1 = hauteur en pixel du sprite numero 1
; x_sprite1 = coordonée X du sprite numero 1
; y_sprite1=coordonée Y du sprite numero 1
; --------------------------------------------------------------------------
; sprite_numero2= le numero du sprite 2 a tester
; largeur_spr2 = largeur en pixel du sprite numero 2
; hauteur_spr12 = hauteur en pixel du sprite numero 2
; x_sprite2 = coordonée X du sprite numero 2
; y_sprite2 coordonée Y du sprite numero 2
Enumeration
#Window
#sprite_cible
#sprite_souris
#sprite_text
EndEnumeration
Structure sprite
x.w
y.w
EndStructure
Dim sprite.sprite(1)
Dim ecran(640,400)
For x = 0 To 640 ; un écran de couleurs aléatoires
For y = 0 To 400
r=Random(255)
G=Random(255)
b=Random(255)
c=RGB(r,G,b)
ecran(x,y)= c
Next y
Next x
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(#Window, 0, 0, 800, 600, "hello",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
Result = OpenWindowedScreen(WindowID(#Window),0,0, 800, 600, 1, 0,0)
CreateSprite( #sprite_cible, 64, 64) ; sprite exemple
StartDrawing(SpriteOutput( #sprite_cible) ) ; on dessine dedans
Box(0, 0, 64, 64, RGB($FF,$0,$80))
StopDrawing()
CreateSprite( #sprite_souris, 32, 32) ; sprite souris
StartDrawing(SpriteOutput( #sprite_souris) ) ; on dessine dedans
Box(0, 0, 64, 64,RGB($13,$F8,$7))
StopDrawing()
bord$="aucun bord"
CreateSprite(#sprite_text, 150,20) ; le text
StartDrawing(SpriteOutput(#sprite_text) ) ; on dessine dedans
DrawText(1,1,bord$,RGB(0,0,0), RGB(255,255,255))
StopDrawing()
Resultat = InitMouse()
Repeat
ExamineMouse()
Event=WindowEvent()
DisplaySprite(#sprite_cible, WindowWidth(#Window) /2+50, WindowHeight(#Window)/2+100)
sprite(1)\x=WindowWidth(#Window)/2+50
sprite(1)\y=WindowHeight(#Window)/2+100
DisplaySprite(#sprite_souris, MouseX(), MouseY())
DisplaySprite( #sprite_text, 10, 10)
bord$=super_collision(#sprite_cible, sprite(1)\x,sprite(1)\y, #sprite_souris,MouseX(), MouseY())
StartDrawing(SpriteOutput(#sprite_text) ) ; on dessine dedans
DrawText(1,1," ", RGB(0,0,0), RGB(255,255,255))
DrawText(1,1,bord$,RGB(0,0,0), RGB(255,255,255))
StopDrawing()
If MouseButton(2)
End
EndIf
FlipBuffers():; affiche l'ecran
ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
Until Event=#PB_Event_CloseWindow
Procedure.s super_collision(sprite_numero1, x_sprite1, y_sprite1, sprite_numero2, x_sprite2, y_sprite2)
; code Dobro
spr1_milieu_x=x_sprite1+SpriteWidth(sprite_numero1) /2
spr1_milieu_y=y_sprite1+SpriteHeight(sprite_numero1)/2
spr2_milieu_x=x_sprite2+SpriteWidth(sprite_numero2)/2
spr2_milieu_y=y_sprite2+SpriteHeight(sprite_numero2)/2
spr1_hauteur=SpriteHeight(sprite_numero1)
spr1_largeur=SpriteWidth(sprite_numero1)
spr2_hauteur=SpriteHeight(sprite_numero2)
spr2_largeur=SpriteWidth(sprite_numero2)
If SpriteCollision(sprite_numero1,x_sprite1, y_sprite1,sprite_numero2,x_sprite2, y_sprite2)
If spr2_milieu_x<x_sprite1 And spr2_milieu_y<y_sprite1
bord$="haut-gauche a cheval "
Goto suite
EndIf
If spr2_milieu_x>(x_sprite1+spr1_largeur) And spr2_milieu_y<y_sprite1
bord$="haut-droit a cheval "
Goto suite
EndIf
If spr2_milieu_x>x_sprite1+spr1_largeur And spr2_milieu_y>y_sprite1+spr1_hauteur
bord$="bas-droit a cheval "
Goto suite
EndIf
If spr2_milieu_x<x_sprite1 And spr2_milieu_y>y_sprite1+spr1_hauteur
bord$="bas-gauche a cheval"
Goto suite
EndIf
If x_sprite2+spr2_largeur>x_sprite1 And x_sprite2<x_sprite1+spr1_largeur And spr2_milieu_y<y_sprite1
bord$="haut a cheval "
Goto suite
EndIf
If y_sprite2+spr2_hauteur>y_sprite1 And y_sprite2<y_sprite1+spr1_hauteur And spr2_milieu_x>x_sprite1+spr1_largeur
bord$="droit a cheval "
Goto suite
EndIf
If x_sprite2+spr2_largeur>x_sprite1 And x_sprite2<x_sprite1+spr1_largeur And spr2_milieu_y>y_sprite1+spr1_hauteur
bord$="bas a cheval "
Goto suite
EndIf
If y_sprite2+spr2_hauteur>y_sprite1 And y_sprite2<y_sprite1+spr1_hauteur And spr2_milieu_x<x_sprite1
bord$="gauche a cheval "
Goto suite
EndIf
If x_sprite2 > x_sprite1 And (x_sprite2+spr2_largeur) <x_sprite1+spr1_largeur
If y_sprite2>y_sprite1 and y_sprite2+spr2_hauteur<y_sprite1+spr1_hauteur
bord$="Dedans "
Goto suite
Endif
EndIf
Else
bord$=" en dehors"
EndIf
suite:
ProcedureReturn bord$
EndProcedure
; Epb
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
Je pense que c'est plus riche que ça : il y a un tableau (plutôt que des couleurs ; vois ça comme un deuxième écran virtuel si tu veux) qui indique le comportement de chaque pixel (infranchissable, libre, couloir, rebond, bumper avec direction...)
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Flipper 2D et sa physique
Tryphon a écrit:Je pense que c'est plus riche que ça : il y a un tableau (plutôt que des couleurs ; vois ça comme un deuxième écran virtuel si tu veux) qui indique le comportement de chaque pixel (infranchissable, libre, couloir, rebond, bumper avec direction...)
Oui voilà, en fond invisible une couleur pour la surface de jeu, et des couleurs pour chaque type d'obstacles
j'avais tenté comme ça lors de mes essais
la bordure noire, je pense qu'elle n'a pas d'impact
_______________________________________________________
Re: Flipper 2D et sa physique
oui on peut utiliser les data aussi pour creer les limites
tout comme un tableau ... le tableau permet de gerer beaucoup plus de points
c'est sur..
par contre la bordure noire... perso je pense qu'elle a un impact
c'est pas par hasard que tout est détouré en noir .... je pense vraiment que c'est pour tester la collision...
tout comme un tableau ... le tableau permet de gerer beaucoup plus de points
c'est sur..
par contre la bordure noire... perso je pense qu'elle a un impact
c'est pas par hasard que tout est détouré en noir .... je pense vraiment que c'est pour tester la collision...
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
pour illustrer ce que je dis a propos des collisions acces sur les points de couleur
je me sis permis de te faire un exemple de base
avec une fonction de collision par couleur maison ...
c'est pas parfait, mais le but c'est de te montrer que la methode peut fonctionner quand meme ... meme si c'est effectivement pas parfait ...
pour faire fonctionner mon exemple , il te faudra mettre cette image dans le meme dossier que le code (attention image au format PNG obligatoire )
car en Jpg par exemple, ça genere des points de couleurs parasite qui peuvent mettre le cirque dans la detection...
l'image de fond pour test :
et voici le code qui va avec :
les procedures RotationX() et RotationY() sont geniales car , tu donne la coordonnée d'un point x et y ... puis un angle ... puis une distance ....
et ça de renvoi la coordonnée du point visé !!
rien que ces deux procédures , c'est un "logo" , car tu donnes la position de ta tortue , l'angle que tu veux pour aller quelque part
et la distance a parcourir ... , ça te renvoi la coordonné x,y a l'ecran ou va etre le prochain pas de ta tortue cool non ?? :)
ici je me sert de ces 2 procédures pour aller lire la couleur autour de ma balle , sur les angles
ang.s="0,45,90,135,180,225,270,315"
considérant que l'angle 0 est a 3 heure !! (a droite )
0=3 heure
90 = 6 heure
180= 9 heure
270 = midi
voila amuses toi bien
je me sis permis de te faire un exemple de base
avec une fonction de collision par couleur maison ...
c'est pas parfait, mais le but c'est de te montrer que la methode peut fonctionner quand meme ... meme si c'est effectivement pas parfait ...
pour faire fonctionner mon exemple , il te faudra mettre cette image dans le meme dossier que le code (attention image au format PNG obligatoire )
car en Jpg par exemple, ça genere des points de couleurs parasite qui peuvent mettre le cirque dans la detection...
l'image de fond pour test :
et voici le code qui va avec :
- Code:
;***********************************************
;Titre :*collision_par_couleur2
;Auteur : Dobro
;Date :16/11/2019
;Heure :11:50:47
;Version Purebasic : PureBasic 5.71 LTS (Windows - x86)
;Version de l'editeur :EPB PHOENIX V2.68
; Libairies necessaire : Aucune
;image de fond au format PNG obligatoire <<<<<----------------- Attention
;***********************************************
UsePNGImageDecoder()
Enumeration
#win
#image_fond
#sprite_balle
#sprite_centre
EndEnumeration
Structure balle
x.i
y.i
pas_x.i
pas_y.i
flag_droit.b
flag_gauche.b
flag_haut.b
flag_bas.b
flag_haut_gauche.b
flag_haut_droit.b
flag_bas_gauche.b
flag_bas_droit.b
EndStructure
;*** initialisation des variables *********
;-initialisation variables
global nombre_de_balle=100
Global dim balle.balle(nombre_de_balle)
Global Dim tab_coul(8)
;
For i=1 to nombre_de_balle
vitesse=6
balle(i)\pas_x=vitesse ;random(5,1)²
balle(i)\pas_y=balle(i)\pas_x
;debug balle(i)\pas_x
;debug balle(i)\pas_y
balle(i)\x=random(750,2)
balle(i)\y=random(100,5)
Next i
;
global Ecrany=600
global Ecranx=800
Global Flag=#false
distance =16 ; determine la distance de detection de collision par rapport a notre balle
global couleur_detection=rgb(0,255,0)
global x_dest ,y_dest
; *******************************************
;
;
; *** declaration des procedures en fin de code *******************
;-declaration des procedures
Declare.f RotationX(x, angle.f, dist)
Declare.f RotationY(Y, angle.f, dist)
Declare detection_couleur(x,y,distance,image_fond,balle)
;******************************************************
;
;
;
; ********* une fenetre ecran **************************
;-creation fenetre
InitSprite():InitMouse()
WindowID = OpenWindow(#Win, 0, 0,Ecranx, Ecrany, "hello",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
Result = OpenWindowedScreen(WindowID(#Win),0,0, EcranX, Ecrany, 1, 0,0,#PB_Screen_WaitSynchronization )
; ******************************************************
;
; ********** chargement image de fond (le decors) **********************
If LoadImage(#image_fond,"fond.png")
Else
MessageRequester("erreur", "j'ai pas pu charger l'image de fond")
Endif
;
;********************* Creation des sprites ************************
CreateSprite( #sprite_balle, 16, 16) ; sprite balle
StartDrawing(SpriteOutput( #sprite_balle) ) ; on dessine dedans
Circle(8, 8, 8, RGB($FF,$0,$80))
StopDrawing()
CreateSprite( #sprite_centre, 8, 8) ; sprite de verification .(ne sert qu'au debuguage)....
StartDrawing(SpriteOutput( #sprite_centre) ) ; on dessine dedans
Circle(4, 4, 4, RGB($0,$0,$255))
StopDrawing()
global centre_sprite=(SpriteWidth(#sprite_balle)/2)-2 ; permet de centrer la detection au centre du sprite
; **************************************************************
;
;
;*********** une boucle d'event ********************************************
;-boucle principale
Repeat
; *********event windows **** obligatoire en mode fenetré de vider la liste des events .... ******
Repeat
Event = WindowEvent()
If Event = #PB_Event_CloseWindow : end : EndIf
Until Event = 0
; **************************************************************************************
ExamineMouse() ; surveille la souris ...pour detecter l'appuis sur le bouton droit pour sortir du prg
;
; *********** Affiche l'image de fond **********************
StartDrawing(ScreenOutput())
DrawImage(imageId(#image_fond),0,0)
StopDrawing()
; ******************************************************
;
; ****** boucle du traitement des balles ou de la balle (ça depends du nombre ) ***************
For i=1 to nombre_de_balle
;-affiche balle
; *** deplacement balle ****
balle(i)\x=balle(i)\x+balle(i)\pas_x
balle(i)\y=balle(i)\y+balle(i)\pas_y
; **************************
DisplaytransparentSprite(#sprite_balle, balle(i)\x,balle(i)\y) ; affiche la balle
; ******* detection collision ******
; les sorties d'ecran
if balle(i)\x+centre_sprite<25
balle(i)\pas_x=vitesse
Endif
if balle(i)\x+centre_sprite > EcranX-25
balle(i)\pas_x=-vitesse
Endif
if balle(i)\y+centre_sprite<25
balle(i)\pas_y=vitesse
;flag=#true
Endif
if balle(i)\y+centre_sprite > Ecrany-20
balle(i)\pas_y=-vitesse
Endif
;**** la detection par couleur ********
; on releve la detection tout autour de la balle
; cela a chargé le tableau balle()\state()
; ici on connais la couleur de 8 positions autour de la balle , on va essayer d'agir en consequence
;"0,45,90,135,180,225,270,315" <---- ceci sont les angles en degres ou l'on regarde si la couleur de collision se trouve
; ***************************************
if flag=#false
detection_couleur(balle(i)\x+centre_sprite,balle(i)\y+centre_sprite,distance,#image_fond,i); ça charge le tableau tab_coul avec les couleurs alentour
Endif
if tab_coul(0)=couleur_detection and balle(i)\flag_droit=#False ; si la couleur de detection a été trouvé dans l'angle 0 degres (a droite de la balle )
balle(i)\pas_x=-vitesse ; on va vers la gauche
debug "droit" ; ici on affiche a quel endroit la collision a eu lieu
; petite machine a etat qui permet de calmer toute ambiguité sur les autres collisions eventuelle ...
balle(i)\flag_droit=#true
balle(i)\flag_gauche=#False
balle(i)\flag_bas=#false
balle(i)\flag_haut=#false
balle(i)\flag_haut_gauche=#false
balle(i)\flag_haut_droit=#false
balle(i)\flag_bas_gauche=#false
balle(i)\flag_bas_droit=#false
Elseif tab_coul(1)=couleur_detection and balle(i)\flag_bas_droit=#false
balle(i)\pas_y=-vitesse
; balle(i)\pas_x=-vitesse
debug "bas droit"
balle(i)\flag_droit=#false
balle(i)\flag_gauche=#false
balle(i)\flag_bas=#false
balle(i)\flag_haut=#false
balle(i)\flag_haut_gauche=#false
balle(i)\flag_haut_droit=#false
balle(i)\flag_bas_gauche=#false
balle(i)\flag_bas_droit=#true
Elseif tab_coul(2)=couleur_detection and balle(i)\flag_bas=#false
balle(i)\pas_y=-vitesse
debug "bas"
balle(i)\flag_droit=#false
balle(i)\flag_gauche=#false
balle(i)\flag_bas=#True
balle(i)\flag_haut=#false
balle(i)\flag_haut_gauche=#false
balle(i)\flag_haut_droit=#false
balle(i)\flag_bas_gauche=#false
balle(i)\flag_bas_droit=#False
Elseif tab_coul(3)=couleur_detection and balle(i)\flag_bas_gauche=#false
; balle(i)\pas_x=-vitesse
balle(i)\pas_y=-vitesse
debug "bas gauche "
balle(i)\flag_droit=#false
balle(i)\flag_gauche=#false
balle(i)\flag_bas=#false
balle(i)\flag_haut=#false
balle(i)\flag_haut_gauche=#false
balle(i)\flag_haut_droit=#false
balle(i)\flag_bas_gauche=#true
balle(i)\flag_bas_droit=#False
Elseif tab_coul(4)=couleur_detection and balle(i)\flag_gauche=#false
balle(i)\pas_x=vitesse
debug "gauche"
balle(i)\flag_droit=#false
balle(i)\flag_gauche=#true
balle(i)\flag_bas=#false
balle(i)\flag_haut=#false
balle(i)\flag_haut_gauche=#false
balle(i)\flag_haut_droit=#false
balle(i)\flag_bas_gauche=#false
balle(i)\flag_bas_droit=#False
Elseif tab_coul(5)=couleur_detection and balle(i)\flag_haut_gauche=#false
;balle(i)\pas_x=vitesse
balle(i)\pas_y=vitesse
debug " haut gauche"
balle(i)\flag_droit=#false
balle(i)\flag_gauche=#false
balle(i)\flag_bas=#false
balle(i)\flag_haut=#false
balle(i)\flag_haut_gauche=#true
balle(i)\flag_haut_droit=#false
balle(i)\flag_bas_gauche=#false
balle(i)\flag_bas_droit=#False
Elseif tab_coul(6)=couleur_detection and balle(i)\flag_haut=#false
balle(i)\pas_y=vitesse
;balle(i)\pas_x=-vitesse
debug "haut"
balle(i)\flag_droit=#false
balle(i)\flag_gauche=#false
balle(i)\flag_bas=#false
balle(i)\flag_haut=#true
balle(i)\flag_haut_gauche=#false
balle(i)\flag_haut_droit=#false
balle(i)\flag_bas_gauche=#false
balle(i)\flag_bas_droit=#False
Elseif tab_coul(7)=couleur_detection and balle(i)\flag_haut_droit=#false
balle(i)\pas_y=vitesse
; debug "haut droit"
balle(i)\flag_droit=#false
balle(i)\flag_gauche=#false
balle(i)\flag_bas=#false
balle(i)\flag_haut=#false
balle(i)\flag_haut_gauche=#false
balle(i)\flag_haut_droit=#true
balle(i)\flag_bas_gauche=#false
balle(i)\flag_bas_droit=#False
Endif
suite:
Next i
;vide le tableau de couleur de detection
For zz=0 to 7
tab_coul(zz)=$0
Next zz
; ******************************
If MouseButton(2) ; test si on appuis sur le bouton droit, alors on quitte le prg
End
EndIf
FlipBuffers():; affiche l'ecran
ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
Until Event=#PB_Event_CloseWindow
; ******************************************************************
Procedure.f RotationX(x, angle.f, dist)
;by Dobro
ProcedureReturn x + Cos(angle.f*#PI/180)*dist
EndProcedure
Procedure.f RotationY(Y, angle.f, dist)
;by Dobro
ProcedureReturn Y + Sin(angle.f*#PI/180)*dist
EndProcedure
;
;
Procedure detection_couleur(x,y,distance,image_fond,balle)
; By Dobro
ang.s="0,45,90,135,180,225,270,315"
StartDrawing(ImageOutput(image_fond))
For i=0 to 7
angle.f=valf(StringField(ang.s,i+1,","))
x_dest=RotationX(x,angle.f,distance)
y_dest=RotationY(y,angle.f,distance)
if x_dest>EcranX-1 or x_dest<1
StopDrawing()
ProcedureReturn couleur_detection
endif
If y_dest>Ecrany-1 or y_dest<1
StopDrawing()
ProcedureReturn couleur_detection
endif
couleur=point(x_dest,y_dest)
tab_coul(i)=couleur
Next i
StopDrawing()
ProcedureReturn couleur
EndProcedure
les procedures RotationX() et RotationY() sont geniales car , tu donne la coordonnée d'un point x et y ... puis un angle ... puis une distance ....
et ça de renvoi la coordonnée du point visé !!
rien que ces deux procédures , c'est un "logo" , car tu donnes la position de ta tortue , l'angle que tu veux pour aller quelque part
et la distance a parcourir ... , ça te renvoi la coordonné x,y a l'ecran ou va etre le prochain pas de ta tortue cool non ?? :)
- Code:
Procedure.f RotationX(x, angle.f, dist)
;by Dobro
ProcedureReturn x + Cos(angle.f*#PI/180)*dist
EndProcedure
Procedure.f RotationY(Y, angle.f, dist)
;by Dobro
ProcedureReturn Y + Sin(angle.f*#PI/180)*dist
EndProcedure
ici je me sert de ces 2 procédures pour aller lire la couleur autour de ma balle , sur les angles
ang.s="0,45,90,135,180,225,270,315"
considérant que l'angle 0 est a 3 heure !! (a droite )
0=3 heure
90 = 6 heure
180= 9 heure
270 = midi
voila amuses toi bien
Dernière édition par Dobro le Mar 26 Nov 2019 - 18:34, édité 8 fois
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
Tu testes la couleurs de l'écran ? Tu y gagnes quoi par rapport à un test dans un tableau qui reprend la disposition ?
De plus, avec un tableau sous-jacent, tu pourrais attribuer une "couleur" différente selon l'angle de la surface collisionnée, ce qui te permettrait de calculer le rebond...
De plus, avec un tableau sous-jacent, tu pourrais attribuer une "couleur" différente selon l'angle de la surface collisionnée, ce qui te permettrait de calculer le rebond...
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Flipper 2D et sa physique
Le coup des bordures fines, attention, le point visé pourrait dépassé la bordure (surtout quand la balle se déplace très vite), et donc ta balle passer au travers....
_______________________________________________________
Re: Flipper 2D et sa physique
Tryphon a écrit:Tu testes la couleurs de l'écran ? Tu y gagnes quoi par rapport à un test dans un tableau qui reprend la disposition ?
De plus, avec un tableau sous-jacent, tu pourrais attribuer une "couleur" différente selon l'angle de la surface collisionnée, ce qui te permettrait de calculer le rebond...
ne commences pas a dériver ...
j'ai jamais dis que l'utilisation d'un tableau etait une herésie ...
il se trouve que le Purebasic est suffisamment rapide pour me permettre de lire les points directement sur l'image (je ne lis pas sur l'ecran ... mais sur l'image )
note que j'aurai pu aussi utiliser l'ecran ....
dans ce cas , tu peux voir l'image comme un tableau de points ..... au lieu d'etre dans un tableau ... c'est une image
dans l'absolu, ça ne change rien ... une image EST un tableau de points ...
chaque point a une coordonée .... et est extrayable ...
on peut aussi mettre l'image dans un tableau bien sur ... mais mon but n'etait pas l'optimisation , mais juste de montrer que le systeme de collision par lecture d'une certaine couleur, fonctionne !
apres ... la reaction a adopter en fonction de la dite collision, c'est une autre affaire ...
un model de collision peut marcher avec un decors ..incliné vers la gauche, et ne pas marcher sur un decors incliné vers la droite
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
drfloyd a écrit:Le coup des bordures fines, attention, le point visé pourrait dépassé la bordure (surtout quand la balle se déplace très vite), et donc ta balle passer au travers....
la vitesse est un "saut" de x pixel...
donc ma variable Distance est a adapter en fonction de ça !!
bien sur qu'on ne peux pas depasser une certaines vitesse , sinon c'est plus credible !!
je viens de changer le code pour accelerer les balles .. tu verra que ça speed bien quand meme
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
moi j'avais ce probleme quand j'ai tenté cette technique, les balles rapides passaient au travers
_______________________________________________________
Re: Flipper 2D et sa physique
oui c'est vrais que j'en ai aussi .. je regarde ce point
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
Dobro a écrit:ne commences pas a dériver ...
j'ai jamais dis que l'utilisation d'un tableau etait une herésie ...
J'ai jamais dit que tu avais dit ça...
il se trouve que le Purebasic est suffisamment rapide pour me permettre de lire les points directement sur l'image (je ne lis pas sur l'ecran ... mais sur l'image )
C'est pas une question de rapidité, ni une question de Pure, c'est une question de souplesse. Tout est beaucoup plus souple si les deux sont découplés.
on peut aussi mettre l'image dans un tableau bien sur ... mais mon but n'etait pas l'optimisation , mais juste de montrer que le systeme de collision par lecture d'une certaine couleur, fonctionne !
apres ... la reaction a adopter en fonction de la dite collision, c'est une autre affaire ...
un model de collision peut marcher avec un decors ..incliné vers la gauche, et ne pas marcher sur un decors incliné vers la droite
Si tu atteins un obstacle par la droite, tu n'atteins pas le même bord que par la gauche. Il te suffit de les "colorier" de deux couleurs différentes.
Si t'es davantage matheux, tu peux aussi garder une seule "couleur" et tester l'angle de la vitesse de la balle...
Et y'a aucun problème de bordure fine parce que, vu que les "couleurs" sont virtuelles, rien ne t'empêche de faire des "bordures épaisses".
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Flipper 2D et sa physique
bon mon probleme des balles qui passent au travers ne viens pas de la vitesse des balles
mais de la contradiction des regles de rebonds !!
une regle de rebond decide du sens de la balle
mais ça tourne tres vite ... (le code)
du coup , une autre regle va intervenir en défaisant ce que la premiere regle avait décidé .. du coup la balle au lieu de reculer, ... ben , elle avance !!!
et passe au travers ....
je viens de tester avec des bordures super epaisses, et ça passe au travers quand meme
bon ... je remballe
mais de la contradiction des regles de rebonds !!
une regle de rebond decide du sens de la balle
mais ça tourne tres vite ... (le code)
du coup , une autre regle va intervenir en défaisant ce que la premiere regle avait décidé .. du coup la balle au lieu de reculer, ... ben , elle avance !!!
et passe au travers ....
je viens de tester avec des bordures super epaisses, et ça passe au travers quand meme
bon ... je remballe
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
Une façon de faire (y'en a d'autres), c'est d'imposer à la balle d'avancer de seulement un pixel à la fois.
Mais, vas-tu me dire, ça va faire un flipper super lent ?
En fait non : il te suffit de faire avancer la balle plusieurs fois sans l'afficher :
Mais, vas-tu me dire, ça va faire un flipper super lent ?
En fait non : il te suffit de faire avancer la balle plusieurs fois sans l'afficher :
- Code:
while True:
avance_balle_de_1_pixel()
avance_balle_de_1_pixel()
avance_balle_de_1_pixel()
avance_balle_de_1_pixel()
affiche_balle()
rafraichit_ecran()
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: Flipper 2D et sa physique
arf .. je crois que c'est bon cette fois :)
j'ai mis a jour mon code et mon fond !! :)
@Tryphon, merci pour tes suggestions :)
[reedit] .... ha bah non , j'ai encore des balles qui passent au travers LOL
j'ai mis a jour mon code et mon fond !! :)
@Tryphon, merci pour tes suggestions :)
[reedit] .... ha bah non , j'ai encore des balles qui passent au travers LOL
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
Dobro a écrit:bon mon probleme des balles qui passent au travers ne viens pas de la vitesse des balles
mais de la contradiction des regles de rebonds !!
ouais... c'est la mega galère.... a chaque technique que je mettais au point ca générait de nouveaux problemes.... J'etais pas loin de réussir mais je me suis cassé les dents sur les couloirs (quand la balle passe dans un couloir etroit), et sur le frottement (quand la balle glisse sur une pente sans rebondir).
pourtant il doit etre facile de mettre au point des techniques, ca marche tres bien sur Kirby Pinball sur Gameboy en quelque ko par maitre Iwata (fan n°1 de flipper, RIP)
_______________________________________________________
Re: Flipper 2D et sa physique
Dobro a écrit:arf .. je crois que c'est bon cette fois :)
j'ai mis a jour mon code et mon fond !! :)
@Tryphon, merci pour tes suggestions :)
[reedit] .... ha bah non , j'ai encore des balles qui passent au travers LOL
Deja faut une bordure d'au point 2 pixels, sinon t'es pas l'abri d'un test qui passe au travers des que ca tourne, meme point par point
Mais comme tu dis, le rebond génère des contradictions qu'on a du mal à schématiser dans notre tête tellement tout se passe vite.... faut mettre tout ca sur papier et creuser.
Ca me donne envie de m'y remettre !!!!
_______________________________________________________
Re: Flipper 2D et sa physique
Kirby Pinball, on voit que c'est pas de le physique parfaite, mais c'est drolement efficace, quelque soit le bordel et les situations à l'ecran
_______________________________________________________
Re: Flipper 2D et sa physique
j'ai reedité mon code et mon image de fond !!
actuellement tel quel ça fonctionne !
j'utilise un "system d'etat" pour etre sur que telle ou telle collision n'est pas doublé...
et se contrarierai ...
ça semble fonctionnel ... meme a haute vitesse avec pas mal de balles...
au debut de la video avec 20 balles , puis 100 balles
je poste une video du resultat pour vous montrer....
ps : celle qui est dans la zone bleu n'as pas traversée, elle a ete generé a cet endroit
et elle ne peux pas sortir , ce qui montre que ça marche dans les deux sens
voila :
actuellement tel quel ça fonctionne !
j'utilise un "system d'etat" pour etre sur que telle ou telle collision n'est pas doublé...
et se contrarierai ...
ça semble fonctionnel ... meme a haute vitesse avec pas mal de balles...
au debut de la video avec 20 balles , puis 100 balles
je poste une video du resultat pour vous montrer....
ps : celle qui est dans la zone bleu n'as pas traversée, elle a ete generé a cet endroit
et elle ne peux pas sortir , ce qui montre que ça marche dans les deux sens
voila :
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
Mais.. Heu.. Ca rebondit a 45 degres quel que soit l'angle ou ca tape ?
Invité- Invité
Re: Flipper 2D et sa physique
oui, le but n'etait pas de faire une physique exacte, mais de démontrer
que les collision par lecture de couleur etait une voie possible ..
une physique exacte, oblige a prendre en compte la gravité (dans le cas d'un flipper...sujet de cette conversation )
mais aussi effectivement de l'angle des obstacles ...
l'avantage , c'est que c'est adaptable... on peut donner une regle de rebond qui varie en fonction d'un decors précis ...
apres c'est une autre histoire ....
moi j'ai préconisé l'empoi d'un moteur 3D avec vue sur le dessus, (on est en 2019 ) ...
mais je sais que je m'adresse aux freres tape dur du code
que les collision par lecture de couleur etait une voie possible ..
une physique exacte, oblige a prendre en compte la gravité (dans le cas d'un flipper...sujet de cette conversation )
mais aussi effectivement de l'angle des obstacles ...
l'avantage , c'est que c'est adaptable... on peut donner une regle de rebond qui varie en fonction d'un decors précis ...
apres c'est une autre histoire ....
moi j'ai préconisé l'empoi d'un moteur 3D avec vue sur le dessus, (on est en 2019 ) ...
mais je sais que je m'adresse aux freres tape dur du code
Dernière édition par Dobro le Sam 16 Nov 2019 - 18:27, édité 3 fois
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
ouais pas mal j'avais aussi réussi à peu près ca
Ca s'est gaté quand j'ai du gérer le type d'obstacles (bumper ou pas) l'inertie et le frottement
Ca s'est gaté quand j'ai du gérer le type d'obstacles (bumper ou pas) l'inertie et le frottement
_______________________________________________________
Re: Flipper 2D et sa physique
oui sérieusement, je ne mettais jamais rendu compte que faire un simple flipper
pouvait etre aussi ....... flippant
effectivement, la physique est compliqué , bien plus qu'il n'y parait au premier regards
le "moteur" doit etre semblable sur un jeux de billard ...
pouvait etre aussi ....... flippant
effectivement, la physique est compliqué , bien plus qu'il n'y parait au premier regards
le "moteur" doit etre semblable sur un jeux de billard ...
Dernière édition par Dobro le Sam 16 Nov 2019 - 19:00, édité 1 fois
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
apres avoir fait ce que tu as fait, je me suis dit, je n'ai plus qu'à attirer la balle en permanence vers le bas pour simuler la pente... et on arrive vite à la problématique du frottement de la balle sans rebond......
c'est complexe, mais une fois maitrisé je pense que ca tient dans un tout petit bout de code.
c'est complexe, mais une fois maitrisé je pense que ca tient dans un tout petit bout de code.
_______________________________________________________
Re: Flipper 2D et sa physique
je continue mes recherches de mon coté .. :)
cette histoire m'interesse
cette histoire m'interesse
Dobro- Patient contaminé
- Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019
Re: Flipper 2D et sa physique
c'est passionnant, j'y ai passé des heures perso (c'est aussi pour ça que ce type de jeu m'obsède)
_______________________________________________________
Page 1 sur 5 • 1, 2, 3, 4, 5
Sujets similaires
» FLIPPER 2D PHYSIQUE
» Documentaire sur le fabricant de flipper HOMEPIN à l'origine du flipper THUNDERBIRDS
» Moteur Physique
» Support physique, this is the end ?
» TOP PLAYSTATION 3 (support physique)
» Documentaire sur le fabricant de flipper HOMEPIN à l'origine du flipper THUNDERBIRDS
» Moteur Physique
» Support physique, this is the end ?
» TOP PLAYSTATION 3 (support physique)
Page 1 sur 5
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum