スタータープロジェクト

リミックス用プロジェクト

完成サンプル
サンプル
難易度

挑戦レベル

チャプター数
全6章
タグ

スイカゲームの作り方① スタンプをリストで管理する土台を作る

ok-scratch
スクラッチでスイカゲームを作るぞ!

スタータープロジェクトをリミックスしよう

今回はコスチュームなど多くが含まれたスタータープロジェクトがあるのでリミックスしておいてね。

ペンの拡張機能を追加する

画面右下のボタンをクリックしてペンを追加しよう。

サムネを開発用の背景に変えておく

スタンプで玉が動く仕組みを作る

スプライト「メイン」を開こう。

ワンステップずつスクショをとってあるから、画像を見て一緒にブロックを置いていこう。

リスト「玉一覧」を作る

玉のデータは6個のデータで成り立つ

リストを使うのだけど、普通の使い方とは少し違う。1から6までの6個のデータで1つの玉を表現していこうと思う。

2つ目の玉は7から13までの6個のデータを使うといった具合だよ。

よし、引き続きブロックを置いていこう。

ペンのブロックを使うよ。

リストを割り当てる。

定義「_玉を追加する」を作る

引数は3つあるから注意。再描画せずに実行するにチェックをつけよう。

リスト「玉一覧」にデータを追加するブロックを6個置いてね。

とりあえず最初の2つに引数のXとYを入れよう。

緑の旗が押されたときに実行されるようにしよう。ずっとループの直前がいいよ。引数は適当でOK。

定義「_玉を描画する」を作る

引数はないよ。画面を再描画せずに実行するよ。

変数「現在の玉」を作る

初期化していこう。

ループブロックを置く。

この中で使う演算を作ろう。

これで玉の数だけループされるようになるよ。リストの中身が6個だけなら玉は1つ。中身が48個なら玉は8個というふうに計算できる。

このループの中には、「緑の旗が押されたとき」に使ってた↓このブロックを移動してきて。元の場所からは消してOKだよ。

ループの最後で変数「現在の玉」に6加算する。

元の場所には、この定義を実行するブロックを置いておこう。

分かりやすいようにもう1つ玉を追加しておこうか。引数はまたまた適当でOK。

玉のデータを取り出す

さて、玉のデータをリストから取り出す方法を紹介する。といってもカンタン。1つ目の玉はリストの1から6にデータが入ってるから、変数「現在の玉」の値がゼロならプラス1すればX座標のインデックスになるし、プラス2すればY座標のインデックスになる。

ループの中で使われているX座標の値に、リストの中に格納されているデータを使うように↓こんなふうに演算を使ってみよう。

Y座標側も同じようにしよう。

この状態でテストしてみると、リストの中身を手動で変えれば玉が動くようになっているはずだよ。

定数「■玉データの項目数」を作る

さて、この6というデータは重要な数字だし繰り返し使われるので、分かりやすさのために変数にしておこう。その際に■から名前を始めておくことで、この変数はゲーム開始後は変わらない、という意味合いを込めておこう。こういう変数を定数って呼んでるよ。

さっき使ってた6の部分を定数で置換しよう。

ループ内にも6があるから定数で置換しよう。

各種の定数を用意しよう(X座標やY座標など)

さて、「現在の玉 + 1」はX座標を意味する、と書いたけど、これを何ヶ月も先まで覚えておく自信は僕にはない。そこでこのプラス1の1はX座標のことでっせ、という意味合いを込めた定数を作っておこう。

その他のデータも同じように作る。

それぞれの定数を緑の旗が押されたときに初期化するぞ。

ついでに玉を追加する定義内の残りのデータにも値を入れておこう。

直接1とか2とか書いてあったマジックナンバーを定数ブロックで置換しよう。

  • マジックナンバーとは? マジックナンバーとは?

    マジックナンバーというのはカンタンに言うと「パッと見では何を意味しているのか分からない数字」のこと。例えばいきなり「変数を10ずつ変える」とあったら「この10って何?いったいどこから来たの?勝手に変えていいの?」とよく分からないけど、10をジャンプ力という変数に入れておけば「10はジャンプ力ってことね」と見ただけで分かるようになる。

    マジックナンバーが多いプロジェクトは、リミックス難易度が高くなりがち。後日、自分で修正するときも困るから、どこかのタイミングでマジックナンバーを変数化しておくと便利。

定義「_玉を描画する」の名前を変える

_メイン処理を実行する、っていう名前にしておいて。

重力を作る

玉が落ちる処理を作るよ。

定義「_重力を適用する」を作る

画面を再描画せずに実行するよ。

実行する場所は、↓ここ。

定義内では玉一覧のデータを変えていく。まずはリストの◯番目を◯で置き換えるブロックを置いて、↓この演算を入れよう。

さらに、空いてるスペースで↓コレを作る。

そこからマイナス0.6する。

これをさっきの置き換えるブロックの右側に入れよう。

この長いブロックをそのまま複製しよう。

■スピードYのところを■Y座標にしよう。ついでに右側のブロックは外しておこう。

右側には↓この演算を当てはめる。すこし長いから注意して作ってね。

右側にはめよう。

