忍者ブログ

幻日記

お絵描き&ゲーム制作好きの ひとりごと日記

AS3横スクロールアクションゲーム制作2

AS3でのゲーム制作、ちょっと進行しました。


前回から追加した部分
●大ジャンプ、小ジャンプシステムの実装:
長く押せば大きく、短く押せば小さくジャンプできます。

●スペースキーで飛び道具が使用可能:
主人公から右向きに弾を飛ばします。
こう見えて図形を飛ばしているのではなくムービークリップが飛んでいます。
最初、ムービークリップを発射する方法が全然わからず
何時間も停滞していたのですが、こちらのサイトを見て一件落着。
専門的には「ライブラリから動的にインスタンス」しているそうな。
なんだかよくわかんないけど思った通りに実装できました。
現在は右にしか飛びませんが、後々色々な方向へ打てるようにする予定です。
今までプログラミングで三角関数を使うようなコードを描いたことが無かったのですが
色々な方向へ飛ばしたいならSin、Cos、ラジアンあたりの知識が必要っぽいです。
数学苦手なのになー(つω`)

●壁のめりこみ修正:
前回、実は矢印キーを画面の内側に入力中に外側の壁にぶつかると
主人公が画面外へ出て行ってしまう現象が起こっていたのですが
なんとかストップするようになりました。
それでもまだまだ画面外へめり込んでしまうモノだけど
これに関しては後日修正するのかどうかは曖昧な所。

…あと前回背景が白くて見え辛かったので適当に描きました。
それにしてもAS3に関する情報がネット上で全然手に入らないのが惜しい。
AS2の情報は多いんだけど…殆ど役に立たない(つω;)


そういやこのコードだと、弾を発射したら永遠に飛び続けて
画面外へ言っても消えません。
画面外へ飛んでいった弾を消す方法は「removeChild()」を使うのですが、
上手い事参照できない。理由は解ってるのですがちょっとややこしい。
こういう丁寧な説明を呼んでたら多分わかるとおもいます。頑張るぞー
弾のコードは省きます。メイン部分のみ。

var left_flg  : Boolean = false;//←を押してるかどうかのフラグ
var right_flg : Boolean = false;//→を押してるかどうか…
var up_flg : Boolean = false;//↑を押してるかどうか…
var space_flg : Boolean = false;//スペースを押してるか…
var vx : Number = 0;//主人公の横加速度
var vy : Number = 0;//主人公の縦加速度
var delay : int = 0;//攻撃のディレイ。0だと攻撃可能になる。
var j_flg : Boolean = false;//ジャンプのフラグ。false=可
var bullet:bullet01 = new bullet01();
 
// キーボードが押されたときに呼び出されるイベント
stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDownFunc);
function KeyDownFunc(event:KeyboardEvent):void{
if(event.keyCode == 37){
left_flg = true;
}
if(event.keyCode == 39){
right_flg = true;
}
if(event.keyCode == 38){
up_flg = true;
}
if(event.keyCode == 32){
space_flg = true;
}
}
 
 
// キーボードが離されたときに呼び出されるイベント
stage.addEventListener(KeyboardEvent.KEY_UP, KeyUpFunc);
function KeyUpFunc(event:KeyboardEvent):void{
    if(event.keyCode == 37){
        left_flg = false;
    }
if(event.keyCode == 39){
        right_flg = false;
    }
if(event.keyCode == 38){
        up_flg = false;
    }
if(event.keyCode == 32){
        space_flg = false;
    }
 
}
 
// 毎フレーム実行されるイベント
//■移動に関する処理----------------------------------------
stage.addEventListener(Event.ENTER_FRAME, function(event:Event):void{
if(left_flg && right_flg){//←→同時に押してる場合
if(vx<1 && vx>-1){
vx=0;//加速度が0に近づくと完全に停止させる
}else{
vx+= -vx/2;//加速度を減らしていく
}
}else if(left_flg && vx>-10 && Syuzinko.x-Syuzinko.width/2 > 0){//←を押す
        vx -= 0.5;
if(Syuzinko.x>stage.stageWidth){//画面→からはみ出るのを防ぐ
Syuzinko.x=stage.stageWidth;
}
}else if(left_flg && vx>=-10 && Syuzinko.x-Syuzinko.width/2 > 10){//←を押す(ダッシュ時)
vx = -10;
}else if(right_flg && vx<10 && Syuzinko.x+Syuzinko.width/2 < stage.stageWidth){//→を押す
vx += 0.5;
if(Syuzinko.x<0){//画面←からはみ出るのを防ぐ
Syuzinko.x=0;
}
}else if(right_flg && vx<=10 && Syuzinko.x+Syuzinko.width/2 < stage.stageWidth-10){//→を押す(ダッシュ時)
vx = +10;
}else{//何も押していない場合
if(vx<1 && vx>-1){
vx=0;//加速度が0に近づくと完全に停止させる
}else{
vx+= -vx/4;//加速度を減らしていく
}
}
//■ジャンプに関する処理----------------------------------------
if(up_flg && !j_flg){
vy -= 30;//ジャンプさせる
j_flg = true;
} else if(j_flg) {//空中に居る場合
if(vy <-25 && !up_flg){//小ジャンプ判定
vy+=10;
}
vy+=1.5;//落下させる
if(Syuzinko.y > stage.stageHeight-25-Syuzinko.height/2){//地面に着地したら
vy = 0;//停止させる
Syuzinko.y = stage.stageHeight-20-Syuzinko.height/2;
j_flg = false;
}
}
//■攻撃に関する処理----------------------------------------
if(space_flg && delay==0){
delay=30;
stage.addChild(bullet);
bullet.x = Syuzinko.x;
bullet.y = Syuzinko.y;
 
}
//■無条件で起きる処理----------------------------------------
Syuzinko.x += vx;//主人公を動かす
Syuzinko.y += vy;
if(delay>0){//攻撃のディレイ
delay--;
}
if(bullet.x > stage.stageWidth/2){//弾が画面外へ出たら消す
//TODO:弾を消す
}
});

拍手