DFdou's Blog Life is short,Be yourself.

402/100

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]];
	}
}
Tagged as: No Comments
302/100

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;占位,可能会需要的东西

Tagged as: No Comments
2611/091

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

2411/090

AS3-SharedObject Flash的Cookie

该从何讲起呢,,先说浏览器的Cookie吧,可以方便的记录一些东西,但是Flash就比较麻烦了,如果要操作Cookie,还得借助其他语言,js,php,asp?着实有点让人不爽,不过Adobe给了个SharedObject给大家玩,借助这个东西保存客户端的信息就比较easy了,来,咱来看个Demo:

Demo代码:

import org.nwhy.utils.*;
init();
function init() {
	var ckie:FlashCookie=new FlashCookie("nwhy");
	if (ckie.data.txt) {
		txt.text=ckie.data.txt;
	} else {
		txt.text="暂无数据";
	}
	btn.addEventListener(MouseEvent.CLICK,saveCookie);
	function saveCookie(_e:MouseEvent) {
		ckie.data.txt=txt.text;
		ckie.flush();
	}
	btnClear.addEventListener(MouseEvent.CLICK,clearCookie);
	function clearCookie(_e:MouseEvent) {
		ckie.clear();
	}
}

是不是跟Cookie一样顺手?

2311/093

AS3-Captcha验证码类

忽然想做个Flash版的验证码,于是就做了,先来看下Demo:

哈哈,是不是觉得最后那个验证码很变态=。=

2011/090

AS3-Effect explode 图片爆炸效果

这个需求是昨天碰到的,怎么说呢,怪怪的,主要是想不出可以模拟爆炸效果的公式。
先来看Demo:

1211/090

AS3-视频拍照功能

Demo:


下载地址:http://dl.dropbox.com/u/477487/flash/as3/AvatarEdit.rar,呵呵,老规矩,豆腐不保证这个链接的永久有效性哈哈。

3010/092

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());
		}
	}
}
2710/091

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;
}
2610/090

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";        //当鼠标离开动态文本时取消手形,恢复为箭头
}
1910/090

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);
3009/090

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();
   		}
  	}
}
Tagged as: , , Continue reading
709/091

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;
}
409/090

LRC歌词同步的实现

本文内容来自[FL 车在臣]的LRC歌词同步。Demo如下:


曲子是豆腐很喜欢的一首,来自《高达SEED》的《晓の车》,在看代码之前,有兴趣的可以听一遍哈,很美。
这个东西的主要功能就是歌词(lrc)和曲子(mp3)的同步显示。

Tagged as: , Continue reading
309/090

二维坐标系旋转在Flash中的应用

今天的内容比较枯燥,是纯数学的内容……
rotate
图示如上,我们假设点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);
Tagged as: , Continue reading
Page 1 of 612345...Last »