忍者ブログ

幻日記

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

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

朝からコードを書いてたら「1発目の弾が消えたら2発目以降の弾も全部消えてしまう」
という謎の現象に戸惑っていました。
こんなページこんなページを参考に直しました。本当に助かります。
あんまりにも気になるので学校をサボってまで家で修正しました。
今日は学校で就活のガイダンスとガイダンスの予約をしないといけない日だったのに…。
大丈夫なんだろうか。
(↑どちらも自主参的に参加するガイダンスなので
 『ガイダンスに出ないと就職できない!』なんてことは無いけど)

そんな訳で
さらに進化を遂げました。すこしだけど。

前回同様にスペースで弾が撃てます。今回は画面外へ行ったらちゃんと消えます。
それと同時に敵の判定も作ってみました。
画面の右側に居る赤い物体が敵。今の所主人公が触れても何も起こりません。

敵には体力が設定されていて弾を3発あてると消えます。
弾自体にも寿命があるのだけど
もともと1発あたっただけで消えてしまうのでほぼ意味なし。
ライフルみたいに敵を貫通する弾を実装する際に使う予定です。

今後実装していきたい箇所は
・装備できるアイテム(武器)
・物理攻撃
・主人公の体力
・敵のAI
・地面以外の足場(ブロック?)
どれも頭の中ではコードの組み立て方は分ってるのですが
いざ、書いてみると苦労するんでしょうね。

今回使ったコードも載せておきます。
左下の■■■■■コードを表示■■■■■をクリックで表示します。
メイン部分:
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 cnt : int = 0;
var bullet_array01:Array = new Array();//弾1用配列
var  enemy_array01:Array = new Array();//敵1用配列
var timer : int = 0;//ゲームの時間軸を表す変数
 
// キーボードが押されたときに呼び出されるイベント
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{
//■timerが0の時に敵を準備---------------------------------
if(timer==0){
var enemy:Enemy01 = new Enemy01();//敵を配置
enemy_array01.push (enemy);
enemy_array01[enemy_array01.length-1].x = 600;
enemy_array01[enemy_array01.length-1].y = 260;
addChild (enemy_array01[enemy_array01.length-1]);
var enemy:Enemy01 = new Enemy01();//敵を配置
enemy_array01.push (enemy);
enemy_array01[enemy_array01.length-1].x = 700;
enemy_array01[enemy_array01.length-1].y = 550;
addChild (enemy_array01[enemy_array01.length-1]);
 
}
 
//■移動に関する処理----------------------------------------
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){//スペースを押し、ディレイ0の時
            var bullet:Bullet01 = new Bullet01();//弾を作成
            bullet_array01.push(bullet);//その弾を配列へ入れる
            addChildAt(bullet, 1);//画面内に登場させる
            bullet.x = Syuzinko.x;
            bullet.y = Syuzinko.y;
delay=16;
}
//□弾が画面外へ飛んでいった場合、削除する
if(bullet_array01.length != 0){//弾が画面内に存在する場合
for(var i:int=0; i<bullet_array01.length; i++){//弾全てに対し
if (bullet_array01[i].x > stage.stageWidth) {//ステージ外へ飛んだら
removeChild(bullet_array01[i]);//ステージから消すよう命令
bullet_array01.splice (i , 1);//配列からも削除しておく
}
    }
}
//■辺り判定に関する処理----------------------------------------
loop1: for (i = 0 ; i < enemy_array01.length ; i ++) {
for (var j:uint = 0 ; j < bullet_array01.length ; j ++) {
if (enemy_array01[i].hitTestObject (bullet_array01[j])) {
removeChild (bullet_array01[j]);//弾が消える
bullet_array01.splice (j , 1);//
enemy_array01[i].life -= 1;//体力を減らす
if(enemy_array01[i].life<=0){//敵が死んでいれば
removeChild (enemy_array01[i]);//死亡処理
enemy_array01.splice (i , 1);
}
break loop1;
}
}
}
 
//■無条件で起こる処理----------------------------------------
Syuzinko.x += vx;//主人公を動かす
Syuzinko.y += vy;
timer++;//時間が進み、timerをインクリメント
 
if(delay>0){//攻撃のディレイをデクリメント
delay--;
}
});


弾の部分
var life:int = 1;
addEventListener(Event.ENTER_FRAME,
function(event:Event):void{
x+=32;
}
);

敵の部分
var life:int = 3;

拍手