よし、このタイミングで玉の引数を少し変えておこう。高い場所から落ちるようにしておくぞ。

現在の玉の各種値を持つ変数を作る

6個つくるぞ。

定義「_メイン処理を実行する」のループ内で、この変数に値を入れていくよ。

変数にはリストの値を入れるようにする。

これを合計6個つくる。

重力で使ってた演算を差し替える

さっき作った重力の処理で、リストから直接データを取って部分あるよね。それを今作った変数で差し替え用。

下も同じようにする。

グッと読みやすくなったと思う!

ok-scratch ok-scratch

読みやすいコードは重要!

玉の値を変更する定義を作る

少し変則的な名前の定義を作るよ。

この定義内では、リストの値を置き換えるブロックを置く。

この定義を重力のところで使ってみよう。

↑さらに読みやすくなったと思わない?

ok-scratch ok-scratch

読みやすさのことを可読性と呼ぶ。プロの現場では可読性が高いコードのほうが、複雑で難解なコードよりも喜ばれる。簡便化できるのに複雑なコードを書くのはときにマナー違反ですらあるから、常にシンプルにできないか考えるクセをつけよう。まぁ無理する必要はないよ。最初は複雑になりがちだし、純粋に処理が複雑な場合は演算も複雑になってしまうことは往々にしてある。

定義「_玉の情報を更新する」を作る

さっきつくった自分の◯◯に値をいれるブロック群をいったん外そう。

↓こんな状態になるよ。

定義を作る

定義内にさっき外しておいたブロック群をもってこよう。

重力のところで使っていくぞ。

箱の端で玉を止める

箱の端は下側だけではなく横側にもある。合計3箇所の「端」があるよね。それを加味したコードをしていくよ。

定義「_箱の端で止める」を作る

条件式の演算を用意する。

この条件ブロック内であれば、「端である」ということ。

この中で使う演算を作っていく。

少し長いからワンステップずつ進めていくよ。

まずは↓これらを用意する。

そして変数を入れていく。

これらを合体しよう。

そして玉の値を変える定義で使うよ。

こうすることで今後横側の端で玉を止めるときにもそのままこの演算が使える。

  • 可読性が大事なら下、左、右の3つの端の処理を作るべきでは?1つにまとめたのはなぜ? 可読性が大事なら下、左、右の3つの端の処理を作るべきでは?1つにまとめたのはなぜ?

    さっき伝えた可読性とは反するようなコーディングがいきなり出てきたね。たしかに、3箇所の端があるなら1つずつ処理を書いたほうがシンプルかもしれない。シンプルというか、平易というか、こんなふうに3箇所の処理を1つの演算で解決してしまうよりもブロック数は増えても読みやすい可能性はある。

    コーディングには可読性以外にも保守性というものあるんだ。保守性というのは「メンテナンスしやすいさ」だと思ってOK。もしこの処理を下・右・左の3つに分けたら、このロジックを変えたいときは3箇所に変更をくわえないといけないよね。でもこの書き方なら1箇所だけ直せばOKだよね。だから3つロジックを作るよりも1つのロジックにまとめてしまうほうが保守性が高いといえるんだ。ここでは可読性よりも保守性を重視した結果、こういうコーディングになっているという裏事情があるよ。

    プログラマーならこういう思考を最初からできないといけないというワケではないから安心してね。プログラマーの人でも、このあたりはシニアエンジニアとか上級エンジニアみたいな人と相談して決めていって徐々に慣れていくものだから。

追加していこう。

X座標のときとY座標のときので、追加の処理をくわえていく。

といってもここではY座標のとき、つまり下側の端で追加したい処理だけ作っておく。

定義を実行するのは↓こちら。

あと直前で玉の情報を更新しておこう。

定義「_玉を描画する」を作る

↓このブロックを移動しよう。

こんなかんじ。

玉の情報も更新する。

メイン処理で実行させよう。

あと、リストのデータを直接参照するのではなく、変数に入れてある値を使って可読性を高めよう。

衝突処理を整えていく

玉と玉がぶつかるというのはスカゲームの華だよね。この処理はぶっちゃけスーパー難しい。本格的に取り掛かるのは次回からだけど、ちょっと慎重に進めていこう。

定義「_玉同士の関係を更新する」を作る

変数「相手の玉」を作る

ここでも玉の数だけ繰り返すようにしよう。

自分と自分は判定する必要はないから、それ以外のケースで通る条件式を作る。

ループの最後で相手の玉を加算するブロックを置いておこう。ここが動くのは次回チュートリアルからだから、とりあえず置いておくかんじ。

定義「_直線距離と重なりを計算する」を作る

まとめ

おつかれさま!1回目からなかなかヘビーだったかな?ここから衝突処理に取り掛かるよ。直線距離の計算とかはピタゴラスの定理を使うんだけど、ゲーム開発ではすごく役に立つ。3Dゲームを作るときにも使える定理だったりするから、このタイミングで一緒にタックルしておこう。

スクラッチゲーム攻略

スクラッチゲーム一覧

    • 厳選されたスクラッチ人気作品リストがレビュー付きで楽しめます
      世界中のヒットゲームをスクラッチで遊ぼう
      趣味に関するスクラッチ作品例
      勉強になるスクラッチ作品