弾の射出 †
シューティングゲームの「シューティング」たる所以、弾の射出について。
他の機能を削ぎ落とした、簡単なサンプルです。
一度に発射できる弾は1発のみです。
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
|
| #const mySize 10 #const bulletSize 5
myX = ginfo_winx / 2
myY = ginfo_winy * 4 / 5
*main
redraw 0
color 255, 255, 255 : boxf
gosub *shot gosub *moveBullet gosub *drawMyShip gosub *drawBullet redraw 1
await 10
goto *main
*shot
getkey pushed, 'Z' if pushed : gosub *makeBullet
return
*makeBullet
bulletFlag = 1 bulletX = myX
bulletY = myY - mySize - bulletSize
bulletVX = 0
bulletVY = -8
return
*moveBullet
if bulletFlag == 0 : return
bulletX += bulletVX
bulletY += bulletVY
return
*drawMyShip
color 0, 0, 255
boxf myX - mySize, myY - mySize, myX + mySize, MyY + mySize
return
*drawBullet
if bulletFlag == 0 : return
color 255
circle bulletX - bulletSize, bulletY - bulletSize, bulletX + bulletSize, bulletY + bulletSize
return
|
ゲームとして利用するには上記サンプルに載せた機能だけでなく、
- 弾が画面外に出たら消去する
- 複数の弾が発射できるようにする
- 連射に制限をかける
といった機能を追加するのが一般的です。
+
| | 画面外消去と連射制限を実装したサンプル
|
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
|
-
|
|
!
-
|
!
| #const chargeTime 10 #const mySize 10 #const bulletSize 5 #const BULLET_MAX 10
myX = ginfo_winx / 2
myY = ginfo_winy * 4 / 5
dim bulletFlag, BULLET_MAX
*main
redraw 0
color 255, 255, 255 : boxf
gosub *shot gosub *moveBullet gosub *drawMyShip gosub *drawBullet redraw 1
await 10
goto *main
*shot
if charge > 0 : charge-- : return
getkey pushed, 'Z' if pushed {
charge = chargeTime
gosub *makeBullet
}
return
*makeBullet
repeat BULLET_MAX
if bulletFlag(cnt) : continue bulletFlag(cnt) = 1
bulletX(cnt) = myX
bulletY(cnt) = myY - mySize - bulletSize
bulletVX(cnt) = 0
bulletVY(cnt) = -8
break
loop
return
*moveBullet
repeat BULLET_MAX
if bulletFlag(cnt) == 0 : continue
bulletX(cnt) += bulletVX
bulletY(cnt) += bulletVY
if (bulletX(cnt) < 0)|(ginfo_winx < bulletX(cnt))|(bulletY(cnt) < 0)|(ginfo_winy < bulletY(cnt)) {
bulletFlag(cnt) = 0
}
loop
return
*drawMyShip
color 0, 0, 255
boxf myX - mySize, myY - mySize, myX + mySize, MyY + mySize
return
*drawBullet
color 255
repeat BULLET_MAX
if bulletFlag(cnt) == 0 : continue
circle bulletX(cnt) - bulletSize, bulletY(cnt) - bulletSize, bulletX(cnt) + bulletSize, bulletY(cnt) + bulletSize
loop
return
|
|
以下の記事が参考になるでしょう。
- 衝突判定
- 弾と敵の衝突を調べる
- キャラクター管理
- 複数のキャラクターを動かす