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

Bonsoir,

Voilà, le code de recherche d'impact est maintenant "optimisé" !
Voici l'ancien :

Function TestCollisions(nBx, nBy, nR, NumB) As Boolean
    ' on intialise à VRAI par défaut, si aucun rebond on passe la fonction à FAUX avant de sortir
    TestCollisions = True
    R = nR + 2
    With Balle(NumB)
        vecteur = .Dx + (2 * .Dy)
        Select Case vecteur
            Case -3 ' haut gauche
                Bx = nBx: By = nBy
            Case -1 ' haut droit
                Bx = nBx: By = nBy 'Bx = nBx + R: By = nBy
            Case 1 ' bas gauche
                Bx = nBx: By = nBy 'Bx = nBx: By = nBy + R
            Case 3 ' bas droit
                Bx = nBx: By = nBy 'Bx = nBx + R: By = nBy + R
        End Select
        ' test rebond sur les bords
        For I = 1 To 4
            If IntersectionBord(I, Bx, By) = True Then
                If I = 1 Or I = 3 Then .Dx = -.Dx
                If I = 2 Or I = 4 Then .Dy = -.Dy
                Exit Function
            End If
        Next I

        ' test de rebond sur les briques
        Col = Int((Bx - Cells(5, 2).Left) / ((Cells(5, 15).Left - Cells(5, 2).Left) / 13)) + 1
        Lig = Int((By - Cells(5, 2).Top) / ((Cells(21, 2).Top - Cells(5, 2).Top) / 16)) + 1
    '    ActiveSheet.Range("U3") = col
    '    ActiveSheet.Range("V3") = lig

        ' ci dessous beaucoup de chose répétitives
        ' je devrais pouvoir simplifier tout ceci !

        ' si on est bien dans la zone de briques
        If Lig >= 0 And Lig <= 17 Then
            ' on test la position même de la brique, normalement on y passe pas
            If TabBrique(Lig, Col) > 0 And TabBrique(Lig, Col) <> "" Then
                ActiveSheet.Range("A40") = ActiveSheet.Range("A40") + 1
                If IntersectionBrique(Lig & "-" & Col, Bx, By) Then
                    If TabBrique(Lig, Col) <> 2 Then
                        ActiveSheet.Shapes("BRK" & Lig & "-" & Col).Delete
                        TabBrique(Lig, Col) = ""
                    End If
                    .Dy = -.Dy: Exit Function
                End If
            End If

            ' en fonction du vecteur de direction
            Select Case vecteur
                Case -3 ' haut gauche
                    If Lig = 0 Then
                        TestCollisions = False
                        Exit Function
                    ElseIf Lig = 1 Then
                        If TabBrique(Lig, Col - 1) > 0 And TabBrique(Lig, Col - 1) <> "" Then
                            If IntersectionBrique(Lig & "-" & Col - 1, Bx, By) Then
                                If TabBrique(Lig, Col - 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig & "-" & Col - 1).Delete
                                    TabBrique(Lig, Col - 1) = ""
                                End If
                                .Dx = -.Dx: Exit Function
                            End If
                        End If
                    ElseIf Lig = 17 Then
                        If TabBrique(Lig - 1, Col) > 0 And TabBrique(Lig - 1, Col) <> "" Then
                            If IntersectionBrique(Lig - 1 & "-" & Col, Bx, By) Then
                                If TabBrique(Lig - 1, Col) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig - 1 & "-" & Col).Delete
                                    TabBrique(Lig - 1, Col) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig - 1, Col - 1) > 0 And TabBrique(Lig - 1, Col - 1) <> "" Then
                            If IntersectionBrique(Lig - 1 & "-" & Col - 1, Bx, By) Then
                                If TabBrique(Lig - 1, Col - 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig - 1 & "-" & Col - 1).Delete
                                    TabBrique(Lig - 1, Col - 1) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                    Else
                        If TabBrique(Lig - 1, Col) > 0 And TabBrique(Lig - 1, Col) <> "" Then
                            If IntersectionBrique(Lig - 1 & "-" & Col, Bx, By) Then
                                If TabBrique(Lig - 1, Col) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig - 1 & "-" & Col).Delete
                                    TabBrique(Lig - 1, Col) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig - 1, Col - 1) > 0 And TabBrique(Lig - 1, Col - 1) <> "" Then
                            If IntersectionBrique(Lig - 1 & "-" & Col - 1, Bx, By) Then
                                If TabBrique(Lig - 1, Col - 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig - 1 & "-" & Col - 1).Delete
                                    TabBrique(Lig - 1, Col - 1) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig, Col - 1) > 0 And TabBrique(Lig, Col - 1) <> "" Then
                            If IntersectionBrique(Lig & "-" & Col - 1, Bx, By) Then
                                If TabBrique(Lig, Col - 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig & "-" & Col - 1).Delete
                                    TabBrique(Lig, Col - 1) = ""
                                End If
                                .Dx = -.Dx: Exit Function
                            End If
                        End If
                    End If
                Case -1 ' haut droit
                    If Lig = 0 Then
                        TestCollisions = False
                        Exit Function
                    ElseIf Lig = 1 Then
                        If TabBrique(Lig, Col + 1) > 0 And TabBrique(Lig, Col + 1) <> "" Then
                            If IntersectionBrique(Lig & "-" & Col + 1, Bx, By) Then
                                If TabBrique(Lig, Col + 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig & "-" & Col + 1).Delete
                                    TabBrique(Lig, Col + 1) = ""
                                End If
                                .Dx = -.Dx: Exit Function
                            End If
                        End If
                    ElseIf Lig = 17 Then
                        If TabBrique(Lig - 1, Col) > 0 And TabBrique(Lig - 1, Col) <> "" Then
                            If IntersectionBrique(Lig - 1 & "-" & Col, Bx, By) Then
                                If TabBrique(Lig - 1, Col) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig - 1 & "-" & Col).Delete
                                    TabBrique(Lig - 1, Col) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig - 1, Col + 1) > 0 And TabBrique(Lig - 1, Col + 1) <> "" Then
                            If IntersectionBrique(Lig - 1 & "-" & Col + 1, Bx, By) Then
                                If TabBrique(Lig - 1, Col + 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig - 1 & "-" & Col + 1).Delete
                                    TabBrique(Lig - 1, Col + 1) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                    Else
                        If TabBrique(Lig - 1, Col) > 0 And TabBrique(Lig - 1, Col) <> "" Then
                            If IntersectionBrique(Lig - 1 & "-" & Col, Bx, By) Then
                                If TabBrique(Lig - 1, Col) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig - 1 & "-" & Col).Delete
                                    TabBrique(Lig - 1, Col) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig - 1, Col + 1) > 0 And TabBrique(Lig - 1, Col + 1) <> "" Then
                            If IntersectionBrique(Lig - 1 & "-" & Col + 1, Bx, By) Then
                                If TabBrique(Lig - 1, Col + 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig - 1 & "-" & Col + 1).Delete
                                    TabBrique(Lig - 1, Col + 1) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig, Col + 1) > 0 And TabBrique(Lig, Col + 1) <> "" Then
                            If IntersectionBrique(Lig & "-" & Col + 1, Bx, By) Then
                                If TabBrique(Lig, Col + 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig & "-" & Col + 1).Delete
                                    TabBrique(Lig, Col + 1) = ""
                                End If
                                .Dx = -.Dx: Exit Function
                            End If
                        End If
                    End If
                Case 1 ' bas gauche
                    If Lig = 17 Then
                        TestCollisions = False
                        Exit Function
                    ElseIf Lig = 16 Then
                        If TabBrique(Lig, Col - 1) > 0 And TabBrique(Lig, Col - 1) <> "" Then
                            If IntersectionBrique(Lig & "-" & Col - 1, Bx, By) Then
                                If TabBrique(Lig, Col - 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig & "-" & Col - 1).Delete
                                    TabBrique(Lig, Col - 1) = ""
                                End If
                                .Dx = -.Dx: Exit Function
                            End If
                        End If
                    ElseIf Lig = 0 Then
                        If TabBrique(Lig + 1, Col) > 0 And TabBrique(Lig + 1, Col) <> "" Then
                            If IntersectionBrique(Lig + 1 & "-" & Col, Bx, By) Then
                                If TabBrique(Lig + 1, Col) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig + 1 & "-" & Col).Delete
                                    TabBrique(Lig + 1, Col) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig + 1, Col - 1) > 0 And TabBrique(Lig + 1, Col - 1) <> "" Then
                            If IntersectionBrique(Lig + 1 & "-" & Col - 1, Bx, By) Then
                                If TabBrique(Lig + 1, Col - 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig + 1 & "-" & Col - 1).Delete
                                    TabBrique(Lig + 1, Col - 1) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                    Else
                        If TabBrique(Lig + 1, Col) > 0 And TabBrique(Lig + 1, Col) <> "" Then
                            If IntersectionBrique(Lig + 1 & "-" & Col, Bx, By) Then
                                If TabBrique(Lig + 1, Col) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig + 1 & "-" & Col).Delete
                                    TabBrique(Lig + 1, Col) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig + 1, Col - 1) > 0 And TabBrique(Lig + 1, Col - 1) <> "" Then
                            If IntersectionBrique(Lig + 1 & "-" & Col - 1, Bx, By) Then
                                If TabBrique(Lig + 1, Col - 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig + 1 & "-" & Col - 1).Delete
                                    TabBrique(Lig + 1, Col - 1) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig, Col - 1) > 0 And TabBrique(Lig, Col - 1) <> "" Then
                            If IntersectionBrique(Lig & "-" & Col - 1, Bx, By) Then
                                If TabBrique(Lig, Col - 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig & "-" & Col - 1).Delete
                                    TabBrique(Lig, Col - 1) = ""
                                End If
                                .Dx = -.Dx: Exit Function
                            End If
                        End If
                    End If
                Case 3 ' bas droit
                    If Lig = 17 Then
                        TestCollisions = False
                        Exit Function
                    ElseIf Lig > 16 Then
                        If TabBrique(Lig, Col + 1) > 0 And TabBrique(Lig, Col + 1) <> "" Then
                            If IntersectionBrique(Lig & "-" & Col + 1, Bx, By) Then
                                If TabBrique(Lig, Col + 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig & "-" & Col + 1).Delete
                                    TabBrique(Lig, Col + 1) = ""
                                End If
                                .Dx = -.Dx: Exit Function
                            End If
                        End If
                    ElseIf Lig = 0 Then
                        If TabBrique(Lig + 1, Col) > 0 And TabBrique(Lig + 1, Col) <> "" Then
                            If IntersectionBrique(Lig + 1 & "-" & Col, Bx, By) Then
                                If TabBrique(Lig + 1, Col) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig + 1 & "-" & Col).Delete
                                    TabBrique(Lig + 1, Col) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig + 1, Col + 1) > 0 And TabBrique(Lig + 1, Col + 1) <> "" Then
                            If IntersectionBrique(Lig + 1 & "-" & Col + 1, Bx, By) Then
                                If TabBrique(Lig + 1, Col + 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig + 1 & "-" & Col + 1).Delete
                                    TabBrique(Lig + 1, Col + 1) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                    Else
                        If TabBrique(Lig + 1, Col) > 0 And TabBrique(Lig + 1, Col) <> "" Then
                            If IntersectionBrique(Lig + 1 & "-" & Col, Bx, By) Then
                                If TabBrique(Lig + 1, Col) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig + 1 & "-" & Col).Delete
                                    TabBrique(Lig + 1, Col) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig + 1, Col + 1) > 0 And TabBrique(Lig + 1, Col + 1) <> "" Then
                            If IntersectionBrique(Lig + 1 & "-" & Col + 1, Bx, By) Then
                                If TabBrique(Lig + 1, Col + 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig + 1 & "-" & Col + 1).Delete
                                    TabBrique(Lig + 1, Col + 1) = ""
                                End If
                                .Dy = -.Dy: Exit Function
                            End If
                        End If
                        If TabBrique(Lig, Col + 1) > 0 And TabBrique(Lig, Col + 1) <> "" Then
                            If IntersectionBrique(Lig & "-" & Col + 1, Bx, By) Then
                                If TabBrique(Lig, Col + 1) <> 2 Then
                                    ActiveSheet.Shapes("BRK" & Lig & "-" & Col + 1).Delete
                                    TabBrique(Lig, Col + 1) = ""
                                End If
                                .Dx = -.Dx: Exit Function
                            End If
                        End If
                    End If
            End Select
        End If
    End With
    ' test de rebond sur la raquette

    ' test de rebond sur les monstres

    TestCollisions = False
