スクラッチプログラミング - 3Dテニスゲームのつくりかた

Scratch でテニスゲームをつくる方法(ほうほう)を紹介(しょうかい)します。マウスやタッチでプレイヤーをうごかすので、キーボードなしのタブレットなどでもあそぶことができるモバイル対応(たいおう)のゲームです。

スクラッチプログラミング - 3Dテニスゲームのつくりかた

テニスのラリーをつづけよう

Scratch (スクラッチ)でテニスゲームをつくってみましょう。

今回(こんかい)つくるのは、コンピューターと対戦(たいせん)するテニスです。自分(じぶん)で操作(そうさ)するプレイヤーは、マウスまたは画面(がめん)のタッチでうごかし、相手(あいて)プレイヤーは自動(じどう)でうごくようにします。3D 風(ふう)にみせるために、ボールのサイズやスピードを変化(へんか)させながらうごかすところが、スクリプトのポイントになります。

サンプルプロジェクト

下(した)にあるのは、テニスゲームのサンプルプロジェクトです。記事(きじ)をよみすすめる前(まえ)に、ボールやプレイヤーのうごきを確認(かくにん)しておいてください。

  • ボールは、サイズとスピードをかえながらうごく
  • 手前(てまえ)のプレイヤーを、マウスで左右(さゆう)に操作(そうさ)する
  • 奥(おく)にいる相手(あいて)は、自動(じどう)でうごく
Scratch|テニスゲームのサンプルGIF
Scratch|テニスゲームのサンプルGIF

テニスコートの背景(はいけい)をつくろう

最初(さいしょ)に、テニスコートの背景(はいけい)をつくりましょう。

ボールがインになるエリアとアウトになるエリアで、色(いろ)をわけてコートをえがいてください。色(いろ)をわける理由(りゆう)は、ボールがアウトになったかどうかを色(いろ)で判定(はんてい)できるようにするためです。

テニスコートの背景
テニスコートの背景

上(うえ)の画像(がぞう)では、わかりやすいように色(いろ)をハッキリとわけていますが、実際(じっさい)にえがくときは、色(いろ)のちがいはすこしでかまいません。

プレイヤーを用意(ようい)しよう

次(つぎ)に、プレイヤーのスプライトを2つ用意(ようい)しましょう。今回(こんかい)は、Scratch の中(なか)にあるスプライトを編集(へんしゅう)してつかっていきます。

  • 自分(じぶん)で操作(そうさ)するプレイヤーは、 Jordyn をえらびます。
  • うしろむきにするために、顔(かお)をぬりつぶします。コスチュームは2つつくってください。
    • ① ボールをうつ前(まえ)
    • ② ボールをうった後(あと)
自分で操作するプレイヤーのコスチューム2つ
自分で操作するプレイヤーのコスチューム2つ
  • 相手(あいて)のプレイヤーは、Casey をえらびます。
  • ゲームは毎回(まいかい) Casey のサーブからはじまるようにしていくので、コスチュームは3つつくってください。
    • ① サーブをするとき
    • ② ボールをうつ前(まえ)
    • ③ ボールをうった後(あと)
相手プレイヤーのコスチューム3つ
相手プレイヤーのコスチューム3つ

ここでは Jordyn と Casey を編集(へんしゅう)してつかっていますが、ほかのスプライトでも、もちろん自分(じぶん)でえがいたものをつかってもOKです。

プレイヤーのスクリプト

プレイヤーを用意(ようい)できたら、スクリプトをつくっていきましょう。Jordyn と Casey のスクリプトは構成(こうせい)がほぼおなじなので、ブロックのちがいがわかりやすいように、まとめて解説(かいせつ)していきます。

位置(いち)とサイズ

緑(みどり)の旗(はた)がおされたとき の下(した)に、プレイヤーの位置(いち)とサイズをきめるためのブロックをつなげましょう。

  • Jordyn は、ステージの下側(したがわ)、一番(いちばん)手前(てまえ)です。
  • Casey は、ステージの上側(うえがわ)です。Jordyn と、この後(あと)追加(ついか)するテニスボールより奥(おく)になるようにします。
プレイヤーの位置とサイズ
プレイヤーの位置とサイズ

ゲームスタート

今回(こんかい)つくるゲームは、ボールがアウトになってもくりかえしゲームをつづけられるよう、メッセージを合図(あいず)にしてゲームをスタートさせます。ゲームスタート をうけとったとき の下(した)に、最初(さいしょ)のコスチュームと、プレイヤーをうごかすためのブロックをつなげましょう。

  • Jordyn は、マウスで左右(さゆう)にうごかせるようにします。
  • Casey は、ボールの位置(いち)にあわせて、自動(じどう)で左右(さゆう)にうごくようにします。
プレイヤーを動かす
プレイヤーを動かす

Jordyn のスクリプトに、もし ゲーム中(ちゅう)?=はい なら という条件(じょうけん)をつけている理由(りゆう)は、Jordyn をうごかせるのはゲーム中(ちゅう)だけで、ボールがアウトになったときなどは操作(そうさ)できないようにするためです。

また、上(うえ)のスクリプトからわかるように、Casey はかならずボールのところへ移動(いどう)するようにしてあるので、Casey がうちかえしに失敗(しっぱい)することはありません。

ボールをうつとき

ボールをうつときは、それぞれメッセージを合図(あいず)にしてコスチュームをきりかえます。

メッセージを受け取ったら、コスチュームを切り替える
メッセージを受け取ったら、コスチュームを切り替える

以上(いじょう)で、プレイヤーのスクリプトができました。

テニスボールのスクリプト

ここからは、ゲームのメインとなる、テニスボールのうごかしかたを説明(せつめい)していきます。テニスボールのスプライトを用意(ようい)してから、スクリプトをつくっていきましょう。

ゲームをはじめる準備(じゅんび)

緑(みどり)の旗(はた)がおされたとき の下(した)につなげるのは、次(つぎ)の3つです。

  1. Casey より手前(てまえ)に表示(ひょうじ)されるようにします。
  2. メッセージをおくって、ゲームをスタートさせます。
位置を決めてメッセージを送る
位置を決めてメッセージを送る

ゲームスタート

ゲームをスタートさせるメッセージは、 Jordyn と Casey だけでなく、ボール自身(じしん)もうけとります。ゲームスタート をうけとったとき の下(した)に、ブロックをつなげていきましょう。

  1. ゲーム中(ちゅう)?はい にして、Jordyn をうごかせるようにします。
  2. サーブをうつのは Casey なので、ボールの y 座標(ざひょう)を Casey のところにします。横(よこ)の位置(いち)はランダムです。
  3. ボールのおおきさは、Casey の y 座標(ざひょう)とボールの y 座標(ざひょう)をつかって計算(けいさん)するようにします。
位置とサイズを指定する
位置とサイズを指定する

ボールのサイズを計算(けいさん)するのは、Casey にちかいときはちいさく、Casey からはなれるにつれておおきくなるようにするためです。こうすることで、ゲーム全体(ぜんたい)に 3D のような奥(おく)ゆきをかんじられるようになります。

つづけて、トスをあげるためのブロックをつなげていきましょう。

  1. すこしまってから、ボールを上下(じょうげ)させてトスをあげます。
  2. トスをあげおわったらメッセージをおくって、Casey のところからボールがうごくようにします。
ボールを上下に動かす
ボールを上下に動かす

ここでは、ボールのはやさ という変数(へんすう)をつかってトスをあげています。変数(へんすう)をつかう理由(りゆう)は、ボールをなめらかにうごかすためです。ボールのはやさ は、この後(あと)、ボールをうちあうときにも使用(しよう)します。

うごきをたしかめよう

では、緑(みどり)の旗(はた)をおしてここまでのうごきを確認(かくにん)してみましょう。

  • 緑(みどり)の旗(はた)をおして、ゲームを開始(かいし)
  • ボールは、Casey のところでトスのうごきをする
  • Casey のコスチュームは、ボールをうったように変化(へんか)する
  • Jordyn は、マウスで左右(さゆう)にうごかすことができる
サーブを打つ前までのスクリプト
サーブを打つ前までのスクリプト

Casey がうったボールのうごき

ここからは、 Casey がうったボールのうごきを説明(せつめい)していきます。

