-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathphysics_shatter.bas
124 lines (93 loc) · 3.61 KB
/
physics_shatter.bas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
'********************************************************************************************
'
' Physac - Body shatter
'
' This example uses Physac (https://github.com/victorfisac/Physac)
'
'********************************************************************************************
_DEFINE A-Z AS LONG
OPTION _EXPLICIT
$COLOR:32
$EXEICON:'./physac.ico'
' Include physac library
'$INCLUDE:'include/physac.bi'
'$INCLUDE:'include/raymath.bi'
' Constants
CONST SHATTER_FORCE! = 200!
' Initialization
'--------------------------------------------------------------------------------------
CONST SCREENWIDTH& = 800&
CONST SCREENHEIGHT& = 450&
CONST LOGOTEXT = "Powered by"
SCREEN _NEWIMAGE(SCREENWIDTH, SCREENHEIGHT, 32)
DO: LOOP UNTIL _SCREENEXISTS
_TITLE "physac - Shatter demo"
_PRINTMODE _KEEPBACKGROUND
' Physac logo drawing position
DIM AS LONG logoX: logoX = SCREENWIDTH - _PRINTWIDTH(LOGOTEXT) - 10
DIM AS LONG logoY: logoY = 15
DIM shatter AS _BYTE: shatter = _FALSE
DIM logo AS LONG: logo = _LOADIMAGE("physac.ico")
SetRandomSeed TIMER
' Initialize physics and default physics bodies
InitPhysics _TRUE
SetPhysicsGravity 0, 0
' Create random polygon physics body to shatter
DIM vec AS Vector2
SetVector2 vec, SCREENWIDTH / 2!, SCREENHEIGHT / 2!
DIM currentBody AS _UNSIGNED _OFFSET: currentBody = CreatePhysicsBodyPolygon(vec, GetRandomValue(80, 200), GetRandomValue(3, 8), 10)
DIM i AS LONG
' Main game loop
DO
' Update
'----------------------------------------------------------------------------------
WHILE _MOUSEINPUT: WEND
IF NOT shatter AND _MOUSEBUTTON(1) THEN
shatter = _TRUE
DIM count AS LONG: count = GetPhysicsBodiesCount
FOR i = count - 1 TO 0 STEP -1
currentBody = GetPhysicsBody(i)
IF currentBody <> NULL THEN
DIM mousePos AS Vector2: SetVector2 mousePos, _MOUSEX, _MOUSEY
PhysicsShatter currentBody, mousePos, SHATTER_FORCE
END IF
NEXT
END IF
'----------------------------------------------------------------------------------
' Draw
'----------------------------------------------------------------------------------
CLS , Black
' Draw created physics bodies
DIM bodiesCount AS LONG: bodiesCount = GetPhysicsBodiesCount
FOR i = 0 TO bodiesCount - 1
currentBody = GetPhysicsBody(i)
IF currentBody <> NULL THEN
DIM vertexCount AS LONG: vertexCount = GetPhysicsShapeVerticesCount(i)
' Get physics bodies shape vertices to draw lines
DIM j AS LONG
DIM vertexA AS Vector2: GetPhysicsShapeVertex currentBody, 0, vertexA
PSET (vertexA.x, vertexA.y), White
FOR j = 1 TO vertexCount - 1
DIM vertexB AS Vector2: GetPhysicsShapeVertex currentBody, j, vertexB
LINE -(vertexB.x, vertexB.y), Green
NEXT
LINE -(vertexA.x, vertexA.y), Green
END IF
NEXT
' Draw FPS
COLOR White
_PRINTSTRING (SCREENWIDTH - 90, SCREENHEIGHT - 30), STR$(GetHertz) + " FPS"
' Draw UI elements
_PRINTSTRING (10, 10), "Left mouse button in polygon area to shatter body"
_PUTIMAGE (SCREENWIDTH - 100, 0)-(SCREENWIDTH - 1, 99), logo
COLOR Black
_PRINTSTRING (logoX, logoY), LOGOTEXT
_DISPLAY
_LIMIT 60
'----------------------------------------------------------------------------------
LOOP UNTIL _KEYHIT = _KEY_ESC
' De-Initialization
'--------------------------------------------------------------------------------------
ClosePhysics
'--------------------------------------------------------------------------------------
SYSTEM