ArkaLouReeD - Le légendaire casse briques

Bonjour,

plusieurs projets en cours dont certains ne voient pas le bout du tunnel...
Je me relance donc dans ce projet anciennement appelé "Cabaret" dans des messages précédent, mais là je par sur son nom "phonétique".
J'espère, ce coup ci, avoir le temps de le finaliser, mais je cherche à optimiser toutes les procédures afin de le rendre fluide et joli à la fois, et si tout va bien j'y mettrais du son...

J'espère pour moi (et vous) qu'il ne tombera pas dans le cartons des "A finir", ou bien dans un autre que je ne sais même plus où je l'ai mis !

Comme dit sur d'autre message, ici j'ai utilisé un contrôle ActiveX Label afin de surveiller le déplacement de la souris ce qui me permet de gérer le déplacement de la "raquette". Il faut que je gère les clics boutons souris afin de ne pas avoir de clignotement à l'écran de ce contrôle qui est transparent... Mais je crois que waard à fait un tuto là dessus, non ?

@ bientôt

LouReeD

EDIT 23/06/2023 : Voilà la version "finale" est téléchargeable ici ! Mais que ceci ne vous empêche pas de lire le fil de discussion dans lequel je relate mes façons de voir les choses et les différentes "bifurcations" pour arriver à destination ! Bon jeu @ vous !

Bonsoir,

une petite retouche afin de vous montrer de quoi je veux parler :

titre transparent

@ bientôt

LouReeD

Edit : changement du logo... en adéquation avec le nouveau nom... (édit du 15/11/2021 : avec une meilleur retouche...)

Vous le reconnaissez celui-là ?

m5

@ bientôt

LouReeD

Bonsoir,

les capsules Bonus, vous connaissez ?

cl

@ bientôt

LouReeD

Bonsoir,

Juste pour dire que les éléments graphiques sont finis...
4 raquettes : Laser, normale, grande et collante
1 raquette spare
6 monstres
2 types de briques : cassable et non cassable
1 balle
7 capsules bonus : Vie, Capture, Balle, Démultiplicateur, Elargissement, Laser, Suivant
2 passages au niveau suivant
1 background
1 bordure façon tube

dionakra

Bon il manque un peu de couleur mais c'est déjà géré, et tout comme l'original, le background change à chaque niveau.

Maintenant il faut que j'attaque le code !

@ bientôt

LouReeD

Bonsoir,

Pour commencer je vais définir ce qu'est une balle :

Une forme standard de type Shape, ronde, de couleur indifférente (enfin on pourra choisir), ayant une direction en X (de gauche à droite), une direction en Y (de haut en bas), un angle pour la trajectoire et une vitesse pour la longueur de déplacement. Ce déplacement est décomposé en translation en X et en Y.

Tout ceci sera indiqué dans une définition de TYPE :

Type Balle_Type
    B As Shape ' Objet Shape représentant la balle
    Tx As Integer ' Translation en X de la balle
    Ty As Integer ' Translation en Y de la balle
    Dy As Integer ' Direction en X de la balle : -1 vers le haut, 1 vers le bas
    Dx As Integer ' Direction en Y de la balle : -1 vers la gauche, 1 vers la droite
    A As Integer ' Angle de la balle de 1° à 89° par rapport à la verticale
    V As Integer ' Vitesse de la balle de 5 à 25 par pas de 5
    P As Long ' couleur de la balle (Paint)
    C As Boolean ' la balle est elle Collée à la raquette
End Type

Puisque dans le jeu il peut y avoir plusieurs balles à gérer alors la définition des balles se fera par une variable "tableau" de type Balle_Type :

Public Balle(1 To 3) As Balle_Type

Ici on pourra gérer trois balle. En effet dans le jeu original, il ne peut y avoir de cumulation de multiplication de balle, contrairement à DX-Ball !

Les coordonnées du Shape balle seront donc gérées pour la balle 1/3 de cette façon :
Balle(1).B.Left = 150
Balle(1).B.Top = 150

Si on doit gérer trois balles :

For I=1 to 3
    Balle(I).B.Left = Balle(I).B.Left + Balle(I).Tx * Balle(I).Dx
    Balle(I).B.Top = Balle(I).B.Top + Balle(I).Ty * Balle(I).Dy