End Function

Voici le nouveau :

Function TestCollisions(Bx As Double, By As Double) As Boolean
    Dim I As Integer, Lig As Integer, Col As Integer, CB(1 To 3) As Integer, LB(1 To 3) As Integer

    ' on intialise à VRAI par défaut, si aucun rebond on passe la fonction à FAUX avant de sortir
    TestCollisions = True

    ' test rebond sur les bords
    ' *************************
    For I = 1 To 4
        If Intersection("Bord" & I, Bx, By) = True Then
            If I = 1 Or I = 3 Then Dx = -Dx Else Dy = -Dy
            Exit Function
        End If
    Next I

    ' test de rebond sur les briques
    ' ******************************

    ' on détermine dans quelle colonne et quelle ligne se trouve la balle "d'itération"
    Col = Int((Bx - Cells(5, 2).Left) / ((Cells(5, 15).Left - Cells(5, 2).Left) / 13)) + 1
    Lig = Int((By - Cells(5, 2).Top) / ((Cells(21, 2).Top - Cells(5, 2).Top) / 16)) + 1
    ' si on est en zone de briques
    If Lig >= 0 And Lig <= 17 Then
        ' calcul positions des trois briques "possibles"
        ' brique 1 : même colonne, une ligne en plus ou en moins (dépend de Dy)
        CB(1) = Col: LB(1) = Lig + Dy
        ' brique 2 : une colonne en plus ou en moins (dépend de Dx), une ligne en plus ou en moins (dépend de Dy)
        CB(2) = Col + Dx: LB(2) = Lig + Dy
        ' brique 3 : une colonne en plus ou en moins (dépend de Dx), même ligne
        CB(3) = Col + Dx: LB(3) = Lig

        ' en fonction de la direction verticale on test si l'on est sur la ligne 0 ou 17
        ' dans ces cas pas de collision possible
        If Lig = IIf(Dy < 0, 0, 17) Then
            TestCollisions = False
            Exit Function
        End If

        ' on boucle sur les trois briques possibles
        ' on va de la brique 1 à la brique 3
        ' si collision en 1 alors on quitte et il y a rebond en Y
        ' si collision en 2 = pas de brique en 1 alors on quitte et il y a rebond en X
        ' si collision en 3 = pas de brique en 2 ni en 1 alors on quitte et il y a rebond en X
        ' le double contact avec des briques en "diagonales" se fera l'une après l'autre

        For I = 1 To 3
            ' si la brique existe
            If TabBrique(LB(I), CB(I)) > 0 And TabBrique(LB(I), CB(I)) <> "" Then
                ' s'il y a impact
                If Intersection("BRK" & LB(I) & "-" & CB(I), Bx, By) Then
                    ' si la brique est destructible
                    If TabBrique(LB(I), CB(I)) <> 2 Then
                        ' on efface le shape
                        ActiveSheet.Shapes("BRK" & LB(I) & "-" & CB(I)).Delete
                        ' on supprime son entrée dans le tableau des briques
                        TabBrique(LB(I), CB(I)) = ""
                    End If
                    ' si c'est la brique "même colonne" que la balle = rebond en Y sinon en X
                    If I = 1 Then Dy = -Dy Else Dx = -Dx
                    Exit Function
                End If
            End If
        Next I
    End If

    ' test collision avec la raquette
    ' *******************************

    ' test collision avec les monstres
    ' ********************************

    ' si l'on est pas sortie prématurément de la fonction c'est qu'il n'y a pas eu de collision
    TestCollisions = False
