Actionscript 3 当一个物体与一堵墙相撞时,玩家不能通过它或其他东西,而不会有不可靠的结果,我该如何做到这一点?
我对AS3很陌生,我正在尝试制作一款类似RPG的运动游戏,我一直在使用Troy Gilbert的PixelPerfectCollisionDetection,我用它来检测角色和碰撞贴图的电影剪辑之间的碰撞,效果很好,但我不知道如何实际添加碰撞,我一直在尝试这样做,当你击中碰撞区域时,你会向后移动相反的方向,但这看起来很危险,如果你击中不同的关键点,它会使角色穿过墙,所以我试图找到一种方法来进行更好的碰撞。整个移动基于使用碰撞贴图移动整个贴图,charSpeed表示贴图移动的速度,如果碰撞贴图击中角色,它会检测碰撞,碰撞会从另一个类文件检测,如果发生碰撞,该类文件会发送事件,这个类接收它并将布尔值转换为true,它还发送一个无冲突的事件,因此它将其转换为false。以下是移动和碰撞的代码:Actionscript 3 当一个物体与一堵墙相撞时,玩家不能通过它或其他东西,而不会有不可靠的结果,我该如何做到这一点?,actionscript-3,collision,flash-cs6,Actionscript 3,Collision,Flash Cs6,我对AS3很陌生,我正在尝试制作一款类似RPG的运动游戏,我一直在使用Troy Gilbert的PixelPerfectCollisionDetection,我用它来检测角色和碰撞贴图的电影剪辑之间的碰撞,效果很好,但我不知道如何实际添加碰撞,我一直在尝试这样做,当你击中碰撞区域时,你会向后移动相反的方向,但这看起来很危险,如果你击中不同的关键点,它会使角色穿过墙,所以我试图找到一种方法来进行更好的碰撞。整个移动基于使用碰撞贴图移动整个贴图,charSpeed表示贴图移动的速度,如果碰撞贴图击中
public function runControlTime(timeHandlerEvents:TimeHandlerEvents):void
{
if (charUp == true)
{
if (collisionDetected)
{
y -= charSpeed;
}
else
{
y += charSpeed;
}
}
if (charDown == true)
{
if (collisionDetected)
{
y += charSpeed;
}
else
{
y -= charSpeed;
}
}
if (charLeft == true)
{
if (collisionDetected)
{
x += charSpeed;
}
else
{
x -= charSpeed;
}
}
if (charRight == true)
{
if (collisionDetected)
{
x -= charSpeed;
}
else
{
x += charSpeed;
}
}
}
假设charSpeed应用于游戏循环中的角色。通常情况下,你会希望在玩家撞到墙后反转他们的方向
if (collisionDetected)
{
charSpeed *= -1;
x += charSpeed;
}
PixelPerfectCollisionDetection是一种节省内存的方法。。你可以用另一种方法 在角色内部创建一个名为var edgePoints:array=new array的数组,创建一个空电影剪辑并在第一帧parent.edgePoints.pushthis中写入以下动作行,然后将此电影剪辑放置在角色内部,并围绕要检测碰撞的角色边缘进行处理 为了使以下代码正常工作,您需要将“增量速度”值指定给一个名为var-velocity:Number=0的变量,并将您希望角色在被触摸时与之碰撞的电影剪辑命名为障碍物 然后在字符内部放置以下代码:
var edgePoints:Array=new Array();
var velocity:Number=0
var velocity_value:Number=5 //the speed by which the charachter will move
//just some parameters no need to panic
var force:Number=0;
var force_angle:Number=0;
var tourq:Number=0;
var tourq_angle:Number=0;
//listeners for testing only
stage.addEventListener(KeyboardEvent.KEY_DOWN,kd);
stage.addEventListener(KeyboardEvent.KEY_UP,ku);
function kd(e:KeyboardEvent) {
if (e.keyCode==Keyboard.RIGHT) {
velocity=velocity_value;
}
if (e.keyCode==Keyboard.LEFT) {
velocity=- velocity_value;
}
}
function ku(e:KeyboardEvent) {
velocity=0;
}
this.addEventListener(Event.ENTER_FRAME,ef);
function ef(e:Event) {
x+=velocity
//this is physics and will not affect your main motion and will cause the repel action
//once this movie clip collides with obstacles
x+=(force)*Math.cos(force_angle*Math.PI/180);
y+=(force)*Math.sin(force_angle*Math.PI/180);
rotation+=tourq/10;
force-=force/4;
tourq-=tourq/4;
for (var i=0; i<edgePoints.length; i++) {
var point:Point=this.localToGlobal(new Point(edgePoints[i].x,edgePoints[i].y));
if (root.obstacle.hitTestPoint(point.x,point.y,true)) {
force+=Math.abs(velocity);
force_angle=180+Math.atan2(point.y-y,point.x-x)*180/Math.PI;
tourq_angle=90-(force_angle-180-rotation);
tourq=0.1*force*Math.sin(tourq_angle*Math.PI/180)*Math.sqrt((point.x-x)*(point.x-x)+(point.y-y)*(point.y-y))*Math.cos(tourq_angle*Math.PI/180);
velocity=-velocity/2;
}
}
}
所以祝你好运,记住在舞台上创建电影剪辑障碍物,并使用动作parent.edgePoints.pushthis创建空电影剪辑,然后将其副本放入角色电影剪辑中。。开发代码很有趣。很抱歉,忘了提到这一点,charSpeed是一个整数变量,用于定义贴图移动的速度,就像角色移动一样。我尝试过反转方向,但如果没有所有的代码,这真的很糟糕。很难说,当你反转方向时,确保你也将角色从它碰撞的项目移开,这样你就不会因为多次碰撞而一直反转角色。