Next I

Chaque balle sera donc déplacée de ses propres coordonnées vers les nouvelles en fonction de sa propre direction et ses propre translation.

Je ne sais si cela prête préjudice sur le fonctionnement du code, mais je préfère décomposé la "quantité" de translation en X de la direction en X avec les variables Tx et Dx. Il est vrai que je pourrais les fusionner, car une translation de -3 indique une translation de 3 vers la gauche et s'il y a rebond en X alors la valeur passerait à +3 donc une translation de 3 vers la droite... Alors oui cela fait plus de variable mais je trouve cela plus clair.

C'est un début... Il manque tout le reste !

Si vous trouvez des "erreurs" ou des absurdité de programmation, alors n'hésitez pas. Après je verrais si j'en prend compte ou pas...

@ bientôt

LouReeD

Bonsoir,

Pour créer ce jeu, différents éléments vont interagir les uns avec les autres.
Ces éléments sont :

Le tableau de jeu

Une forme de type picture afin d'y intégrer une image décorative pour le niveau considéré :

  • Limite gauche, limite haute, limite droite : rebond de la balle avec un angle identique qu'à l'arrivée mais dans une direction opposée.
  • Limite basse : si balle arrive à cette limite, une vie est perdue. S'il n'y a plus de raquette spare alors la partie est finie.

Le contour du tableau de jeu

Une forme de type picture afin d'y intégrer une image décorative représentant le cadre des limites de jeu sur lesquelles la balle va rebondir. Cette forme sera positionnée au premier plan afin d'y ajouter une ombre pour donner du relief.

La balle

Une forme Shape simple. Elle pourra avoir des couleurs différentes dans le cas de la démultiplication.

La raquette

Une forme de type picture afin de lui intégrer une image. Plusieurs raquettes accessibles :

  • La raquette normale : de taille normale sans accessoire, la balle rebondie différemment en fonction du point d'impact.
  • La raquette élargie : de taille plus longue et sans accessoires, la balle rebondie différemment en fonction du point d'impact.
  • La raquette capture : de taille normale avec la possibilité de capturer les balles, la balle ne rebondis pas et reste collée au point d'impact, il faut une action du joueur pour la relancer. Ceci permet de faire des tirs de précision. L’angle de la balle une fois libérée sera fonction du point d’impact initial.
  • La raquette laser : de taille normale avec la possibilité de tirer des lasers. Par action du joueur permet de lancer des lasers pour détruire des briques et/ou des monstres. La balle rebondie différemment en fonction du point d'impact.

Les raquettes spare

Une forme de type picture afin de lui intégrer une image, au nombre de trois en début de partie, ce nombre peut varier en plus ou en moins en fonction des pertes ou des gains de vie. Si le joueur perd une vie et qu'il n'y a plus de raquette spare alors la partie est finie.

Les briques

Une formes simples rectangulaire avec deux types d'effet de relief afin de différencier les briques "cassables" et celles "incassables". Plusieurs couleurs accessibles :

  • Blanche : cassable et donne 10 points
  • Bleu ciel : cassable et donne 15 points
  • Rose : cassable et donne 20 points
  • Jaune : cassable et donne 25 points
  • Verte : cassable et donne 30 points
  • Rouge : cassable et donne 35 points
  • Bleu : cassable et donne 40 points
  • Grise clair : cassable et donne 45 points
  • Grise foncée : résistante, il faut la toucher de 2 à 5 fois suivant le niveau atteint pour la détruire et donne 80 points
  • Or : incassable et donne 0 point

Aléatoirement, lorsqu'une brique et détruite, il y a distribution des capsules bonus.

Les capsules

Une forme de type picture afin d'y intégrer un gif animé. Plusieurs bonus accessibles :

  • Laser : identifiée par la lettre L et la couleur rouge, elle active la raquette laser.
  • Démultiplication : identifiée par la lettre D et la couleur bleu ciel, multiplie par trois le nombre de balles en jeu.
  • Capture : identifiée par la lettre C et la couleur verte, elle active la raquette capture.
  • Vie : identifiée par la lettre V et la couleur grise, elle ajoute une vie supplémentaire.
  • Elargissement : identifiée par la lettre E et de couleur bleue, elle active la raquette élargie.
  • Suivant : identifiée par la lettre S et de couleur orange, elle active l'ouverture du passage au niveau suivant.
  • Balle : identifiée par la lettre B et de couleur rose, elle diminue la vitesse de déplacement de la balle.