End Function

Et le fichier qui emporte la visualisation des calculs d'itérations de la position de la balle avec un aperçu grâce à une deuxième balle :
Balle rouge les calculs intermédiaires, balle verte la "vraie" balle du jeu :

(pour favoriser les téléchargements, le fichier est en affichage "normal" avec un zoom de 70%...)

Pour le test des collisions sur les trois briques j'ai pris ce principe de numérotation des briques :

briques 1 2 3

Comme dit dans le commentaire :
B1 : même colonne que la balle, une ligne en plus ou en moins fonction de Dy
B2 : une colonne de plus ou de moins fonction de Dx, une ligne en plus ou en moins fonction de Dy
B3 : une colonne en plus ou en moins fonction de Dx, même ligne

@ bientôt

LouReeD

Bonjour

Avec ce code assigné aux monstres je devrais pouvoir gérer leur déplacement en dehors des briques ! Bon ça va retarder un peu la sortie, mais une fois encore le jeu en vaut la chandelle ! Non ?

@ bientôt

LouReeD

Bonsoir,

suite à un fonctionnement du code sur une longue durée, un petit bug est apparu :
La balle se trouve "coincée" sur une limite de bord car même avec les changements de direction en Y cela ne suffisait pas à la faire sortir de la superposition avec ce dernier...