方向(ほうこう)とスピード

Caseyがうつ をうけとったとき の下(した)に、ボールの方向(ほうこう)とスピードをきめるためのブロックをつなげましょう。

  1. 変数(へんすう) ななめの量(りょう) で、ななめにうごく量(りょう)をランダムにします。
  2. ボールのはやさ で、うったときの最初(さいしょ)のいきおいを指定(してい)します。下方向(したほうこう)へうごかすので、値(あたい)はマイナスです。
  3. はやさの変化量(へんかりょう) は、ボールのいきおいを変化(へんか)させるための変数(へんすう)です。ランダムにして、うつたびにスピードのちがうボールになるようにします。
ボールの向きと速さを設定する
ボールの向きと速さを設定する

変数(へんすう) ななめの量(りょう) は、Casey のいる位置(いち)、つまり、ボールの x 座標(ざひょう)におうじて乱数(らんすう)を調整(ちょうせい)してください。これは、ボールがななめにうごきすぎて、すぐにアウトにならないようにするためです。

ボールが斜めに行きすぎる例
ボールが斜めに行きすぎる例

ボールをうごかす

上(うえ)で設定(せってい)した変数(へんすう)の値(あたい)をつかって、ボールをうごかしましょう。

  1. Jordyn のコートのまん中(なか)あたりまでうごかします。
  2. 回転(かいてん)させながら、ななめにうごかします。
  3. だんだんはやくうごかします。
  4. サイズを変化(へんか)させます。
ボールを動かす
ボールを動かす

Jordyn にちかづくにつれてボールのスピードやサイズをかえるのは、3D らしさを表現(ひょうげん)するためです。

つづけて、コートのまん中(なか)あたりまでうごかしたら、一回(いっかい)バウンドさせましょう。

  1. Jordyn のコートまでボールがうごいたら、そのときに Jordyn がいる位置(いち)を、変数(へんすう) Jordynの位置(いち) に保存(ほぞん)しておきます。
  2. Jordyn のコートで、バウンドさせます。
バウンドさせる
バウンドさせる

Jordyn の位置(いち)を変数(へんすう)に保存(ほぞん)しておくのは、Jordyn がうつときに、この変数(へんすう)の値(あたい)をつかってボールをななめにうごかせるようにするためです。これについては、この後(あと)、「Jordyn がうったボールのうごき」のセクションでくわしく説明(せつめい)します。

バウンドするときにメッセージをおくるのは、ボールの影(かげ)を表示(ひょうじ)するためです。ボールの影(かげ)については、この後(あと)、「ボールの影(かげ)」のセクションで説明(せつめい)します。また、0.03秒(びょう)まつ をつかって一瞬(いっしゅん)だけボールのうごきをとめることで、バウンドした様子(ようす)をあらわしています。

つづけて、バウンドした後(あと)のボールのうごきをつくっていきましょう。

  1. ボールをステージの下側(したがわ)までうごかします。
  2. ステージの下(した)にいきすぎる前(まえ)に Jordyn にふれたら、Jordyn がうちかえすようメッセージをおくります。Jordyn がうちかえす場合(ばあい)は、この下(した)につなげているブロックは実行(じっこう)しません。
  3. Jordyn にふれなかった場合(ばあい)は、メッセージをおくってゲームをとめます。
ステージの端まで動かす
ステージの端まで動かす

ボールがステージの下(した)までうごいた場合(ばあい)にゲームをとめるのは、Jordyn がうちかえすのに失敗(しっぱい)した、ということだからです。このメッセージをうけとったときのうごきは、この後(あと)、「ゲームをとめる」のセクションで説明(せつめい)します。

Casey がうったボールをうごかすスクリプトは以上(いじょう)です。

Jordyn がうったボールのうごき

ここからは、 Jordyn がうったボールのうごきを説明(せつめい)していきます。

方向(ほうこう)とスピード

