夜鹰教程网-程序员的加油站
 当前位置:文章中心 >> 技术辅导
Flash游戏开发常用函数(上)
夜鹰教程网 来源:www.yyjcw.com 日期:2016-10-28 13:16:41
Flash游戏开发常用函数
对象数组
比如要构建一个有很多属性的数组,简单的可以这样做:
2004 代码:
var a:Array = new Array();
for (var i = 0; i<10; i++) {
a = new Object();
a.x = 10;
a.y = 10*i;
a.name = "---";
a.id = i;
// 随便你给什么属性啊。
}
////先用局部变量存储对象会更好一点。
var a=new Array()
for(var i=0;i<10;i++){
var ta=new Object();
ta.x=10;
ta.y=10;
ta.name="n"+i;
a.push(ta);
}
////或者更简便一点的方法:
var a=new Array()
for(var i=0;i<10;i++){
a={x:10,y:10,name:"n"+i}
}


■■■程序控制角色运动
下面这段代码控制 MovieClip mc 从 (50,50) 横向运动到(100,50) 停止,速度为 5 pixel:
mc._x = mc._y=50;
mc.onEnterFrame = function() {
_x += 5;
trace(_x);
if (_x == 100) {
delete (mc.onEnterFrame);
}
};


■■■精确计时
我们设定了时间为 60 秒,然后通过 setInterval 来定期(每1000milliseconds)触发一个函数 runTimer。
function runTimer 用来计时,当时间到了以后,转去执行 outThere。
function outThere 用来处理时间到了以后的动作,不要忘记 clearInterval(intervalID),停止计时。
var time:Number = 60;
var intervalID:Number;
intervalID = setInterval(runTimer, 1000);
function runTimer() {
time--;
trace(time);
if (time == 0) {
outThere();
}
}
function outThere() {
// blah blah blah
clearInterval(intervalID);
}


■■■找到目前最小的一个可用的深度 Depth(来自国外)
针对 Flash Player 6 的:
availTopDepth = function () {
var allDepths = [];
for (var z in _root) {
if (_root[z] instanceof Button || _root[z] instanceof MovieClip || _root[z] instanceof TextField) {
allDepths.push(_root[z].getDepth());
}
}
if (allDepths.length != 0) {
sortAll = function (a, b) { if (ab) {return 1;} else {return 0;}};
allDepths.sort(sortAll);
return (parseInt(allDepths[allDepths.length-1])+1);
}
};
trace(_root.availTopDepth());
放置一个 MovieClip 在 Stage,再执行这段 Action 就会得到最近的一个可用深度。我们也可以用这个来创建绝对不

会出问题的 MovieClip,比如:
_root.createEmptyMovieClip("mc_name", availTopDepth());
getNextHighestDepth() 以及 getInstanceAtDepth(depth)是 for player 7 的。


■■■鼠标消隐
鼠标消隐之后,右健弹出菜单,鼠标就又出现了,并且一直保留着~
完整的解决方法是:在 左健抬起、右健第二次抬起、回车键抬起的时候再次消隐鼠标。
完整的方法比较复杂,下面是一个简单的解决方法,可以解决绝大多数的问题:
(){
if(Key.isDown(1)|| Key.isDown(Key.ENTER)){
Mouse.hide();
}
}


■■■我常用的一个加速度移动的代码
//以下代码放到主场景第一帧
stop();
_global.a = 5;
//移动加速度,越大越慢
_global.click_x = 0;
//用来记录点击鼠标的位置
_global.click_y = 0;
_root.onMouseDown = function() {
_global.click_x = _root._xmouse;
_global.click_y = _root._ymouse;
//me是受控mc的instance name
me.onEnterFrame = function() {
if (Math.abs(_global.click_x-me._x)<2 && Math.abs(_global.click_y-me._y)<2) {
//如果已经基本移到了鼠标点过的位置就取消这个事件句柄的响应程序
delete (this.onEnterFrame);
return;
} else {
//控制移动
me._x += (_global.click_x-me._x)/_global.a;
me._y += (_global.click_y-me._y)/_global.a;
}
};
};
//////以下部分可选
//a_v是个可以输入的文本框,用来输入加速度,即可以自定义速度,方便调试
a_v.onChanged = function() {
if (a_v.text == "" || Number(a_v.text)>1000 || Number(a_v.text)<0) {
//default value
a_v.text = 5;
} else {
_global.a = Number(a_v.text) ? Number(a_v.text) : 5;
//trace(_global.a);
}
};


