レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
おちゃめくらぶ掲示板
-
プチコンで卓球ゲームを作ってみた
先日まで世界卓球が開催されていたにょ。
私は卓球がそれほど好きというわけではないけど日本選手が活躍すれば熱くなれるにょ。
というわけで、昨日突発的に「卓球ゲームを作ってみよう」と思いついたにょ。
さて、どんなゲームにするかだけどプチコンでは知る限りは卓球ゲームはないにょ。(私が
作ろうと考えた前日にもりちゃんさんがプチコンへ移植した卓球ゲームの画面写真を公開
した程度)
というわけで、Webブラウザ上で遊べる卓球ゲームをいくつかプレイしてみたにょ。
卓球ゲームで検索するとたくさんの種類があるけどほとんどが後方からの見下ろし視点の
疑似3Dゲームにょ。
プレイしてみた印象は表示は疑似3Dだけど中身は2Dゲームというものにょ。
それは高さの概念がないためにょ。
端的に言えば70年代にポピュラーだった「PONG」などの真上からの俯瞰視点のテニスゲーム
と本質的には変わらないということにょ。
それならば3Dでボールの軌道を計算したゲームを作ってみようと思ったにょ。
それにはまずは卓球台がどれくらいなのかを知る必要があるにょ。
調べた結果公式では幅152.5cm、長さ274cmだったので概ね1:1.8くらいの比率にょ。
計算しやすいように設定サイズは幅200、長さ360としたにょ。
次にカメラ位置の設定だけどこれは計算が簡単なように卓球台から後方360、高さ180と
したにょ。
それさえ分かればこの公式によって卓球台を表示することは可能になるにょ。
◎3D座標をスクリーン座標に変換
http://ochameclub.web.fc2.com/petitcom/tips/routine.htm#3d_screen
画角は卓球台の手前の幅が画面上で200pixel(つまり、設定上の座標1が1pixelに相当)に
なるようにしたにょ。
卓球台は簡単に済むようにGRPで描画だけどネットはボールとの重なりを考えてBGにしたにょ。
ラケットはCHREDで即興で作り、ボールはスプライトキャラの251番の奴を使ったにょ。
これで画面表示はできたにょ。
次はいよいよボールの挙動にょ。
まずはどのような操作でボールを打つかということにょ。
これがテニスゲームならば十字ボタン+ABXYボタンという選択肢もありだけど卓球の場合は
瞬時にラケットの位置を決める必要があるためタッチパネルでないと厳しいにょ。
というわけで、マウスの代わりにタッチで操作し、ラケットの動かし方でカット、ドライブ、
スマッシュを打ち分けられるようにしたいと考えたにょ。
これらは高さの概念がないと成立しないにょ。
さて、いよいよボールを動かしてみるにょ。
これは至って簡単にょ。
(プレイヤーから見て奥行き方向をZとした場合)X、Z方向に普通に等速運動を行い、Y方向に
等加速度運動をするだけだからね。
最初に現実の重力加速度(約9.8m/s^2)をゲーム内のスケールに置き換えてみたけど想像して
いたのとは異なり少し不自然な気がしたので重力加速度はゲームの速度を考慮しつつ少しずつ
調整することにしたにょ。
ボールの初速も世界レベルの選手のスピードを参考にして決めたけどそれだと速すぎてとても
プレイはできなかったためこれもプレイしながら調整していくことにしたにょ。
一応ボールの挙動は粗方決まったけど問題はラケットとの当たり判定にょ。
その前に考えておく必要があるのは現実ではラケットは腕を振る関係上Z座標は常に変わって
いるにょ。
しかし、それをタッチパネルだけで行うことはできないためX、Y方向のみの移動となって
いるにょ。
するとラケットとの当たり判定はプレイヤーの基準座標(Z=0)にボールが来たときのみと
なってしまうにょ。
それではまともにプレイすることはできないにょ。
これを改善するには見た目で当たっているように見えるボールに対して当たり判定を行えば
いいにょ。
つまり、簡単にいうとラケットに隠れて見えなくなったボールは当たったと見なすわけにょ。
それだと相手コートにあるボールにまで当たり判定ができてしまうためZの有効範囲は基準座標
から±90としたにょ。(自コートの手前半分とそれと同じ分だけコートの後ろ側にも有効
範囲がある)
これによってようやくラケットにボールが当たるようになり当たり方もかなり自然に見える
ためこれがベターだと感じたにょ。
あとは、どのようにラケットを動かせばどのような挙動でボールが動くかを調整するだけにょ。
そのため、1回打つごとにRUNをするのも大変なので壁打ちができるようにしたにょ。
つまり、相手の位置(Z=360)には巨大な見えない壁があるというわけにょ。
これによってボールの挙動を少しずつ調整していったにょ。
上記のようにこのゲームでは現実の卓球台の比率をほぼそのまま使っていたけど壁打ちを
開始することでネットにあまりに頻繁に引っかかると言う問題が発生していたにょ。
そのためネットの高さは当初の14pixelから8pixelに減らしたにょ。
これによってネットを表示するルーチンの大幅な短縮にも繋がったにょ。
これでもかなりの割合で引っかかってしまうけどこれは高さの概念を入れている以上は
やむを得ないことでありネットがあることで打点を高くしないとスマッシュが入らないため
スマッシュのリスクにも繋がるので引っかかるというのは良いことにょ。(引っかからない
見た目だけのネットだと低いボールもスマッシュを打ち放題になってしまう)
文章で書いても分かりづらい面もあると思うので実際にこの壁打ちの様子を動画で撮影して
みたにょ。(左上の「VERY EASY」は5段階のCOMの強さで一番弱いという意味だけど後述の
ように現時点では思考ルーチンができてないため何の意味も持たない)
https://www.youtube.com/watch?v=ZAKRUytFK3Q
ただでさえ、難易度が高いゲームなのに撮影のためプレイしにくい体勢で操作しているため
2、3回程度しか連続で打ち返せてないけどこれは慣れたら10回くらいは続けることが可能にょ。
動画を見ての通り、このゲームでは実際の卓球のようにラケットを振る感じでラケットを
動かすことでボールを相手コートに打ち返すことができるにょ。(ラケットを勢いよく振れば
その分だけ強い打球を返すことができる)
もちろん、静止した状態のラケットにも当たり判定はあるけどその場合は相手のコートに
返すことはほぼ無理にょ。
スマッシュは高速で右、もしくは左にラケットを打つことでできるにょ。(上記動画の
最後に1回だけスマッシュが決まっているけど壁打ちなのでそのスマッシュと同じ速度で
ボールが返っている)
ドライブとカットは上下の移動でできるにょ。
さて、次はいよいよ思考ルーチンを作ることにしたにょ。
この手の球技の思考ルーチンとなると私が過去に発表したゲームではポケコン用に作った
「ピーチバレー」があるにょ。
◎ピーチバレー
http://ochameclub.web.fc2.com/CLUB/peach_volley/index.htm
このゲームの思考ルーチンの大ざっぱな解説は上記リンク先の攻略本に記載しているにょ。
簡単に言うとレベルは5段階あり、レベルごとに打ったあとの硬直時間、サーブの強弱、
スパイクやブロックの確率が変わってくるにょ。
まずはボールを打った際にはボールが落下する場所は単純計算で求めることができるにょ。
ピーチバレーではその座標がコートの後ろならば前に繋ぎ、コートの前ならばスパイクを
打つためにトスを上げるにょ。
3回目ならば相手のコートに返すことを最優先しているにょ。
卓球ゲームは1回で相手のコートに返せばいいので思考ルーチンはさほど難しくはないにょ。
今回作ろうとしているゲームのようにスマッシュ、ドライブ、カットを使い分けるような
思考ルーチンならば難易度が高くなるものの単純に打ち返すだけの思考ルーチンならば
簡単にできそうだと考えたにょ。
ボールが落下して打ちやすい高さに来たときにラケットで打ち返せばいいだけなので
その3次元座標を求めるだけでいいわけだからね。
しかし、ここで大きな問題が発覚したにょ。
というのもこのゲームでは先ほどのように打ちやすくするため当たり判定は見た目で
ラケットに触れているかどうかで行っているにょ。
では、COM側もプレイヤーと同様にラケットに触れているかどうかで判定をすれば良さそう
だけどそうした場合には高さが変わるという問題が発生するにょ。
カメラから見て見下ろしであるためプレイヤー側の当たり判定はカメラから遠くなるごとに
Y座標(高さ)は小さくなっているにょ。(つまり、当たり判定は遠くほどコート面に近く
なっている)
これがCOM側はどうかというと見た目で判断するとCOM側から見て遠くなるほどY座標は
大きくなってしまうにょ。
つまり、COM側とプレイヤー側は当たり判定の座標が異なるだけではなくその有効範囲
(大きさ)まで異なっているにょ。
この問題を改善する方法として下記の4つがあるにょ。
(1)ボールの動きをラケットと同じく2Dにする
(2)ラケットの動きをボールと同じく3Dにする
(3)画面上での見た目通りの当たり判定をやめる
(4)プレイヤー側とCOM側の挙動を変える
(1)これは多くの卓球ゲームで採用されているけど冒頭に書いたように私が作りたかった
ものとはゲーム性が全く異なるものになるため却下にょ。
(2)COM側はこれでZ座標を自由に変えることができこれによってZ座標に応じたラケットの
大きさにすることができるため全く問題はないにょ。
しかし、プレイヤー側はどうすることもできないにょ。
確かにトグル切り替えやボタン操作を併用によって奥行きと上下を使い分けることが可能に
なるものの反射神経が要求されるこのゲームでそんな悠長なことはできず、ただでさえ
難易度が高いこのゲームの難易度が極めて高くなるにょ。(ボールを遅くして解決という
方法もあるけどそれだとゲーム性も変わってしまうし、スマッシュの醍醐味も無くなるため
選択肢にはならない)
(3)そもそも見た目通りの当たり判定に拘ったのがそもそもの敗因にょ。
見た目ではなくボールとラケットのX座標、Y座標が合致すれば当たるようにすればいいと
考えたけどそれだとラケットの下半分には当たり判定がなくその分(見た目で)ラケットの
上の空間に当たり判定ができてしまうにょ。
ラケットの下半分に当たり判定がないならば当たり判定そのものを拡大すれば解決が
できるにょ。
ただし、全体を一様に拡大した場合には当たって無いように見えても打ち返せる範囲が広く
なるという問題があるにょ。
私が書いているプチコン講座を見てのように1画面プログラムでさえ自分が納得できるような
当たり判定を行っているのに制限がないプログラムでこんな妥協策は納得ができないにょ。
(4)(2)でプレイヤー側と違ってCOM側は3D移動(Z座標の移動)が容易に可能ならばCOM側だけ
そうすれば良いという考えもあるにょ。
ただし、私は上記のポケコン用のピーチバレーにおいてもCOM側はすべてプレイヤー側が
できることしかやってないにょ。(落下地点以外のプレイヤー側が知り得ない情報を活用
したりとか、加速減速処理もプレイヤー側が行うのと全く同じことを行っている)
対戦ゲームにおいてCOM側がプレイヤーにできないことをするというのはやはり納得が
できないからね。(麻雀ゲームのように見えないところでイカサマをしているならばまだ
許せるけど)
というわけで、思考ルーチンを作る段階で頓挫している状態にょ。
元々突発的に作ろうと思って1日で作ったプログラムなので完成しなければそれはそれで
構わない(というか、完成してないゲームなんて多いし)けどどうしても完成させたいと
気が変われば(3)もしくは(4)の方法でとりあえず簡単な思考ルーチンを作ってみるにょ。
さらにより良い方法があればそれを選択するかもしれないにょ。
過去の例からするとこのまま未完成で終わることが非常に多いのであまり期待をせず待って
いてにょ。
突発的に思いついたプログラムは勢いだけで完成させないと熱がさめたらどうでも良く
なってしまうからね(笑)
|
|
|
掲示板管理者へ連絡
無料レンタル掲示板