キャラチェンジ forked from: ワンダフルクエスト
forked from 画像表示のみ forked from: ワンダフルクエスト (diff: 218)
[c]でキャラチェンジ [カーソルキー]でキャラ操作。 地形の当たり判定をしてないので「通れない地形」は現段階では無し。
♥0 |
Line 229 |
Modified 2013-07-11 12:04:52 |
MIT License
archived:2017-03-20 10:40:03
| (replaced)
ActionScript3 source code
/**
* Copyright itouhiro ( http://wonderfl.net/user/itouhiro )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/4Ewd
*/
// forked from itouhiro's "画像表示のみ forked from: ワンダフルクエスト"
// forked from siouxcitizen's "forked from: ワンダフルクエスト" http://wonderfl.net/c/fMu8
/**=====================================================
* 画像をassets.wonderfl.netにアップロードして、表示をためします
* ===================================================== */
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
/**
* ...
* @author itouhiro
*/
[SWF(width="465", height="465", frameRate="30", backgroundColor="0xEEEEEE")]
public class Main extends Sprite {
private var preload:Preloader;
static public var loading:int = 0;
public function Main():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
preload = new Preloader();
trace('preload');
addEventListener(Event.ENTER_FRAME, preloadHandler);
}
private function preloadHandler(e:Event):void {
if (loading <= 0) return;
removeEventListener(Event.ENTER_FRAME, preloadHandler);
gamePlay();
}
private function gamePlay():void {
var wld:World = new World(Bitmap(preload.get().content), stage);
addChild(wld);
}
}
}
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.ProgressEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.ui.Keyboard;
class Preloader extends Sprite{
private var preloadText:TextField = null;
private var ld:Loader;
public function Preloader():void {
trace('constructor');
ld = new Loader();
ld.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
ld.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgressHandler);
ld.load(new URLRequest('http://assets.wonderfl.net/images/related_images/0/03/03e1/03e140c0fe09a4055ea74ea7b74af1c1a963ef68'), new LoaderContext(true));
}
public function get():Loader {
return ld;
}
private function loadCompleteHandler(e:Event):void {
removeChild(preloadText);
Main.loading++;
}
private function loadProgressHandler(e:ProgressEvent):void {
if ( ! preloadText) {
//preloader
preloadText = new TextField();
preloadText.x = 160; preloadText.y = 12; preloadText.width = 160;
preloadText.defaultTextFormat = new TextFormat('Verdana', 16, 0x000000);
preloadText.text = 'Loading: 0 %';
addChild(preloadText);
}
var percentLoaded:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
preloadText.text = 'Loading: ' + percentLoaded + ' %';
trace('Loading: ' + percentLoaded + ' %');
}
}
class World extends Sprite {
private var mapCharaTip:BitmapData;
private var charaTip:Array;
private var mapTable:Array;
private var block:Array; //mapを人が通過できるかどうか。false..通れる、true..通行不可
private var hero:Actor;
private var scrn:Sprite;
private var mv:Array = [0, 0];
private var cnt:int = 0;
public function World(img:Bitmap,stg:Stage):void {
//画像の縦横比を3倍にしてmapCharaTipにcopy
mapCharaTip = new BitmapData(img.width * 3, img.height * 3, true, 0x00000000);
var matrix:Matrix = new Matrix(); matrix.scale(3, 3);
mapCharaTip.draw(img, matrix);
var w:int, h:int;
//地形をbgDataに配置
//[0]芝生, [1]砂, [2]石畳, [3]フローリング, [4]橋(縦), [5]橋(横), [6]木(小), [7]木(大),
//[8]サボテン, [9]水, [10]壁(石), [11]壁(木), [12]壁(武器屋), [13]壁(防具屋), [14]壁(宿屋), [15]壺,
//[16]タンス, [17]石像, [18]真っ暗
block = [
false, false, false, false, false, false, true, true,
true, true, true, true, true, true, true, true,
true, true, true, true
];
var mapTable:Array = [
[ 0, 9, 0, 0, 0, 0, 1, 0, 0, 0],
[ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 9, 0, 0, 0, 0, 0, 0, 6, 0],
[ 0, 9, 0, 0, 0, 0, 0, 0, 0, 0],
[ 1, 9, 0, 0, 0, 0, 0, 0, 0, 0],
[ 1, 9, 9, 9, 9, 9, 9, 4, 4, 9],
[ 1, 0, 0, 0, 9, 9, 0, 0, 0, 0],
[ 1, 1, 0, 0, 5, 5, 0, 0, 0, 0],
[ 1, 1, 1, 9, 9, 9, 9, 0, 0, 1],
];
var bgData:BitmapData = new BitmapData(mapTable[y].length * 48, mapTable.length * 48, false, 0x333333);
for (h = 0; h < mapTable.length; h++) {
for (w = 0; w < mapTable[h].length; w++) {
bgData.copyPixels(mapCharaTip, new Rectangle(mapTable[h][w]*48, 0, 48, 48), new Point(w*48, h*48));
}
}
//キャラの[種類][パターン]ごとにcharaTipに登録
charaTip = [];
for (h = 1; h < mapCharaTip.height / 48; h++) {
charaTip[h] = [];
for (w = 0; w < mapCharaTip.width / 48; w++) {
var charaData:BitmapData = new BitmapData(48, 48, true, 0x00000000);
charaData.copyPixels(mapCharaTip, new Rectangle(w*48, h*48, 48, 48), new Point(0,0));
charaTip[h][w] = new Bitmap(charaData);
}
}
//画面表示
scrn = new Sprite(); //screen
var bg:Bitmap = new Bitmap(bgData);
scrn.addChild(bg);
//キャラ表示
hero = new Actor(charaTip);
hero.x = int(mapTable[0].length/2)*48;
hero.y = int(mapTable.length/2)*48;
scrn.addChild(hero);
scrn.x = stg.stageWidth / 2 - 24 - hero.x;
scrn.y = stg.stageHeight / 2 - 24 - hero.y;
addChild(scrn);
stg.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void {
cnt = (cnt + 1) % 15; //frameRate/2
if (cnt === 0) hero.patt();
var u:int = 4; //unit
if (mv[0] !== 0) {
if (mv[0] > 0) {
scrn.x -= u;
hero.x += u;
mv[0] -= u;
} else {
scrn.x += u;
hero.x -= u;
mv[0] += u;
}
}
if (mv[1] !== 0) {
if (mv[1] > 0) {
scrn.y -= u;
hero.y += u;
mv[1] -= u;
} else {
scrn.y += u;
hero.y -= u;
mv[1] += u;
}
}
}
private function keyDownHandler(e:KeyboardEvent):void {
if (mv[0] !== 0 || mv[1] !== 0) return;
if (e.keyCode === Keyboard.UP) {
mv = hero.move(Actor.UP);
} else if (e.keyCode === Keyboard.DOWN) {
mv = hero.move(Actor.DOWN);
} else if (e.keyCode === Keyboard.RIGHT) {
mv = hero.move(Actor.RIGHT);
} else if (e.keyCode === Keyboard.LEFT) {
mv = hero.move(Actor.LEFT);
} else if (e.keyCode === Keyboard.C) {
hero.changeChara();
}
}
public function isMovable(ax:int, ay:int):Boolean {
return block[mapTable[ay][ax]];
}
}
class Actor extends Sprite {
public static const UP:int = 2; //enum
public static const DOWN:int = 0;
public static const RIGHT:int = 4;
public static const LEFT:int = 6;
private var lastdir:int = 0; //向き
private var lastpatt:int = 0;
private var charas:Array = [];
private var charaIndex:int = 0;
private var bitmaps:Array = [];
private const u:int = 48; //unit
private var pattern:int = 0;
public function Actor(kind:Array):void {
charas = kind;
bitmaps = charas[charaIndex + 1];
addChild(bitmaps[lastdir+lastpatt]);
}
public function move(direction:int):Array {
removeChild(bitmaps[lastdir+lastpatt]);
lastdir = direction;
addChild(bitmaps[lastdir+lastpatt]);
switch (direction) {
case Actor.DOWN:
return [0, u];
case Actor.UP:
return [0, -u];
case Actor.RIGHT:
return [u, 0];
case Actor.LEFT:
return [-u, 0];
}
return [0,0];
}
public function patt():void {
removeChild(bitmaps[lastdir+lastpatt]);
pattern = (pattern + 1) % 2;
lastpatt = pattern;
addChild(bitmaps[lastdir+lastpatt]);
}
public function changeChara():void {
removeChild(bitmaps[lastdir+lastpatt]);
charaIndex = (charaIndex + 1) % 4;
bitmaps = charas[charaIndex + 1];
addChild(bitmaps[lastdir+lastpatt]);
}
}