Donc pour remédier à ce problème il faut que les coordonnées d'itération du mouvement suivant soit "au-delà" de ce bord. Je modifie donc la boucle d'itération en la commençant à 3 au lieu de 1, comme cela pour les calculs suite à un changement de direction, la balle "sera trois itérations" plus loin ce qui donne la possibilité de sortir du shape précédent. Je pense que cela est du à la nouvelle précision avec les "Double".

Je repart faire un test sur le long terme...

Il se peut également que je revoie tout mon code d'ArkaLouReeD pour l'adapter à cette nouvelle structure...
Comme je disais dans un post précédent : j'espère le sortir avant 2024 !

@ bientôt

LouReeD

Bonjour,

l'adaptation sur mon fichier "d'origine" se met gentiment en place... Je constate que lors du jeu à trois balles cela a vraiment tendance à ralentir la machine !
Il est vrai que je suis resté sur 27 itérations (30 -3 comme expliqué plus haut).

Il me faut peut-être optimiser ces itérations en les liant à la vitesse de la balle. En effet plus la balle va vite plus il me faut faire du découpage dans sa trajectoire pour être sur de ne pas louper une brique ou un monstre ou la raquette ! Mais cela je l'ai déjà expliqué.

Pour le moment l'intégration n'est faite qu'au niveau des balles, il me reste à l'intégrer au niveau des monstres : avec les briques, la raquette et les lasers. Ensuite il me faudrait l'intégrer au niveau des lasers avec les briques et les monstres, avec la raquette en prise avec les monstres ou les capsules, puis pourquoi pas avec les capsules vers la raquette !

Quelque fois je me dis que de tout ré écrire serait plus rapide ! A voir... Par contre au niveau des rebonds je suis vraiment satisfait, n'est-ce pas là l'essentiel ?

Je pense déjà à faire deux versions : une "totale animation" pour les machines puissantes, une plus sobre pour les machines moins puissantes !

Je suis un peu comme la peinture sur la Tour Eiffel : Multicouches !

@ bientôt

LouReeD

Bonsoir,

mise d'ArkaLouReeD en validation auprès de Sébastien !

En espérant qu'elle soit accessible assez vite, depuis le temps que j'en parle !

Attention ! Le BUG de minuit n'est pas résolu ! Donc si vous avez une envie de jouer "longtemps" attendez de passer minuit et vous pourrez vous lancer dans une partie de près de 24 heures !

@ bientôt

LouReeD

ArkaLouReeD :

7 capsules :
- Laser (Rouge) : donne droit à tirer des lasers pour détruire les briques et les monstres (un anti bug fait que l'on peut détruire les briques incassables mais il faut alors les toucher 100 fois), cette capsule lance l'animation de transformation de la raquette vers le laser, la balle passe au rouge.
- Démultiplication (Bleu Ciel) : donne droit à trois balles, elles sont bleue ciel également. Cette capsule met la raquette en forme "standard". Tant qu'il y a plus d'une balle en jeu, il n'y a plus de capsules à tomber. Chaque rebond sur la raquette rapporte autant de point que de balle en jeu.
- Vie (Noire) : donne droit à une raquette spare supplémentaire sans jamais dépasser 5. Cette capsule met la raquette en forme "standard". La raquette perd donc les effets éventuels en cours. La balle passe au blanc.
- Elargissement (Bleu Foncé) : transforme la raquette standard en raquette élargie, la balle passe au bleu foncé.
- Colle (Verte) : Cette capsule met la raquette en forme "standard", mais cette dernière permet de capturer la balle. Cette dernière se libère au bout d'un certain temps. Afin de "voir" que la raquette est magnétique, la balle passe au vert.
- Niveau (Blanche) : cette capsule permet l'ouverture de la porte de téléportation qui permet de changer de niveau tout en gagnant un bonus de 10000 points. Cette capsule met la raquette en forme "standard". Une fois ouverte, la porte le reste, vous pouvez essayer de gagner encore quelques points avant de l'utiliser.
- Speed (Orange) : cette capsule ramène l'angle de la balle à 10° par rapport à la verticale, et comme la vitesse de la balle est dépendante de l'angle, la vitesse diminue. La balle passe au blanc. Attention ! le changement d'angle se fait dès réception de la capsule, cela peut vous faire perdre !

6 types de monstres :
Sur la version 1 d'Arkanoïd il n'y avait que trois monstres, j'en ai ajouté 3 des versions suivantes, mais il n'y a qu'un seul type par niveau. j'ai réussi à faire ne sorte que les monstres ne "traversent" pas les briques, ils ne peuvent aller vers le bas que s'il existe un passage (bien qu'en diagonale ils arrivent parfois à passer...)
Ils n'ont qu'un seul rôle : vous embêtez lors du jeu en déviant la balle de sa trajectoire en cas d'impact. Ceci vous donne des points. un monstre explose sous l'impacte d'une balle, de la raquette ou d'un laser.

