HSPで縦シューティングゲームを作っていこう②敵の管理

この記事は科学太郎氏が提供しているゲーム制作のミニ講座 シューティングゲームを作ろうを参考に実践をもとに記事を構築しています。HSPの基本的な構文等については以下の記事から参照していただければと思います。
いまさらはじめるHSP入門。

randmizeとrndをつかってみよう

hspで乱数を生成するには最初にrandomizeと書いて乱数を初期化する必要があります。randomizeを使わずにrnd()関数を使うと毎回同じ値が出力されます。

    randomize: mes rnd(10) //0から9までの乱数を表示する

敵を表示させて移動させてみよう

敵の考え方は自機弾を発射させる処理の考え方とほとんど一緒だ。敵の配列を作成して、生成したのち描画処理を行いy方向に落下させる。画面外に消えればスイッチが切り替わり、また敵が生成される。敵の生成間隔も自機の弾のときと処理は一緒だ。コードが長すぎてやる気をなくすかもしれない。でも実際は大したことはやっていない。

*Init
    //自機の弾の管理
    dim tamaF,10
    dim tamaX,10
    dim tamaY,10
    //敵機の管理
    dim enemyF,20
    dim enemyX,20
    dim enemyY,20

*Main
    screen 0,600,400,SCREEN_FIXEDSIZE
    font MSGOTHIC,50
    repeat
        redraw 0
        stick key,31
        if(key&1):x- =5:if(x<0):x=0
        if(key&2):y-=5:if(y<0):y=0
        if(key&4):x+=5:if(x>550):x=550
        if(key&8):y+=5:if(y>350):y=350
        if(key&16):gosub *TamaBirth
        color $00,$00,$00:boxf
        color $00,$FF,$00:pos x,y:mes "山"
        gosub *TamaDraw
        gosub *EnemyBirth // 敵
        gosub *EnemyDraw // 敵
        redraw 1
        await (1000/60)
    loop
stop
//--------------------------------------
// 自機弾の発生
//--------------------------------------
*TamaBirth
	if(tamaTrigg):tamaTrigg--:return
    foreach tamaF
        if(tamaF(cnt)==0){
            tamaF(cnt)=1  
            tamaX(cnt)=x
            tamaY(cnt)=y
            break
        }
    loop
    tamaTrigg = 2
    return
//--------------------------------------
// 自機弾の描画
//--------------------------------------
*TamaDraw
    foreach tamaF
        if tamaF(cnt){
            tamaY(cnt)-=8
            if(tamaY(cnt)<-50):tamaF(cnt)=0:continue
            pos tamaX(cnt),tamaY(cnt)
            color $FF,$FF,$00:mes ":::"
        }
    loop
    return
//--------------------------------------
// 敵機の発生
//--------------------------------------
*EnemyBirth
	if(enemyTrigg):enemyTrigg--:return
    foreach enemyF
        if(enemyF(cnt)==0){
            enemyF(cnt)=1
            enemyX(cnt)=rnd(600/50)*50
            enemyY(cnt)=-50
            break
        }
    loop
    enemyTrigg = 30
    return
//--------------------------------------
// 敵機の描画
//--------------------------------------
*EnemyDraw
    foreach enemyF
        if enemyF(cnt){
            enemyY(cnt)+=3:if(enemyY(cnt)>400):enemyF(cnt)=0:continue
            pos enemyX(cnt),enemyY(cnt)
            color $00,$FF,$FF:mes "Ж"
        }
    loop
    return

randmoizeを使っている点にも注目だ。x軸でrnd()関数を使っているので、x軸のランダムな位置に敵が描画される。
screenshot-20181216-2007
かなり地味ではあるが、こういうふうに動くのかとちょっと納得できる。

#includeを使ってみよう

もしかすると敵と自機のコードが混在していてイライラするかもしれない。そういうときはもしかすると#includeが役に立つかもしれない。#include “ファイル名” と記述すると、#includeが記述された箇所に指定のファイルが読み込まれる。まずは簡単なコードでチェックしてみよう。2つのファイルを用意した

	//これはincludetest.hspです。
	button "読み込み", *hata1
	stop
*hata1
	#include "includefile.hsp"
	//これはincludefile.hspです
	mes "hello world"

「読み込み」ボタンをおすとincludefile.hspが読み込まれ 「hello world」 が表示される。hspにはモジュールという仕組みもあるようですが、わからんのでここではふれません。くわしくしりたいかたは公式を参照するのがよいでしょう。


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78