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次使用は禁止されています。詳しくはこちらを参考ください。