Les monstres

Une forme de type picture afin d'y intégrer un gif animé, il en existe 6 types. Un seul type visible par niveau et au maximum 3 monstres visibles en simultané. Lorsqu'ils entrent en contact avec la balle cette dernière est déviée de façon aléatoire et ils disparaissent. En cas de contact avec la raquette, les monstres disparaissent. Dans les deux cas ils rapportent 5 points.

Les champs magnétique de changement de niveau

Une forme de type picture afin d'y intégrer un gif animé.

Comme vous pouvez le voir, seules les briques et la balle sont de "simple shape" mais ceci est choisi après quelques tests : en effet, les briques avec les 16 lignes possibles sur 13 colonnes sont au nombre de 208 ! En type picture, cela a tendance à ralentir le jeu... Pour les balles, elles sont en mouvement, parfois au nombre de trois alors... Et puis une balle, elle est de forme ronde, de couleur, alors pourquoi y mettre une image ? Eventuellement un gif animé pour créer une balle "brulante" ? Heureusement pour moi cela n'existe pas dans le jeu !

Pour les monstres ils seront gérés à peu près de la même manière que les balles, si ce n'est que leur déplacement sera aléatoire. Reste à voir si je respecte les briques ou pas lors de ces déplacements. En effet dans l'original, les monstres ne traversent pas les briques.

Voilà pour aujourd'hui mes réflexions...

@ bientôt

LouReeD

Aller encore un peu pour ce soir

Déplacement de la balle

Variables prises en compte pour le déplacement de la balle :

  • A : angle de la trajectoire de la balle par rapport à la verticale de 1° à 89°. Angle de départ = 30°.
  • V : vitesse de la balle de 5 à 25 par pas de 5. Vitesse de départ = 5.
  • Dx : direction de la balle en X : +1 direction vers la droite, -1 direction vers la gauche. Valeur de départ = +1
  • Dy : direction de la balle en Y : +1 direction vers le bas, -1 direction vers le haut. Valeur de départ = -1
  • Tx : translation en X correspondant au vecteur de déplacement de la balle d'un angle de A° et de vitesse V, où : Sin(A) = côté opposé / Hypoténuse => Sin(A) = Tx/V => Tx = V * Sin(A)
  • Sous VBA le calcul du sinus se fait sur des radian, il faut donc convertir A° en radian, pour cela on le multiplie par Pi/180, hors sous VBA il n'y a pas de constante Pi, on le trouve donc par la formule suivante : Pi= 4 * ATN(1) ce qui donne la formule suivante finale en prenant la valeur absolue car le déplacement de la balle est toujours positif car la direction est donnée par la variable Dx : Tx = ABS(V * SIN(A * 4 * ATN(1)/180))
    Tx représente le côté opposé de l’angle de la trajectoire de la balle.
  • Ty : translation en Y correspondant au vecteur de déplacement de la balle d'un angle de A° et de vitesse V, où : Cos(A) = coté adjacent / Hypoténuse => Cos(A) = Ty/V => Ty = V * Cos(A) => Ty = ABS(V * Cos(A * 4 * ATN(1)/180))
    Ty représente le côté adjacent de l’angle de la trajectoire de la balle.
arkanoid explications

Position actualisée de la balle :

  • Balle.Left = Balle.Left + (Tx * Dx)
  • Balle.Top = Balle.Top + (Ty * Dy)

Le quart de cercle permet d'illustrer la trigonométrie utilisée...

J'y retourne ! (Edit du 13/10/2021 : en réalité l'axe des Y est dans l'autre sens ! Et oui le "0" des coordonnées dans Excel est en haut à gauche de la feuille !)

@ bientôt

LouReeD

Bonsoir à vous tous ! A moins que ce ne soit qu'à toi... Ou bien moi tout seul...

