AS3でゲームを作成する その12 | Photoshop CC Tutorials
今回はリンゴの連射ゲームを作成しました。
ランキング機能を付ければ盛り上がると思うのですが、只今検討中です。(;^_^ A

$ピック社長のブログ
できあがりはこちらをクリック(効果音にご注意)

画像はアルテミス職人からお借りしました。
効果音はこちらのサイトからお借りしました。

画像を使用する場合はドット絵専門家のアルテミス職人の許可を取ってください。
アルテミス職人のサイト:http://ameblo.jp/yukineko-altemis/theme2-10008493007.html

$ピック社長のブログ

Main.as
package 
{
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.getTimer;

/**
* リンゴゲーム
*/
public class Main extends Sprite
{
// 描画エリア
private var p:Sprite = new Sprite();
private var apple:Apple = new Apple();

// テキストエリア
private var textField:TextField;
private var textField_02:TextField;
private var textField_03:TextField;

// タイムエリア
private var timeField:TextField;
// タイム
private var milliSecond:Number = 0; // 現レコード
private var highMilliSecond:Number = 0xffffff; // ニューレコード
private var second:Number = 0; // 現レコード
private var highSecond:Number = 0xffffff; // ニューレコード
private var oldTimer:Number = getTimer();

// スコアエリア
private var scoreField:TextField;

// ハイスコアエリア
private var highScoreField:TextField;

// スタートフラグ
private var startFlag:Boolean = false;

public function Main():void
{
init();

// テキストフォント
var textformat:TextFormat = new TextFormat();
textformat.size = 13;
textformat.font = "_sans";

// 説明を表示
textField = new TextField();
textField.defaultTextFormat = textformat;
textField.textColor = 0x00ff00;
textField.border = false;
textField.x = 100;
textField.y = 10;
textField.width = 300;
textField.height = 20;
textField.text = "16連射のタイムを競い合うゲームです。";
this.addChild(textField);

// リンゴを食べた数を表示
textField_02 = new TextField();
textField_02.defaultTextFormat = textformat;
textField_02.textColor = 0x00ff00;
textField_02.border = false;
textField_02.x = 140;
textField_02.y = 260;
textField_02.width = 300;
textField_02.height = 20;
textField_02.text = "食べたリンゴの数";
this.addChild(textField_02);

// リンゴを食べた数を表示
textField_03 = new TextField();
textField_03.defaultTextFormat = textformat;
textField_03.textColor = 0x00ff00;
textField_03.border = false;
textField_03.x = 240;
textField_03.y = 260;
textField_03.width = 300;
textField_03.height = 20;
textField_03.text = "0個";
this.addChild(textField_03);

// タイムエリア
timeField = new TextField();
timeField.defaultTextFormat = textformat;
timeField.textColor = 0x00ff00;
timeField.border = false;
timeField.x = 230;
timeField.y = 30;
timeField.width = 300;
timeField.height = 20;
timeField.text = "TIME: " + second + ":" + milliSecond;
this.addChild(timeField);

// スコアエリア
scoreField = new TextField();
scoreField.defaultTextFormat = textformat;
scoreField.textColor = 0x00ff00;
scoreField.border = false;
scoreField.x = 100;
scoreField.y = 45;
scoreField.width = 300;
scoreField.height = 20;
scoreField.text = "SCORE: " + second + ":" + milliSecond;
this.addChild(scoreField);

// ハイスコアエリア
highScoreField = new TextField();
highScoreField.defaultTextFormat = textformat;
highScoreField.textColor = 0xffff00;
highScoreField.border = false;
highScoreField.x = 100;
highScoreField.y = 30;
highScoreField.width = 300;
highScoreField.height = 20;
highScoreField.text = "HIGHSCORE: " + second + ":" + milliSecond;
this.addChild(highScoreField);

// リスナー登録
//----------------------------------
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
// マウスの左ボタンが押されたときに呼び出されるイベント
stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseLDownFunc);
}

private function init():void
{
p.x = 0; // 描画エリアの位置
p.y = 0;
this.addChild(p);
}

private function onEnterFrame(e:Event):void
{
if (!apple.eatenFlag && startFlag) { // リンゴ食べ終わっていない
timer();
}else if(apple.eatenFlag){ // リンゴ食べ終わった
startFlag = false;
apple.eatenFlag = false;
culcScore(); // スコア計算
}
p.graphics.clear();
//apple.move(1, 1);
apple.paint(this.p);
}

private function culcScore():void
{
scoreField.text = "SCORE: " + second + ":" + milliSecond;
if (highSecond > second) {
highSecond = second;
highMilliSecond = milliSecond;
highScoreField.text = "HIGHSCORE: " + highSecond + ":" + highMilliSecond;
}else if (highSecond == second) {
if (highMilliSecond > milliSecond) {
highSecond = second;
highMilliSecond = milliSecond;
highScoreField.text = "HIGHSCORE: " + highSecond + ":" + highMilliSecond;highScoreField.text = "HIGHSCORE: " + second + ":" + milliSecond;
}
}
}

private function timer():void
{
milliSecond = Math.floor(( ( getTimer() - oldTimer) / 10 % 100));
second = Math.floor(( getTimer() - oldTimer) / 1000 % 60);

timeField.text = "TIME: " + second + ":" + milliSecond;
}

public function MouseLDownFunc(event:MouseEvent):void
{
// 初期状態なら
if (!startFlag && apple.ringoInitFlag) {
apple.ringoInitFlag = false;
oldTimer = getTimer(); // タイマー初期化
startFlag = true;
}

// リンゴを食べた数を表示
textField_03.text = ((String)(apple.eatNum) + "個");
apple.hit(mouseX, mouseY);
}
}

}


