Flipper 2D et sa physique
+5
Urbinou
Ricco59_59
Dobro
Tryphon
drfloyd
9 participants
Page 5 sur 5
Page 5 sur 5 • 1, 2, 3, 4, 5
Re: Flipper 2D et sa physique
Tryphon a écrit:Pour la suite Doc, ça t'embête si j'écris des classes avec des méthodes ? Si oui, je peux transformer le code pour m'en débarrasser, mais c'est un poil moins "joli"...
c'est un peu chiant pour la compréhension..... le moins joli est plus compréhensible
Re: Flipper 2D et sa physique
...par toi. L’objet est bien plus élégant ! (D’ailleurs tu confirmes ? Possible en pure ?)
Mais bon vu que ça t’est destiné
Mais bon vu que ça t’est destiné
Re: Flipper 2D et sa physique
D'après wikipedia, non, PureBasic n'est pas orienté objet, par la volonté de son créateur.
Mais plusieurs utilisateurs ont créé des préprocesseurs pour permettre la POO.
Du coup je vais pas faire d'objet. Par contre je ferai des structures...
Mais plusieurs utilisateurs ont créé des préprocesseurs pour permettre la POO.
Du coup je vais pas faire d'objet. Par contre je ferai des structures...
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
ce n'est pas pour moi
c'est pour la science
C'est aussi pour cela qu'il faut réaliser ce tuto eu pseudo code, adaptable à n'importe quel langage
c'est pour la science
C'est aussi pour cela qu'il faut réaliser ce tuto eu pseudo code, adaptable à n'importe quel langage
_______________________________________________________
Re: Flipper 2D et sa physique
Du coup j'utilise des structures. Pure le fait. Une structure, c'est comme un tableau sauf que chaque élément peut être d'un type différent, et s'appelle par un nom (et non un indice). Par exemple :
machin contient donc deux éléments, que tu peux affecter et lire en écrivant machin.truc pour le premier, et machin.muche pour le second.
En Pure, j'ai cru voir que c'était machin\truc et machin\muche, mais bon, je garde le point, c'est plus courant...
Bon, la gestion de la balle maintenant.
Je représente la vitesse de la balle par un vecteur speed. Un vecteur, mathématiquement, ça représente un déplacement dans une direction, d'un certain nombre de pixel. En général on le décompose en ses coordonnées x et y (horizontales et verticales), mais on pourrait le décomposer sur d'autres axes (et on le fera).
On peut ajouter des vecteurs, ou les multiplier par un nombre. J'ai mis tout ça dans une classe, avec quelques fonctions :
La balle est elle-même une structure qui contient plusieurs attributs :
À chaque tick (1 tick = 1/60ème de seconde), je mets à jour la vitesse en lui ajoutant le vecteur gravity. C'est un vecteur qui pointe vers le bas, ses coordonnées sont (0, 0.1) dans ma démo, mais comme on m'a fait remarquer, la balle a l'air flottante donc il faudrait certainement augmenter le y :
Ça donne des déplacements en forme de parabole.
Ensuite, je mets à jours la position, mais pas tout d'un coup, car sinon je risque de rater une collision.
Par exemple, si le vecteur speed mesure 10 pixels, j'ajoute 10 fois le dixième du vecteur speed, et je teste les collisions à chaque étape, comme ça je sais que je parcours tous les pixels sur la trajectoire.
Ce n'est pas parfait, parce que théoriquement on peut passer à travers une diagonale, mais en pratique ça a l'air d'aller. Je calcule donc la longueur du vecteur (on dit norme en maths) puis je calcule un vecteur delta qui représente un vecteur d'(à peu près) un pixel dans la direction de la vitesse :
Je rajoute 1 à norm(speed) parce qu'a priori, c'est un nombre à virgule, et avec l'arrondi je risque d'avoir un vecteur speed qui fait plus d'un pixel.
Ensuite, j'ajoute n_steps le vecteur delta, en vérifiant s'il y a collision à chaque étape :
Je fais pas une bête boucle "for" parce que, s'il y a une collision, ça va changer le vecteur speed, donc le vecteur delta, nb_steps et current_step.
La fonction check_collisions s'occupe de rajouter le vecteur delta à la position de la balle s'il n'y a pas de collision, sinon elle gère le rebond.
Bon, prochain message : la collision entre la balle et un obstacle. Y'aura de la trigo
- Code:
struct Bidule:
truc
muche
machin = Bidule()
machin contient donc deux éléments, que tu peux affecter et lire en écrivant machin.truc pour le premier, et machin.muche pour le second.
En Pure, j'ai cru voir que c'était machin\truc et machin\muche, mais bon, je garde le point, c'est plus courant...
Bon, la gestion de la balle maintenant.
Je représente la vitesse de la balle par un vecteur speed. Un vecteur, mathématiquement, ça représente un déplacement dans une direction, d'un certain nombre de pixel. En général on le décompose en ses coordonnées x et y (horizontales et verticales), mais on pourrait le décomposer sur d'autres axes (et on le fera).
On peut ajouter des vecteurs, ou les multiplier par un nombre. J'ai mis tout ça dans une classe, avec quelques fonctions :
- Code:
struct Vector:
x
y
def add_vectors(v1, v2):
# somme de deux vecteurs
return Vector(v1.x + v2.x, v1.y + v2.y)
def mul_vector(v, k):
# multiplication d'un vecteur v par un nombre k
return Vector(k*v1.x, k*v1.y)
def norm(v):
# norme d'un vecteur, càd sa "longueur" :
return sqrt(v.x^2 + v.y^2)
La balle est elle-même une structure qui contient plusieurs attributs :
- Code:
struct Ball:
pos # vecteur position
speed # vecteur vitesse
delta # vecteur vitesse réduit, voir plus loin
n_steps # le nombre de fois où il faut rajouter delta, voir plus loin
current_step # lié au précédent, voir plus loin
radius # rayon de la balle
sprite # image de la balle
À chaque tick (1 tick = 1/60ème de seconde), je mets à jour la vitesse en lui ajoutant le vecteur gravity. C'est un vecteur qui pointe vers le bas, ses coordonnées sont (0, 0.1) dans ma démo, mais comme on m'a fait remarquer, la balle a l'air flottante donc il faudrait certainement augmenter le y :
- Code:
ball.speed = add_vectors(ball.speed, gravity)
Ça donne des déplacements en forme de parabole.
Ensuite, je mets à jours la position, mais pas tout d'un coup, car sinon je risque de rater une collision.
Par exemple, si le vecteur speed mesure 10 pixels, j'ajoute 10 fois le dixième du vecteur speed, et je teste les collisions à chaque étape, comme ça je sais que je parcours tous les pixels sur la trajectoire.
Ce n'est pas parfait, parce que théoriquement on peut passer à travers une diagonale, mais en pratique ça a l'air d'aller. Je calcule donc la longueur du vecteur (on dit norme en maths) puis je calcule un vecteur delta qui représente un vecteur d'(à peu près) un pixel dans la direction de la vitesse :
- Code:
ball.n_steps = int(norm(speed)) + 1
ball.delta = mul_vector(speed, 1/n)
Je rajoute 1 à norm(speed) parce qu'a priori, c'est un nombre à virgule, et avec l'arrondi je risque d'avoir un vecteur speed qui fait plus d'un pixel.
Ensuite, j'ajoute n_steps le vecteur delta, en vérifiant s'il y a collision à chaque étape :
- Code:
ball.current_step = 0
while ball.current_step < ball.nb_steps:
check_collisions(ball, collision_map, flips)
ball.current_step += 1
Je fais pas une bête boucle "for" parce que, s'il y a une collision, ça va changer le vecteur speed, donc le vecteur delta, nb_steps et current_step.
La fonction check_collisions s'occupe de rajouter le vecteur delta à la position de la balle s'il n'y a pas de collision, sinon elle gère le rebond.
Bon, prochain message : la collision entre la balle et un obstacle. Y'aura de la trigo
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
bordel, il a osé les structures... il veut me perdre
_______________________________________________________
Page 5 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 5 sur 5
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum