AS3-aSpaceEscape 迷宫脱离游戏(二)地图生成部分
这个游戏一开始,我们需要一个地图类,用来生成地图,这里我用的是方格的形式,每个方格Tile使用的是同一个类Tile.as,至于不同的Tile素材,只要在库里弄个元件,不同帧放上不同的素材,然后绑定Tile类就可以了。
Map类的代码是这样:
package org.nwhy.aSpaceEscape{
import flash.display.Sprite;
public class Map extends Sprite{
private var data:Array;
public function Map(mapData:Array){
data = mapData;
drawMap();
}
private function drawMap(){
var len:uint = data.length;
var tile:Tile;
for(var i:uint=0;i<len;i++){
for(var j:uint=0;j<Config.TILE_PERLINE;j++){
tile = new Tile(data[i][j]+1);
tile.x = j * Config.TILE_SIZE;
tile.y = i * Config.TILE_SIZE;
addChild(tile);
}
}
}
}
}
填充的Tile.as:
package org.nwhy.aSpaceEscape{
import flash.display.MovieClip;
public class Tile extends MovieClip{
private var tileID:uint;
public function Tile(id:uint){
tileID = id;
showTile();
}
private function showTile(){
gotoAndStop(tileID);
}
}
}
代码是相当的简单。给个tileID 然后跑到指定帧就可以了~
然后是配置文件:
package org.nwhy.aSpaceEscape{
public class Config{
public static const TILE_SIZE:uint = 30;
public static const TILE_PERLINE:uint = 12;//指定每行的Tile数,列数并不固定
public static const MAP:Array = [[[0,0,0,0,0,0,0,0,0,0,0,0],
[0,1,1,1,1,1,1,1,1,1,1,0],
[0,1,1,1,1,1,1,1,1,2,1,0],
[0,1,1,2,1,1,1,1,1,1,1,0],
[0,1,1,1,1,1,1,5,1,1,1,0],
[0,1,1,1,1,1,1,1,1,1,1,0],
[0,1,1,1,1,1,1,1,1,1,1,0],
[0,1,2,1,1,1,1,1,1,1,1,0],
[0,1,1,1,1,1,1,1,2,1,1,0],
[0,1,1,1,1,1,1,1,1,1,1,0],
[0,1,1,1,1,1,1,1,1,1,1,0],
[0,0,0,0,0,0,0,0,0,0,0,0]]];
public static const ROLE_POSITION:Array = [[2,2]];
}
}
AS3-aSpaceEscape 迷宫脱离游戏(一)分析
分享知识点:
1.Flash里的代码(Class,Actionscript)和库中的UI元件(MovieClip,Sprite)如何绑定。
2.KeyboardEvent,按键事件的绑定和处理。
3.如何把一个库中的UI元件加入到场景中。
4.stage的使用。
5.视图的刷新。
最近在想,做点什么Flash的分享好。在上一个周末,玩了一个Flash小游戏,觉得还不错,就写了一个。
来来来,咱来看一下Demo:
先来说说游戏的玩法,用小键盘的上下左右键控制移动那个看起来很嚣张的怪物,话说这个怪物是啥我也不知道……XX表情里扣出来的……
怪物只能直线移动,中途不能换方向,碰到树桩就会停下,跑出屏幕外就挂了(接着会被搬回到出发点),跑到Exit的地方就过关了。
是个很简单的游戏对吧,那应该怎么来实现呢?Follow me~
首先我们来整理一下需要的东西(PS:不包括素材):
1.怪物对象(Role Class);就是那个很嚣张的怪物
2.地图对象(Map Class);看到的全部方块的集合,包括树,出口
3.填充地图的对象(Tile Class);树,出口等
4.参数配置对象(Config Class/XML);
5.控制器(Controller Class);场景控制
6.etc;占位,可能会需要的东西
AS3-Caurina 动画类
今天玩了下Caurina类,和TweenLite的差别并不大,具体哪个好用,对我来说,TweenLite更熟悉点=,=
而老外(尤其是日本人)的Flash破解出来基本都是Caurina来作为Tween类,因为Caurina开源的关系么?
Caurina官方地址如下:http://hosted.zeh.com.br/tweener/docs/en-us/。
类包下载地址:http://code.google.com/p/tweener/downloads/list,看好版本再下载哈。
最简单的动画代码如下:
import caurina.transitions.Tweener;
Tweener.addTween(clip_mc,{x:500,time:1,transition:"easeOutBounce"});
让clip_mc的x位置花1s的时间运动到500位置,动画的ease为easeOutBounce。熟悉TweenLite的应该很快就可以熟悉Caurina了。至于addTween的详细参数,,自己看文档去~
下边来个结合Timer的Demo,来自flepstudio.org。
AS3-视频拍照功能
Demo:
下载地址:http://dl.dropbox.com/u/477487/flash/as3/AvatarEdit.rar,呵呵,老规矩,豆腐不保证这个链接的永久有效性哈哈。
AS3-getDefinitionByName
先来看下CS3版F1的介绍:
public function getDefinitionByName(name:String):Object
语言版本 : ActionScript 3.0
Player 版本 : Flash Player 9
返回 name 参数指定的类的类对象引用。
参数 name:String — 类的名称。
返回 Object — 返回 name 参数指定的类的类对象引用。
引发 ReferenceError — 不存在具有指定名称的公共定义。
下边是一个读取地图信息并显示的实例。文件有点多,先来看主文档,TD.as:
package{
import flash.display.Sprite;
import org.nwhy.TD.Config;
import org.nwhy.TD.Controller;
public class TD extends Sprite{
public var screen:Sprite;
public function TD(){
screen = new Sprite();
addChild(screen);
var game:Controller = new Controller(screen,new Config());
}
}
}
AS3-如何加载自身SWF
先看Demo,顺便介绍下MP3切割工具一枚"mp3spliter",再顺便鄙视下PR被降权了……
我们来看一下代码:
stop();
var tf_loadinfo:TextField = new TextField();
tf_loadinfo.autoSize = TextFieldAutoSize.CENTER;
tf_loadinfo.selectable=false;
tf_loadinfo.background = true;
var format:TextFormat = new TextFormat();
format.font = "Arial";
format.size = 12;
tf_loadinfo.defaultTextFormat = format;
addChild(tf_loadinfo);
root.loaderInfo.addEventListener(ProgressEvent.PROGRESS, showProgress);
root.loaderInfo.addEventListener(Event.COMPLETE, loadComplete);
function loadComplete(_e:Event):void {
removeChild(tf_loadinfo);
play();
}
function showProgress(_e:ProgressEvent):void {
var p:Number=_e.bytesLoaded/_e.bytesTotal;
var n:Number=Math.round(p*100);
tf_loadinfo.text='Loading '+n.toString()+'%';
setCenter(tf_loadinfo);
}
function setCenter(obj:Object) {
obj.x =(stage.stageWidth-obj.width)/2;
obj.y =(stage.stageHeight-obj.height)/2;
}
AS3-如何让TextField鼠标出现手形?
这个问题来自http://flash.9ria.com/thread-25870-1-1.html
我以前的处理方法是放空MC,也就是4楼的做法:
import flash.events.MouseEvent;
var txt:TextField = new TextField();
txt.text = "wonderful";
txt.x=200;
txt.y=200;
txt.autoSize = TextFieldAutoSize.LEFT;
addChild(txt);
var format:TextFormat = new TextFormat("Arial",30,0x9900000);
txt.setTextFormat(format);
var mc:Sprite = new Sprite();
mc.graphics.beginFill(0x000000,0);
mc.graphics.drawRect(txt.x,txt.y,txt.textWidth,txt.textHeight);
mc.buttonMode = true;
addChild(mc);
6楼的做法也不错,不过问题是这只能用在CS4里,CS3还不支持~
mytx.addEventListener(MouseEvent.MOUSE_OVER,mousesj1);
mytx.addEventListener(MouseEvent.MOUSE_OUT,mousesj2);
function mousesj1(e:MouseEvent) {
Mouse.cursor="button"; //当鼠标移到动态文本上时出现手形
}
function mousesj2(e:MouseEvent) {
Mouse.cursor="arrow"; //当鼠标离开动态文本时取消手形,恢复为箭头
}
AS3-对象的深度复制
内容转载自:http://blog.youmila.com/?p=241
AS3中通过ByteArray可以进行对象的深度拷贝:
import flash.utils.ByteArray;
import flash.utils.getQualifiedClassName;
import flash.net.*;
import src.*;
function cloneObject(source:Object) :* {
var typeName:String = getQualifiedClassName(source);//获取全名
trace(”输出类的结构”+typeName);
//return;
var packageName:String = typeName.split(”::”)[0];//切出包名
trace(”类的名称”+packageName);
var type:Class = getDefinitionByName(typeName) as Class;//获取Class
trace(type);
registerClassAlias(packageName, type);//注册Class
//复制对象
var copier:ByteArray = new ByteArray();
copier.writeObject(source);
copier.position = 0;
return copier.readObject();
}
有的人说用复制对象那一段不就可以了吗,但是实际上行不通。对于数组深度复制来说, 复制对象的后面4句代码就足够了。
var a1:Array=[1,2,3]; var a2:Array =cloneObject(a1); var a3:Array = a1; a1.push(”youmila”); trace(”a1:”+a1+”a2:”+a2+”a3″+a3);
AS3-Dynamically Creating Classes From XML
Learned from http://www.insideria.com/2009/10/dynamically-creating-classes-f.html
转自:http://www.insideria.com/2009/10/dynamically-creating-classes-f.html
不翻译了,大伙儿自个儿翻译……
Step 1: Create A Test Class
The first thing we need to do is make a test class for us to use. Create the following class in your project in a com.flashartofwar.example package.
package com.flashartofwar.example {
import flash.display.Sprite;
/**
* @author jessefreeman
*/
public class RedBox extends Sprite {
protected var _width:Number = 0;
protected var _height:Number = 0;
/**
* We override the public setter for width so we can redraw
* the box when the width is changed.
*/
override public function set width(value : Number) : void {
_width = value;
trace("Width", super.width);
redraw();
}
override public function get width() : Number {
return _width;
}
/**
* We override the public setter for width so we can redraw
* the box when the width is changed.
*/
override public function set height(value : Number) : void {
_height = value;
redraw();
}
override public function get height() : Number {
return _height;
}
public function RedBox() {
width = 100;
height = 100;
redraw();
}
/**
* This simply clears the graphics and redraws the box based
* on the new width and height.
*/
public function redraw():void
{
graphics.clear();
graphics.beginFill(0xFF0000);
graphics.drawRect(0, 0, width, height);
graphics.endFill();
}
}
}
Flash-一些常用物理公式和AS3的结合应用
来自《Foundation Actionscript 3.0 Animation: Making Things Move!》的物理公式:
向鼠标(或者任何一个点)旋转:
// 用要旋转到的 x, y 坐标替换 mouseX, mouseY dx = mouseX - sprite.x; dy = mouseY - sprite.y; sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;
创建波形:
// 将 x, y 或其它属性赋值给 Sprite 影片或影片剪辑,
// 作为绘图坐标,等等。
public function onEnterFrame(event:Event){
value = center + Math.sin(angle) * range;
angle += speed;
}
创建圆形:
// 将 x, y 或其它属性赋值给 Sprite 影片或影片剪辑,
// 作为绘图坐标,等等。
public function onEnterFrame(event:Event){
xposition = centerX + Math.cos(angle) * radius;
yposition = centerY + Math.sin(angle) * radius;
angle += speed;
}
LRC歌词同步的实现
本文内容来自[FL 车在臣]的LRC歌词同步。Demo如下:
曲子是豆腐很喜欢的一首,来自《高达SEED》的《晓の车》,在看代码之前,有兴趣的可以听一遍哈,很美。
这个东西的主要功能就是歌词(lrc)和曲子(mp3)的同步显示。
二维坐标系旋转在Flash中的应用
今天的内容比较枯燥,是纯数学的内容……

图示如上,我们假设点P0(x0,y0)旋转角度B之后到了点P1(x1,y1)。
注:按照惯例,逆时针旋转角度为正值,顺时针则为负值。
那么,现在根据坐标点,就有以下的4个方程式:
1.x0=R*cosA; 2.y0=R*sinA; 3.x1=R*cos(A+B); 4.y1=R*sin(A+B);
根据和差化积公式有:
sin(a+b)=sin(a)*cos(b)+cos(a)*sin(b); sin(a-b)=sin(a)*cos(b)-cos(a)*sin(b); cos(a+b)=cos(a)*cos(b)-sin(a)*sin(b); cos(a-b)=cos(a)*cos(b)+sin(a)*sin(b);