シューティングゲームサンプル

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
  1. 上記をコピーする
  2. Small Basic Onlineエディタにアクセスする
    https://smallbasic-publicwebsite-code.azurewebsites.net/
  3. エディタに上記のコピーしたコードを貼り付ける
  4. Runボタンをクリックして実行する
  5. 左矢印キー、右矢印キー、スペースキーで操作する
  6. 上部に四角が現れたらスペースキーで弾を発射して当てる

全部で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” がヒントですね。

ぜひ自身の手でたっぷり時間をかけて、あーでもないこーでもないと改造してみてください。

タイトルとURLをコピーしました