Phonétiquement parlant j'ai changé le nom de mon futur jeu pour qu'il se rapproche de l'originale, mais avec "ma touche personnel" !

Au niveau du code cela avance bien pour le moment... J'ai finaliser le concept de tableau de briques afin de me permettre de savoir s'il y a impact entre une brique et la balle. Sauf erreur de ma part dans Excel il n'y a pas d'instruction "d'intersection" entre deux shape, n'est-il pas ?

Du coup je travaille sur un quadrillage qui représente les lignes et les colonnes de la zone de brique, puis en fonction des coordonnées de la balle, je détermine sa position dans ce quadrillage et je compare les coordonnées de la cellule trouvée avec celles d'un tableau qui garde en mémoire les briques existantes et leur type.
Avec ce système il n'y a aucune référence au cellule de la feuille.

Comme un dessin vaut mieux à un long discours :

explications

J'introduis ici ma futur solution de détection d'impact ainsi que ce qui me servira à déterminer le côté touché de la brique et par correspondance le type de rebond pour la balle : je surveillerais ce qui se passe au niveaux des trois points remarquables en fonction de la direction de la balle. Si la balle va vers le haut et la droite alors les points à surveiller seront le P1, P2 et P3, P4 peu être ignoré car il est dans la trainée de la balle, donc il n'y aura pas d'impact à son niveau dans cette direction !

@ bientôt

LouReeD

Re bonsoir,

petites nouveautés de dernière minutes :

Les raquettes sont un peu plus fines, cela est plus esthétique que les "gros" tubes prévus à l'origine, et j'ai ajouté les flammes des réacteurs directionnels de ces dernières ! Ils s'allument bien évidemment en fonction de la direction demandée ! Sur la photo ci dessous, la raquette va vers la droite :

flamme

Le code de déplacement de la raquette est finalisé avec ajout d'une variable qui calcule le delta de déplacement de la raquette afin de savoir si celle-ci se déplace vite ou pas lors de la collision avec la balle ce qui aura pour effet de donner (justement) de l'effet à la balle :
Un déplacement quasi nul = un rebond avec un angle identique au départ qu'à l'arrivée, mais si la raquette va "plus vite" et qu'elle va dans le sens de la balle, alors l'angle sera plus plat et la vitesse de la balle sera augmentée, et si elle va en sens inverse alors l'angle sera plus vertical avec une vitesse réduite.

Ce sera l'équivalent du "coupé" et du "lifté" au tennis.

@ bientôt

LouReeD

Aller, ce soir je suis en forme, je vous présente ma façon d'aborder les collisions de la balle avec les briques (mais le principe est valable pour les quatre cotés du tableau de jeu et pour la raquette, pour les monstres je n'ai pas réfléchie, mais cela devrait s'en approcher...)

Principe du test de collision de la balle avec un des éléments du jeu

La balle se trouve à la position Balle.Left et Balle.Top (en jaune), elle a un déplacement en X de Tx et un déplacement en Y de Ty avec les directions associées Dx et Dy. Pour savoir s'il y a une collision il suffit de voir si à l'arrivée (en vert) la balle est en intersection avec un obstacle :

arkanoid explications3

Ici on voit qu'en effet il y a collision avec une brique à l'arrivée, il suffira de gérer ce contact afin de modifier la trajectoire de la balle ainsi que la suppression de la brique.

En fonction de la vitesse de la balle, il peut y avoir entre son point de départ et son point d'arrivée un obstacle non pris en compte dans cette façon de faire :

arkanoid explications4

Ici on voit bien que la brique Violette n'est pas considérée lors du déplacement de la balle ce qui conduit à une incohérence de jeu où la balle semble traverser une brique sans la toucher.

Pour remédier à ce "problème" la trajectoire de la balle entre le point de départ et le point d'arrivée théorique est découpé en 10 segments, et après chaque 1/10 de déplacement on vérifie la collision ou pas avec un élément du jeu :

arkanoid explications5

Ici c'est au deuxième décalage (balle rouge) où le contact se fait avec le premier élément rencontré. En fonction de la puissance de l'ordinateur ce nombre de 10 itérations peut être augmenté ou diminué afin d'augmenter la précision des impacts ou de réduire le temps de calcul et ainsi améliorer la fluidité.

