ошибка тестирования попадания в растровое изображение

Я пытаюсь заставить своего персонажа отскакивать назад, когда он сталкивается с объектом, чтобы он не мог касаться объектов. Моя проблема в том, что когда он касается двух объектов, он застревает и движется назад из-за моего оператора 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");
}
 }

Это то, что вы имели в виду?


person Crossman    schedule 25.10.2012    source источник


Ответы (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)) {.....

Затем вы можете просто перемещать объект по его скорости.

person Tyler    schedule 26.10.2012
comment
Я попробовал код, но теперь мой персонаж не хочет двигаться. Я добавил код вверху. это ты имел ввиду? - person Crossman; 28.10.2012
comment
Я имел в виду это только как отправную точку. Теперь вам придется использовать redSpeed. Наверное, сразу после - person Tyler; 28.10.2012
comment
Не обращайте внимания на вышеуказанное сообщение. Похоже, это должно быть (хит) вместо (!хит). Кроме того, в зависимости от порядка, в котором запускаются moveChar и enterFrame, у вас могут возникнуть некоторые проблемы. Может быть хорошим планом вызывать moveChar с самого начала enterFrame. Таким образом, вы точно знаете, что при вызове hittest для кадра установлена ​​правильная скорость. Надеюсь, что ад - person Tyler; 28.10.2012
comment
Я понимаю концепцию. Он просто прикрепляет персонажа к объекту, если он касается, хотя скорость затем устанавливается на 0. - person Crossman; 28.10.2012