Synopsis d'un casse brique en 3d

Contenu du snippet

ce code est le début d'un casse brique en 3D.
il gère l'affichage linéaire en 3D,
la déplacement de la balle(un cube pour l'instant),
le déplacement de la raquette(un pavé)
il emmet un bip lorsque l'on devrait perdre la balle.
les brique ne sont pas encore gérées.

Le code suivant est à metre dans une form.

Source / Exemple :


'Option Explicit

Private Const pi = 3.14159265358979
Private Type point3d
    X As Double
    Y As Double
    z As Double
End Type
Private Type fline
    p1 As point3d
    p2 As point3d
End Type
Private Type cube
    p1 As point3d
    p2 As point3d
    p3 As point3d
    p4 As point3d
    p5 As point3d
    p6 As point3d
    p7 As point3d
    p8 As point3d
End Type
Private Type carre
    p1 As point3d
    p2 As point3d
    p3 As point3d
    p4 As point3d
End Type

Dim grand_cube As cube
Dim centre As point3d
Dim angle As point3d
Dim balle As cube
Dim affballe As cube
Dim dirballe As point3d
Dim hballe As carre
Dim hballe2 As carre
Dim hballe3 As carre
Dim hballe4 As carre
Dim hballe5 As carre
Dim hballe6 As carre
Dim raq As cube
Dim dirraq As point3d
Dim xx As Double
Dim yy As Double
Dim xxx As Double
Dim yyy As Double

Private Sub deplace(pointdep As point3d, pointrot As point3d, angle As point3d, pointarr As point3d)
    Dim tmp As point3d

    pointarr.X = pointdep.X - pointrot.X
    pointarr.Y = pointdep.Y - pointrot.Y
    pointarr.z = pointdep.z - pointrot.z

    tmp = pointarr

    pointarr.z = Sqr(tmp.z ^ 2 + tmp.Y ^ 2) * Cos(angle.X + angled(tmp.z, tmp.Y))
    pointarr.Y = Sqr(tmp.z ^ 2 + tmp.Y ^ 2) * Sin(angle.X + angled(tmp.z, tmp.Y))

    tmp = pointarr

    pointarr.X = Sqr(tmp.X ^ 2 + tmp.z ^ 2) * Cos(angle.Y + angled(tmp.X, tmp.z))
    pointarr.z = Sqr(tmp.X ^ 2 + tmp.z ^ 2) * Sin(angle.Y + angled(tmp.X, tmp.z))

    tmp = pointarr

    pointarr.X = Sqr(tmp.X ^ 2 + tmp.Y ^ 2) * Cos(angle.z + angled(tmp.X, tmp.Y))
    pointarr.Y = Sqr(tmp.X ^ 2 + tmp.Y ^ 2) * Sin(angle.z + angled(tmp.X, tmp.Y))

    pointarr.X = pointarr.X + pointrot.X
    pointarr.Y = pointarr.Y + pointrot.Y
    pointarr.z = pointarr.z + pointrot.z
End Sub

'x et y sont 2 point d'une droite passant par l'origine.
'le résultat est l'angle de la droite par rapport à l'orizontal.
Private Function angled(ByVal X As Double, ByVal Y As Double) As Double
    Select Case X
        Case Is > 0
            angled = Atn(Y / X)
        Case Is < 0
            angled = Atn(Y / X) + pi '=-Atn(y / x)
        Case Else
            If Y > 0 Then
                angled = pi / 2
            Else
                angled = 3 * pi / 2
            End If
    End Select
End Function

Private Sub affcube(obj As Form, cube1 As cube, couleur As Long, pointrot As point3d, angle As point3d)
    Dim cube As cube
    Call movecube(cube1, pointrot, angle, cube)
    obj.Line (cube.p1.X, cube.p1.Y)-(cube.p2.X, cube.p2.Y), couleur
    obj.Line (cube.p2.X, cube.p2.Y)-(cube.p3.X, cube.p3.Y), couleur
    obj.Line (cube.p3.X, cube.p3.Y)-(cube.p4.X, cube.p4.Y), couleur
    obj.Line (cube.p4.X, cube.p4.Y)-(cube.p1.X, cube.p1.Y), couleur
    obj.Line (cube.p5.X, cube.p5.Y)-(cube.p6.X, cube.p6.Y), couleur
    obj.Line (cube.p6.X, cube.p6.Y)-(cube.p7.X, cube.p7.Y), couleur
    obj.Line (cube.p7.X, cube.p7.Y)-(cube.p8.X, cube.p8.Y), couleur
    obj.Line (cube.p8.X, cube.p8.Y)-(cube.p5.X, cube.p5.Y), couleur
    obj.Line (cube.p1.X, cube.p1.Y)-(cube.p5.X, cube.p5.Y), couleur
    obj.Line (cube.p2.X, cube.p2.Y)-(cube.p6.X, cube.p6.Y), couleur
    obj.Line (cube.p3.X, cube.p3.Y)-(cube.p7.X, cube.p7.Y), couleur
    obj.Line (cube.p4.X, cube.p4.Y)-(cube.p8.X, cube.p8.Y), couleur
End Sub

Private Sub movecube(cubedep As cube, pointrot As point3d, angle As point3d, cubearr As cube)
    Call deplace(cubedep.p1, pointrot, angle, cubearr.p1)
    Call deplace(cubedep.p2, pointrot, angle, cubearr.p2)
    Call deplace(cubedep.p3, pointrot, angle, cubearr.p3)
    Call deplace(cubedep.p4, pointrot, angle, cubearr.p4)
    Call deplace(cubedep.p5, pointrot, angle, cubearr.p5)
    Call deplace(cubedep.p6, pointrot, angle, cubearr.p6)
    Call deplace(cubedep.p7, pointrot, angle, cubearr.p7)
    Call deplace(cubedep.p8, pointrot, angle, cubearr.p8)
End Sub

Private Sub affcarre(obj As Form, carre1 As carre, couleur As Long, pointrot As point3d, angle As point3d)
    Dim carre As carre
    Call movecarre(carre1, pointrot, angle, carre)
    obj.Line (carre.p1.X, carre.p1.Y)-(carre.p2.X, carre.p2.Y), couleur
    obj.Line (carre.p2.X, carre.p2.Y)-(carre.p3.X, carre.p3.Y), couleur
    obj.Line (carre.p3.X, carre.p3.Y)-(carre.p4.X, carre.p4.Y), couleur
    obj.Line (carre.p4.X, carre.p4.Y)-(carre.p1.X, carre.p1.Y), couleur

End Sub

Private Sub movecarre(carredep As carre, pointrot As point3d, angle As point3d, carrearr As carre)
    Call deplace(carredep.p1, pointrot, angle, carrearr.p1)
    Call deplace(carredep.p2, pointrot, angle, carrearr.p2)
    Call deplace(carredep.p3, pointrot, angle, carrearr.p3)
    Call deplace(carredep.p4, pointrot, angle, carrearr.p4)
End Sub

Private Sub Form_Load()
centre.X = 0
centre.Y = 0
centre.z = 0
angle.X = -0.2
angle.Y = -0.3

balle.p1.X = 2000
balle.p1.Y = 2000
balle.p1.z = 300
balle.p2.X = 2600
balle.p2.Y = 2000
balle.p2.z = 300
balle.p3.X = 2600
balle.p3.Y = 2600
balle.p3.z = 300
balle.p4.X = 2000
balle.p4.Y = 2600
balle.p4.z = 300
balle.p5.X = 2000
balle.p5.Y = 2000
balle.p5.z = -300
balle.p6.X = 2600
balle.p6.Y = 2000
balle.p6.z = -300
balle.p7.X = 2600
balle.p7.Y = 2600
balle.p7.z = -300
balle.p8.X = 2000
balle.p8.Y = 2600
balle.p8.z = -300
dirballe.X = 40
dirballe.Y = 30
dirballe.z = 20

grand_cube.p1.X = 1000
grand_cube.p1.Y = 1000
grand_cube.p1.z = 2000
grand_cube.p2.X = 5000
grand_cube.p2.Y = 1000
grand_cube.p2.z = 2000
grand_cube.p3.X = 5000
grand_cube.p3.Y = 5000
grand_cube.p3.z = 2000
grand_cube.p4.X = 1000
grand_cube.p4.Y = 5000
grand_cube.p4.z = 2000
grand_cube.p5.X = 1000
grand_cube.p5.Y = 1000
grand_cube.p5.z = -2000
grand_cube.p6.X = 5000
grand_cube.p6.Y = 1000
grand_cube.p6.z = -2000
grand_cube.p7.X = 5000
grand_cube.p7.Y = 5000
grand_cube.p7.z = -2000
grand_cube.p8.X = 1000
grand_cube.p8.Y = 5000
grand_cube.p8.z = -2000

raq.p1.X = 2000
raq.p1.Y = grand_cube.p4.Y
raq.p1.z = 500
raq.p2.X = 3000
raq.p2.Y = grand_cube.p4.Y
raq.p2.z = 500
raq.p3.X = 3000
raq.p3.Y = grand_cube.p4.Y - 100
raq.p3.z = 500
raq.p4.X = 2000
raq.p4.Y = grand_cube.p4.Y - 100
raq.p4.z = 500
raq.p5.X = 2000
raq.p5.Y = grand_cube.p4.Y
raq.p5.z = -500
raq.p6.X = 3000
raq.p6.Y = grand_cube.p4.Y
raq.p6.z = -500
raq.p7.X = 3000
raq.p7.Y = grand_cube.p4.Y - 100
raq.p7.z = -500
raq.p8.X = 2000
raq.p8.Y = grand_cube.p4.Y - 100
raq.p8.z = -500

hballe.p1.Y = grand_cube.p4.Y
hballe.p2.Y = grand_cube.p4.Y
hballe.p3.Y = grand_cube.p4.Y
hballe.p4.Y = grand_cube.p4.Y

hballe2.p1.Y = grand_cube.p1.Y
hballe2.p2.Y = grand_cube.p1.Y
hballe2.p3.Y = grand_cube.p1.Y
hballe2.p4.Y = grand_cube.p1.Y

hballe3.p1.z = grand_cube.p1.z
hballe3.p2.z = grand_cube.p1.z
hballe3.p3.z = grand_cube.p1.z
hballe3.p4.z = grand_cube.p1.z

hballe4.p1.z = grand_cube.p5.z
hballe4.p2.z = grand_cube.p5.z
hballe4.p3.z = grand_cube.p5.z
hballe4.p4.z = grand_cube.p5.z

hballe5.p1.X = grand_cube.p1.X
hballe5.p2.X = grand_cube.p1.X
hballe5.p3.X = grand_cube.p1.X
hballe5.p4.X = grand_cube.p1.X

hballe6.p1.X = grand_cube.p2.X
hballe6.p2.X = grand_cube.p2.X
hballe6.p3.X = grand_cube.p2.X
hballe6.p4.X = grand_cube.p2.X

xxx = raq.p1.X
yyy = raq.p5.Y
xx = Me.Width / 2
yy = Me.Height / 2
Show
DoEvents
Dim i As Integer
1
Cls
'PSet (centre.x, centre.y), RGB(0, 0, 255)
Call affcube(Me, grand_cube, RGB(255, 0, 0), centre, angle)

If balle.p2.X + dirballe.X >= grand_cube.p2.X And dirballe.X > 0 Then dirballe.X = -dirballe.X
If balle.p1.X - dirballe.X <= grand_cube.p1.X And dirballe.X < 0 Then dirballe.X = -dirballe.X

If balle.p4.Y + dirballe.Y >= grand_cube.p4.Y - 100 And dirballe.Y > 0 Then
 'si un des point da la balle est dans la raquette
    If ((balle.p1.X >= raq.p1.X And balle.p1.X <= raq.p2.X) And (balle.p1.z >= raq.p5.z And balle.p1.z <= raq.p1.z)) Then dirballe.Y = -dirballe.Y: GoTo 2
    If ((balle.p2.X >= raq.p1.X And balle.p2.X <= raq.p2.X) And (balle.p2.z >= raq.p5.z And balle.p2.z <= raq.p1.z)) Then dirballe.Y = -dirballe.Y: GoTo 2
    If ((balle.p5.X >= raq.p1.X And balle.p5.X <= raq.p2.X) And (balle.p5.z >= raq.p5.z And balle.p5.z <= raq.p1.z)) Then dirballe.Y = -dirballe.Y: GoTo 2
    If ((balle.p6.X >= raq.p1.X And balle.p6.X <= raq.p2.X) And (balle.p6.z >= raq.p5.z And balle.p6.z <= raq.p1.z)) Then dirballe.Y = -dirballe.Y: GoTo 2
    If balle.p4.Y + dirballe.Y >= grand_cube.p4.Y Then Beep: dirballe.Y = -dirballe.Y ' End 'dirballe.y = -dirballe.y
    
End If
2
If balle.p1.Y - dirballe.Y <= grand_cube.p1.Y And dirballe.Y < 0 Then dirballe.Y = -dirballe.Y

If balle.p1.z + dirballe.z >= grand_cube.p1.z And dirballe.z > 0 Then dirballe.z = -dirballe.z
If balle.p5.z - dirballe.z <= grand_cube.p5.z And dirballe.z < 0 Then dirballe.z = -dirballe.z

balle.p1.X = balle.p1.X + dirballe.X
balle.p2.X = balle.p2.X + dirballe.X
balle.p3.X = balle.p3.X + dirballe.X
balle.p4.X = balle.p4.X + dirballe.X
balle.p5.X = balle.p5.X + dirballe.X
balle.p6.X = balle.p6.X + dirballe.X
balle.p7.X = balle.p7.X + dirballe.X
balle.p8.X = balle.p8.X + dirballe.X
balle.p1.Y = balle.p1.Y + dirballe.Y
balle.p2.Y = balle.p2.Y + dirballe.Y
balle.p3.Y = balle.p3.Y + dirballe.Y
balle.p4.Y = balle.p4.Y + dirballe.Y
balle.p5.Y = balle.p5.Y + dirballe.Y
balle.p6.Y = balle.p6.Y + dirballe.Y
balle.p7.Y = balle.p7.Y + dirballe.Y
balle.p8.Y = balle.p8.Y + dirballe.Y
balle.p1.z = balle.p1.z + dirballe.z
balle.p2.z = balle.p2.z + dirballe.z
balle.p3.z = balle.p3.z + dirballe.z
balle.p4.z = balle.p4.z + dirballe.z
balle.p5.z = balle.p5.z + dirballe.z
balle.p6.z = balle.p6.z + dirballe.z
balle.p7.z = balle.p7.z + dirballe.z
balle.p8.z = balle.p8.z + dirballe.z

raq.p1.X = raq.p1.X + dirraq.X
raq.p2.X = raq.p2.X + dirraq.X
raq.p3.X = raq.p3.X + dirraq.X
raq.p4.X = raq.p4.X + dirraq.X
raq.p5.X = raq.p5.X + dirraq.X
raq.p6.X = raq.p6.X + dirraq.X
raq.p7.X = raq.p7.X + dirraq.X
raq.p8.X = raq.p8.X + dirraq.X
raq.p1.z = raq.p1.z + dirraq.z
raq.p2.z = raq.p2.z + dirraq.z
raq.p3.z = raq.p3.z + dirraq.z
raq.p4.z = raq.p4.z + dirraq.z
raq.p5.z = raq.p5.z + dirraq.z
raq.p6.z = raq.p6.z + dirraq.z
raq.p7.z = raq.p7.z + dirraq.z
raq.p8.z = raq.p8.z + dirraq.z

dirballe.X = dirballe.X * (1 + Rnd / 5000)
dirballe.Y = dirballe.Y * (1 + Rnd / 5000)
dirballe.z = dirballe.z * (1 + Rnd / 5000)

hballe.p1.X = balle.p1.X
hballe.p1.z = balle.p1.z
hballe.p2.X = balle.p2.X
hballe.p2.z = balle.p2.z
hballe.p3.X = balle.p6.X
hballe.p3.z = balle.p6.z
hballe.p4.X = balle.p5.X
hballe.p4.z = balle.p5.z

hballe2.p1.X = balle.p1.X
hballe2.p1.z = balle.p1.z
hballe2.p2.X = balle.p2.X
hballe2.p2.z = balle.p2.z
hballe2.p3.X = balle.p6.X
hballe2.p3.z = balle.p6.z
hballe2.p4.X = balle.p5.X
hballe2.p4.z = balle.p5.z

hballe3.p1.X = balle.p1.X
hballe3.p1.Y = balle.p1.Y
hballe3.p2.X = balle.p2.X
hballe3.p2.Y = balle.p2.Y
hballe3.p3.X = balle.p3.X
hballe3.p3.Y = balle.p3.Y
hballe3.p4.X = balle.p4.X
hballe3.p4.Y = balle.p4.Y

hballe4.p1.X = balle.p1.X
hballe4.p1.Y = balle.p1.Y
hballe4.p2.X = balle.p2.X
hballe4.p2.Y = balle.p2.Y
hballe4.p3.X = balle.p3.X
hballe4.p3.Y = balle.p3.Y
hballe4.p4.X = balle.p4.X
hballe4.p4.Y = balle.p4.Y

hballe5.p1.Y = balle.p1.Y
hballe5.p1.z = balle.p1.z
hballe5.p2.Y = balle.p5.Y
hballe5.p2.z = balle.p5.z
hballe5.p3.Y = balle.p8.Y
hballe5.p3.z = balle.p8.z
hballe5.p4.Y = balle.p4.Y
hballe5.p4.z = balle.p4.z

hballe6.p1.Y = balle.p1.Y
hballe6.p1.z = balle.p1.z
hballe6.p2.Y = balle.p5.Y
hballe6.p2.z = balle.p5.z
hballe6.p3.Y = balle.p8.Y
hballe6.p3.z = balle.p8.z
hballe6.p4.Y = balle.p4.Y
hballe6.p4.z = balle.p4.z

Call affcube(Me, balle, RGB(0, 255, 0), centre, angle)
Call affcube(Me, raq, RGB(127, 127, 255), centre, angle)
Call affcarre(Me, hballe, RGB(127, 127, 127), centre, angle)
Call affcarre(Me, hballe2, RGB(127, 127, 127), centre, angle)
Call affcarre(Me, hballe3, RGB(127, 127, 127), centre, angle)
Call affcarre(Me, hballe4, RGB(127, 127, 127), centre, angle)
Call affcarre(Me, hballe5, RGB(127, 127, 127), centre, angle)
Call affcarre(Me, hballe6, RGB(127, 127, 127), centre, angle)

'Circle (affballe.x, affballe.y), balle.rayon
For i = 0 To 500: DoEvents: Next
GoTo 1
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If X > xx + 200 Then
        dirraq.X = 50
    ElseIf X < xx - 200 Then
        dirraq.X = -50
    Else
        dirraq.X = 0
    End If
    If Y > yy + 200 Then
        dirraq.z = -50
    ElseIf Y < yy - 200 Then
        dirraq.z = 50
    Else
        dirraq.z = 0
    End If
End Sub

Conclusion :


qu'en pensez-vous ?
comment trouver-vous la fonction 'deplace' ?
(j'ai mis du temps avant de la faire fonctionner, au moin les trois quart du temp total du projet!)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.