■■■随机输出1到100而不从复的语句~~~
seq = new Array(100);
pArray = new Array(100);
function makeRandom() {
for (i=1; i<=100; i++) {
seq = "A";
}
}
function mRandom() {
while (true) {
n = int(random(100))+1;
if (seq[n] == "A") {
seq[n] = "0";
break;
}
}
return (n);
}
function rArray() {
for (i=1; i<=100; i++) {
pArray = mRandom();
trace(pArray);
}
}
stop();


■■■偷梁换柱~~~
我们可以用这样一个技巧,在某些函数外部加一些东西而不需要了解函数的代码~~
比如,假如当前有很多mc 覆盖了onEnterFrame函数,我们可以这样了解那些在_root下的mc 的onEnterFrame函

数是以什么顺序执行的:
代码:
for(var i in _root){
if(_root.onEnterFrame != null){//如果这个Object实现了onEnterFrame接口的话
_root.oldFunc = _root.onEnterFrame;//首先保存原来的onEnterFrame的句柄
_root.onEnterFrame = function(){//然后开始替换了~~加上一层壳~~
trace(this+ ": onEnterFrame Called.");
this.oldFunc();//我们用保留的句柄调用原来的函数
trace(this+ ": onEnterFrame Returned.");
}
}
}
如果要取消这些附加的操作:
代码:
for(var i in _root){
if(_root.oldFunc!= null){//如果发现改过得痕迹
_root.onEnterFrame = _root.oldFunc;
delete(oldFunc);
}
}
呵呵这些操作的关键在于 flash里面的引用机制:
所有函数名都是引用,而函数本身是浮在数据的海洋里面的。如果没有任何变量引用他,他就会被回收。如果有,

他就不会被回收。所以有着样一个有趣的事情:delete函数不会删掉任何东西,除了要求删掉的那个名字:(和java

机制相似,而和C不同)

a= function(){trace("Function a called");}
b=a;
delete(a);//除了a这个名字被删掉以外,没有任何事情发生
b();

函数通过this得到其调用者的实例。


■■■MovieClipPlus.as
定义了一些简单的MC操作
//画点:由于flash没有画点,那我们就画短线
MovieClip.prototype.point = OxMovieClipPoint;
function OxMovieClipPoint(x, y) {
this.moveTo(x, y);
this.lineTo(x+1, y);
}
//画矩形,左上角x1,y1 右下角x2,y2, 颜色rgb, 不透明度alpha
MovieClip.prototype.rect = OxMovieClipRect;
function OxMovieClipRect(x1, y1, x2, y2, rgb, alpha) {
this.beginFill(rgb, alpha);
this.moveTo(x1, y1);
this.lineTo(x1, y2);
this.lineTo(x2, y2);
this.lineTo(x2, y1);
this.lineTo(x1, y1);
this.endFill();
}
//画圆:这么bt的冬冬当然不是我写的,作者素Jody Keating
//圆心x,y ,半径r
MovieClip.prototype.circle = OxMovieClipCircle;
function OxMovieClipCircle(x, y, r) {
var a = r*0.414213562;
var b = r*0.707106781;
this.moveTo(x+r, y);
this.curveTo(x+r, y-a, x+b, y-b);
this.curveTo(x+a, y-r, x, y-r);
this.curveTo(x-a, y-r, x-b, y-b);
this.curveTo(x-r, y-a, x-r, y);
this.curveTo(x-r, y+a, x-b, y+b);
this.curveTo(x-a, y+r, x, y+r);
this.curveTo(x+a, y+r, x+b, y+b);
this.curveTo(x+r, y+a, x+r, y);
}


