Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 当一个物体与一堵墙相撞时,玩家不能通过它或其他东西,而不会有不可靠的结果,我该如何做到这一点?_Actionscript 3_Collision_Flash Cs6 - Fatal编程技术网

Actionscript 3 当一个物体与一堵墙相撞时,玩家不能通过它或其他东西,而不会有不可靠的结果,我该如何做到这一点?

Actionscript 3 当一个物体与一堵墙相撞时,玩家不能通过它或其他东西,而不会有不可靠的结果,我该如何做到这一点?,actionscript-3,collision,flash-cs6,Actionscript 3,Collision,Flash Cs6,我对AS3很陌生,我正在尝试制作一款类似RPG的运动游戏,我一直在使用Troy Gilbert的PixelPerfectCollisionDetection,我用它来检测角色和碰撞贴图的电影剪辑之间的碰撞,效果很好,但我不知道如何实际添加碰撞,我一直在尝试这样做,当你击中碰撞区域时,你会向后移动相反的方向,但这看起来很危险,如果你击中不同的关键点,它会使角色穿过墙,所以我试图找到一种方法来进行更好的碰撞。整个移动基于使用碰撞贴图移动整个贴图,charSpeed表示贴图移动的速度,如果碰撞贴图击中

我对AS3很陌生,我正在尝试制作一款类似RPG的运动游戏,我一直在使用Troy Gilbert的PixelPerfectCollisionDetection,我用它来检测角色和碰撞贴图的电影剪辑之间的碰撞,效果很好,但我不知道如何实际添加碰撞,我一直在尝试这样做,当你击中碰撞区域时,你会向后移动相反的方向,但这看起来很危险,如果你击中不同的关键点,它会使角色穿过墙,所以我试图找到一种方法来进行更好的碰撞。整个移动基于使用碰撞贴图移动整个贴图,charSpeed表示贴图移动的速度,如果碰撞贴图击中角色,它会检测碰撞,碰撞会从另一个类文件检测,如果发生碰撞,该类文件会发送事件,这个类接收它并将布尔值转换为true,它还发送一个无冲突的事件,因此它将其转换为false。以下是移动和碰撞的代码:

                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是一个整数变量,用于定义贴图移动的速度,就像角色移动一样。我尝试过反转方向,但如果没有所有的代码,这真的很糟糕。很难说,当你反转方向时,确保你也将角色从它碰撞的项目移开,这样你就不会因为多次碰撞而一直反转角色。