【问题标题】:bitmap hit testing error位图命中测试错误
【发布时间】:2012-10-25 10:23:02
【问题描述】:

我试图让我的角色在碰到一个物体时反弹回来,以免它接触到物体。我的问题是当它接触 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");
}
 }

这是你的意思吗?

【问题讨论】:

    标签: actionscript-3 testing bitmap hit


    【解决方案1】:

    我认为你会想要做的是根据对象的预期位置进行命中测试。但是,为了做到这一点,您需要分配速度值,而不是在 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)) {.....
    

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

    【讨论】:

    • 我尝试了代码,但我的角色现在不想移动。我在顶部添加了代码。这是你的意思吗?
    • 我的意思只是作为一个起点。您现在必须实际使用 redSpeed。可能就在之后
    • 忽略上述信息。看起来应该是 (hit) 而不是 (!hit)。此外,根据触发 moveChar 和 enterFrame 的顺序,您可能会遇到一些问题。从 enterFrame 开始调用 moveChar 可能是一个好计划。这样你就可以确定在调用 hittest 时为帧正确设置了 redspeed。希望地狱的
    • 我理解这个概念,如果它接触到物体,它只会将角色粘在物体上,因为速度然后被设置为 0
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2018-07-13
    • 2011-06-12
    • 2015-06-14
    • 2015-06-26
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多