as3总结(6)

还是看的那本as3游戏编程中的总结,写的都很经典啊

1、帧频事件运动

     我们通过设置影片剪辑的 x,y 的坐标,来改变他们在屏幕的位置是非常容易的。如果
我们想使这个影片剪辑运动起来,并给它设置一特定的速度运动,这时就需要用到
ENTER_FRAME 事件了。例如,你可以在舞台上绘制一个任意图形,并转换为影片剪辑,
类名为 Hero,下面,我们就通过一小段程序复制库中 Hero 的一个副本,并且让他每帧移
动一个像素,代码如下:
var hero:Hero = new Hero();
hero.x = 50;
hero.y = 100; 
addChild(hero); 

addEventListener(Event.ENTER_FRAME, animateHero);
function animateHero(event:Event) {
hero.x++;
}
    现在,测试影片可以看到,这个 hero 角色开始从屏幕坐标(50,100)处每帧以一个像
素的速度水平向右移动。

  注意:你还可以通过改变舞台属性面板上的帧频来控制对象的运动速度,系统默认值为
每秒 12 帧,你可以更改该值为[1,60]内的任意数。事实上,你如果选择了帧频为
60 的话,并不意味着影片每秒运行 60 帧,如果该影片剪辑比较大,并且你的机器比较慢,
那么,他将达不到 60 帧。对此,我们有一个更好的办法来解决这个差距,就是用下
面介绍的基于时间的动画来处理。

在游戏的过程中,我们经常遇到任务行走,这个问题的flash中怎么解决的呢?不必担心,其实这个很简单,首先用动画制作的方法制作一个影片剪辑, 该影片剪辑有 8 帧,从第二帧到第八帧为步行的一个循环,每帧代表不同的步进,第一帧作为站立的位置被保留。制作完成以后,在时间轴内输入下面的帧频事件和帧频函数,在函 数内,我们将要创建该角色每帧在水平位置移动 7 像素,后面的条件代码是检测该影片剪辑的当前帧数,如果为 8 帧的话,它将要返回的第二帧继续运动,否则,它继续下面的一帧。

源代码如下:
var hero:Hero = new Hero();
hero.x = 100;
hero.y = 200; 
addChild(hero); 
addEventListener(Event.ENTER_FRAME, animateHero);
function animateHero(event:Event)
{
     hero.x += 7;
     if (hero.currentFrame == 8)
     {
         hero.gotoAndStop(2); 
     } else
     {
         hero.gotoAndStop(hero.currentFrame+1);
     }
}

2、用计时器控制影片的运动

计时器,就好比我们使用的钟表。你还可以创建一个计时器,每秒用它来调用一个函数。
当你声明一个计时器后也就创建了一个 Timer 对象,你需要设置时间间隔的毫秒数,还有循
环次数,为 0 的话就是循环无数次。

下面代码创建一个 Timer 对象,每隔 1S 就触发调用一次 timerFunction 函数,源代码如下: 
//  创建一个 Timer 对象,每秒调用一次 timerFunction 函数
var myTimer:Timer = new Timer(1000); 
myTimer.addEventListener(TimerEvent.TIMER, timerFunction); 
//  函数内为画一黑色填充圆点
function timerFunction(event:TimerEvent)
{
     this.graphics.beginFill(0x000000); 
     //currentCount 为计时器从  0  开始后触发的总次数。  如果已重置了计时器,则只会计
入重置后的触发次数。  
     this.graphics.drawCircle(event.target.currentCount*10,100,4);
}
//  计时开始
myTimer.start();

3、基于时间的帧频动画

该方法的原理就是,首先声明一个整型变量来存储初始化 flash player 后经过的时间,
然后再用侦听事件来调用侦听函数,在侦听函数内计算出当前帧与上一帧的时间差,再乘以
一个比例系数应用到影片剪辑的坐标,从而改变该对象的运动。

先声明一个变量来存储初
始化 flash player 后经过的时间,该时间以毫秒为单位的,再通过 getTimer()函数,把返回的
时间传递給刚才声明的变量 lastTime。

getTimer()函数,是用来返回自  SWF  文件开始播放时起已经过的毫秒数。
var lastTime:int=getTimer() ;

然后,我们用 ENTER_FRAME 事件来侦听,并声明一个animateBall 侦听函数来调用。
addEventListener(Event.ENTER_FRAME, animateBall);

function animateBall(event:Event) {
var timeDiff:int = getTimer()-lastTime;
lastTime += timeDiff;
ball.x += timeDiff*.1;
}

4、拖拽影片

