忍者 vs インベーダー
左右キーで移動
Aキーで攻撃
Timeが0になるまでに敵を倒して高得点を目指すべし。
/**
* Copyright testtaro ( http://wonderfl.net/user/testtaro )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/g23Y
*/
package {
import flash.filters.DropShadowFilter;
import flash.geom.Point;
import flash.text.TextField;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.display.Sprite;
[SWF(width=450, height=450, backgroundColor=0x222222)]//ステージサイズと背景色指定
public class FlashTest extends Sprite {
private const STAGE_SIZE:int = 450;//ステージサイズ
private var colobj:Object = {"1":0xffffff,"2":0xb22222,"3":0x1e90ff,"4":0xffd700,"5":0x006400,"6":0x8B4513};//色テーブル
private var frame:int = 0;//経過フレーム
private var score:int = 0;//スコア
private var scoreText:TextField;//スコアの表示用テキストフィールド
private var time:int = 40;//残り時間
private var timeText:TextField;//残り時間の表示用テキストフィールド
//各種ボタン押下フラグ
private var rightFlag:Boolean = false;
private var leftFlag:Boolean = false;
private var buttonFlag:Boolean = false;
//各種スプライト
private var player:Sprite;//プレイヤー
private var tama:Sprite;//弾
private var enemy:Array;//敵配列
public function FlashTest() {
addEventListener(Event.ADDED_TO_STAGE, init);//ステージに追加されたら初期化
}
//初期化
private function init(e:Event):void{
removeEventListener(Event.ADDED_TO_STAGE,init);
//背景
var bg:Sprite = new Sprite();
drawDot("bg",bg);
addChild(bg);
bg.width = bg.height = STAGE_SIZE;
//点数表示
scoreText = new TextField();
scoreText.textColor = 0xffffff;//文字色
updateScoreText();
addChild(scoreText);
//残り時間表示
timeText = new TextField();
timeText.textColor = 0xffffff;
timeText.y = 20;
updateTimeText();
addChild(timeText);
//プレイヤー生成
player = new Sprite();
var player2:Sprite = CreateSprite(0,0,50,50,"player");
player.addChild(player2);
player2.x = -25;
player.x = STAGE_SIZE / 2;
player.y = STAGE_SIZE - 80;
addChild(player);
//弾生成
tama = new Sprite();
var tama2:Sprite = CreateSprite(0,0,30,30,"tama");
tama.addChild(tama2);
tama2.x = tama2.y = -15;
tama.visible = false;
addChild(tama);
//敵配列
enemy = new Array();
//イベントリスナー登録
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);//キーダウン
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);//キーアップ
addEventListener(Event.ENTER_FRAME,update);//毎フレーム
}
//************************************************
//メインループ
//************************************************
private function update(e:Event):void{
frame++;//経過フレーム
if(frame % 30 == 0){//30フレーム毎に残り時間減らす
time--;
updateTimeText();//表示更新
if(time <= 0){//残り時間が0になったらゲームオーバー
gameOver();
}
}
if(frame % 5 == 0){
player.scaleX = player.scaleX * -1;
}
if(rightFlag){//移動
player.x += 10;
}else if(leftFlag == true){
player.x -= 10;
}
if(buttonFlag && !tama.visible){//弾発射
tama.x = player.x;//座標をプレイヤーに合わせる
tama.y = player.y;
tama.visible = true;
}
if(tama.visible){//弾更新(表示中だけ)
tama.y -= 7;
tama.rotation += 30;//回転
if(tama.y < -tama.height){//画面外に行ったとき非表示に
tama.visible = false;
}
}
if(frame % 30 == 0){//敵生成
var newenemy:Object = createEnemy();//敵オブジェクト
enemy.push(newenemy);//敵オブジェクトをリストに追加
addChild(newenemy.sp);//敵スプライトをステージに追加
}
//敵更新 & 弾との当たり判定
for(var i:int = enemy.length-1;i >= 0;i--){//要素を削除しても実行順に影響が無いように後ろから更新
enemy[i].update.call(enemy[i]);//敵更新
var esp:Sprite = enemy[i].sp;//敵スプライト
//弾が表示中で敵と接触したとき
//弾を非表示にして敵をステージとリストから取り除く
if(enemy[i].liveFlag && tama.visible && tama.hitTestObject(esp)){
enemy[i].dropStart();
tama.visible = false;//弾非表示
score++;//得点加算
updateScoreText();//表示更新
}
if(enemy[i].removeFlag == true){//削除フラグがtrueのときステージとリストから取り除く
esp.parent.removeChild(esp);//ステージから削除
enemy.splice(i,1);//リストから削除
}
}
}
//ゲームオーバー
private function gameOver():void{
var gameoverText:TextField = new TextField();//ゲームオーバーテキスト
gameoverText.textColor = 0xffffff;
gameoverText.text = "Game Over";
gameoverText.x = (STAGE_SIZE - gameoverText.width)/2;
gameoverText.y = (STAGE_SIZE - gameoverText.height)/2;
addChild(gameoverText);
removeEventListener(Event.ENTER_FRAME,update);//イベントリスナー削除で時間停止
}
private function updateScoreText():void{//表示スコア更新
scoreText.text = "Score : " + score.toString();
}
private function updateTimeText():void{//表示時間更新
timeText.text = "Time : " + time.toString();
}
//スプライト生成、指定のidでドット絵を描画させる
private function CreateSprite(tx:Number,ty:Number,tw:Number,th:Number,id:String):Sprite{
var sp:Sprite = new Sprite();
sp.x = tx; sp.y = ty;
drawDot(id,sp);//ドット絵の描画
sp.width = tw; sp.height = th;
sp.filters = [new DropShadowFilter(8)];//フィルター
return sp;
}
private function createEnemy():Object{//敵の生成
var obj:Object = new Object();
obj.sp = CreateSprite(-30,rnd(200) + 50,30,30,"enemy" + rnd(2).toString());
obj.liveFlag = true;//生存フラグ
obj.removeFlag = false;//削除フラグ
obj.boundCount = 4;//バウンド回数
obj.dropVy = -5;//初期値
obj.dropAy = 1;//加速度
//ランダムで更新関数と初期位置を設定
obj.sp.width = obj.sp.height = 30 + (rnd(4) * 10);//大きさ
obj.lineY = obj.sp.y;//横移動の基準になる高さ
obj.spd = (rnd(4) + 4);//移動速度
if(rnd(2) == 1){//右から
obj.sp.x = STAGE_SIZE;
obj.spd = -obj.spd;
}
obj.moveUpdate = function():void{
this.sp.x += this.spd;
this.sp.y = this.lineY + (Math.sin((this.sp.x / 10)) * 10);//上下に揺らす
if(this.sp.x > STAGE_SIZE + 30 || this.sp.x < -30){//画面外に出たらステージとリストから取り除く
this.removeFlag = true;
}
}
obj.dropUpdate = function():void{
this.dropVy += this.dropAy;
this.sp.y += this.dropVy;
if(this.boundCount > 0){
if(this.sp.y > (STAGE_SIZE - this.sp.height)){
this.sp.y = STAGE_SIZE - this.sp.height;
this.dropVy = -(this.dropVy * 0.5);
this.boundCount--;
}
}else if(this.sp.y > STAGE_SIZE){//画面外に落ちたら削除
this.removeFlag = true;
}
}
obj.dropStart = function():void{
this.liveFlag = false;
this.update = this.dropUpdate;
this.sp.alpha = 0.3;
}
obj.update = obj.moveUpdate;
return obj;
}
//スプライトにドット絵を描き込む
private function drawDot(id:String,sp:Sprite):void{
var dot:Array = new Array(5);//ドットデータ
switch(id){
case "player"://プレイヤー
dot[0] = "0011100";
dot[1] = "1013300";
dot[2] = "1111111";
dot[3] = "0011101";
dot[4] = "0010100";
break;
case "enemy0"://敵1
dot[0] = "20002";
dot[1] = "22222";
dot[2] = "21212";
dot[3] = "22222";
dot[4] = "02020";
break;
case "enemy1"://敵2
dot[0] = "02220";
dot[1] = "22222";
dot[2] = "02120";
dot[3] = "22222";
dot[4] = "20202";
break;
case "tama"://弾
dot[0] = "00400";
dot[1] = "04440";
dot[2] = "44044";
dot[3] = "04440";
dot[4] = "00400";
break;
case "bg"://背景
dot[0] = "333333333333333333";
dot[1] = "333111133333333333";
dot[2] = "331111113333311133";
dot[3] = "333333333333111113";
dot[4] = "333333333333333333";
dot[5] = "333333333333333333";
dot[6] = "335553555333333333";
dot[7] = "335653565333333333";
dot[8] = "333633363333333333";
dot[9] = "555555555555555555";
break;
}
var tw:int = String(dot[0]).length;
var th:int = dot.length;
for(var i:int = 0;i < th;i++){
for(var j:int = 0;j < tw;j++){
var colchar:String = String(dot[i]).substring(j,j+1);
if(colchar != "0"){
sp.graphics.beginFill(colobj[colchar],1);
sp.graphics.drawRect(j * 10,i * 10,10,10);
sp.graphics.endFill();
}
}
}
}
//乱数
private function rnd(val:int):int{
return Math.floor(Math.random() * val);
}
//************************************************
//入力
//************************************************
//キーダウン
private function keyDownHandler(e:KeyboardEvent):void{
switch(e.keyCode){
case Keyboard.RIGHT:
rightFlag = true;
break;
case Keyboard.LEFT:
leftFlag = true;
break;
case 65://Aキー
buttonFlag = true;
break;
}
}
//キーアップ
private function keyUpHandler(e:KeyboardEvent):void{
switch(e.keyCode){
case Keyboard.RIGHT:
rightFlag = false;
break;
case Keyboard.LEFT:
leftFlag = false;
break;
case 65://Aキー
buttonFlag = false;
break;
}
}
}
}