ArkaLouReeD - Le légendaire casse briques
Bonsoir @ tous !
Nouveau bug détecté ! Le passage à l'an 2000 !
Il me faut trouver "une astuce" pour ce bug...
Si vous avez des idées...
Sinon je viens de faire une score de plus de 500000 points ! je suis arrivé au niveau 42 !

Et l'on voit bien la balle "décollée" mais figée avec une heure à minuit !
@ bientôt
LouReeD
Bonsoir,
comme toujours, lorsque quelque chose ne me plait pas, je cherche ou j'abandonne !
Les bug de rebonds ne me plaisent pas... Je cherche donc... Pas beaucoup de code en VBA sur les intersection Cercle/Rectangle, mais des codes qui s'en rapprochent et que j'arrive à comprendre !
Voici un code adapté au VBA :
Type Balle_Type
S As Shape
X As Double
Y As Double
R As Double
End Type
Type Brique_Type
S As Shape
X As Double
Y As Double
W As Double
H As Double
End Type
Public Balle As Balle_Type
Public Brique(1 To 3) As Brique_Type
Sub TestLRDCollision()
Set Balle.S = ActiveSheet.Shapes("Balle")
With Balle
.R = .S.Width / 2
.X = .S.Left + .R
.Y = .S.Top + .R
End With
For i = 1 To 3
Set Brique(i).S = ActiveSheet.Shapes("Brique" & i)
With Brique(i)
.X = .S.Left
.Y = .S.Top
.W = .S.Width
.H = .S.Height
End With
Next i
For i = 1 To 3
If Intersection(i) Then Brique(i).S.Fill.ForeColor.RGB = RGB(0, 255, 255)
Next i
End Sub
Function Intersection(NumBrique) As Boolean
Dim DistanceX, DistanceY, DistanceC
DistanceX = Abs(Balle.X - Brique(NumBrique).X - Brique(NumBrique).W / 2)
DistanceY = Abs(Balle.Y - Brique(NumBrique).Y - Brique(NumBrique).H / 2)
If DistanceX > (Brique(NumBrique).W / 2 + Balle.R) Then Intersection = False: Exit Function
If DistanceY > (Brique(NumBrique).H / 2 + Balle.R) Then Intersection = False: Exit Function
If DistanceX <= Brique(NumBrique).W / 2 Then Intersection = True: Exit Function
If DistanceY <= Brique(NumBrique).H / 2 Then Intersection = True: Exit Function
DistanceC = (DistanceX - Brique(NumBrique).W / 2) ^ 2 + (DistanceY - Brique(NumBrique).H / 2) ^ 2
Intersection = DistanceC <= (Balle.R * Balle.R)
End Function
Sub InitColor()
For i = 1 To 3
ActiveSheet.Shapes("Brique" & i).Fill.ForeColor.RGB = RGB(0, 0, 255)
Next i
End Sub
Le fichier :
Supprimé par LouReeD
Ce code permet donc de tester la collision entre la balle rouge et les briques bleues. Il n'est pas automatique, il faut déplacer la balle "à la main" et cliquer sur le bouton de test d'impact, s'il y a impact la brique passe en bleu ciel, l'autre bouton initialise la couleur des briques au bleu foncé.
Mon futur principe pour connaitre le résultat "en rebond" : en fonction de la direction de la balle et à partir de la cellule où elle se trouve, je fais alors un tets de collision avec les 3 briques "possibles".
Je boucle sur les trois briques pour chaque itération de déplacement de la balle sur sa trajectoire et j'efface les briques qui sont en "collision" avec elle.
En fonction des briques effacées je saurais dire s'il y a rebond en X, en Y, ou en X et Y.
Exemple : la balle va vers le bas et la droite et elle se trouve en ligne 5 de la zone de brique et en colonne 8.
(flèche noire : direction de la balle, flèche jaune : résultat du rebond)