3 types de briques :
- les destructibles de couleur : une seule touche et la brique est détruite, un même nombre de points quelque soit la couleur (peut-être que sur une version futur...)
- les destructibles après plusieurs touches de couleur gris foncé : il n'y a pas d'animation sur ces touches et le nombre dépend du numéro de niveau rapporte plus de points quand il faut plus les toucher.
- les indestructibles : "or" ou "argent", pour un système d'anti bug, elles sont tout de même destructibles mais seulement avec les lasers et après 100 touches ! Ceci permet tout de même de gagner 1500 points !

61 niveaux !
- 32 niveaux "originaux" version ATARI 1986 (il me semble...)
- 29 niveaux inventé ou venant de versions différentes.
- Possibilité d'en créer de nouveaux simplement : il suffit de mettre des chiffres dans des cases afin de choisir la couleur des briques et leur type. Attention ! il n'y a pas de test de faisabilité du niveau, c'est à vous d'être rigoureux.

Pour jouer c'est simple :
cliquer sur le bouton de la feuille d'accueil qui vous prévient que l'application va passer en mode plein écran, le curseur de souris va disparaitre.
Pour jouer il suffit de cliquer sur le bouton gauche de la souris pour lancer la balle en début de partie, si ce clic arrive trop tard, la balle part toute seule.
La raquette se déplace par des mouvements de souris allant de la droite vers la gauche et inversement. Il suffit alors de rattraper la balle pour qu'elle rebondisse et finisse par détruire toutes les briques. certaines briques (aléatoirement) libèrent des capsules, pour les intercepter il suffit de se mettre en dessous.
Avec cette raquette vous pouvez détruire les monstres si ces derniers sont suffisamment bas.

Si vous interceptez la capsule Colle, la balle restera collée à la raquette ce qui vous permet de mieux viser, ne tardez pas car comme en début de partie, la balle finit par être libérée.

Si vous intercepter la capsule Laser, il vous suffit de cliquer gauche sur la souris pour lancer une paire de laser. pour un tir continu, vous pouvez rester en appuis sur le bouton gauche de la souris. Ce tir en continue est contrôlé par le jeu afin de créer une cadence de tir raisonnable, nous ne sommes pas dans un Shoot and Up !

Voilà, avec ces données vous allez pouvoir commencer à jouer et faire de bon score !
n'hésitez pas à mettre des ScreenShot de vos score ici ! Et oui, je n'ai pas fait de score dans un drive afin d'avoir un tableau commun à tous les futurs utilisateurs !

Comme toujours, le code est accessible sans mot de passe, il est ici énormément commenté, vous pouvez le modifier afin de régler quelques bugs ou l'adapter à votre machine.

Pour les bugs connus mais qui ne sont pas systématiques :
- Un monstres qui se bloque en dehors de la zone de jeu, ce qui crée une colonne inconnue dans le code...
- Une balle qui se trouve coincée dans les bords du tableau : si c'est un bord vertical et qu'elle va vers le bas alors elle fini par "perdre" car elle touche en bas. pour les autres côtés...

@ bientôt

LouReeD

Bonjour à tous !

Merci à Sébastien pour sa réactivité ! Voilà c'est fait ! Depuis que j'en parle ici (01/10/2021 !) il est finalement disponible !
Au grès des messages de ce post vous verrez mes différents changement de direction quant à la résolution de différents problèmes !
le plus "délicat" a été celui des rebonds de la balles sur les briques. La dernière solution adoptée est je pense l'une des meilleurs de toutes celles que j'ai pu essayé de mettre en place. Alors il arrive que la balle se coince sur les bords, il faudra peut-être ajuster le départ de la boucle d'itération afin de faire les premiers calculs en étant sur d'être ressorti du fameux bord. Le code étant disponible, cela peut très bien être fait à votre niveau. C'est comme le nombre d'itération, il est actuellement de 20, mais si vous avez une machine "surpuissante", pour plus de précision sur les tests d'impact, vous pouvez passer à 30 ! A l'inverse, avec une machine moins puissante vous pouvez diminuer ce chiffre à 15 (pas trop en dessous sinon il y a des incohérences de rebonds). A savoir que ce chiffre, plus il est grand et plus cela demande de calcul surtout lors de l'arrivée des trois balles où vous l'avez compris cela peut représenter 90 itérations si la boucle est faite entièrement !

