GAMOPAT
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Flipper 2D et sa physique

+5
Urbinou
Ricco59_59
Dobro
Tryphon
drfloyd
9 participants

Page 1 sur 5 1, 2, 3, 4, 5  Suivant

Aller en bas

Flipper 2D et sa physique Empty Flipper 2D et sa physique

Message par drfloyd Mer 13 Nov 2019 - 21:09

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 !


Dernière édition par drfloyd le Mar 26 Nov 2019 - 17:05, édité 1 fois

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Tryphon Jeu 14 Nov 2019 - 9:16

Si Dobro t'aide pas, je pense que je peux (mais je suis pas mal pris avec Shinobi pour l'instant)...
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Jeu 14 Nov 2019 - 17:12

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 Mad
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Jeu 14 Nov 2019 - 18:58

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 ?

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Jeu 14 Nov 2019 - 19:09

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 Very Happy

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


avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Tryphon Jeu 14 Nov 2019 - 19:11

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
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Jeu 14 Nov 2019 - 23:11

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

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Ven 15 Nov 2019 - 9:40

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...
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 11:58

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 : 
Flipper 2D et sa physique Fond12

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é !!   Very Happy

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 Very Happy  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   Very Happy

voila amuses toi bien Very Happy


Dernière édition par Dobro le Mar 26 Nov 2019 - 18:34, édité 8 fois
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Tryphon Sam 16 Nov 2019 - 12:08

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...
Tryphon
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Sam 16 Nov 2019 - 12:15

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

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 12:15

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 ! Wink

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



avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 12:23

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 Wink
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Sam 16 Nov 2019 - 12:24

moi j'avais ce probleme quand j'ai tenté cette technique, les balles rapides passaient au travers

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 12:25

oui c'est vrais que j'en ai aussi .. je regarde ce point
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Tryphon Sam 16 Nov 2019 - 12:27

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 !   Wink

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
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 12:49

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 MDR

bon ... je remballe Embarassed
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Tryphon Sam 16 Nov 2019 - 12:53

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 :

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
Tryphon
Docteur *
Docteur *

Masculin Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 12:57

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
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Sam 16 Nov 2019 - 13:01

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  Mr. Green par maitre Iwata (fan n°1 de flipper, RIP)

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Sam 16 Nov 2019 - 13:04

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 !!!!

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Sam 16 Nov 2019 - 13:05

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


_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 17:01

j'ai reedité mon code et mon image de fond !!

actuellement tel quel ça fonctionne ! Very Happy
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 Flipper 2D et sa physique 418468
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  Flipper 2D et sa physique 418468

voila :  
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Invité Sam 16 Nov 2019 - 18:19

Mais.. Heu.. Ca rebondit a 45 degres quel que soit l'angle ou ca tape ?
avatar
Invité
Invité


Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 18:21

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 ... Flipper 2D et sa physique 418468

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 Flipper 2D et sa physique 7PA9eZ3i_400x400

MDR MDR


Dernière édition par Dobro le Sam 16 Nov 2019 - 18:27, édité 3 fois
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Sam 16 Nov 2019 - 18:22

ouais pas mal  cyclops 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  Mr. Green

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 18:31

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 Shocked

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
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Sam 16 Nov 2019 - 18:37

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.

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par Dobro Sam 16 Nov 2019 - 18:38

je continue mes recherches de mon coté .. :)
cette histoire m'interesse
avatar
Dobro
Patient contaminé

Masculin Nombre de messages : 293
Age : 59
Localisation : 43
Date d'inscription : 30/09/2019

Revenir en haut Aller en bas

Flipper 2D et sa physique Empty Re: Flipper 2D et sa physique

Message par drfloyd Sam 16 Nov 2019 - 18:45

c'est passionnant, j'y ai passé des heures perso (c'est aussi pour ça que ce type de jeu m'obsède)

_______________________________________________________
Flipper 2D et sa physique Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181822
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Page 1 sur 5 1, 2, 3, 4, 5  Suivant

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum