ArkaLouReeD - Le légendaire casse briques

Bonsoir @ tous !

Nouveau bug détecté ! Le passage à l'an 2000 ! Non non, le passage "au lendemain" ! En effet le Timer repasse à 0, mais la boucle de jouabilité tourne tant que la Tempo + 0.416 est > à Timer ! Donc avec un tempo pris sur un Timer proche de 23h59 et 59 secondes, soit 86 400 secondes, disons 86 399, alors lorsque minuit arrive et que le Timer passe à 0 le jeu va se figer longtemps !

Il me faut trouver "une astuce" pour ce bug...
Si vous avez des idées... A part évidemment d'interdire de jouer trop tard dans la journée !

Sinon je viens de faire une score de plus de 500000 points ! je suis arrivé au niveau 42 !

bug de minuit

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)

image

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)

image

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

image

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

image

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) :

image

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

image

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

image

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

image

- si B2 alors en Y

image

- si B3 alors en X et Y

image

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

Rechercher des sujets similaires à "arkaloureed legendaire casse briques"