Ensuite, en conclusion d'une discussion avec stryk, j'ai modifié les gif animés car ces derniers ne tournent pas sous Excel inférieur à 2019 ! Du coup je me suis tourné vers la technique du "rognage" des images contenues dans des shapes et ceci grâce aux tuto de waard ! En ayant des images type "SheetSprite" (à voir dans le dossier images des ressources) il a été facile de créer ces animations avec quelque astuces comme le fait de créer un point de départ animation et un point de fin qui ne correspondent pas forcément à la première image et à la dernière de l'animation. Résultat ? La raquette de taille standard emporte avec elle l'animation d'arrivée en jeu, l'animation du jeu standard avec clignotement des feux, l'animation de transformation en vaisseau laser, l'animation en vaisseau laser avec clignotement des feux, l'animation de dé transformation laser, et l'animation d'explosion.
une petite routine qui sert à passer d'une image à l'autre mais avec des points de départ et d'arrivé différents afin de boucler les images sur la "bonne zone" !

Le fond des tableaux qui est conçu en mosaïque, ça ce n'est pas très difficile... Si cela vous dérange et préférez avoir en fond d'écran de tableau l'image du cosmos alors sur la feuille "ArkaLouReeD" il vous suffit de masquer le shape "FT". Par défaut, ce fond change à chaque perte de balle (en effet en fonction de la couleur et du motif du fond, les tableaux peuvent être plus ou moins difficile) afin de permettre une résolution de ce dernier avec la petite chance d'avoir un fond moins agressif pour suivre la balle ! Si cela ne vous convient pas, tout se joue dans la procédure "DebutTableau", l'appel à la mise à jour du fond est en première ligne juste après le "DIM", mettez cette ligne de code en commentaire et le fond du tableau jusqu'à sa résolution ou votre perte restera le même. Par contre d'une partie à l'autre il pourra être différent, il y en a 40 au choix !

Si vous voulez avoir une taille de balle un peu plus conséquente (voir plus petite) il vous suffit de modifier la valeur Taille. Actuellement elle est à 7. En sachant que la balle doit pouvoir passer dans l'épaisseur d'une brique il ne faut pas que cette taille dépasse les 14 ! Je dis ça c'est pour les "anciens" !

j'ai fait le choix de ne pas faire d'animation sur les briques indestructibles... Par manque de motivation, je l'avoue, j'ai même pensais à un moment pour les briques "grises foncées" de créer une animation faisant apparaître un numéro lors de la première touche qui indique le nombre de fois à toucher restant pour qu'elle se détruise...

b82

J'ai abandonné l'idée...

J'ai fait le choix de ne pas gérer "la collision" entre les monstres ! en effet le jeu original fait que ces derniers ne se chevauchent pas, bon ben moi il peut y a voir un aggloméra de monstre dans un coin...

J'ai également fait le choix de ne pas "gérer" la vitesse de la balle pour l'augmentation de difficulté des niveaux. En effet la balle accélère quand son angle par rapport à la verticale augmente et elle diminue quand l'angle diminue. donc en jouant avec la zone de rebond de la raquette, il vous est possible de freiner ou d'accélérer la balle en modifiant son angle !

Si vous avez des questions ou des remarques ou bien tout autre chose (bug, améliorations...) n'hésitez pas !
De mon côté j'avais envie de mettre des options comme celles dont je viens de parler et d'autre, mais mon impatience à pris le dessus !
Les options envisagées :
- pouvoir commencer le jeu à n'importe quel niveau puis continuer la boucle
- effectuer les niveaux dans un ordre aléatoire
- mettre ou enlever les bruitages
- définir le nombre de monstres en jeu
- choisir la taille de la balle
- choisir les capsules accessibles
- choisir de cacher ou pas le curseur de souris
- choisir si le fond de tableau est fixe durant l'exécution ou pas
- choisir un fond fixe pour toute la partie ou de ne pas en mettre ou qu'il soit uni
- etc...

En réfléchissant bien on peut en trouver plein d'option !

Bon jeu à vous !

@ bientôt

LouReeD

Bonsoir !

voilà mon dernier score !

high score

niveau 28 et 331 385 points ! "Petite partie" avec 5 bugs, mais les 5 sont "passés" avec de la chance !

Deux fois le bug de la raquette collante : j'ai attrapé une capsule verte juste avant de finir un niveau, au lancement du niveau suivant, malgré la balle blanche l'effet de la raquette collante existait puis disparaissait à la première capsule tombée récupérée.
Deux fois le bug des monstres qui se collent à la bordure gauche du tableau : avant qu'ils aient eu l'envie d'aller plus loin en dehors du jeu je me suis appliqué à les viser avec la balle, ils ont été détruis avant le drame !
Une fois le bug identique mais côté droit pour la balle : ma chance c'est que c'est arrivé sur un bord vertical, donc la balle a fini par aller au-delà de la ligne "de vie" et je l'ai perdue, mais j'ai pu reprendre le jeu avec une raquette spare !

Va falloir que je me tourne sur ces petits problèmes.
Sinon sur ma longue partie je n'ai pas ressenti d'incohérence sur les rebonds, juste mon ordi qui patine s'il y a trois balle et trois monstres en même temps et beaucoup de briques en jeu... Là il faut que je voie avec mon banquier !

Merci à la petite dizaine de "propriétaire" de cette application !

@ bientôt

LouReeD

Bonsoir,

