見出し画像

MakeCodeでpython-4/ミニゲームを作成3(傾きを検知する)

こんにちは、ロック204チャンネルです。
今回は「MakeCodeでPython4 ミニゲームを作成3 傾きを検知する」プログラムについてお送りします。
この動画は前回の「MakeCodeでpython3」に続く動画となりますので、先に前回の動画をご覧いただくことをおすすめします。

マイクロビットでは、加速度センサーを内蔵しマイクロビット本体の傾きを検知することができます。
前方と手前への傾きをピッチ角として、また右左の傾きをロール角として、傾斜ブロックを使用し参照することができます。
今回はこの二つの方向を利用し、スプライトを移動するプログラムを前回のミニゲームに追加することとします。

こちらがPythonで記述したスプライトを動かすプログラムとなります。
Bf_yおよびbf_xはスプライトの座標位置を入れる変数としています。
3行目の「player=game.create_sprite(2,0)」は変数playerにゲームスプライトを作成しx座標2、y座標0の位置にスプライトを作成する記述です。
そして、on_foreverのループの中に
7行では、スプライトのx座標を決定するため「input.rotation(Rotation.ROLL)」でロール角を求めています。
そして、これを15度で割ることにより、15度ロールするごとに1つx座標を動かすようにしています。また水平位置を真ん中とするために+2とし座標を右にシフトしています。
ここで計算された値を8行の「player.set()」に設定しています。
同様にy座標も、9行目でピッチ角を求め9度ごとに一つスプライトか移動できるように割り算をしています。
ここでは手前にmicro:bitを9゜傾けると一つy座標が増えるように設定を行っています。
それではこれから作るプログラムの実行状況をご覧ください。

こちらは再スタートのコードとなります。
このコードは前回と同様で変更ありません

こちらは判定コードです。
このコードも前回と変わらず変更ありません。

こちらは初期設定のコードです。
jibunのスプライトのx座標、y座標を入れる変数として30、31行でbf_x, bf_yを設定しています。

こちらは監視ループの前半にあたります。
44行でbf_x, bf_yをglobal変数として設定し、この関数内で変更を可能としています。
そして45行でinput.rotation(Rotation.ROLL)でロール角を参照し15で割り商を求めています。また水平状態のロール角0をx座標の中心とするため2を足しています。
このとき、商を求めるのは結果を整数化するために用いています。この後判定ルーチンに行った時にtekiスプライトとの接触、goalスプライトとの接触を感知する場合に
整数化していなければ接触したと認められないことになりますので、この処理が必要となってきます。
同様にy座標においてもinput.rotation(Rotation.PITCH) でピッチ角を求め9で割った商を求め、これをy座標として使用しています。
9で割るのは45゜でスプライトをy軸方向に5つ進めるためです。

監視ループの後半については変更ありません。

効果音についても変更ありません。
以上でプログラムの説明を終わります。

ご視聴ありがとうございました。 



def restart(): #再スタート
    jibun.set(LedSpriteProperty.Y, 0)
    goal.set(LedSpriteProperty.Y, 4)
    teki.set(LedSpriteProperty.Y, 2)
    teki2.set(LedSpriteProperty.Y, 3)
    jibun.set(LedSpriteProperty.X, randint(0, 4))
    goal.set(LedSpriteProperty.X, randint(0, 4))
    teki.set(LedSpriteProperty.X, randint(0, 4))
    teki2.set(LedSpriteProperty.X, randint(0, 4))


def hantei(): #判定
    global speed
    if jibun.is_touching(teki) or jibun.is_touching(teki2): #自分と敵が接触したとき
        music.play(music.tone_playable(262, music.beat(BeatFraction.WHOLE)),
            music.PlaybackMode.UNTIL_DONE)
        game.game_over() #ゲームオーバーを表示
        speed=500
        restart() #再スタート
    if jibun.is_touching(goal): #ゴールに達したとき
        music.play(music.string_playable("E B C5 A B G A F ", 120),
        music.PlaybackMode.UNTIL_DONE)
        basic.show_string("Good!")
        game.add_score(10) #スコアーを10加算
        if speed>=200:
            speed-=100
        restart() #再スタート

#初期設定
bf_x=0 #スプライトjibunのx座標を入れる
bf_y=0 #スプライトjibunのy座標を入れる
goal: game.LedSprite = None #スプライトを初期化する
teki: game.LedSprite = None
teki2: game.LedSprite = None #敵を追加
jibun: game.LedSprite = None
jibun = game.create_sprite(2, 0) #x座標0-4の乱数,y=0
teki = game.create_sprite(2, 2)
teki2 = game.create_sprite(0, 3)
goal = game.create_sprite(randint(0, 4), 4)
game.set_score(0) #スコアーを0にする
speed=500 #停止時間を500ミリ秒とする

def on_forever(): #監視ループ
    global bf_x, bf_y
    bf_x = input.rotation(Rotation.ROLL) // 15 + 2
    #ロール角を求め15゜で割り商を求め(整数化)、右に2シフトする
    #15゜で割るのは、15゜でx方向に1移動させるため
    jibun.set(LedSpriteProperty.X, bf_x)
    bf_y = input.rotation(Rotation.PITCH) // 9
    #ロール角を求め9゜で割り商を求める
    #9゜で割るのは、9゜でy方向に1移動させるため
    jibun.set(LedSpriteProperty.Y, bf_y)
    sound1()
    
    teki.move(1) #敵を1進める
    teki2.move(1) #敵2を1進める
    hantei() #判定を呼び出し
    teki.if_on_edge_bounce() #壁に当たると反射する
    teki2.if_on_edge_bounce() #壁に当たると反射する
    basic.pause(speed) #停止時間をspeedで設定
basic.forever(on_forever)

def sound1(): #jibunが移動したときの効果音(V2)
    music.play(music.create_sound_expression(WaveShape.SQUARE,
            400,
            600,
            255,
            0,
            100,
            SoundExpressionEffect.WARBLE,
            InterpolationCurve.LINEAR),
        music.PlaybackMode.UNTIL_DONE)



MakeCodeのプログラム


この記事が気に入ったらサポートをしてみませんか?