Sub Heart()
Dim shapesColl As ShapeRange, shp As Shape
Set shapesColl = ActiveSheet.Shapes.Range(Array("Heart 1", "Heart 3", "Heart 4", "Heart 5"))
rotationLimit = 8
movementLimit = 8
monoMovementLimit = 30
windowXBorder = ActiveWindow.Width - 50
windowyBorder = ActiveWindow.Height - 250
ReDim shapesMovements(1 To shapesColl.Count, 0 To 8)
For i = LBound(shapesMovements, 1) To UBound(shapesMovements, 1)
' Start pos X
shapesMovements(i, 0) = Application.RandBetween(50, 600)
' Start pos Y
shapesMovements(i, 1) = Application.RandBetween(50, 300)
' Start Width
shapesMovements(i, 2) = Application.RandBetween(100, 150)
' Start Height
shapesMovements(i, 3) = Application.RandBetween(100, 150)
With shapesColl(i)
.Visible = msoTrue
.Left = shapesMovements(i, 0)
.Top = shapesMovements(i, 1)
.Width = shapesMovements(i, 2)
.Height = shapesMovements(i, 3)
End With
' Movement X
shapesMovements(i, 4) = Application.RandBetween(-1 * rotationLimit, rotationLimit)
' Movement Y
shapesMovements(i, 5) = Application.RandBetween(-1 * rotationLimit, rotationLimit)
' Rotation X
shapesMovements(i, 6) = Application.RandBetween(-1 * rotationLimit, rotationLimit)
' Rotation Y
shapesMovements(i, 7) = Application.RandBetween(-1 * rotationLimit, rotationLimit)
' Rotation Z
shapesMovements(i, 8) = Application.RandBetween(-1 * rotationLimit, rotationLimit)
Next i
For j = 1 To 2000
For i = 1 To shapesColl.Count
On Error Resume Next
shapesColl(i).Left = shapesColl(i).Left + shapesMovements(i, 4)
shapesColl(i).Top = shapesColl(i).Top + shapesMovements(i, 5)
If shapesColl(i).Left = 0 Or shapesColl(i).Left > windowXBorder Then shapesMovements(i, 4) = shapesMovements(i, 4) * -1
If shapesColl(i).Top = 0 Or shapesColl(i).Top > windowyBorder Then shapesMovements(i, 5) = shapesMovements(i, 5) * -1
With shapesColl(i).ThreeD
.RotationX = .RotationX + shapesMovements(i, 6)
.RotationY = .RotationY + shapesMovements(i, 7)
.RotationZ = .RotationZ + shapesMovements(i, 8)
If _
(.RotationX \ shapesMovements(i, 6)) > monoMovementLimit Or _
(.RotationY \ shapesMovements(i, 7)) > monoMovementLimit Or _
(.RotationZ \ shapesMovements(i, 8)) > monoMovementLimit Then
'Debug.Print shapesColl(i).Name & " is changing direction"
' Movement X
shapesMovements(i, 4) = shapesMovements(i, 4) + (Application.RandBetween(-1 * rotationLimit, rotationLimit) / 2)
If shapesMovements(i, 4) < 0 Then
shapesMovements(i, 4) = Application.Max(shapesMovements(i, 4), -1 * monoMovementLimit)
Else
shapesMovements(i, 4) = Application.Min(shapesMovements(i, 4), monoMovementLimit)
End If
' Movement Y
shapesMovements(i, 5) = shapesMovements(i, 5) + (Application.RandBetween(-1 * rotationLimit, rotationLimit) / 2)
If shapesMovements(i, 5) < 0 Then
shapesMovements(i, 5) = Application.Max(shapesMovements(i, 5), -1 * monoMovementLimit)
Else
shapesMovements(i, 5) = Application.Min(shapesMovements(i, 5), monoMovementLimit)
End If
' Rotation X
shapesMovements(i, 6) = shapesMovements(i, 6) + (Application.RandBetween(-1 * rotationLimit, rotationLimit) / 2)
If shapesMovements(i, 6) < 0 Then
shapesMovements(i, 6) = Application.Max(shapesMovements(i, 6), -1 * monoMovementLimit)
Else
shapesMovements(i, 6) = Application.Min(shapesMovements(i, 6), monoMovementLimit)
End If
' Rotation Y
shapesMovements(i, 7) = shapesMovements(i, 7) + (Application.RandBetween(-1 * rotationLimit, rotationLimit) / 2)
If shapesMovements(i, 7) < 0 Then
shapesMovements(i, 7) = Application.Max(shapesMovements(i, 7), -1 * monoMovementLimit)
Else
shapesMovements(i, 7) = Application.Min(shapesMovements(i, 7), monoMovementLimit)
End If
' Rotation Z
shapesMovements(i, 8) = shapesMovements(i, 7) + (Application.RandBetween(-1 * rotationLimit, rotationLimit) / 2)
If shapesMovements(i, 8) < 0 Then
shapesMovements(i, 8) = Application.Max(shapesMovements(i, 8), -1 * monoMovementLimit)
Else
shapesMovements(i, 8) = Application.Min(shapesMovements(i, 8), monoMovementLimit)
End If
End If
End With
DoEvents
Next i
Next j
End Sub |