Un petit clein d'oeil pour "fêter" la barre des 10 téléchargements ! Rendez-vous est pris pour celle des 100 !

@ bientôt

LouReeD

Bonjour,

pour le bug de la balle qui reste coincée sur les bords, j'ai ajouté un paramètre à l'objet balle : B as Integer.
Ce B correspond au numéro du bord que la balle vient d'impacter par exemple le côté gauche .B=1.

Lors des tests suivant dans la boucle d'itération, si la balle impacte encore le bord gauche (nous somme alors en théorie en présence du bug) le changement de direction en X n'est possible que si B est différent de I=1 (=bord gauche dans la boucle i=1 to 4). Du coup la balle impacte "encore" le bord gauche alors il n'y a pas de changement de direction en X et la balle continue à s'en éloigner, dès que la balle n'a plus d'impact avec les bords, alors .B=0 la balle a le "droit" d'impacter n'importe quel bord.

Pour le bug des monstres qui vont au delà de la zone de jeu, j'ai créé des variables correspondant à des valeurs numériques fixes pour les tests, mais je pense que ce n'est pas cela qui corrige l'affaire, mais plutôt le fait de changer l'ordre des groupes d'instructions. En effet le code fourni teste les collisions avec les bords du jeu puis modifie le paramètre de direction en conséquence. Et juste en dessous il y a les lignes de code qui permettent de faire varier la direction et la vitesse des monstres, donc dans certain cas le monstre dans un premier temps est détecté comme sortant de la zone de jeu à gauche (par exemple) alors on inverse sa direction en X, mais juste après l'aléatoire modifie la vitesse et la direction de ce monstre et ré inverse la direction en X ! Résultat le monstre continu sa progression en dehors de la zone de jeu !

Je modifie beaucoup de valeurs de données récupérées grâce, par exemple, à Activesheet.Shapes("Monstre1").Width ! Cette donnée, plutôt que d'aller la chercher dans le shape à chaque tour de calcul je la remplace par sa valeur connue et fixe : 35 ! Résultat moins d'accès feuille, et le code me parait plus fluide lors de la présence de trois monstres et des trois balles !

Je vais continuer dans ce sens, en créant des variables "non variables" qui permettra au code de fonctionner en "autonomie" sans avoir à accéder aux objets de la feuille.

Une chose également qui me "satisfait" : en programmant les lignes de code pour le déplacement des monstres afin qu'ils ne puissent pas aller sur les briques, je me rend compte que cela va au delà de mes "espérances" ! En effet, non seulement ils évitent les briques mais malgré tout ils restent autour pour "les protéger", à croire qu'il y a une IA derrière comme j'ai essayé de le programmer (voir message précédents).

J'ai également rajouté quelques niveaux qui sont maintenant au nombre de 100 ! Les derniers me paraissent difficiles, mais "C'est le jeu ma pauvre Lucette !"

A ce jour, 16 téléchargements ! N'hésitez pas à faire des "imprime écran" pour nous montrer vos scores !

@ bientôt

LouReeD

Bonjour,

Pour le bug des balles, "ma technique" n'a pas suffit ! Donc je reviens en arrière, je supprime ce "B" et je reviens vers la technique des monstre avec les valeurs limite numérique des bords ! Tout simplement. En plus cela va simplifier les calculs du coup cela va augmenter la fluidité !

Seuls les impactes entre la balles et les briques seront testés avec cette superposition de shape !

@ bientôt

LouReeD

Bonjour,

cette solution simple à l'air de fonctionner !

Donc la balle avec les "bords" je teste juste la position de celle-ci avec ces derniers.
La balle avec les briques, j'utilise la fonction de superposition des shapes, idem pour la raquette et les monstres.
Les lasers j'utilise leur position numérique afin de déterminer dans quelle case du tableau des briques ils se trouvent.
Les monstres idem que les lasers pour la zone de briques, et position numérique pour les bords.
La raquette position numérique.

En plus de cela, comme annoncé, j'ai supprimé toutes les références à un objet pour avoir son Width ou Height, du fait que je connaisse toutes ces données et qu'elles n'ont pas vocations à être modifiées : largeur hauteur d'une brique, taille d'un monstre, taille de la balle, taille des raquettes, des capsules ! Moins d'accès feuille, donc gain de temps.

De plus lors des animations j'avais laissé les "formules" pour comprendre ce que je faisais : = ( 2208 / 2 ) - ( 96 / 2 ) - ( Ind * 32 ), du coup l'interpréteur VBA devait se farcir quelques calculs simples, mais des calculs tout de même, alors j'ai transformé ceci en : = 1152 - ( Ind * 32 )
Je suis sur que ce n'est pas grand chose, mais rien + rien = un peu plus que rien et c'est déjà du temps !

J'ai ajouté des sons de transformation Laser et dé transformation Laser, ainsi qu'un son pour le rétrécissement.

Il y a maintenant 100 niveaux.

La version optimisée approche de la fin... Je réfléchie à la possibilité d'ajouter des capsules au fur et à mesure que le score augmente, au début il y en aurait 7, puis à chaque 100 000 une de plus, ou bien alors tous les 20 niveaux... Dans ce cas il m'en faudrait au moins 4, et si j'en trouve plus alors au lieu de 20 ce serait 15...

Une modification au niveau de l'affichage des scores : lorsque le score du joueur arrive à égalité avec le score du High Score, alors chaque points ajouté au score du joueur est ajouté au High Score, en somme le High Score devient le score du joueur "en direct" !