Jordynがうつ をうけとったとき の下(した)に、ボールの方向(ほうこう)とスピードをきめるためのブロックをつなげましょう。

  1. ななめにうごく量(りょう)をきめる変数(へんすう) ななめの量(りょう) は、Jordyn の現在(げんざい)の位置(いち)と、ボールがバウンドしたときにいた位置(いち)をつかって計算(けいさん)するようにします。
  2. ボールのはやさ で、うったときの最初(さいしょ)のいきおいを指定(してい)します。上方向(うえほうこう)へうごかすので、値(あたい)はプラスです。
  3. はやさの変化量(へんかりょう) は、ボールのいきおいを変化(へんか)させるための変数(へんすう)です。ランダムにして、うつたびにスピードのちがうボールになるようにします。
ボールの向きと速さを設定する
ボールの向きと速さを設定する

さきほど、Casey がうつときは、ななめの量(りょう) を乱数(らんすう)にしましたね。なぜ、Jordyn の場合(ばあい)はこのように計算(けいさん)するのかというと、うちかえす方向(ほうこう)を自分(じぶん)でコントロールできるようにするためです。どういうことか、下(した)の画像(がぞう)で確認(かくにん)してみましょう。

  1. バウンドしたときに Jordyn がボールの正面(しょうめん)にいる場合(ばあい)、うちかえす方向(ほうこう)はまっすぐです。
  2. バウンドしたときに Jordyn がボールより左側(ひだりがわ)にいて、そこからすぐに右(みぎ)へ移動(いどう)してうちかえすと、ボールは右(みぎ)ななめにうごきます。
  3. 左(ひだり)ななめにうちかえしたい場合(ばあい)は、バウンドの位置(いち)より右側(みぎがわ)にいて、そこから一気(いっき)に Jordyn を左(ひだり)へ移動(いどう)させます。
バウンドした時のJordynの位置によってボールの方向が決まる
バウンドした時のJordynの位置によってボールの方向が決まる

また、Jordyn がうったボールは、Casey の場合とは逆(ぎゃく)で、うったときのいきおいが一番(いちばん)はやく、だんだんスピードがおそくなるようにします。

ボールをうごかす

ボールの方向(ほうこう)とスピードを設定(せってい)したら、Casey のコートまでボールをうごかして、バウンドさせましょう。

ボールを動かしてバウンドさせる
ボールを動かしてバウンドさせる

Jordyn がうったボールは Casey にふれるまでうごかしつづけます。そして、Casey がうちかえすようにメッセージをおくりましょう。

Caseyの所まで動かす
Caseyの所まで動かす

Jordyn がうったボールをうごかすスクリプトは以上(いじょう)です。

ブロック定義(ていぎ)でまとめよう

さて、ここまで説明(せつめい)してきた、Casey がうったボールのうごきと、Jordyn がうったボールのうごきには、「おなじブロックのかたまり」があることに気(き)がつきましたか?

同じブロックがつながっている部分
同じブロックがつながっている部分

このように、おなじうごきを構成(こうせい)している部分(ぶぶん)は、ブロック定義(ていぎ)でまとめることをおすすめします。スクリプトがよみやすくなり、後(あと)で修正(しゅうせい)したくなった場合(ばあい)の対処(たいしょ)が簡単(かんたん)になるからです。

ブロック定義を使ったスクリプト
ブロック定義を使ったスクリプト

ボールの影(かげ)をつくろう

ここからは、ボールがバウンドするときの影(かげ)をつくっていきましょう。

さきほど、テニスボールのスクリプトの中(なか)で、「バウンドするときにメッセージをおくるのは、ボールの影(かげ)を表示(ひょうじ)するためです」と説明(せつめい)しました。影(かげ)を表示(ひょうじ)するのは、バウンドしたことをわかりやすくすると同時(どうじ)に、アウトになったこともわかりやすくするためです。

ボールの影(かげ)のスプライトは、下(した)のようにつくってください。

ボールの影のコスチューム2つ
ボールの影のコスチューム2つ

Casey のほうでバウンドするときと、Jordyn のほうでバウンドするときとで、ちがうコスチュームになるようにします。影(かげ)の位置(いち)やおおきさは、実際(じっさい)にプレイしてみて、ボールの位置(いち)とあうように調整(ちょうせい)してください。