En code VBA une simple boucle For To Next suffit à calculer les différentes itérations, et un Exit For permet d'arrêter ces tests prématurément s'il y a eu impact.
On part de 1 à 10 et à chaque itération on addition i * 1/10 du déplacement Tx*Dx à la position Balle.Left et i * 1/10 du déplacement Ty*Dy à la position Balle.Top.

Pour les calculs on utilisera une position en "Left" et en "Top" virtuelle afin de ne pas toucher à la position réelle de la balle

' Test de collision de la balle avec un élément de jeu
' principe des itérations de calculs pour les positions intermédiaires
For I = 1 to 10
    Bleft = Balle.Left + Dx * ((Tx / 10) * I)
    Btop = Balle.Top + Dy * ((Ty / 10) * I)
    [… Code test de collision aux coordonnées virtuelles Bleft et Btop… renvoie Impact à True ou à False]
    If Impact Then Exit For
Next I

@ bientôt

LouReeD

Bonjour,

L'air de rien, ces étapes de construction sont très intéressantes à suivre.

Hâte de voir le résultat final !

Bonjour JoyeuxNoel !

Merci pour ce message !

Je me suis rendu compte que de "coucher" les problèmes sur papier permettait d'optimiser les codes... Et ceci me permait de comprendre ce que je code.

J'espère seulement avoir le temps de finir de la sorte.

@ bientôt

LouReeD

Bonjour LouReeD,

Bonsoir à vous tous ! A moins que ce ne soit qu'à toi... Ou bien moi tout seul...

Je te rassure, tu ne parles pas tout seul !

Je suis le sujet depuis presque le début, je trouve que tu avances très vite j'espère que c'est encourageant !

A+

Bonjour Gabin37 !

Merci pour votre message ! J'arrive à voir qu'il y a du passage sur le fil mais pas trop de trace laissées...

Pour ce qui est d'avancer, je suis dans la réalité plus en avance qu'ici, mais comme j'essaye d'expliquer mes choix, les problèmes et les solutions pris, ici je prends du retard...

@ bientôt

LouReeD

Bravo pour ce projet ambitieux, mais qui rendra très bien.

Imoka, bonsoir !

et merci pour ces encouragements !
De mon coté j'ai hâte également !
Comme dit un message plus haut, j'ai déjà une version avec la balle et les briques, une très vielle version avec les capsules et les multi-balles ainsi que les changements de raquettes, mais j'essaie de rester sur cette piste, c'est à dire avancer en expliquant et comprenant ce que je fais pour optimiser le code...

A voir donc.

@ bientôt

LouReeD

Bonsoir,

ce soir on avance sur les différents types d'impact :

Détermination de la brique touchée par la balle

Pour déterminer la brique impactée par la balle et connaître ainsi son rebond, on utilise les 4 points caractéristiques de position de la balle : P1, P2, P3 et P4, avec leur composants P1x et P1y (etc…) pour connaître leurs coordonnées.

Ensuite en fonction de la direction de la balle, déterminée par la paire de valeur Dx et DY, on regarde ce qui se passe au niveau de ces points. Seuls 3 points sont à prendre en considération par mouvement, le quatrième faisant partie de la "trainée" de la balle :

arkanoid explications6

On a donc pour :

  • Dx > 0 et Dy > 0 les points 2, 3 et 4
  • Dx > 0 et Dy < 0 les points 1, 2 et 3
  • Dx < 0 et Dy > 0 les points 1, 3 et 4
  • Dx < 0 et Dy < 0 les points 1, 2 et 4

En fonction de la zone de jeu, on se retrouve avec 9 possibilités d'impact, comme le montre le schéma ci-dessous pour une direction avec les valeurs de Dx et Dy suivante : Dx > 0 et Dy < 0 :

arkanoid explications7
  • soit la balle touche une brique par l'un des trois points remarquables (1, 2 et 7)
  • soit la balle touche une brique avec deux des points sur la même ligne (3 et 4 ou 5 et 6) avec dans ces cas le test de connaître qu'elle est la brique la plus touchée pour l'effacer et si la touche est égale alors les deux seront effacées
  • soit la balle touche deux briques avec deux points non consécutifs ou les trois (8 et 9)