J'ai l'intention de faire "naviguer" l'image du Round sur la feuille : en début de partie ou suite à une "relance" avec un raquette Spare, le Round s'affiche, puis disparait. Au lieu de ça, j'ai l'intention de le décaler sous le score du joueur afin que "visuellement" on sache à quel niveau on est en train de jouer. Donc ce shape ne serait plus "visible" "invisible" mais centré sur la tableau de jeu et centré sur le score du joueur.

Encore quelque modifications en vue, mais à ce que j'ai pu voir sur ma machine il y a une amélioration au niveau de la fluidité, bien qu'il faille comme même une bonne machine !

@ bientôt

LouReeD

Bonsoir,

le "bug" de la touche Fin est résolu ! Maintenant en milieu de partie si vous appuyez sur la touche Fin du clavier la partie s'arrête instantanément, pas d'inscription au tableau des meilleurs scores et retour sur la feuille d'accueil sans message d'erreur ! Je ne sais pas si je l'ai dit, mais il y a aussi la touche "p" pour Pause et "r" pour Reprise.

La navigation du Round est effective.

Je vais regarder de plus près les réactions de la balle sur les raquettes ! Il y a des déviations mais elles me semblent un peu "limité" alors qu'on a le choix entre 10 et 65° ! En effet, je vais limiter les angles dans cette fourchette contrairement à ce qui est actuellement où cela va de 10 à 80°.

Après tous ces changements, avec 30 itérations sur un trois balles trois monstres cela est vraiment correct ! Je suis descendue à 17 itérations et cela reste "précis", j'ai tenté 15 et là des briques de "deuxième ligne" arrivaient à disparaitre ! donc pour moi 17 itérations est un minimum mais cela peut vous aider dans la fluidité.

je ne vais pas tarder à mettre (déjà ?!) la nouvelle version en validation auprès de Sébastien...

@ bientôt

LouReeD

Bonjour,

la dernière version : ArkaLouReeD 100 est à la validation auprès de Sébastien.

Cette dernière comporte donc 100 niveaux, exécutables en boucle !

J'ai corrigé le bug de la balle avec les bords : j'ai juste ajouté une condition aux tests à savoir la direction de la balle. En effet pour qu'il y ait changement de direction en X après impact avec le bord gauche il faut que la direction en X soit négatif. Si la balle va vers la gauche .Dx<0, il y a un impact avec le bord, .Dx=-.Dx donc .Dx>0 et si sur les itérations suivantes la balle touche encore le bord cela n'est pas pris en compte puisque .Dx n'est plus inférieur à 0 !

J'ai "ajusté" les réactions de la balle sur la raquette : on maitrise mieux son rebond, on arrive maintenant à la renvoyer au sens opposée de son arrivée avec le même angle ! Les raquettes sont découpées en 4 morceaux : le bord rouge gauche, la moitié du corp de raquette gauche, la moitié du corps de raquette droit, et le bord rouge droit. Les moitié de corp renvoient la balle avec le même angle d'arrivé (donc même vitesse puisque j'ai fait le choix de lier la vitesse à l'angle) mais si la balle va de gauche à droite, si elle tape la moitié gauche elle inverse sa direction, sinon elle continue avec la même. Le principe est le même pour les bord sauf qu'avec eux en fonction du point d'impact l'angle est modifié : plus l'impact est au bout de la raquette plus l'angle est grand(donc la vitesse est grande) et inversement. Ceci peut vous permettre d'accélérer ou ralentir les balles.

Le numéro du niveau en cours reste visible.

La valeur du High Score évolue en même temps que le score du joueur si celui-ci le dépasse.

De nouveaux sons "hors jeu original" ont été ajoutés : rétrécissement, transformation raquette en Laser, dé transformation du Laser.

La page d'accueil a été enrichie de données sur les différents points à gagner.

Il existe un bonus de 250 points pour la suppression des trois monstres du tableau.

Beaucoup de modifications de code ou de simplifications pour gagner en fluidité (exemple : la gestion des monstres n'est lancée que s'il y a des monstres en jeu...)
Mais vous avez accès au code pour jouer sur la valeur d'Itération dans la procédure DéplacementsBalles.

Pour rappel, ce jeu se joue à la souris droite/gauche et le bouton gauche pour tirer les lasers ou lancer les balles magnétisée ou bien en début de partie.
La touche "p" pour mettre en pause, la touche "r" pour la reprise du jeu et la touche "Fin" pour quitter prématurément (pas de gestion du score en cours).
Vous acceptez en cliquant sur le bouton de la page d'accueil que votre application Excel passe en plein écran.
Des ActiveX sont présent pour la gestions des bruitages sous la forme d'objet Windows Media Player au nombre de 18 sur la feuille "Musiques".

Voilà, tout est dit je pense...

n'hésitez pas à poser des questions, des commentaires, à remonter des bugs ou proposition diverses... Et surtout pensez à faire des imprime écrans pour poster vos scores !

@ bientôt

LouReeD

high score

@ bientôt !

LouReeD

Bonjour,

n'ayez pas peur de laisser vos scores même si ceux-ci ne sont pas "gros" ! Au moins cela permet de voir si l'application tourne bien !

@ bientôt

LouReeD

Rechercher des sujets similaires à "arkaloureed legendaire casse briques"