现在,我们再来看一下移动影片的另一种方
法,实现:用户鼠标点击影片时,开始拖拽;用户释放鼠标时,停止拖拽。当鼠标点击影片
时,可以在该影片上侦听 MOUSE_DOWN 事件,但是释放鼠标时我们不能把该影片作为侦听
对象,而是要用舞台代替才行,只有这样,当鼠标不论在不在影片上面,只要侦听到
MOUSE_UP 事件,就能够停止拖拽了。代码如下:
//  设置侦听
mascot.addEventListener(MouseEvent.MOUSE_DOWN, startMascotDrag);
stage.addEventListener(MouseEvent.MOUSE_UP, stopMascotDrag);
mascot.addEventListener(Event.ENTER_FRAME, dragMascot);
      另一个因素就是光标的偏移量,我们允许鼠标从影片的任何一点拖拽。首先,我们需
要先计算出鼠标点击影片上的点相对于影片中心点的局部坐标,并把该点存储到 clickOffset
变量中,我们还可以用这个变量计算此刻是否有拖拽产生,如果是,clickOffset 将要设置成
一个点,否则,就把 null 赋值給它。
//  鼠标点击的位置相对于影片的偏移量
var clickOffset.Loint = null; 
当用户点击影片时,这个偏移量由点击事件的 localx,localy 获取
//  鼠标点击时
function startMascotDrag(event:MouseEvent) { 
clickOffset = new Point(event.localX, event.localY);
}
当鼠标释放时,该点被置为 null 
//  鼠标释放时
function stopMascotDrag(event:MouseEvent) {
clickOffset = null;
}
     对于帧频事件调用的 dragMascot 函数,如果这个clickOffset 不是空值,我们将要设置这
个影片的位置为当前光标的位置减去偏移量。

//  帧频动画
function dragMascot(event:Event) {
if (clickOffset != null) {  
mascot.x = mouseX - clickOffset.x;
mascot.y = mouseY - clickOffset.y; 
}
}
     测试影片,用鼠标点击这个影片然后从不同点拖拽,看一下这个 clickOffset 是怎么样处
理的。
另外,也可以用 startDrag(),stopDrag()方法实现开始停止拖拽过程,代码如下:
mascot.addEventListener(MouseEvent.MOUSE_DOWN, startMascotDrag);
stage.addEventListener(MouseEvent.MOUSE_UP, stopMascotDrag);
function startMascotDrag(event:MouseEvent):void
{
      mascot.startDrag();
}
function stopMascotDrag(event:MouseEvent):void
{
      mascot.stopDrag();
}

5、碰撞检测

 在游戏中,当有很多对象在屏幕上移动时,检测他们之间的相互碰撞是非常有用的。
AS3.0 包含两个碰撞检测函数, hitTestPoint 函数用于检测某个点与显示对象间是否发生了
碰撞;hitTestObject 函数用于检测两个显示对象间是否发生了碰撞。
具体来说,用 hitTestObject 函数作为影片的方法时,要将另一个影片的引用作为参数传入,
格式如下:
sprite1.hitTestObject(sprite2)
    如果两个影片发生了碰撞则返回 true,否则,返回 false。但是这种检测方法的精度很
低,主要用来检测矩形影片的碰撞;hitTestPoint 函数用来检测两个影片是否相碰时,需
要先定义两个 Number 类型的参数,作为检测点。根据影片是否与该点相交,返回 true 或者
false。另外第三个参数为可选参数,其值为 boolean 类型,默认为 false,检查影片的边
框是否与该点相碰;如果设置为 true 的话,则用来检查影片的实际形状与该点是否相碰。
下面,我们通过一个实例来验证这两个函数的使用方法,首先,在舞台上绘制两个动态文本,
分别命名为 messageText1,messageText2;然后再绘制一个月牙形,一个星形影片剪辑,
实例名称分别为 crescent,star。代码如下:
addEventListener(Event.ENTER_FRAME, checkCollision);

function checkCollision(event:Event)
{
    // 检测鼠标指针是否与月牙形影片相碰
    if (crescent.hitTestPoint(mouseX, mouseY, true))
    {
        messageText1.text = "hitTestPoint: YES";
    } else
    {
        messageText1.text = "hitTestPoint: NO";
    }
    // 把星形坐标作为鼠标跟随
    star.x = mouseX;
    star.y = mouseY;
 
    // 检测星形与月牙形是否相碰
    if (star.hitTestObject(crescent))
    {
        messageText2.text = "hitTestObject: YES";
    } else
    {
        messageText2.text = "hitTestObject: NO";
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值