3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ScratchAdvent Calendar 2022

Day 5

Scratchで点取ゲームを作ってみた

Last updated at Posted at 2022-12-04

これは何

Scractchで昔作った点取ゲームを発掘したので、振り返りがてら作り方を解説していきます

筆者はエンジニアではないので、設計などがスマートでないと思います:pray:

完成品はこちらになります

(学生時代に使ってたアカウントにログインできなくなったので新しく作成したアカウントにログインできなくなったので、過去に作ったプロジェクトをリミックスして作成してます)

ゲームの概要

ゲームは簡単な点取ゲームです。

  • MAP内に宝箱が4つ配置されていて、宝箱にタッチするとポイントが溜まります。
  • MAP内を彷徨いている敵キャラがいて、敵キャラにタッチすると初期位置に戻りライフが1減ります。
  • ライフが0になるとゲームオーバーです。
  • 宝箱を4つ開けると、ゲームクリアです。

作成したゲームのリンクはこちらです。

ゲームを作る

何を作るか考える

Scratchでできることから、作りやすそうなゲームを考えます。

Scratchにはあらかじめ、「X歩動かす」「大きさをXずつ変える」などのコードが用意されていて、これらを組み合わせてプログラムを組んでいきます。

ざっくりと用意されているコードを整理してみました。

名前 できること
動き 動かす、回す、座標をかえるなど動きを制御する
見た目 吹き出しを出す、コスチュームや背景、大きさを変える、表示非表示するなどの見た目を制御する
音を鳴らしたり止めたり音量を変えるなど音を制御する
イベント キーが押された時、背景がhogeになった時などイベント発火のタイミングを作ったり、メッセージを送るなどのイベントを起こす
制御 待つ、hogeまで繰り返す、ずっと、もしhogeならなど、条件に応じてプログラムを制御する
調べる 特定のオブジェクトや色に触った、マウスが押されたなどのイベントの発生や現在の年やユーザー名などを取得する
演算 四則演算やAND, OR, NOTなどの計算や制御をする
変数 変数を作成する
ブロック定義 ブロックを作成する

例えば「動き」でキャラクターの位置を動かし、「調べる」でキャラクターが橋に触れたかを取得し、「制御」でもしキャラクターが端に触れたらという発火条件を作り、「見た目」で吹き出しを出す のように組み合わせて簡単にプログラムを作ることができます。

scratch.gif

また、Scratchには様々なキャラクターを歩いたり飛んだりさせることができる素材が用意されており、これらを活用して簡単にキャラクターを動かすことができます。

image.png

ということで、今回はこれらを活用して「ゲームの概要」で紹介したような点取ゲームを作っていきます。

必要な素材を洗い出す

動かす自キャラクターと敵キャラクターはScratchで用意されているものを使えるで、背景のMAPと宝箱を用意します。

背景とドット絵世界さんから素材をお借りして作成しました。

background.png

宝箱もドット絵世界さんからお借りしています。

必要な挙動を洗い出す

  • 自キャラクターを移動する
  • お邪魔要素
    • 敵キャラクターが移動している
    • 敵キャラクターにぶつかると、LIFEが1減り、初期位置に戻る
    • MAPの「木」の部分の上は移動できない
    • MAPの「水」の部分に入るとLIFEが1減り、初期位置に戻る
    • LIFEが0になるとゲームオーバー
  • 点取要素
    • 宝箱に触れると、SCOREが1増える
    • SCOREが4になるとゲームクリア

ゲームを作る

素材の準備や作るものが決まったので、ゲームを作っていきます。

最初に使うスプライトや背景をプロジェクトに追加します。
スプライトとは、Scratchで使用するキャラクター画像のことです。

右下のプラスボタンから作成した画像を読み込んだり、Scratchに用意されているスクラッチを選択することができます。

image.png

自キャラクターを移動する

まずはキャラクターを用意して矢印キーで移動できるようにします。

矢印の各キーが押された時に、移動する距離を定義し移動する方向に合わせたコスチュームに変更して、x座標もしくはy座標を変えることで移動させます。

歩いているように見せるために、右足を上げている画像と左足を上げている画像を交互に出します。

image.png

敵キャラクターが移動している

今度は敵キャラクターを動かしていきます。
敵キャラクターは同じ場所をループで移動しているようにしたいので、右端まで右に向かって歩く、左端まで左に向かって歩くを繰り返させて移動させます。

image.png

敵キャラクターにぶつかると、LIFEが1減り、初期位置に戻る

的キャラクターにぶつかった時の挙動は、メインキャラクターに定義していきます。

「もし~~に触れたら」というブロックで触れたかどうかの判定ができるので、そのブロックを利用します。
LIFEを変数で定義し、敵キャラクターに触れた時に、-1ずつ値を変えます。
ぶつかったことがわかるように音を出し、ぶつかった後はスタート地点に戻します。

image.png

MAPの「木」の部分の上は移動できない

次に移動できない部分で矢印キーで移動できないようにします。

これはスマートなやり方が思いつかなかったのでかなり力技で作っています...
木の位置を計算して、木にぶつかりそうになったら位置を戻すという挙動を作っています。

MAPを全てスプライトで作成して並べて「~~に触れた」ブロックを使えるようにしても良かったのですが、Scratch上で位置調整をするのが面倒で背景画像にしてしまいました。

image.png

MAPの「水」の部分に入るとLIFEが1減り、初期位置に戻る

水に触れた判定は、色に触れたらで作っています。そのまま判定を使うと頭が水に触れても落ちた判定になってしまうので、自キャラクターに青い靴を履かせて落ちた判定に使っています。

image.png

LIFEが0になるとゲームオーバー

そして、LIFEが0になったら音を鳴らして背景を変えてゲームオーバーにします。
また、LIFE=0になった時は自キャラクターや敵キャラクターなどの不要なスプライトを隠すようにしてます。

ゲームオーバーにする 不要なスプライトを隠す
image.png image.png

宝箱に触れるとSCOREが1増える

単純に「もし宝箱に触れたら1増やす」にすると、触れている間無限に点数が増えてしまうので、変数を作って「その宝箱にすでに触れたかどうか」を判定します。

最初は0にしておいて、isTreasureNOpen=0かつ宝箱に触れたら、SCOREを1増やし「isTreasureNOpen」を1にします。

キャラクターのコード 宝箱のコード
image.png

また、宝箱側でもキャラクターと触れたかを判定し、キャラクターに触れたらコスチュームを宝箱が開いているものに変更します。

SCOREが4になるとゲームクリア

SCOREが4になったらゲームオーバーの時と同じように背景を変え、キャラクターなどの不要なスプライトを非表示にします。

ゲームクリアにする 不要なスプライトを隠す
image.png image.png

ついでに風船を飛ばしてみます。

クローンを作る機能があるので、風船を1つとふわふわと飛んでいくブロックを定義し、クローンを作ってたくさんのふわふわ飛んでいく風船を作ります。

コスチュームを複数用意しておいて、どのコスチュームにするかに乱数を作ると、色々な種類の風船をランダムに飛ばすことができます。

image.png

最後に

このままだと、スタートボタンを押した時にキャラクターの位置や非表示などが受け継がれてしまうので、諸々の設定を初期値に戻すようにします。

image.png

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?