0

我试图让我的角色在撞到物体时反弹回来,以免它接触到物体。我的问题是当它接触 2 个对象时,由于我的 else 语句,它会卡住并向后移动。有什么办法可以改变我的代码,让我的角色一开始就不能触摸物体。

我的代码:

o1 是影片剪辑中所有对象的实例名称,p1 是我的角色。

import flash.events.Event;

var upKeyDown:Boolean = false;
var rightKeyDown:Boolean = false;
var downKeyDown:Boolean = false;
var leftKeyDown:Boolean = false;
var hit:Boolean = false;

p1.addEventListener(Event.ENTER_FRAME, moveChar);
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeysDown);
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp);


var redRect:Rectangle = o1.getBounds(this);
var redClipBmpData = new BitmapData(redRect.width, redRect.height, true, 0);
redClipBmpData.draw(o1);

var blueRect:Rectangle = p1.getBounds(this);
var blueClipBmpData = new BitmapData(blueRect.width, blueRect.height, true, 0);
blueClipBmpData.draw(p1);

addEventListener(Event.ENTER_FRAME, enterFrame);

function enterFrame(e:Event):void
{
if(redClipBmpData.hitTest(new Point(o1.x, o1.y),
                            255,
                            blueClipBmpData,
                            new Point(p1.x, p1.y),
                            255

                      ))
{
    o1.filters = [new GlowFilter()];
    hit = true;
}
else
{
    o1.filters = [];
    hit = false;
}
}


function moveChar(event:Event):void{
if(downKeyDown && !upKeyDown && !rightKeyDown && !leftKeyDown)
{
    p1.gotoAndStop("walk_down");
    if(!hit)
        p1.y += 5;
    else
        p1.y -= 10;
}
if(upKeyDown  && !downKeyDown && !rightKeyDown && !leftKeyDown)
{
    p1.gotoAndStop("walk_up");
    if(!hit)
        p1.y -= 5;
    else
        p1.y += 10;
}
if(rightKeyDown  && !upKeyDown && !downKeyDown && !leftKeyDown)
{
    p1.gotoAndStop("walk_right");
    if(!hit)
        p1.x += 5;
    else
        p1.x -= 10;
}
if(leftKeyDown  && !upKeyDown && !rightKeyDown && !downKeyDown)
{
    p1.gotoAndStop("walk_left");
    if(!hit)
        p1.x -= 5;
    else
        p1.x += 10;
}
}

function checkKeysDown(event:KeyboardEvent):void{
if(event.keyCode == 87){
    upKeyDown = true;
}
if(event.keyCode == 68){
    rightKeyDown = true;
}
if(event.keyCode == 83){
    downKeyDown = true;
}
if(event.keyCode == 65){
    leftKeyDown = true;
}
}


    function checkKeysUp(event:KeyboardEvent):void{
if(event.keyCode == 87){
    upKeyDown = false;
    p1.gotoAndStop("still_up");
}

if(event.keyCode == 68){
    rightKeyDown = false;
    p1.gotoAndStop("still_right");
}

if(event.keyCode == 65){
    leftKeyDown = false;
    p1.gotoAndStop("still_left");
}

if(event.keyCode == 83){
    downKeyDown = false;
    p1.gotoAndStop("still_down");
}
}

提前致谢

编辑:我把它改成了你说的,但现在我的角色根本不想动:<

代码:

import flash.events.Event;

var upKeyDown:Boolean = false;
var rightKeyDown:Boolean = false;
var downKeyDown:Boolean = false;
var leftKeyDown:Boolean = false;
var hit:Boolean = false;
var redSpeed:Point = new Point();

p1.addEventListener(Event.ENTER_FRAME, moveChar);
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeysDown);
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp);


var redRect:Rectangle = o1.getBounds(this);
var redClipBmpData = new BitmapData(redRect.width, redRect.height, true, 0);
redClipBmpData.draw(o1);

var blueRect:Rectangle = p1.getBounds(this);
var blueClipBmpData = new BitmapData(blueRect.width, blueRect.height, true, 0);
blueClipBmpData.draw(p1);

addEventListener(Event.ENTER_FRAME, enterFrame);

function enterFrame(e:Event):void
{
if(redClipBmpData.hitTest(new Point(o1.x + redSpeed.x, o1.y + redSpeed.y),
                    255,
                    blueClipBmpData,
                    new Point(p1.x, p1.y),
                    255))
{
    o1.filters = [new GlowFilter()];
    hit = true;
}
else
{
    o1.filters = [];
    hit = false;
}
 }


 function moveChar(event:Event):void{
if(downKeyDown && !upKeyDown && !rightKeyDown && !leftKeyDown)
{
    p1.gotoAndStop("walk_down");
    if(!hit)
    {
        redSpeed.y = 0;
    }
    else
    {
        redSpeed.y = 5;
        p1.y += 5;
    }
}
if(upKeyDown  && !downKeyDown && !rightKeyDown && !leftKeyDown)
{
    p1.gotoAndStop("walk_up");
    if(!hit)
    {
        redSpeed.y = 0;
    }
    else
    {
        redSpeed.y = -5;
        p1.y -= 5;
    }
}
if(rightKeyDown  && !upKeyDown && !downKeyDown && !leftKeyDown)
{
    p1.gotoAndStop("walk_right");
    if(!hit)
    {
        redSpeed.x = 0;
    }
    else
    {
        redSpeed.x = 5;
        p1.x += 5;
    }
}
if(leftKeyDown  && !upKeyDown && !rightKeyDown && !downKeyDown)
{
    p1.gotoAndStop("walk_left");
    if(!hit)
    {
        redSpeed.x = 0;
    }
    else
    {
        redSpeed.x = -5;
        p1.x -= 5;
    }
}
 }

 function checkKeysDown(event:KeyboardEvent):void{
if(event.keyCode == 87){
    upKeyDown = true;
}
if(event.keyCode == 68){
    rightKeyDown = true;
}
if(event.keyCode == 83){
    downKeyDown = true;
}
if(event.keyCode == 65){
    leftKeyDown = true;
}
 }


 function checkKeysUp(event:KeyboardEvent):void{
if(event.keyCode == 87){
    upKeyDown = false;
    p1.gotoAndStop("still_up");
}

if(event.keyCode == 68){
    rightKeyDown = false;
    p1.gotoAndStop("still_right");
}

if(event.keyCode == 65){
    leftKeyDown = false;
    p1.gotoAndStop("still_left");
}

if(event.keyCode == 83){
    downKeyDown = false;
    p1.gotoAndStop("still_down");
}
 }

这是你的意思吗?

4

1 回答 1

0

我认为您要做的是根据对象的预期位置进行命中测试。但是,为了做到这一点,您需要分配速度值,而不是在 moveChar() 上移动对象。

private var redSpeed:Point = new Point();

//in moveChat:
if(downKeyDown && !upKeyDown && !rightKeyDown && !leftKeyDown)
{
    p1.gotoAndStop("walk_down");
    if(!hit)
        redSpeed.y = 5;
    else
        redSpeed.y = 0;
}


// in enterFrame
if(redClipBmpData.hitTest(new Point(o1.x + redSpeed.x, o1.y + redSpeed.y),
                        255,
                        blueClipBmpData,
                        new Point(p1.x, p1.y),
                        255)) {.....

然后你可以通过它的速度移动对象。

于 2012-10-26T17:39:33.253 回答