Elle pourra donc entrer en collision avec les briques aux coordonnées de zone de briques : B1(5,9), B2(6,8) et B3(6,9)
c'est à dire la brique même ligne à droite, la brique même colonne en dessous, et la brique "en diagonale" ligne du dessous et colonne à droite.
La boucle teste la collision avec ces trois briques pour chaque itération, dès qu'il y a au moins un impact, on arrête la boucle d'itération, et en fonction de la brique touchée on définit les paramètres de rebond :
Cas de trois briques en présence :
- si c'est la B1 qui est touchée alors de bas vers la droite on passe à bas vers la gauche en X donc (en effet on a touché le côté gauche de la brique de droite)

- si c'est la B2 qui est touchée alors de bas vers la droite on passe à haut vers la droite en Y donc ( en effet on a touche le côté supérieur de la brique du dessous)

- si c'est la B1 ET B2 alors on inverse la direction dans les deux sens en X et Y donc et dans ce cas la B3 n'est pas touchable.

Cas de deux briques en présence (différente de B1 ET B2 sinon voir cas ci dessus, le graphique ne représente que le troisième cas) :

- avec B2 et B3 : dans tous les cas c'est en Y mais en fonction du résultat des impacts, soit l'une ou l'autre des briques est détruite, soit les deux.

- avec B1 et B3 : dans tous les cas c'est en X mais en fonction du résultat des impacts, soit l'une ou l'autre des briques est détruite, soit les deux.

Cas où il n'y a qu'une brique sur les trois, on simplifiera en disant que :
- si B1 alors en X

- si B2 alors en Y

- si B3 alors en X et Y

Et pour plus de précision les variables seront en Double au lieu du Integer ou du INT(Double), en gros je garde les fractions de position de la balle et des briques !
Il me faut retoucher une partie de mon code afin d'y appliquer les modifications, mais je crois que le jeu en vaut la chandelle comme on dit !
@ bientôt
LouReeD
Bonsoir,
le fichier fourni ce matin n'est pas top pour se rendre compte "du truc", c'est pourquoi ce soir je vous en met un autre qui est "viable" du moins du côté des rebonds avec les bords du jeu.
L'avantage de ce code de test c'est qu'il n'y a plus de valeur "en dur" des limites du tableau de jeu : j'ai positionné 4 shape noirs en bordure et je test la collision avec ces derniers pour faire rebondir les balles dans les directions opposées. Et ce sont leur position respectives qui délimite la zone de jeu !
Seules les bordures sont testées sur le fichier joint avec trois balles en mouvement, c'est fluide et rapide, mais au code il faudra ajouter collision avec les briques (j'espère arriver à les limiter à trois briques ou moins au maximum), avec la raquette, avec les monstres.
Ce type de test fonctionnera également avec les lasers en "simulant" un cercle à leur bout, de même avec la raquette et les monstres en encapsulant les monstres dans un cercle... mais sur le site où j'ai trouvé le code je crois qu'il y avait les variantes de test : cercle avec cercle / cercle avec triangle / carré avec carré / carré et triangle etc...
Le fichier (édit 25/05/2023 à 00:34 je change le fichier avec un autre où il y a des briques sur lesquelles les balles rebondissent mais ne les détruisent pas) :
Supprimé par LouReeD
@ bientôt
LouReeD
Bonsoir @ vous peu !
Si on regarde depuis le début ce fil, on se rend compte que mes idées "trouvailles" vont dans tous les sens !
Cette fois ci je crois tenir le bon bout pour ce qui est du test de collision entre les shapes "briques" et la balle quelque soit sa vitesse et son angle d'attaque !
Le fichier joint permet de s'en rendre compte : la balle change sa vitesse et son angle et les différents rebonds sont cohérents.
Vous pouvez changer la zone de brique avec la feuille 2, et les 16 premières lignes et 13 premières colonnes en sachant que le 2 représente une brique indestructible puis tout autre chiffre une brique destructible. Les couleurs de ces dernières sont aléatoire. on ne peut pas jouer avec la balle, c'est juste un fichier de test et de rendu. Pour moi, il n'y a plus les rebonds incohérents. Il me reste à simplifier le code de test d'impact avec les briques.
Le fichier (attention il est en plein écran !) :
Un des avantages également de ce système pour le moment c'est qu'il supporte le zoom...
Mais bon les animations ne sont pas mises en place et c'est surtout ces dernières qui ne supportent pas le zoom... A voir...
@ bientôt
LouReeD