■■■两点间的直线移动
var s = 15;
_root.onMouseDown = function() {
var oldM_x = _root._xmouse;
var oldM_y = _root._ymouse;
ax = aa._x;
ay = aa._y;
dis = Math.sqrt((oldM_x-ax)*(oldM_x-ax)+(oldM_y-ay)*(oldM_y-ay));
xa = (oldM_x-ax)/dis;
ya = (oldM_y-ay)/dis;
amove();
};
function amove() {
onEnterFrame = function () {
aa._x += s*xa;
aa._y += s*ya;
if (Math.sqrt((aa._x-ax)*(aa._x-ax)+(aa._y-ay)*(aa._y-ay))>dis) {
delete onEnterFrame;
}
};
}


■■■计算两个对象之间/两点之间的距离(注册点)
function getDistanceOf(target1, target2, x2, y2) {
if (arguments.length == 4) {
dx = x2-target1;
dy = y2-target2;
} else if (arguments.length == 2) {
dx = target2._x-target1._x;
dy = target2._y-target1._y;
}
return Math.sqrt(dx*dx+dy*dy);
}
//Arguments 对象是一个数组,其中包含作为参数传递给任何函数的值。每次在动作脚本中调用函数时,都会为该函

数自动创建 Arguments 对象。同时还会创建一个局部变量 arguments,使您可引用 arguments 对象。

■■■让播放的MC暂停一段时间
function pausePlay(sec) {
pfunc = function () {
this.play();
clearInterval(this.pint);
}
stop();
this.pint = setInterval(this, "pfunc", sec*1000);
}
//这样调用.sec是暂停的时间,单位是秒.
pausePlay(2);


■■■onHitTest(target),自己写的一个MC事件,当该MC与指定的MC hitTest的时候触发事件.其实也没什么特别的地方,一样也是用setInterval来实现
stop();
MovieClip.prototype.listen = function(target) {
if (this.isHiting == undefined) {
this.isHiting = this.hitTest(target);
}
if (this.hitTest(target)) {
if (this.isHiting == false) {
this.broadcastMessage("onHitTest", this, target);//广播事件,给事件传递this和target两个参数
}
this.isHiting = true;
} else {
this.isHiting = false;
}
};//为MovieClip添加域成员listen成员,用于监视当前对象与目标是否碰撞
MovieClip.prototype.watch = function(target) {
this.timer = setInterval(this, "listen", 50, target);
};//以每50毫秒检测一次的速度来检测是否碰撞
MovieClip.prototype.unWatch = function() {
clearInterval(this.timer);
};//停止对对象的监视
ASBroadcaster.initialize(MovieClip.prototype);//初始化MovieClip原型为事件源

//下面是调用的示例

//假设有两个MovieClip,左边ball,右边wall,让ball不断往wall移动,同时监视wall,一旦击中触发事件onHitTest

ball.onEnterFrame = function() {
this._x += 5;
};//让ball不断往右方移动工
myListener = new Object();
myListener.onHitTest = function(source,target){
trace("The " + source._name + " hit " + target._name + ".");
};
ball.addListener(myListener);//创建监听员并注册给ball
ball.watch(wall);//让ball监视wall
复制链接 网友评论 收藏本文 关闭此页
上一条: JavaScript控制Flash播放器的方法…  下一条: 问题解决:如何让网页中的Flash影片全屏…
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  热点推荐
FLASH加载xml,txt,swf实例代码
Flash,Actionscript,AS延时执行语…
入门Flash CS3 ActionScript 3.0
播放器的制作方法
JavaScript控制Flash播放器的方法…
FLASH变量和作用域[这是一篇比较好…
用FLASH8.0轻松制作简易计算器
FLASH动画禁止右键菜单
FLASH AS教程:响应键盘事件的四种…
最常用的Flash语句(汇总)
Flash制作坦克游戏视频教程
创建FLEX自定义组件(1)
FLASH与ASP通信原理入门
Flash教程:加载外部文本文件的3种…
创建FLEX自定义组件(3)
  最近更新
在线考试系统
常见项目开发
学生公寓管理系统的设计与实现
校园电话查询系统设计与实现
校园机动车停车位申请系统的设计与…
C#支付宝接口集成服务
常见项目开发
常用UML建模工具
FLASH加载xml,txt,swf实例代码
视频教程卡住的解决办法
播放器的制作方法
常见定制系统开发
入门Flash CS3 ActionScript 3.0
flex code
Flex 开发架构渐变

关于我们 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3