スプライトを用意(ようい)できたら、スクリプトをつくっていきましょう。

  1. ゲームをスタートするときは、かくしておきます。
  2. 常(つね)にテニスボールとおなじ位置(いち)になるようにします。
  3. 位置(いち)が、コートの奥(おく)か手前(てまえ)かで、コスチュームをきりかえます。
位置とコスチュームを指定する
位置とコスチュームを指定する
  1. 影(かげ)を表示(ひょうじ)するのは、バウンドするときです。
  2. アウトの色(いろ)にふれている場合(ばあい)は、メッセージをおくってゲームをとめます。
  3. インの場合(ばあい)は、すこしの間(あいだ)表示(ひょうじ)した後(あと)、かくします。
バウンドする時に影を表示する
バウンドする時に影を表示する

白(しろ)いろにふれた ではない をアウトの条件(じょうけん)にくわえているのは、ライン上(じょう)のバウンドはインになるためです。

ゲームをとめて、またはじめよう

最後(さいご)に、ゲームをとめてまたゲームをはじめられるようにするスクリプトをつくります。

ゲームをとめるためのメッセージをうけとるのは、テニスボールです。テニスボールを選択(せんたく)し、ゲームストップ をうけとったとき の下(した)にブロックをつなげましょう。

  1. ゲーム中(ちゅう)?いいえ にして、Jordyn をうごかせないようにします。
  2. ボールがこれ以上(いじょう)うごかないようにします。
  3. すこしまってから、ふたたびゲームをスタートさせます。
ゲームを止めて、再開する
ゲームを止めて、再開する

スクリプト完成(かんせい)

テニスゲームのスクリプトが完成(かんせい)です。

操作するプレイヤーのスクリプト
操作するプレイヤーのスクリプト
相手プレイヤーのスクリプト
相手プレイヤーのスクリプト
テニスボールのスクリプト
テニスボールのスクリプト
ボールの影のスクリプト
ボールの影のスクリプト

Scratch の Pyxofy ページへいって、実際(じっさい)にテニスゲームであそんでみてください。Scratch 3D テニスゲーム by Pyxofy

Scratch|3D テニスゲーム by Pyxofy
Scratch|3D テニスゲーム by Pyxofy

Pyxofy (著)「きょうからはじめるスクラッチプログラミング入門」

Pyxofy が Scratch の電子書籍を出版しました!Kindle・Apple Books からご購入ください。

詳細はこちら

まとめ

ここまで、Scratch でテニスゲームをつくる方法(ほうほう)を紹介(しょうかい)してきました。

今回(こんかい)つくったのは、一人(ひとり)であそぶゲームで、シンプルにボールをうちあうテニスでしたが、以下(いか)のように変更(へんこう)をくわえてみることもできるので、ぜひためしてみてください。

  • 二人(ふたり)であそべるようにするために、相手(あいて)プレイヤーを自動(じどう)ではなく、A・ Dキーなどでうごくようにする
  • 得点(とくてん)をカウントして表示(ひょうじ)する
  • スプライトや背景(はいけい)をかえて、卓球(たっきゅう)ゲームにする

最後まで読んでいただき、ありがとうございます。この記事をシェアしてくれると嬉しいです!

SNS で Pyxofy とつながりましょう! LinkedInThreadsBlueskyMastodon X (Twitter) @pyxofyFacebook

関連記事

スクラッチプログラミング - たっきゅうゲームのつくりかた - Part 1
コンピューターと対戦(たいせん)する卓球(たっきゅう)ゲームをつくってみましょう。ラケットのプログラムは簡単(かんたん)です。ボールをいろいろな方向(ほうこう)にうごくようにするのが、プログラミングのポイントになります。
JavaScript - ピンポンゲームの作り方 Part 1 - キーで操作する
JavaScript でピンポンゲームを作成します。キーで操作する方法や衝突判定、ゲームループなどを3回に分けて解説します。今回の Part 1 では、キー押下でパドルを動かせるようにコーディングします。
CSS Art - How to Make a Game Character - Super Mario
A plumber jumping in and out of pipes, throwing fireballs while rescuing a princess. Step-by-step article to create a world renowned game character.
CSS Animation – Diagonal Movement
Zip to the bottom right, then to the upper left hand corner, then switch directions. Let’s learn how to do just that in this step-by-step article.