Small Basicでシューティングゲームのサンプルプログラムを書きました。
中学生以上の生徒さんにぜひチャレンジしてほしいです。
試し方
INTERVAL = 20
AREA_W = 640
AREA_H = 480
GraphicsWindow.DrawRectangle(0, 0, AREA_W, AREA_H)
ENEMY_W = 50
ENEMY_H = 25
ENEMY_BIRTH_INTERVAL = 1000 / INTERVAL
birth_countdown = ENEMY_BIRTH_INTERVAL
num_of_enemies = 0
PLAYER_W = 50
PLAYER_H = 25
player_x = AREA_W / 2 - PLAYER_W / 2
player_y = AREA_H / 10 * 8
player = Shapes.AddTriangle(PLAYER_W / 2, 0, 0, PLAYER_H, PLAYER_W, PLAYER_H)
Shapes.Move(player, player_x, player_y)
BULLET_SPEED = 20
BULLET_D = 10
bullet_x = player_x + PLAYER_W/2 - BULLET_D/2
bullet_y = player_y
num_of_bullets = 0
GraphicsWindow.KeyDown = onKeyDown
Sub onKeyDown
If GraphicsWindow.LastKey = "ArrowLeft" Then
player_x = player_x - 10
Shapes.Move(player, player_x, player_y)
ElseIf GraphicsWindow.LastKey = "ArrowRight" Then
player_x = player_x + 10
Shapes.Move(player, player_x, player_y)
ElseIf GraphicsWindow.LastKey = " " Then
If num_of_bullets = 0 Then
num_of_bullets = 1
bullet_x = player_x + PLAYER_W/2 - BULLET_D/2
bullet_y = player_y
bullet = Shapes.AddEllipse(BULLET_D, BULLET_D)
Shapes.Move(bullet, bullet_x, bullet_y)
EndIf
EndIf
EndSub
Timer.Interval = INTERVAL
Timer.Tick = onTick
Sub onTick
birth_countdown = birth_countdown - 1
if birth_countdown = 0 Then
birth_countdown = ENEMY_BIRTH_INTERVAL
birthEnemy()
EndIf
If num_of_bullets = 1 Then
bullet_y = bullet_y - BULLET_SPEED
If bullet_y < 0 Then
Shapes.Remove(bullet)
num_of_bullets = 0
Else
Shapes.Move(bullet, bullet_x, bullet_y)
EndIf
EndIf
If bullet_y > enemy_y - BULLET_H And bullet_y < enemy_y + ENEMY_H Then
If bullet_x > enemy_x - BULLET_D And bullet_x < enemy_x + ENEMY_W Then
Shapes.Remove(bullet)
Shapes.Remove(enemy)
num_of_bullets = 0
num_of_enemies = 0
EndIf
EndIf
EndSub
Sub birthEnemy
If num_of_enemies = 0 Then
num_of_enemies = 1
enemy = Shapes.AddRectangle(ENEMY_W, ENEMY_H)
enemy_x = Math.GetRandomNumber(AREA_W - ENEMY_W)
enemy_y = ENEMY_H
Shapes.Move(enemy, enemy_x, enemy_y)
EndIf
EndSub
- 上記をコピーする
- Small Basic Onlineエディタにアクセスする
https://smallbasic-publicwebsite-code.azurewebsites.net/ - エディタに上記のコピーしたコードを貼り付ける
- Runボタンをクリックして実行する
- 左矢印キー、右矢印キー、スペースキーで操作する
- 上部に四角が現れたらスペースキーで弾を発射して当てる
全部で87行。もしがんばれるならコピーせず、全部コツコツ打ち込んでみてほしいです。
エディタも補助してくれます。
動かしてみれば分かりますが、ゲームと呼べるほどのものではないです。
下記に行番号を追加したものを載せます。
解説
01 : INTERVAL = 20
02 :
03 : AREA_W = 640
04 : AREA_H = 480
05 : GraphicsWindow.DrawRectangle(0, 0, AREA_W, AREA_H)
06 :
07 : ENEMY_W = 50
08 : ENEMY_H = 25
09 : ENEMY_BIRTH_INTERVAL = 1000 / INTERVAL
10 :
11 : birth_countdown = ENEMY_BIRTH_INTERVAL
12 : num_of_enemies = 0
13 :
14 : PLAYER_W = 50
15 : PLAYER_H = 25
16 : player_x = AREA_W / 2 - PLAYER_W / 2
17 : player_y = AREA_H / 10 * 8
18 : player = Shapes.AddTriangle(PLAYER_W / 2, 0, 0, PLAYER_H, PLAYER_W, PLAYER_H)
19 : Shapes.Move(player, player_x, player_y)
20 :
21 : BULLET_SPEED = 20
22 : BULLET_D = 10
23 : bullet_x = player_x + PLAYER_W/2 - BULLET_D/2
24 : bullet_y = player_y
25 : num_of_bullets = 0
26 :
27 : GraphicsWindow.KeyDown = onKeyDown
28 : Sub onKeyDown
29 : If GraphicsWindow.LastKey = "ArrowLeft" Then
30 : player_x = player_x - 10
31 : Shapes.Move(player, player_x, player_y)
32 :
33 : ElseIf GraphicsWindow.LastKey = "ArrowRight" Then
34 : player_x = player_x + 10
35 : Shapes.Move(player, player_x, player_y)
36 :
37 : ElseIf GraphicsWindow.LastKey = " " Then
38 : If num_of_bullets = 0 Then
39 : num_of_bullets = 1
40 : bullet_x = player_x + PLAYER_W/2 - BULLET_D/2
41 : bullet_y = player_y
42 : bullet = Shapes.AddEllipse(BULLET_D, BULLET_D)
43 : Shapes.Move(bullet, bullet_x, bullet_y)
44 : EndIf
45 : EndIf
46 : EndSub
47 :
48 :
49 : Timer.Interval = INTERVAL
50 : Timer.Tick = onTick
51 : Sub onTick
52 : birth_countdown = birth_countdown - 1
53 : if birth_countdown = 0 Then
54 : birth_countdown = ENEMY_BIRTH_INTERVAL
55 : birthEnemy()
56 : EndIf
57 :
58 : If num_of_bullets = 1 Then
59 : bullet_y = bullet_y - BULLET_SPEED
60 : If bullet_y < 0 Then
61 : Shapes.Remove(bullet)
62 : num_of_bullets = 0
63 : Else
64 : Shapes.Move(bullet, bullet_x, bullet_y)
65 : EndIf
66 : EndIf
67 :
68 : If bullet_y > enemy_y - BULLET_H And bullet_y < enemy_y + ENEMY_H Then
69 : If bullet_x > enemy_x - BULLET_D And bullet_x < enemy_x + ENEMY_W Then
70 : Shapes.Remove(bullet)
71 : Shapes.Remove(enemy)
72 : num_of_bullets = 0
73 : num_of_enemies = 0
74 : EndIf
75 : EndIf
76 : EndSub
77 :
78 :
79 : Sub birthEnemy
80 : If num_of_enemies = 0 Then
81 : num_of_enemies = 1
82 : enemy = Shapes.AddRectangle(ENEMY_W, ENEMY_H)
83 : enemy_x = Math.GetRandomNumber(AREA_W - ENEMY_W)
84 : enemy_y = ENEMY_H
85 : Shapes.Move(enemy, enemy_x, enemy_y)
86 : EndIf
87 : EndSub
5行目で四角を描いてゲームエリアを表現しています。
28行目から46行目でキーボードのボタンを押したときの処理を書いています。よく見ると左矢印キーの処理、右矢印キーの処理、スペースキーの処理を書いているのが分かるのではないかと思います。ぜひじっくり眺めてほしい。
52行目から56行目は敵を生み出す処理、58行目から66行目が弾丸が飛んでいく処理、68行目から75行目がいわゆる当たり判定、弾丸と敵がぶつかったら消す処理です。
残念ながらこのプログラム、ちょっと至らないところがあります。
まっさきに思いつくのは、プレイヤーが左、右に行き過ぎると、エリアの外にどんどん出て行ってしまいます。
これをエリア内に閉じ込めておくにはどうしたらいいでしょうか。ぜひ自身で考えてほしい。
左矢印キーを押しても左端以上には行けなくする、右矢印キーを押しても右端以上には行けなくする、ということです。29行目の “ArrowLeft” や33行目の “ArrowRight” がヒントですね。
ぜひ自身の手でたっぷり時間をかけて、あーでもないこーでもないと改造してみてください。