flashゲーム作成記

趣味でflashゲームを作成するにあたっての技術ネタ(作り方)、作品公開、体験記など。技術ネタとしては主にPV3D(Papervision3D:flashで3D表現をするためのAPI)の研究を行っています。
<< March 2010 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
 
RECENT COMMENT
RECENT TRACKBACK
PROFILE
 
hitTestPointを使って背景との判定を作ってみる
このあいだの超むりげーで集まったとき、babarageoのbabaraさんが「マリオって自機と障害物の判定とか面倒くさそう!なんかいい方法ないかい?」と仰られてましたので、自分が思いついた手法として、hitTestPointを使った作り方を紹介してみたいと思います。


デモはこちら
プログラム一式はこちら

このデモで大体プログラム100行くらい。「}」だけの行とかも沢山あるので、頑張れば50行くらいでできそうな位のコード量です。基本的な動作の判定をほぼ全てhitTestPoint関数を使って行っています。hitTestPointは、あるDisplayObject(今回は背景)と、一点(今回は自機の進行方向の位置)が重なっているかどうかを判別してくれる関数です。DisplayObject同士(例えばMovieClipとMovieClip)が重なっているか判定するhitTestObjectという関数よりも、動作がかなり軽いらしいという事に最近気づいたので、自分もhitTestPointは最近のゲームには積極的に使っています。「ファイナルぴーちゃんをゲットせよ」でも、hitTestPointをあらゆる当たり判定の場面において多用しましたが、それによるパフォーマンス上の影響は少なかったと思います。

今回のデモでは、自機が走ったときは進行方向10pxくらい先の座標位置と背景をhitTestPointして障害物とぶつかるか判定し、ジャンプしたときはジャンプした頭の上(y座標)及び足元の座標と背景をhitTestPointして空中か着地かを判定しています。

あと、ちょっとした注意点としては、移動速度とフレームレートによっては、障害物にめり込んで停止する場合がありえますので停止したときに、若干障害物にめり込んでいたら位置を微調整して直すようなロジックを入れてあげるといいと思います。
(サンプルプログラムでは、着地時に位置を微調整するロジックを入れています。左右の移動には逆に微調整を入れていないので、若干めり込んで止まる場合があります)

あと、サンプルの中にある赤い板のように、厚さが薄いものはタイミングによって当たり判定がスカッてしまう場合があります。(サンプルでは、自機の当たり判定は10px先で行っているが、赤い板は厚さが3pxしかありません)この場合は、赤い板のところに、高さ15pxくらいのアルファ0%の透明な図形を配置してあげます。そうすれば、見た目は薄い3pxの板ですが、当たり判定はアルファ0%の部分も考慮して判定してくれるので、スカることが無くなります。

Enterキーで確定処理(変換中のEnterと区別させる)
TextFieldにカーソルがあって、Enterキーで入力処理を実行する、
なんて事をしたい場合の方法です。ポイントとしては、日本語入力の
漢字変換確定時のEnterキーと、区別させる事です。

以下のコード例は、入力用のTextFieldをtxtChatInputという名前で
宣言した場合の例です。処理実行として、Enter時にbtClick("送信")という
関数を呼び出すとします。


イベントリスナーセット
txtChatInput.addEventListener(KeyboardEvent.KEY_UP, eCharInputKeyUp); //

・・・・

//イベント実行時の関数(と変数)
public var tmpInputString:String;
public function eChatInputKeyUp(e:KeyboardEvent):void
{
   switch (e.keyCode) {
      case 32: //space 変換
         break;
      case 13: //enter
         if (tmpInputString != txtChatInput.text) {
            tmpInputString = txtChatInput.text;
         } else {
            btClick("送信");
         }
         break;
      default:
         tmpInputString = txtChatInput.text;
   }
}

入力した文字列を一時的に保存する変数(以下の例ではtmpInputString)へ
入力イベントで入力値を代入していき、Enter時にTextFieldのtextと変数を比較し、
同じなら処理を実行、異なるなら変換確定のEnterとみなして処理は実行しない、という方法です。
今日2/7は「超むりげー」イベントの日
イベントの告知でっす。
本日(2010/2/7)はイベント「超むりげー」の日です。

自分も参加します。壇上でなんかしゃべる気がします。イベント内容としては、過去のむりげー作品の紹介、1時間でゲーム作ってみる、第6回むりげー作品発表なんかがあります。

自分は第6回むりげーにゲーム作って出展する形で参加させて頂きます。実はゲームは今(12:30現在)まだ作っててもうすぐ完成するのですが、今回新しい試みを入れすぎて本当にちゃんと動くのか!?っていう不安がかなりあるのですが、多分面白い作品になりそうなので、お楽しみに!

あと、自分は業界の話は疎いのでよく知らないんですけど、あんなゲームやこんなゲームを作った有名な方(プロの方)とか、あとDJ急行さんや杏野はるなさんをはじめとするタレントな人も顔を出してくれるみたいなので、そんな方達を見るだけでも楽しくなれると思われます。

会場はASAGAYA LOFT Aという所で19:30からスタートです。誰でも参加可能です(ゲーム・Web関係の学生さん、社会人さんは無料!、一般の方は1500円)

普段、自分のゲームを遊んでくれている方にもぜひぜひお会いしたいです。名刺交換の時間があるらしいので、来場して頂ければ色々絡めると思います。「あのゲームはどうやって作ってるんですか?」とか「あのゲームのコツはありますか」とか、大抵の事ならなんでも答えちゃいます。あ、ちなみに今回のゲームにはガッツリ裏技を仕込んであるので、会場に来て頂ければこっそり教えちゃいますよ〜!

という訳なので、とっても寒いですがとっても楽しいイベントになると思いますのでぜひ足を運んでみてくださいー。

Copyright (C) 2004-2010 lolipop Some Rights Reserved.

Powered by ロリポブログ