Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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对象碰撞以防止字符重叠_Actionscript 3_Flash_Object_Collision - Fatal编程技术网

Actionscript 3 Actionscript 3对象碰撞以防止字符重叠

Actionscript 3 Actionscript 3对象碰撞以防止字符重叠,actionscript-3,flash,object,collision,Actionscript 3,Flash,Object,Collision,我和我的朋友正在尝试制作一个rpg风格的游戏,你可以从上面看到你的角色,但是我们遇到了一些物体碰撞的问题。值得一提的是,我们在FlashCS6中的一个面向对象AS3项目中这样做 我很抱歉,如果这个问题被问了一百万次,但我们整天都在寻找解决方案,到目前为止,我们发现的要么是对我们来说有点太先进的东西,比如box2d/nape,要么就是我们已经知道的简单碰撞检测 我们所面临的问题是,我们需要一种方便的方法来检测碰撞,并防止主角与场景中的对象重叠,而不会使其冻结或卡住。到目前为止,我们已经放弃了解决这

我和我的朋友正在尝试制作一个rpg风格的游戏,你可以从上面看到你的角色,但是我们遇到了一些物体碰撞的问题。值得一提的是,我们在FlashCS6中的一个面向对象AS3项目中这样做

我很抱歉,如果这个问题被问了一百万次,但我们整天都在寻找解决方案,到目前为止,我们发现的要么是对我们来说有点太先进的东西,比如box2d/nape,要么就是我们已经知道的简单碰撞检测

我们所面临的问题是,我们需要一种方便的方法来检测碰撞,并防止主角与场景中的对象重叠,而不会使其冻结或卡住。到目前为止,我们已经放弃了解决这个问题的所有尝试,但下面是代码的其余部分,以帮助您理解我们的处境(如果很难阅读,请道歉)。如有任何建议或参考相关教程,我们将不胜感激

主课

package {

import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;

public class Engine extends MovieClip
{
    private var hero:Hero;
    private var box1:Box1;

    public function Engine()
    {
        box1 = new Box1();
        stage.addChild(box1);
        box1.x = stage.stageWidth / 4;
        box1.y = stage.stageHeight / 2;

        hero = new Hero(stage, box1);
        stage.addChild(hero);
        hero.x = stage.stageWidth / 2;
        hero.y = stage.stageHeight / 2;
    }

}
}
角色类

