(ゲームイメージ)
おわりに
自己満足の塊をば。ちょっとゲームっぽくなったと思います。
enchant();
window.onload = function(){
// ----- ゲーム内共通利用変数 ---------
var game = new Core(320, 320);
game.preload('chara7.png', 'chara6.png', 'icon0.png','map0.png','effect0.png'); // preload image
game.fps = 15;
var INFO_LIFE = 3; // ライフ
var INFO_SCORE = 0; // スコア
var INFO_LEVEL = 1;
var Info = { // 良い名前募集中
life: INFO_LIFE,
score: INFO_SCORE,
level: INFO_LEVEL,
init: function(){
this.life = INFO_LIFE;
this.score = INFO_SCORE;
this.level = INFO_LEVEL;
},
gamecontinue: function(){
this.life =INFO_LIFE;
},
minuslife: function(){
this.life --;
},
plusscore: function(){
this.score ++;
},
pluslevel: function(){
this.level ++;
},
};
game.onload = function(){
// ******* キャラ *******
// プレイキャラクター
var Player = enchant.Class.create(enchant.Sprite, {
initialize: function(){
enchant.Sprite.call(this, 32, 32);
this.image = game.assets['chara7.png'];
this.x = 288;// add:右側に表示。320-32の位置
this.frame = 10; // キャラクター
this.attackframe = -1; // 攻撃状態確認用。0未満がデフォルト
this.renda = 0;
},
attackstart: function(ly){
if(Math.abs(this.y - ly ) < 10 ){ // 移動距離が小さいなら攻撃状態に移れる
this.frame = 16; // 斬っている瞬間の画像
this.attackframe = 0; // 攻撃状態確認0回目
this.renda++; // 連打数
} else {
this.renda = 0; // 動いたら連打数無効
}
this.moving(ly);
},
attackend: function(){
if( this.attackframe < 0 ) return; // 攻撃状態では無い場合は後続処理をしない
if( this.attackframe == 3 ) {
this.frame = 10; // 普段の画像
this.attackframe = -1;
} else {
this.attackframe ++;
}
},
moving: function(ly){
this.y = ly;
},
isattacking: function(){
if(this.attackframe === -1) return false;
return true;
},
isenoughrenda: function(){
if (this.renda > 10 ){
this.renda = 0;
return true;
}
return false;
},
onenterframe:function(){ // フレーム単位でのプレイキャラクター監視
this.attackend(); // attackstartしてから終わるまでをみはる
},
endgraphic: function(){ // ゲームオーバー時の表示
this.frame = 29;
this.rotation = -90;
this.x = 140;
this.y = 160;
this.scale(3,3);
}
});
// 敵キャラ
var Enemy = enchant.Class.create(enchant.Sprite, {
initialize: function(){
enchant.Sprite.call(this, 32, 32);
this.image = game.assets['chara6.png']; // set image
this.moveTo(0, Math.floor(Math.random() * 295)); // 320だと実質見えない
this.scaleX = -1;
this.speed = 160 - Math.min(Info.level , 159 ); // 移動速度. レベル依存
this.tl.moveBy(360, 0, this.speed );
this.frame = 9; // 敵キャラ画像
}
});
// 爆発
var Crash = enchant.Class.create(enchant.Sprite, {
initialize: function(scene,ex,ey){
enchant.Sprite.call(this, 32, 32);
this.image = game.assets['effect0.png']; // set image
this.frame = 0;
this.scene = scene;
this.x = ex;
this.y = ey;
this.scaleX = 2;
this.scaleY = 2;
this.scene.addChild(this); //生み出す
},
onenterframe:function(){ // 爆発動作と終了処理
this.frame++;
if(this.frame > 4){
this.scene.removeChild(this); // 消す
}
},
});
// ******* シーン *******
// メインシーン
var MainScene = function(){
var scene = new Scene();
// 背景
var bgmap = new Map(16,16);
bgmap.image = game.assets['map0.png'];
bgmap.backgroundColor="#d3ffdd";
var bgbase = [];
for(var i = 0; i < 320/16 ; i++ ){
bgbase[i]=[];
var frm = ( i === 0 ? 19 : 0); // 画面一番上の方だけ画像変える
for(var j = 0 ; j < 320/16; j++ ) bgbase[i][j]=frm;
}
bgmap.opacity = 0.6; // ちょっとだけ透明処理
bgmap.loadData(bgbase);
scene.addChild(bgmap);
// プレイキャラクター
var player = new Player();
scene.addChild(player);
// ラベル
var label = new Label();
label.x = 5;
label.y = 288;
label.color = "black";
label.opacity = 0.6;
label.settext = function(addtxt){
this.text = 'Life : ' + Info.life
+ '<br>' + 'Score : ' + Info.score
+ (addtxt === undefined ? '' : addtxt);
};
label.settext(); // 初期テキスト設定
scene.addChild(label);
// -- シーン内動作(キャラクター動作) --
// - タッチスタート
scene.addEventListener(Event.TOUCH_START, function(evt) {
player.attackstart(evt.localY);
});
// - タッチムーブ
scene.addEventListener(Event.TOUCH_MOVE, function(evt){
player.moving(evt.localY);
});
// 一定時間ごと
// - 敵の作成
var enemies = [];
scene.tl.then(function() {
enemies.push(new Enemy());
scene.addChild(enemies[enemies.length -1 ]);
Info.pluslevel(); // 時間とともにレベルもあげる
}).delay(30).loop();
// フレーム監視 - 敵を作ったり消したりスコアいじったり
scene.addEventListener(Event.ENTER_FRAME, function(evt){
// 連打数が十分な場合、全ての敵を削除
var chkflg = player.isenoughrenda();
// 敵とプレイキャラクターが当たっているかどうかを1件ずつ確かめる
for(var i = 0; i < enemies.length; i ++){
if(chkflg || player.within(enemies[i]) && player.isattacking()) {
if(chkflg){
new Crash(scene,enemies[i].x , enemies[i].y);
}
scene.removeChild(enemies[i]);
enemies.splice(i--,1);
Info.plusscore(); // スコアカウントアップ
label.settext(); // 表示更新
}
else if(enemies[i].x >= 315){
scene.removeChild(enemies[i]); // 画面から削除
enemies.splice(i--,1);
Info.minuslife(); // ライフカウントダウン
label.settext(); // 表示更新
}
}
});
// シーン切替処理
scene.addEventListener(Event.ENTER_FRAME, function(evt){
// メイン -> ゲームオーバー
if(Info.life <= 0){
game.replaceScene(new EndScene());
}
});
return scene;
};
// ゲームオーバーシーン
var EndScene = function(){
var scene = new Scene();
scene.backgroundColor = '#666666';
// シーン内フラグ
var buttons = {
iscontinue:false,
isnewgame:false,
};
// プレイキャラクター表示
var player = new Player();
player.endgraphic();
scene.addChild(player);
// スコア表示追加
var label = new Label('Score : ' + Info.score + '<br>ヤラレタ...');
label.color='#cccccc';
label.y = 100;
label.textAlign = 'center';
scene.addChild(label);
// ボタン(コンティニュー)
var btnContinue = new Label('こんてぬー');
btnContinue.color='#eeeeee';
btnContinue.y = 210;
btnContinue.x = -50;
btnContinue.textAlign = 'center';
btnContinue.addEventListener(Event.TOUCH_START, function(evt) {
buttons.iscontinue = true;
});
scene.addChild(btnContinue);
// ボタン(ニューゲーム)
var btnNewgame = new Label('ぬーげーむ');
btnNewgame.color='#eeeeee';
btnNewgame.y = 210;
btnNewgame.x = 50;
btnNewgame.textAlign = 'center';
btnNewgame.addEventListener(Event.TOUCH_START, function(evt) {
buttons.isnewgame = true;
});
scene.addChild(btnNewgame);
// シーン切替処理
scene.addEventListener(Event.ENTER_FRAME, function(evt){
if(buttons.isnewgame === true ){
Info.init();
game.replaceScene(new MainScene());
}
else if(buttons.iscontinue === true ){
Info.gamecontinue();
game.replaceScene(new MainScene());
}
});
return scene;
};
// ******** 最初のシーン設定 **********
game.replaceScene(new MainScene());
};
game.start();
};