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 に答える