-
Notifications
You must be signed in to change notification settings - Fork 1
/
Topdown racing game ai.bb
166 lines (148 loc) · 3.31 KB
/
Topdown racing game ai.bb
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
; topdown racing game ai
Graphics 640,480,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
; number of cars
Const numcars = 6
Dim cx#(numcars) ; car x
Dim cy#(numcars) ; car y
Dim ctx(numcars) ; car destination x
Dim cty(numcars) ; car destination y
Dim ca#(numcars) ; current car angle
Dim cs#(numcars) ; car speed
Dim tp(numcars) ; next point location on map
Dim locktime(numcars)
Const numpoints = 5 ; race track destination points
Dim px(numpoints) ; pointx ; makes up the race track
Dim py(numpoints) ; pointy
;make race track image
Global myim = CreateImage(GraphicsWidth(),GraphicsHeight())
setupracetrack()
SetBuffer BackBuffer()
While KeyDown(1) = False
Cls
updatecars
DrawImage myim,0,0
Color 255,0,0
For i=0 To numpoints
Rect px(i)-3,py(i)-3,6,6,False
Next
For i=0 To numcars
Color 0,0,255
Oval cx(i)-3,cy(i)-3,6,6,True
Next
Flip
Wend
End
Function updatecars()
SetBuffer ImageBuffer(myim)
For i=0 To numcars
If cs(i)< 2 Then cs(i) = cs(i) + .01 ; increase car speed
; Get target angle to stear towards
a = getangle(cx(i),cy(i),ctx(i),cty(i))
a1 = ca(i)
a2 = ca(i)
c1 = 0
c2 = 0
exitloop = False
While exitloop = False
a1=a1+1
c1=c1+1
If a1 = a Then exitloop = True
If a1=>360 Then a1=-1
Wend
exitloop = False
While exitloop = False
a2=a2-1
c2=c2+1
If a2 = a Then exitloop = True
If a2=<0 Then a2=361
Wend
; turn towards the destination point
If c1>c2 Then
ca(i) = ca(i) - 3
If ca(i) < 0 Then ca(i)=361
Else
ca(i) = ca(i) + 3
If ca(i)>360 Then ca(i) = -1
End If
; See if next position is inside other car and crash
b1# = cx(i) + Sin(ca(i)) * cs(i)
b2# = cy(i) + Cos(ca(i)) * cs(i)
col = False
For ii=0 To numcars
If Not i = ii
If RectsOverlap(b1,b2,3,3,cx(ii),cy(ii),3,3)
col=True
End If
End If
Next
If col = False ; if no crash then move
cx(i) = cx(i) + Sin(ca(i)) * cs(i)
cy(i) = cy(i) + Cos(ca(i)) * cs(i)
Else ; if crash then go real slow
cs(i) = Rnd(0.1,0.2)
cx(i)=cx(i)+Rand(-3,3)
cy(i)=cy(i)+Rand(-3,3)
End If
; If reached next point
If RectsOverlap(cx(i),cy(i),3,3,ctx(i),cty(i),3,3) = True Then
tp(i) = tp(i) + 1
If tp(i) > numpoints Then tp(i) = 0
ctx(i) = px(tp(i)) + Rand(-8,8)
cty(i) = py(tp(i)) + Rand(-8,8)
End If
; if on dirt then slow down
If Rand(10) = 1
GetColor cx(i),cy(i)
If ColorRed() = 0 Then cs(i) = 0.1
EndIf
Next
SetBuffer BackBuffer()
End Function
Function setupracetrack()
px(0) = 100
py(0) = 100
px(1) = 320
py(1) = 100
px(2) = 500
py(2) = 200
px(3) = 500
py(3) = 370
px(4) = 320
py(4) = 400
px(5) = 100
py(5) = 300
For i=0 To numcars
cx(i) = px(0)+Rand(-16,16)
cy(i) = py(0)+Rand(-16,16)
ca(i) = getangle(cx(i),cy(i),px(1),py(1))
tp(i) = 1
ctx(i) = px(tp(i))+Rand(-8,8)
cty(i) = py(tp(i))+Rand(-8,8)
cs(i) = Rnd(0.4,0.7)
Next
SetBuffer ImageBuffer(myim)
For i=0 To numpoints-1
For y1=-32 To 32
For x1=-32 To 32
Line px(i)+x1,py(i)+y1,px(i+1)+x1,py(i+1)+y1
Next
Next
Next
For y1=-32 To 32
For x1=-32 To 32
Line px(numpoint)+x1,py(numpoints)+y1,px(0)+x1,py(0)+y1
Next
Next
End Function
Function getangle(x1,y1,x2,y2)
at = ATan2( x1 - x2 , y1 - y2 )
at = at - 180;
If at > 360
at = at - 360
ElseIf ( at < 0)
at = at + 360
End If
Return at
End Function