概要
トランプゲームのソリティア(クロンダイク)を作ってみましょう。
トランプ画像
コード(コメント有り)
Main.as
| + | ... |
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BlendMode;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.tweens.ITween;
public class Main extends Sprite
{
public function Main()
{
const SW:int = stage.stageWidth;
const SH:int = stage.stageHeight;
// BitmapDataにノイズをかける
var bd:BitmapData = new BitmapData(SW, SH, false);
bd.noise(0, 220, 255, 7, true);
// Spriteに円形緑グラデーションを付ける
var matrix:Matrix = new Matrix();
matrix.createGradientBox(SW, SH);
var canvas:Sprite = new Sprite();
canvas.graphics.beginGradientFill("radial", [0x1BB74C, 0x106F2F], [1.0, 1.0], [0, 255], matrix);
canvas.graphics.drawRect(0, 0, SW, SH);
canvas.graphics.endFill();
// ノイズ + 円形緑グラデーションをブレンドモード乗算
bd.draw(canvas, null, null, BlendMode.MULTIPLY);
addChild(new Bitmap(bd));
Card.create(); // 52枚生成
// 組札配置
for (var i:int = 0; i < 4; i++)
{
var card:Card = new Card(i, 0, Card.KUMI, false);
card.x = (i + 3) * (card.width + 20) + 20;
card.y = 40;
addChild(card);
}
// 場札配置
for (i = 0; i < 7; i++)
{
card = new Card(0, 0, Card.BA, false);
card.x = i * (card.width + 20) + 20;
card.y = 160;
addChild(card);
var prev:Card = card;
for (var j:int = 0; j < i; j++)
{
card = Card.getCard(Card.BA);
prev.addChild(card);
prev = card;
}
card = Card.getCard(Card.BA);
card.open();
prev.addChild(card);
}
// 山札配置
var yamaCardContainer:Card = new Card(0, 0, Card.KUMI, false);
yamaCardContainer.x = 20;
yamaCardContainer.y = 40;
yamaCardContainer.buttonMode = true;
yamaCardContainer.addEventListener(MouseEvent.CLICK, onMouseClick);
addChild(yamaCardContainer);
card = new Card(0, 1, 0, true);
card.mouseEnabled = false;
card.name = "yamaCard";
yamaCardContainer.addChild(card);
// 場札に配置した以外のカードを全て山札に
for each (var yamaCard:Card in Card.group)
{
yamaCard.x = card.x;
yamaCard.y = card.y;
yamaCard.position = Card.YAMA;
yamaCard.visible = false;
}
}
private var index:int = 0;
private var yamaCardTween:ITween = BetweenAS3.func(function():void { } );
// 山札の表示
private function onMouseClick(event:MouseEvent):void
{
if (Card.tween.isPlaying) return;
if (yamaCardTween.isPlaying) return;
var yamaCardCotnainer:Card = event.currentTarget as Card;
// 山札に一枚以上のカードがあればそれを表示
if (index < Card.group.length)
{
var card:Card = Card.group[index++];
card.x = yamaCardCotnainer.x;
card.y = yamaCardCotnainer.y;
addChild(card);
card.visible = true;
card.mouseEnabled = false;
card.open();
yamaCardTween =
BetweenAS3.serial
(
BetweenAS3.tween(card, { $x:card.width + 20 }, null, 0.3),
BetweenAS3.func(function(card:Card):void { card.mouseEnabled = true; }, [card])
);
yamaCardTween.play();
if (index == Card.group.length)
{
yamaCardCotnainer.getChildByName("yamaCard").visible = false;
}
}
// 一枚もカードがない状態で山札をクリックされたら右のカードを全て非表示。インデックスを0に戻す
else
{
index = 0;
if (Card.group.length > 0)
{
yamaCardCotnainer.getChildByName("yamaCard").visible = true;
for each (var yamaCard:Card in Card.group)
{
yamaCard.visible = false;
}
}
}
}
}
}
|
Card.as
| + | ... |
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.tweens.ITween;
public class Card extends Sprite
{
[Embed(source = "trump.gif")]
private static var TrumpImage:Class; // トランプ画像
private static var trump:BitmapData; //
private static const WIDTH:int = 56; // トランプ一枚の幅
private static const HEIGHT:int = 80; // トランプ一枚の高さ
public static const SPADE:int = 0; // スペード
public static const HEART:int = 1; // ハート
public static const CLUB:int = 2; // クラブ
public static const DIAMOND:int = 3; // ダイア
public static const YAMA:int = 0; // 左上の山札
public static const BA:int = 1; // 場札
public static const KUMI:int = 2; // 右上の組札
public static var group/*Card*/:Array = []; // カード52枚
public var number:int; // カードの数字
public var type:int; // カードの種類(絵柄)
public var position:int; // カードが置かれている位置(YAMA/BA/KUMI)
public var hidden:Boolean = false; // hiddenがtrueならカードを裏返している状態
private var last:Point = new Point(); // ドラッグ開始時の位置
private var lastParent:Sprite; // 移動する前の親
public static var tween:ITween = BetweenAS3.func(function():void { } );
private var bd:BitmapData; // カード画像
// トランプ52枚をシャッフルしてgroup配列に入れる
public static function create():void
{
trump = Bitmap(new TrumpImage()).bitmapData;
for (var i:int = 0; i < 4; i++)
{
for (var j:int = 1; j <= 13; j++)
{
var card:Card = new Card(i, j, 0, true);
group.push(card);
}
}
group = shuffle(group);
}
// positionを指定して、カード一枚を返す
public static function getCard(position:int):Card
{
var card:Card = Card.group.shift();
card.position = position;
return card;
}
// 配列をシャッフルするutil関数
public static function shuffle(data:Array):Array
{
var temp:Array = data.slice();
var dest:Array = new Array();
while (temp.length > 0)
{
var index:int = Math.random() * temp.length;
dest.push(temp[index]);
temp.splice(index, 1);
}
return dest;
}
public function Card(type:int, number:int, position:int, hidden:Boolean)
{
this.type = type;
this.number = number;
this.position = position;
this.hidden = hidden;
// getObjectsUnderPoint()用にカードの描画範囲を確保
graphics.beginFill(0x0, 0);
graphics.drawRect(0, 0, WIDTH, HEIGHT);
graphics.endFill();
bd = new BitmapData(WIDTH, HEIGHT, true, 0x0);
addChild(new Bitmap(bd));
if (number == 0 || hidden)
{
var heightIndex:int = (number == 0) ? 1 : 0;
bd.copyPixels(trump, new Rectangle(0, heightIndex * HEIGHT, WIDTH, HEIGHT), new Point());
}
else open();
}
// 裏返っているカードを裏返して普通表示
public function open():void
{
hidden = false;
bd.copyPixels(trump, new Rectangle(number * WIDTH, type * HEIGHT, WIDTH, HEIGHT), new Point());
this.buttonMode = true;
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private function onMouseDown(event:MouseEvent):void
{
event.stopPropagation(); // 親にMOUSE_DOWNイベントを渡さないように
if (tween.isPlaying) return; // カード移動中はドラッグ禁止
lastParent = this.parent as Sprite; // 親情報を保持
if (lastParent == null) return;
var point:Point = lastParent.localToGlobal(new Point(this.x, this.y));
this.x = last.x = point.x; // stage基準の位置に変更
this.y = last.y = point.y;
stage.addChild(this); // stageに貼りつけてこれからドラッグするカードを一番手前に表示する
startDrag(false); // ドラッグ開始
}
private function onMouseUp(event:MouseEvent):void
{
stopDrag(); // ドラッグ終了
// ドラッグし終わった位置にあるオブジェクトを全取得
var data:Array = stage.getObjectsUnderPoint(localToGlobal(new Point(WIDTH / 2, HEIGHT / 2))).reverse();
var target:Card;
// ドラッグし終わった位置にあるカードを取得
for each (var object:Object in data)
{
if (object is Card && object != this && !this.contains(Card(object)))
{
target = object as Card;
break;
}
}
if (target)
{
// ドラッグしてカードを移動できる条件
// 組札でかつ、既に置いてあるカードと同種類でかつ、自分の値が一つ大きい
// 組札の先頭でかつ、自分の値が1である(1のカードなら組札先頭の4箇所どこでも置けるため)
// 場札でかつ、既に置いてあるカードと色が違っていてかつ、自分の値が一つ小さい
// 場札の先頭でかつ、自分の値が13(キングなら場札先頭どこでも置けるため)
if (target.position == Card.KUMI && target.type == this.type && target.number == this.number - 1 ||
target.position == Card.KUMI && target.number == 0 && this.number == 1 ||
target.position == Card.BA && target.type + this.type % 2 && target.number == this.number + 1 ||
target.position == Card.BA && target.number == 0 && this.number == 13)
{
if (this.position == Card.YAMA)
{
Card.group.splice(Card.group.indexOf(this), 1);
}
this.position = target.position;
var p:Sprite = lastParent;
if (p is Card && Card(p).hidden) Card(p).open();
target.addChild(this);
}
else
{
moveLastPosition();
}
}
else
{
moveLastPosition();
}
}
override public function addChild(child:DisplayObject):DisplayObject
{
if (child is Card)
{
child.x = 0;
if (this.number == 0 || this.position == Card.KUMI) child.y = 0;
else if (this.hidden) child.y = 10;
else child.y = 17;
}
return super.addChild(child);
}
// カードをドラッグした位置に置けない場合、もとの位置に戻す処理
private function moveLastPosition():void
{
if (!tween.isPlaying && lastParent && this.parent != lastParent)
{
var instance:Sprite = this;
tween = BetweenAS3.tween(this, { x:last.x, y:last.y }, null, 0.3);
tween.onComplete = function(lastParent:Sprite):void { lastParent.addChild(instance); }
tween.onCompleteParams = [lastParent];
tween.play();
}
}
}
}
|
コード(コメント無し)
Main.as
| + | ... |
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BlendMode;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.tweens.ITween;
public class Main extends Sprite
{
public function Main()
{
const SW:int = stage.stageWidth;
const SH:int = stage.stageHeight;
var bd:BitmapData = new BitmapData(SW, SH, false);
bd.noise(0, 220, 255, 7, true);
var matrix:Matrix = new Matrix();
matrix.createGradientBox(SW, SH);
var canvas:Sprite = new Sprite();
canvas.graphics.beginGradientFill("radial", [0x1BB74C, 0x106F2F], [1.0, 1.0], [0, 255], matrix);
canvas.graphics.drawRect(0, 0, SW, SH);
canvas.graphics.endFill();
bd.draw(canvas, null, null, BlendMode.MULTIPLY);
addChild(new Bitmap(bd));
Style.embedFonts = false;
Card.create();
for (var i:int = 0; i < 4; i++)
{
var card:Card = new Card(i, 0, Card.KUMI, false);
card.x = (i + 3) * (card.width + 20) + 20;
card.y = 40;
addChild(card);
}
for (i = 0; i < 7; i++)
{
card = new Card(0, 0, Card.BA, false);
card.x = i * (card.width + 20) + 20;
card.y = 160;
addChild(card);
var prev:Card = card;
for (var j:int = 0; j < i; j++)
{
card = Card.getCard(Card.BA);
prev.addChild(card);
prev = card;
}
card = Card.getCard(Card.BA);
card.open();
prev.addChild(card);
}
var yamaCardContainer:Card = new Card(0, 0, Card.KUMI, false);
yamaCardContainer.x = 20;
yamaCardContainer.y = 40;
yamaCardContainer.buttonMode = true;
yamaCardContainer.addEventListener(MouseEvent.CLICK, onMouseClick);
addChild(yamaCardContainer);
card = new Card(0, 1, 0, true);
card.mouseEnabled = false;
card.name = "yamaCard";
yamaCardContainer.addChild(card);
for each (var yamaCard:Card in Card.group)
{
yamaCard.x = card.x;
yamaCard.y = card.y;
yamaCard.position = Card.YAMA;
yamaCard.visible = false;
}
}
private var index:int = 0;
private var yamaCardTween:ITween = BetweenAS3.func(function():void { } );
private function onMouseClick(event:MouseEvent):void
{
if (Card.tween.isPlaying) return;
if (yamaCardTween.isPlaying) return;
var yamaCardCotnainer:Card = event.currentTarget as Card;
if (index < Card.group.length)
{
var card:Card = Card.group[index++];
card.x = yamaCardCotnainer.x;
card.y = yamaCardCotnainer.y;
addChild(card);
card.visible = true;
card.mouseEnabled = false;
card.open();
yamaCardTween =
BetweenAS3.serial
(
BetweenAS3.tween(card, { $x:card.width + 20 }, null, 0.3),
BetweenAS3.func(function(card:Card):void { card.mouseEnabled = true; }, [card])
);
yamaCardTween.play();
if (index == Card.group.length)
{
yamaCardCotnainer.getChildByName("yamaCard").visible = false;
}
}
else
{
index = 0;
if (Card.group.length > 0)
{
yamaCardCotnainer.getChildByName("yamaCard").visible = true;
for each (var yamaCard:Card in Card.group)
{
yamaCard.visible = false;
}
}
}
}
}
}
|
Card.as
| + | ... |
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.tweens.ITween;
public class Card extends Sprite
{
[Embed(source = "trump.gif")]
private static var TrumpImage:Class;
private static var trump:BitmapData;
private static const WIDTH:int = 56;
private static const HEIGHT:int = 80;
public static const SPADE:int = 0;
public static const HEART:int = 1;
public static const CLUB:int = 2;
public static const DIAMOND:int = 3;
public static const YAMA:int = 0;
public static const BA:int = 1;
public static const KUMI:int = 2;
public static var group/*Card*/:Array = [];
public var number:int;
public var type:int;
public var position:int;
public var hidden:Boolean = false;
private var last:Point = new Point();
private var lastParent:Sprite;
public static var tween:ITween = BetweenAS3.func(function():void { } );
private var bd:BitmapData;
public static function create():void
{
trump = Bitmap(new TrumpImage()).bitmapData;
for (var i:int = 0; i < 4; i++)
{
for (var j:int = 1; j <= 13; j++)
{
var card:Card = new Card(i, j, 0, true);
group.push(card);
}
}
group = shuffle(group);
}
public static function getCard(position:int):Card
{
var card:Card = Card.group.shift();
card.position = position;
return card;
}
public static function shuffle(data:Array):Array
{
var temp:Array = data.slice();
var dest:Array = new Array();
while (temp.length > 0)
{
var index:int = Math.random() * temp.length;
dest.push(temp[index]);
temp.splice(index, 1);
}
return dest;
}
public function Card(type:int, number:int, position:int, hidden:Boolean)
{
this.type = type;
this.number = number;
this.position = position;
this.hidden = hidden;
graphics.beginFill(0x0, 0);
graphics.drawRect(0, 0, WIDTH, HEIGHT);
graphics.endFill();
bd = new BitmapData(WIDTH, HEIGHT, true, 0x0);
addChild(new Bitmap(bd));
if (number == 0 || hidden)
{
var heightIndex:int = (number == 0) ? 1 : 0;
bd.copyPixels(trump, new Rectangle(0, heightIndex * HEIGHT, WIDTH, HEIGHT), new Point());
}
else open();
}
public function open():void
{
hidden = false;
bd.copyPixels(trump, new Rectangle(number * WIDTH, type * HEIGHT, WIDTH, HEIGHT), new Point());
this.buttonMode = true;
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private function onMouseDown(event:MouseEvent):void
{
event.stopPropagation();
if (tween.isPlaying) return;
lastParent = this.parent as Sprite;
if (lastParent == null) return;
var point:Point = lastParent.localToGlobal(new Point(this.x, this.y));
this.x = last.x = point.x;
this.y = last.y = point.y;
stage.addChild(this);
startDrag(false);
}
private function onMouseUp(event:MouseEvent):void
{
stopDrag();
var data:Array = stage.getObjectsUnderPoint(localToGlobal(new Point(WIDTH / 2, HEIGHT / 2))).reverse();
var target:Card;
for each (var object:Object in data)
{
if (object is Card && object != this && !this.contains(Card(object)))
{
target = object as Card;
break;
}
}
if (target)
{
if (target.position == Card.KUMI && target.type == this.type && target.number == this.number - 1 ||
target.position == Card.KUMI && target.number == 0 && this.number == 1 ||
target.position == Card.BA && target.type + this.type % 2 && target.number == this.number + 1 ||
target.position == Card.BA && target.number == 0 && this.number == 13)
{
if (this.position == Card.YAMA)
{
Card.group.splice(Card.group.indexOf(this), 1);
}
this.position = target.position;
var p:Sprite = lastParent;
if (p is Card && Card(p).hidden) Card(p).open();
target.addChild(this);
}
else
{
moveLastPosition();
}
}
else
{
moveLastPosition();
}
}
override public function addChild(child:DisplayObject):DisplayObject
{
if (child is Card)
{
child.x = 0;
if (this.number == 0 || this.position == Card.KUMI) child.y = 0;
else if (this.hidden) child.y = 10;
else child.y = 17;
}
return super.addChild(child);
}
private function moveLastPosition():void
{
if (!tween.isPlaying && lastParent && this.parent != lastParent)
{
var instance:Sprite = this;
tween = BetweenAS3.tween(this, { x:last.x, y:last.y }, null, 0.3);
tween.onComplete = function(lastParent:Sprite):void { lastParent.addChild(instance); }
tween.onCompleteParams = [lastParent];
tween.play();
}
}
}
}
|
実行結果
添付ファイル
このwikiの更新情報RSS