package 
{

import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;

public class Hero extends MovieClip
{
    private var box1:Box1;
    private var stageRef:Stage;
    private var vy:Number = 0;
    private var vx:Number = 0;
    private var limit:Number = 30;
    private var rad:Number;
    private var bounce:Number = 0.125;
    private var _max:Number = 8;

    public function Hero(stageRef:Stage, box1:Box1)
    {
        //box variable was used in previous experiments with hit tests
        this.box1 = box1;
        this.stageRef = stageRef;
        Input.initialize(stageRef);
        stageRef.addEventListener(Event.ENTER_FRAME, moveHero);
    }
    private function moveHero(e:Event):void
    {
        if (Input.kd("W","UP"))
        {
            vy = vy < 1 - _max ? _max * -1:vy - 1;
        }
        if (Input.kd("S","DOWN"))
        {
            vy = vy > _max - 1 ? _max:vy + 1;
        }
        else if (!Input.kd("W", "UP", "S", "DOWN"))
        {
            if (vy > 1)
            {
                vy = vy < 1 ? 0:vy - 1;
            }
            else
            {
                vy = vy > -1 ? 0:vy + 1;
            }

        }
        if (Input.kd("A","LEFT"))
        {
            vx = vx < 1 - _max ? _max * -1:vx - 1;
        }
        if (Input.kd("D","RIGHT"))
        {
            vx = vx > _max - 1 ? _max:vx + 1;
        }
        else if (!Input.kd("A", "LEFT", "D", "RIGHT"))
        {
            if (vx > 1)
            {
                vx = vx < 1 ? 0:vx - 1;
            }
            else
            {
                vx = vx > -1 ? 0:vx + 1;
            }

        }
        if (x < limit)
        {
            x = limit;
            vx *=   -  bounce;
        }
        if (x > stage.stageWidth - limit)
        {
            x = stage.stageWidth - limit;
            vx *=   -  bounce;
        }
        if (y < limit)
        {
            y = limit;
            vy *=   -  bounce;
        }
        if (y > stage.stageHeight - limit)
        {
            y = stage.stageHeight - limit;
            vy *=   -  bounce;
        }

        x +=  vx;
        y +=  vy;
        rad = (Math.atan2(stage.mouseY - y,stage.mouseX - x)) * 180 / Math.PI;
        this.rotation = rad;


    }
}
}
包
{
导入flash.display.MovieClip;
导入flash.events.Event;
导入flash.display.Stage;
《大众英雄》扩展了电影口吻
{
私有变量box1:box1;
私有var阶段f:阶段;
私有变量vy:Number=0;
私有变量vx:Number=0;
私人风险价值限额:数字=30;
私有变量rad:数字;
私人var反弹:数字=0.125;
私有变量_max:Number=8;
公共功能英雄(stageRef:Stage,box1:box1)
{
//在以前的命中测试实验中使用了box变量
这个.box1=box1;
this.stageRef=stageRef;
输入。初始化(stageRef);
stageRef.addEventListener(Event.ENTER_FRAME,moveHero);
}
私有函数moveHero(e:事件):无效
{
如果(输入.kd(“W”,“UP”))
{
vy=vy<1-\u max?\u max*-1:vy-1;
}
if(输入.kd(“S”,“DOWN”))
{
vy=vy>最大值-1?\u最大值:vy+1;
}
如果(!Input.kd(“W”,“UP”,“S”,“DOWN”)),则为else
{
如果(vy>1)
{
vy=vy<1?0:vy-1;
}
其他的
{
vy=vy>-1?0:vy+1;
}
}
if(输入.kd(“A”,“左”))
{
vx=vx<1-\u max?\u max*-1:vx-1;
}
if(输入.kd(“D”,“RIGHT”))
{
vx=vx>最大值-1?\u最大值:vx+1;
}
如果(!Input.kd(“A”、“LEFT”、“D”、“RIGHT”))
{
如果(vx>1)
{
vx=vx<1?0:vx-1;
}
其他的
{
vx=vx>-1?0:vx+1;
}
}
if(x<极限)
{
x=极限;
vx*=-反弹;
}
如果(x>stage.stageWidth-极限)
{
x=阶段宽度-极限;
vx*=-反弹;
}
如果(y<极限)
{
y=极限;
vy*=-反弹;
}
如果(y>阶段高度-限制)
{
y=阶段高度-极限;
vy*=-反弹;
}
x+=vx;
y+=vy;
rad=(Math.atan2(stage.mouseY-y,stage.mouseX-x))*180/Math.PI;
这个旋转=rad;
}
}
}

进行碰撞检测的简单方法是:

1) 尝试将对象X移动到其新位置

2) 对于游戏Y中的每个其他对象,计算Y和X是否重叠(将对圆中的矩形、矩形中的矩形、圆中的圆等使用不同的算法)

3) 如果它们确实重叠,请返回步骤1,但尝试将其移动一半。或者:如果碰撞的对象是圆形的,则根据旋转角度的余弦(角度变化的余弦,因此0x表示90度变化,(sqrt2/2)x表示45度变化,1x表示0度变化,这在我的头脑中很有意义。)

4) 如果你的行动成功了,就坚持下去。如果移动的长度变得难以置信的小,并且仍然被拒绝,那么假设你处于休息状态并放弃

更复杂的算法会将您从碰撞对象的中心弹出,因此您将通过进入弯曲对象等方式绕着弯曲对象弯曲,但是您必须小心,弹出不会与第三个对象Z发生碰撞,这可能会变得棘手。(你考虑过使用物理库吗?它们的编码有很好的理由——物理很难做到正确。)