タグ: プログラム

衝突判定①

Pocket

衝突判定の考え方

自機と★が接触したかどうかの判定を行います。

「衝突判定」「あたり判定」「ヒット判定」「コリジョン」・・・
いろいろな呼び方がされますが、ゲームを作るうえで非常に重要な要素の一つです。

少し長くなりますが、しっかり理解してください。

続きを読む

Pocket

★の表示

Pocket

★の表示と移動

次に今回のゲームの敵キャラにあたる★を表示します。

最終的に★は大量に出しますが、とりあえずは1個だけ出したいと思います。

プログラム的には●を表示したのと変わりありません。

一気に書いちゃいましょう。

続きを読む

Pocket

自機の操作

Pocket

キー入力

さて、とりあえず無条件で●を右に移動させましたが、
本来はキーボードの「→」を押した時に右に移動するはずです。

そのへんを作ってみましょう。

まず、次の1行を追加します。

    ;自機移動
    stick key
    player_x = player_x + 5

stickは、押されているキーの番号を変数に代入する命令です。

続きを読む

Pocket

自機の表示

Pocket

ウィンドウを表示

まずは、ウィンドウを表示しなければ始まりません。

今回は、ワイド型スクリーンの比率に合わせて800×480ピクセルの
ウィンドウにしましょう。

    ;スクリーンを作成
    screen 0, 800, 480

 

自機を表示する

今回のゲームの自機は、画像ではなく、文字の「●」です。

つまり、mes命令で表示できます。

表示する位置はどこにしたらいいでしょうか?

自機は移動するので、位置は常に変化します。

ということは・・・・変数を使います。

    ;スクリーンを作成
    screen 0, 800, 480

    ;自機の位置
    player_x = 100
    player_y = 200

その変数の位置に、緑色で●を表示しましょう。

ついでに、そのままだと少し小さいので、フォントのサイズを32にします。

    ;自機の位置
    player_x = 100
    player_y = 200

    ;フォントの設定
    font "MS ゴシック", 32

    ;自機を表示
    color 0, 255, 0
    pos player_x, player_y
    mes "●"

これで、左から100、上から200の位置に、緑色で●が表示されると思います。

 

自機を移動させる

自機は、カーソルキーの押した方に移動しますが、
キー入力は次ページ以降で説明するとして、
とりあえず単純に右方向に移動させてみましょう。

変数player_xとplayer_yは、ウィンドウの左上からの距離を表しています。

つまりplayer_xの値を大きくすれば右に移動します。

    ;自機を表示
    color 0, 255, 0
    pos player_x, player_y
    mes "●"

    ;自機移動
    player_x = player_x + 5

これで実行すれば移動するでしょうか・・・?

しませんね。

これは、表示した後に変数の値を変えただけなので意味がありません。

移動させるためには、表示→移動→表示→移動→・・・を、
繰り替えさなければなりません。

繰り返し処理は以前repeat-loopを紹介しました。
それを使ってもいいのですが、今回は違う方法を紹介します。

次のように追加してください。

*メインループ
    ;自機を表示
    color 0, 255, 0
    pos player_x, player_y
    mes "●"

    ;自機移動
    player_x = player_x + 5

    await 16
    goto *メインループ

awaitは前に紹介したから大丈夫ですね?

「*メインループ」と書いていますが、これは「ラベル」と呼ばれるものです。

先頭に「*」をつければラベルになります。「*」の後ろは何でもOK。

で、ラベル自体は何かをする命令ではなく、
プログラム中にはさむ 「しおり」のようなものです。

なお、ラベルは先頭に空白を入れず、左端に書くのが通例です。

で、最後に追加した「goto *メインループ」。
これは「“*メインループ”というラベルのところにジャンプしろ」いう意味の命令です。

歌の歌詞によくある「※くりかえし」ってやつに似てますね。

これで、表示→移動→表示→移動→・・・を
1秒間に約60回繰り返すことになります。

実行してみましょう。

残像が残るので、太い線が伸びていくように見えますが、
●が右に移動している証拠です。

 

「repeat – loop」と「goto」の使い分け

さて、今回新しいループの方法を紹介しました。

ですが、今回のプログラムをrepeat – loopで書いても特に問題はありません。

では、どういう時はrepeat – loop を使い、
どういう時はgotoを使ってループを書けばいいのでしょうか?

これに関しては、特に正解はないのですが、次のように考えてください。

【repeat – loopがいいパターン】
・ループ回数が決まっている場合
・ループさせる処理があまり多くない場合

【gotoがいいパターン】
・ループ回数が決まってない場合
・ループさせる処理がある程度多い場合

今回のループは、★にぶつかってゲームが終了するまで
繰り返すわけですから、実際何回ループするか分かりません。

こういう場合はgotoを使ったほうがいいと思います。

 

画面をクリアする

●を移動させましたが、
残像が残っているので1本の線のようになってしまっています。

ちゃんと移動しているように見せるには、
一度表示した●を消してからちょっと右に移動する必要があります。

今回のゲームは、完成版サンプルを見てもらうと分かるとおり、
背景は青で塗りつぶしているので、
●を表示する前に画面を青一色で塗りつぶしましょう。

塗りつぶすには「boxf」命令を使います。

*メインループ
    ;画面をクリア
    color 0, 0, 255
    boxf


    ;自機を表示
    color 0, 255, 0
    pos player_x, player_y

boxfは「Box(四角く) Fill(塗りつぶす)」の略で、
画面全体を塗りつぶす命令です。

これで、画面真っ青→●表示→移動→画面真っ青→●表示→移動→・・・
というループになり、●が移動しているように見えると思います。

なお、PCのスペックによっては●がチラつく場合もありますが、
あとで修正しますので、とりあえず我慢しておいてください。

 

今回のポイント

  • 「*○○○」と書くことでラベルという目印をつけることができる。

  • 「goto *○○○」と書くと、指定したラベルの位置に ジャンプする。

  • 「boxf」と書くと、画面全体を塗りつぶす。

Pocket

ゲーム(っぽいもの)を作ってみよう

Pocket

さて、基礎的なことはだいたい紹介しました。

ここからは、いよいよゲームを作ってみたいと思います。

ここで一つ注意。

ゲームプログラマーになろうと思った人が挫折する原因の一つに
「最初から市販されているようなカッコいいゲームを作ろうとする」というのがあります。

HSPでカッコいいゲームを作ることは可能です。

しかも比較的簡単にできます。

しかし、初めて作るゲームでカッコいいゲームを作るのは無理です。

そこで、今回はつまらないゲームを作ります。

そもそもゲームといっていいのか分からないほどのものです。

 

仕様

プレイヤーは「●」です。
横から「★」が3つ飛んできます。
キーボードのカーソルキーを使って●を操作し、
★にぶつからないよう避けてください。
★はどんどん増えていきます。
★に触ってしまうと終了。
その時の★の数がスコアとして表示されます。

それだけです。

サンプルを作ったのでプレイしてみてください。

【サンプル ダウンロード】

さっそく次のページから作成していきます。

すでに何かプログラムを書いている人は、一度全部消してください。

まっさらな状態からゲームを作っていきます。

ここからは少し長いプログラムになりますので、ときどき保存しながら進めてください。

Pocket