L'impact avec le seul point 2 est en 7ième position car son cas est délicat, il dépend énormément de l'angle de la trajectoire de la balle.
Pour le 8 et 9, cela devrait bien "se passer", et pour les autres cas je les présence ci dessous.

Etude des différents cas de contact

Seule la trajectoire Dx > 0 et Dy < 0 sera traité. En effet par un jeu de rotation des graphiques, le principe d'analyse est le même pour les trois autres trajectoires, seuls les points remarquables à prendre en compte changent.

Configuration 1 : Impacte au point 1 et pas au point 2 ni au point 3 :

arkanoid explications9

Il faut "redescendre" la balle afin que la ligne des points 1 et 2 soit au niveau du bas de la brique (Ca), La balle ne se trouve plus sur sa trajectoire d'origine, il faut la décaler vers la gauche afin de la remettre sur sa trajectoire (Co). Pour cela on va utiliser la trigonométrie.

On connaît la position en "y" du point 1 (en haut à gauche de la zone balle) qui correspond ici à Balle.Top. On connaît la position inférieure de la brique qui est égale à Brique.Top + Brique.Height, ceci nous donne Ca (Coté adjacent de l'angle de la trajectoire de la balle) :

  • Ca = (Brique.Top + Brique.Height) - Balle.Top

On connaît Ca, on connaît l'angle, il faut déterminer Co par la trigonométrie :

  • On sait que le Sin(A) = Co/Hyp donc on a Co = Sin(A)*Hyp, mais on ne connaît pas la valeur de Hyp.
  • On sait que le Cos(A)=Ca/Hyp donc on a Hyp = Ca/Cos(A)
  • Ce qui nous donne Co = Sin(A) * (Ca/Cos(A))
  • Le Sin(A) est égal à Ty et le Cos(A) est égale à Tx, on a donc Co = Ty*(Ca/Tx)

Il suffit après calcul de déplacer la balle à ses nouvelles coordonnées grâce aux composante P1x et P1y du point P1 et en prenant la valeur absolue de Ca et Co car le décalage est toujours positif :

  • Balle.Left = P1x - ABS(Co)
  • Balle.Top = P1y + ABS(Ca)

Dans ce cas la balle rebondie en "Y" donc on a également Dy = - Dy (on part en sens inverse). La brique sera effacée.

Configuration 2 : Pas d'impact au point 1 et 2 et un impact au point 3

Ici le principe est le même que ci-dessus sauf qu'au lieu de faire un décalage vers le bas en premier, on va faire un décalage vers la gauche pour aligner la ligne point 2 et 3 avec le bord gauche de la brique, ce qui nous donnera Co, on calculera alors Ca en fonction de Co, Tx et Ty par la formule : Ca = Tx * (Co/Ty)

Les nouvelles coordonnées de la balle seront :

  • Balle.Left = P1x - ABS(Co)
  • Balle.Top = P1y + ABS(Ca)

Dans ce cas la balle rebondie en "X" donc on aura Dx = - Dx.

Configuration 3 et 4 : Impact au point 1, impact au point 2 pas d’impact au point 3

arkanoid explications13

Nous sommes dans le même cas que la configuration 1, il faut donc calculer le Ca en décalant la balle sous la ligne des briques et trouver le Co grâce à Tx et Ty afin de placer la balle sur la trajectoire.

La différence se fait au niveau de la brique à effacer :

  • Si le point 1 et le point 2 sont sur la même brique alors cette dernière est effacée.
  • Si le point 2 est plus « en avant » de sa brique que le point 1 par rapport à la ligne commune des briques, alors c’est la brique à droite qui sera effacée.
  • Si c’est l’inverse alors se sera la brique de gauche.
  • Si la distance est égale alors les deux briques seront effacées.

Configuration 5 et 6 : Pas d’impact au point 1 et impact au point 2 et 3

arkanoid explications14

Nous sommes dans le même cas que la configuration 2, il faut donc calculer Co en décalant la balle sur le bord gauche des briques puis déterminer Ca en fonction de Tx et Ty afin de remettre la balle sur sa trajectoire.

La différence se fait au niveau de la brique à effacer :

  • Si le point 2 et le point 3 sont sur la même brique, alors cette dernière est effacée.
  • Si le point 2 est plus en avant sur sa brique que le point 3 par rapport à la ligne commune des briques, alors c’est la brique du dessus qui est effacée.
  • Si c’est l’inverse alors c’est la brique du dessous
  • Si la distance est égale alors les deux seront effacées.

Voilà, il me reste à analyser les configurations 7, 8 et 9 qui dépendent de la trajectoire. Mais dans la version "fonctionnelle" de test, je ne vais pas beaucoup plus loin dans l'analyse et vu le "dézoom" des briques et de la balle, les incohérences qui peuvent exister ne se voient pas plus que cela.
Mais je vais comme même y réfléchir un peu (c'est déjà fait...) et le problème se situ surtout pour les angles proches de 0° ou à l'inverse proche de 90° par rapport à la vertical du jeu. Une solution serait de limiter les angles possible sur la trajectoire avec un minimum de 30° et un maxi de 60° par exemple.
A voir, quand je me serais vraiment plongé dans l'étude.

@ bientôt

LouReeD

Bonsoir,

comme dit juste au dessus, les configurations 7, 8 et 9 dépendent de la trajectoire... Chose un peu compliqué à gérer pour moi pour le moment...
Mais comme dit également, ma solution utilisée sur mon fichier "test" me parait correcte lors du jeu.

Je vous met ici cette version, qui est allégée : pas de mise en couleur des briques, pas de gestion de "perte" ni de gain, pas de capsules...
Les seules choses sont :
- Déplacement de la raquette : pour cela il faut placer le curseur de la souris sous la zone de jeu afin qu'il se trouve sur le label ActiveX pour la détection de son déplacement.
- Rebonds de la balle sur la raquette variable en fonction du point d'impact avec modification de la vitesse et/ou de la trajectoire.
- Vous pouvez modifier la positions des briques sur la feuille niveau.

Le fichier : effacé par LouReeD

Il ne restera pas longtemps ici, il est mis afin de confirmer ou infirmer ce que je dis plus haut : ma simplification de gestion d'impact pour les configurations 7, 8 et 9 ne se voit pas trop lors du fonctionnement du jeu. Cette technique est le fait de déplacer la balle juste dans l'angle de la brique touchée (cas numéro 7, avec un rebond en Dx et Dy, et pour les cas 8 et 9 qui sont en fait identiques, je déplace la balle à la position de contact avec les deux briques au niveau du coin de contact avec également un rebond en Dx et Dy). Merci pour vos éventuels retours.

Cette version prend en compte la continuité de ma logique à savoir le calcul des points remarquables en fonction de la position actuelle de la balle, puis la recherche de présence ou pas de brique dans la ligne/colonne où se trouve ces différents points.

Seule chose qui change c'est la boucle des 10 itérations de déplacement "virtuel" de la balle : ici je prend en compte la vitesse de la balle avec V/5, comme la vitesse va de 5 à 25 par pas de 5, si la vitesse est de 5, on ne fait qu'une itération, si elle est de 25 on en fait 5, donc plus on va vite plus on découpe le déplacement, ce qui permet "naturellement" de gagner du temps de calcul, tout en ayant le "Exit For" dès qu'il y a un impact !

Pour les machines puissantes, une temporisation lancée au début des calculs et stoppée à l'issue permet d'afficher un minimum de 24 images par secondes donc le jeu devrait être jouable...

Un bouton "lancer" pour lancer le jeu, la balle part directement, un bouton "Stop" pour arrêter le jeu.

@ bientôt

LouReeD

Bonjour,

Félicitations pour ce 1er jet, c'est plutôt pas mal du tout !

La balle part peut-être vite d'entrée quand même, ça ne plaisante pas. On a l'impression de se prendre un service de John Isner ;)

C'est très dur aussi de redonner un angle nul à la balle, et donc aussi de la ralentir.

Sinon, rien ne choque au niveau des impacts, effectivement. Ça saccade à peine, ça reste tout à fait acceptable.

Bravo :)

Rechercher des sujets similaires à "arkaloureed legendaire casse briques"