大家下午好!
我在使用hitTestObject的ActionScript 3.0中遇到了一个小问题。 如果我的角色遇到一个平台(我正在制作一个简单的平台游戏),我想chechk。 我有一个针对动作脚本exproted的平台对象,我将childs frim添加到一个数组。 在此之前一切顺利,我可以把它们放在舞台上等等。
如果我的caharacter击中平台但是它无法正常工作,我已经写了一个循环来chechk。我的角色落在第一个平台上,只有当它击中最后一个平台时才停止下降。 (因此,对于数组中的最后一个,它运行良好。)
现在这部分来自我的代码,我希望有人可以帮助我。 :)
import flash.events.Event;
import flash.geom.Rectangle;
stop();
var vy:Number=0;
var gv:Number=1;
var sebesseg:Number=4;
var jumped:Boolean=false;
var stay:Boolean=false;
var level:Array=new Array ;
var gravity:Number=2;
var velocity:Number=1.1;
var platform0:MovieClip=new platform ;
level.push(addChild(platform0));
level[0].x=200;
level[0].y=450;
var platform1:MovieClip=new platform ;
level.push(addChild(platform1));
level[1].x=700;
level[1].y=650;
var platform2:MovieClip=new platform ;
level.push(addChild(platform2));
level[2].x=1000;
level[2].y=800;
stage.addEventListener(Event.ENTER_FRAME, cameraFollowCharacter);
function cameraFollowCharacter(evt:Event) {
root.scrollRect=new Rectangle(PORK1_mc.x-(stage.stageWidth/2)+320,PORK1_mc.y-(stage.stageHeight/2)-50,stage.stageWidth,stage.stageHeight);
}
stage.addEventListener(KeyboardEvent.KEY_DOWN,gomb);
function gomb(k:KeyboardEvent):void {
trace(k);
if (k.keyCode==37) {
if (sebesseg==2) {
sebesseg=sebesseg+0;
} else {
sebesseg-=1;
}
} else if (k.keyCode==39) {
sebesseg+=1;
} else if (k.keyCode==Keyboard.ESCAPE) {
stop();
root.scrollRect=new Rectangle (stage.x,stage.y,stage.stageWidth,stage.stageHeight);
gotoAndStop(2);
} else if (k.keyCode==Keyboard.F1 && stay==false) {
stage.frameRate=0;
stay=true;
} else if (k.keyCode==Keyboard.F1 && stay==true) {
stage.frameRate=24;
stay=false;
}
}
stage.addEventListener(Event.ENTER_FRAME, megy);
function megy(e:Event):void {
PORK1_mc.x+=sebesseg;
gravity*=velocity;
PORK1_mc.y+=gravity;
//trace(velocity);
}
这一部分是问题,HITTESOBJECT仅适用于最后的平台
PORK1_mc.hitPork_mc这是我的角色(hitPork_mc是一个不可见的矩形,用于更好的HitTestObject。所以当我写下我的角色时,直到最后一个,它落在最后一个并且停止下降,所以对于最后一个平台在阵列中它完美地运作。 我不想在我的代码上做很多改变,只在hitTest部分改变它的可能性。
this.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
function handleEnterFrame(e:Event):void {
for (var i:int = 0; i < level.length; i++) {
if (level[i].hitTestObject(PORK1_mc.hitPork_mc)) {
velocity=0;
} else {
velocity=1.1;
gravity=4;
}
}
}
提前感谢您的帮助!
答案 0 :(得分:0)
使用原始代码,您可以为每个平台执行以下操作:
由于您按顺序执行此操作,以下是当您与平台1发生碰撞而不是2或3时发生的情况:
由于这些在同一帧中连续发生,最终结果是你的角色永远不会停止,除非碰撞是在平台3上。
通过在将速度设置为零后返回,您将脱离循环,从而防止您的碰撞工作被撤消。你正在做的事情会起作用,但你也可以采用另一种不那么简洁但可能更有意义的方式:
function handleEnterFrame(e:Event):void
{
var collided:Boolean = false; //This will record if you collided or not.
for (var i:int = 0; i < level.length; i++)
{
if (level[i].hitTestObject(PORK1_mc.hitPork_mc))
{
collided = true;
}
}
if(collided) velocity = 0;
else
{
velocity=1.1;
gravity=4;
}
}
请注意,这里我们没有在for循环中应用速度和重力,因为我们不希望它发生在我们可能碰撞的每个对象上。相反,在我们确定是否与任何物体发生碰撞之后,我们设置了一次。
这也有助于表明你在每一帧都没有碰撞时设置重力,即使你似乎没有将它设置为零的任何点;我怀疑这是你要解决的问题。