Flashでゲームキャラを動してみる1。オンラインゲームが作りたい(3)
今回はとりあえずFlash上でゲームキャラが動くようにしてみる。
ただ、動くだけ。本当にただ動くだけ。
前回の記事はこっち(どうやったら同一ウィンドウ内でリンクが出来るか知りたい)
とりあえず、読込んだキャラクターが動くだけ。
FlashCS3で書いています。
画像はランケージからnew char(0,0)ってやつ。
ASファイルはドキュメントクラスに設定。
サンプル
package { import flash.display.*; import flash.events.*; public class Game extends Sprite { // プレイヤー private var player_mc:MovieClip; // 移動スピード private var x_speed:Number;//X座標 private var y_speed:Number;//Y座標 //コンストラクタ public function Game() { // 変数の初期化 x_speed = 2;//X座標移動スピード y_speed = 2;//Y座標移動スピード // プレイヤー生成 player_mc = createCharacter( new char(0,0) ); // 配置位置を決定 player_mc.x = 10; player_mc.y = 10; // ステージに配置 addChild(player_mc); // イベントリスナーの登録 stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownEvent); } // キャラクター生成 private function createCharacter(bmpdata:BitmapData) { // ビットマップデータをビットマップオブジェクトにセット var bmp = new Bitmap( bmpdata ); // キャラクターMC生成 var mc:MovieClip = new MovieClip(); // 表示 mc.addChild(bmp); // 戻り return mc; } // keyDownEvent private function keyDownEvent(event:KeyboardEvent) { var code:Number = event.keyCode; // 移動 ←↑→↓ if (code == 37) { moveLeft(); } else if (code == 38) { moveUp(); } else if (code == 39) { moveRight(); } else if (code == 40) { moveDown(); } } private function moveUp() { player_mc.y -= y_speed; } private function moveRight() { player_mc.x += x_speed; } private function moveDown() { player_mc.y += y_speed; } private function moveLeft() { player_mc.x -= x_speed; } } }
ソースのダウンロード
後半明らかにコメント書くのがめんどくさくなってるさ。
でも、このままだとキーを押したときにキャラクターが動く。
「その何がいけないの?」って思うかもしれないけど、それだったら高橋名人が↑を連打したらすっごい勢いでキャラクターが上に移動してしまう。
ゲームの場合、普通は方向キーを押しっぱなしで一定間隔で移動しないといけない。
TimerEventを使って今度は押しっぱなしで移動するように書き換えてみる。
もう、FlashCS3はしんどいのでFlex Builder 2で書く。
サンプル
package { import flash.display.*; import flash.events.*; import flash.utils.Timer; public class Game extends Sprite { // 素材クラスの定義 [Embed(source='01.png')] private var char01:Class; // プレイヤー private var player_mc:MovieClip; // 移動スピード private var x_speed:Number;//X座標 private var y_speed:Number;//Y座標 // キーコード private var keyCode:Number; //コンストラクタ public function Game() { // 変数の初期化 x_speed = 5;//X座標移動スピード y_speed = 5;//Y座標移動スピード // プレイヤー生成 /* // Bitmapを描く場合 var bmpdata:BitmapData = new BitmapData(30,40,true,0xffff0000); player_mc = createCharacter(bmpdata); // CS3でランケージ読みする場合 player_mc = createCharacter( new char0101(0,0) ); */ // Flex Builder 2でEmbedした場合 player_mc = new MovieClip(); player_mc.addChild( new char01() ); // 配置位置を決定 player_mc.x = 10; player_mc.y = 10; // ステージに配置 addChild(player_mc); // イベントリスナーの追加 stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownEvent); stage.addEventListener(KeyboardEvent.KEY_UP,keyUpEvent); // タイマーの追加(20m秒間隔、無制限) var timer:Timer = new Timer(20,0); // イベントリスナーの追加(発生時に) timer.addEventListener(TimerEvent.TIMER,timerEvent); // タイマーの開始 timer.start(); } // キャラクター生成 private function createCharacter(bmpdata:BitmapData):MovieClip { // ビットマップデータをビットマップオブジェクトにセット var bmp:Bitmap = new Bitmap( bmpdata ); // キャラクターMC生成 var mc:MovieClip = new MovieClip(); // 表示 mc.addChild(bmp); // 戻り return mc; } // キーダウンイベント private function keyDownEvent(event:KeyboardEvent):void { // キーコードを代入 keyCode = event.keyCode; } // キーアップイベント private function keyUpEvent(event:KeyboardEvent):void { // キーコードを空にする keyCode = 0; } // タイマーイベント private function timerEvent(event:TimerEvent):void{ // 移動 ←↑→↓ if (keyCode == 37) { moveLeft(); } else if (keyCode == 38) { moveUp(); } else if (keyCode == 39) { moveRight(); } else if (keyCode == 40) { moveDown(); } // 攻撃 space if (keyCode == 32) { actionAttack(); } } private function moveUp():void { player_mc.y -= y_speed; } private function moveRight():void { player_mc.x += x_speed; } private function moveDown():void { player_mc.y += y_speed; } private function moveLeft():void { player_mc.x -= x_speed; } private function actionAttack():void { trace("攻撃"); } } }
プロジェクトファイルのダウンロード
次回は多分今回の続き。
今回使用しているドット絵はREFMAP様が配布しているフリー画像素材を使用してます。ゲームからデータを取り出しての2次使用は禁止されています。詳しくはこちらを参考ください。