Apple.as
package  
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.geom.Point;
import flash.media.Sound;
import flash.net.URLRequest;
/**
* リンゴクラス
*/
public class Apple
{
// 画像
[Embed(source = 'ringo.png')]
private var Image0:Class;

// 効果音
private var url:URLRequest = new URLRequest("ringo.mp3");
private var sound_obj:Sound = new Sound(url);

private var _x:Number = 0;
private var _y:Number = 0;

private var imgArray:Array = new Array(16); // リンゴの画像を格納
private var imgNumber:int = 0;

public var eatNum:int = 0; // 食べたリンゴの数
public var eatenFlag:Boolean = false; // 食べ終わった時にtrueになる
public var ringoInitFlag:Boolean = true; // 初期のリンゴ画像かどうか

public function Apple()
{
// 画像初期設定
var bitmap:Bitmap = new Image0;
var srcbd:BitmapData = bitmap.bitmapData;
var k:int = 0;

for (var i:int = 0; i < 6; i++ ) {
for (var j:int = 0; j < 3; j++ ) {
var destbd:BitmapData = new BitmapData(32, 32);
destbd.copyPixels(srcbd, srcbd.rect, new Point(j * -32, i * -32));
imgArray[k] = new Bitmap(destbd);
imgArray[k].scaleX = 2;
imgArray[k].scaleY = 2;
imgArray[k].x = 168;
imgArray[k].y = 128;
k++;
if (k >= 16) break;
}
}
}

public function move(_xx:Number, _yy:Number):void
{
_x += _xx;
_y += _yy;

imgArray[0].x = _x;
imgArray[0].y = _y;
}

public function paint(p:Sprite):void
{
if (imgNumber != 0)
p.removeChildAt(0);
p.addChild(imgArray[imgNumber]);
}

public function hit(_mouseX:int, _mouseY:int):void
{
imgNumber++;
if (imgNumber >= 16) {
// 終了
eatenFlag = true;
ringoInitFlag = true; // 初期のリンゴ画像かどうか
imgNumber = 0;
}else {
// 最後の画像
if (imgNumber == 15) {
eatNum++; // リンゴ食べた数
}

sound_obj.play();
}
}

}

}