n-wayショット †
n-way弾(扇状に複数個発射される弾)発射のサンプルです。
好みの方向に弾を発射し動かすことができれば、難しいことは何もありません。
などが理解できれば問題はないでしょう。
ここでは扇状に発射するにあたり、同時発射する弾のうち、何番目の弾かによって
発射角度を一定値だけずらしています。
画面をクリックするとその方向にn-way弾を発射します。
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
|
|
#const BULLET_MAX 60 #const BULLET_SPEED 10 #const BULLET_DIST 0.2 #const SHIP_RADIUS 5 #const N_WAY 5 #const WAIT_TIME 4
dim bullet, BULLET_MAX
ddim bulletX, BULLET_MAX
ddim bulletY, BULLET_MAX
ddim bulletVX, BULLET_MAX
ddim bulletVY, BULLET_MAX
shipX = double(ginfo_winx / 2)
shipY = double(ginfo_winy) - SHIP_RADIUS
PI = atan(1) * 4
onclick gosub *makeBullet
*main
gosub *bulletMove
gosub *draw
wait WAIT_TIME
goto *main
*bulletMove
repeat BULLET_MAX
if bullet(cnt) == 0 : continue
bulletX(cnt) += bulletVX(cnt)
bulletY(cnt) += bulletVY(cnt)
if (bulletX(cnt) < 0)|(ginfo_winx < bulletX(cnt))|(bulletY(cnt) < 0)|(ginfo_winy < bulletY(cnt)) : bullet(cnt) = 0
loop
return
*draw
redraw 0
color 255, 255, 255 : boxf
gosub *drawBullet
gosub *drawShip
redraw 1
return
*drawBullet
color
repeat BULLET_MAX
if bullet(cnt) == 0 : continue
pset bulletX(cnt), bulletY(cnt)
loop
return
*drawShip
color 255
circle shipX - SHIP_RADIUS, shipY - SHIP_RADIUS, shipX + SHIP_RADIUS, shipY + SHIP_RADIUS
return
*makeBullet
tmp = 0
repeat N_WAY
up_cnt = cnt
repeat BULLET_MAX - tmp, tmp
if bullet(cnt) : continue
bullet(cnt) = 1
bulletX(cnt) = shipX
bulletY(cnt) = shipY
radian = atan(-mousey + shipY, mousex - shipX) - (0.5 * (N_WAY - 1) - up_cnt) * BULLET_DIST
bulletVX(cnt) = cos(radian) * BULLET_SPEED
bulletVY(cnt) = -sin(radian) * BULLET_SPEED
tmp = cnt + 1
break
loop
if BULLET_MAX < tmp : break loop
return
|