的BitmapData碰撞 [英] BitmapData Collision

查看:124
本文介绍了的BitmapData碰撞的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试使用的BitmapData碰撞检测,但到目前为止还没有,我不知道为什么。在code编译,但不会做任何事情(当它应打印打)。谁能帮我?

 包
{
进口flash.events.KeyboardEvent;
进口对象类型:flash.events.Event;
进口的flash.display.MovieClip;
进口flash.ui.Keyboard;
进口flash.display.BitmapData;
进口flash.geom.Point;

公共类主要扩展影片剪辑
{
    私人VAR SPD:INT = 5;
    私人变种pressedKeys:对象= {};
    私人VAR bgMask:的BitmapData;
    私人VAR plMask:的BitmapData;
    私人VAR墙面:墙面=新墙();

    公共函数main()
    {
        VAR bgBitMapData:的BitmapData =新的BitmapData(bg.width,bg.height,真实,0);
        bgMask = bgBitMapData.clone();
        wall.x = bg.x;
        wall.y = bg.y;
        bgMask.draw(墙);

        VAR plBitMapData:的BitmapData =新的BitmapData(pl.width,bg.height,真实,0);
        plMask = bgBitMapData.clone();
        bgMask.draw(PL);

        stage.addEventListener(KeyboardEvent.KEY_DOWN,this.key pressHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP,this.key pressHandler);
        stage.addEventListener(Event.ENTER_FRAME,this.gameLoop);
    }

    公共功能键pressHandler(EVT:KeyboardEvent的):无效
    {
        如果(evt.type == KeyboardEvent.KEY_DOWN)
        {
            pressedKeys [evt.k​​ey code] = 1;
        }
        其他
        {
            删除pressedKeys [evt.k​​ey code]。
        }
    }

    公共职能inputHandler():无效
    {
        VAR moveXBy:INT;
        VAR moveYBy:INT;

        如果(pressedKeys [Keyboard.J])
        {
            moveXBy  -  = SPD;
        }

        如果(pressedKeys [Keyboard.K])
        {
            moveYBy + = SPD;
        }

        如果(pressedKeys [Keyboard.L])
        {
            moveXBy + = SPD;
        }

        如果(pressedKeys [Keyboard.I])
        {
            moveYBy  -  = SPD;
        }

        pl.x + = moveXBy;
        pl.y + = moveYBy;

    }

    公共职能playerWallCollision():无效
    {
        如果(plMask.hitTest(新点(wall.x,wall.y),1,bgMask,新点(pl.x,pl.y),1))
        {
            跟踪(打);
        }
    }

    公共职能gameLoop(EVT:事件):无效
    {
        wallUpdate();
        inputHandler();
        playerWallCollision();
    }

    私有函数wallUpdate()
    {
        wall.x = bg.x;
        wall.y = bg.y;
    }
}
}
 

解决方案

据该脚本告诉我,该行之后:

  VAR bgBitMapData:的BitmapData =新的BitmapData(bg.width,bg.height,真实,0);
    // bgBitMapData是空的BMP在这一点导致它只是新鲜实例化
    bgMask = bgBitMapData.clone();
    wall.x = bg.x;
    wall.y = bg.y;
    bgMask.draw(墙);

    VAR plBitMapData:的BitmapData =新的BitmapData(pl.width,bg.height,真实,0);
    //不知道Ÿ你做这个plBitMapData反正
    plMask = bgBitMapData.clone();
    //现在克隆空bgBitMapData是plMask
    bgMask.draw(PL);
 

plMask是从来没有装满东西!因此,用空的BitmapData相比,应该八方通返回false。

所以,答案须于何时输出命中 - 永不;)

而作为一个旁注尽量保持1。写评论的每这里更易读且有你的意图是什么,以及2随时随地直接的方式:

  VAR bgBitMapData:的BitmapData =新的BitmapData(bg.width,bg.height,真实,0);
    bgMask = bgBitMapData.clone();
    //这个位置似乎只是错误的我wall.x或wall.y不影响抽签所以要在别的地方...因为你将复制墙的内侧
    wall.x = bg.x;
    wall.y = bg.y;
    bgMask.draw(墙);
 

对于我来说,应该是这样的:

  //放置在墙上新/ init的坐标
    wall.x = bg.x;
    wall.y = bg.y;

    //绘制墙bgMask的hittesting对播放器或你intende这里什么都
    bgMask =新的BitmapData(bg.width,bg.height,真实,0);
    bgMask.draw(墙);
 

I have been trying to use BitmapData for collision detection, but have failed so far, and I don't know why. The code compiles, but doesn't do anything (when it should print "hit" ). Can anyone help me?

package 
{
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.display.MovieClip;
import flash.ui.Keyboard;
import flash.display.BitmapData;
import flash.geom.Point;

public class Main extends MovieClip
{
    private var spd:int = 5;
    private var pressedKeys:Object = {};
    private var bgMask:BitmapData;
    private var plMask:BitmapData;
    private var wall:Wall = new Wall();

    public function Main()
    {
        var bgBitMapData:BitmapData = new BitmapData(bg.width,bg.height,true,0);
        bgMask = bgBitMapData.clone();
        wall.x = bg.x;
        wall.y = bg.y;
        bgMask.draw( wall );

        var plBitMapData:BitmapData = new BitmapData(pl.width,bg.height,true,0);
        plMask = bgBitMapData.clone();
        bgMask.draw( pl );

        stage.addEventListener(KeyboardEvent.KEY_DOWN,this.keyPressHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP,this.keyPressHandler);
        stage.addEventListener(Event.ENTER_FRAME,this.gameLoop);
    }

    public function keyPressHandler( evt:KeyboardEvent ):void
    {
        if (evt.type == KeyboardEvent.KEY_DOWN)
        {
            pressedKeys[evt.keyCode] = 1;
        }
        else
        {
            delete pressedKeys[ evt.keyCode ];
        }
    }

    public function inputHandler():void
    {
        var moveXBy:int;
        var moveYBy:int;

        if (pressedKeys[Keyboard.J])
        {
            moveXBy -=  spd;
        }

        if (pressedKeys[Keyboard.K])
        {
            moveYBy +=  spd;
        }

        if (pressedKeys[Keyboard.L])
        {
            moveXBy +=  spd;
        }

        if (pressedKeys[Keyboard.I])
        {
            moveYBy -=  spd;
        }

        pl.x +=  moveXBy;
        pl.y +=  moveYBy;

    }

    public function playerWallCollision():void
    {
        if ( plMask.hitTest( new Point( wall.x, wall.y ), 1, bgMask, new Point( pl.x, pl.y ), 1))
        {
            trace(  "hit" );
        }
    }

    public function gameLoop( evt:Event ):void
    {
        wallUpdate();
        inputHandler();
        playerWallCollision();
    }

    private function wallUpdate()
    {
        wall.x = bg.x;
        wall.y = bg.y;
    }
}
}

解决方案

as far as this script tells me, after the lines:

var bgBitMapData:BitmapData = new BitmapData(bg.width,bg.height,true,0);
    // bgBitMapData is an empty BMP at this point cause its just freshly instanciated
    bgMask = bgBitMapData.clone();
    wall.x = bg.x;
    wall.y = bg.y;
    bgMask.draw( wall );

    var plBitMapData:BitmapData = new BitmapData(pl.width,bg.height,true,0);
    // no idea y you make this plBitMapData anyway
    plMask = bgBitMapData.clone();
    // now you clone the empty bgBitMapData to be plMask
    bgMask.draw( pl );

plMask is never filled with anything! So compared with an empty BitmapData should allways return false.

So the answer to when should it output hit - never ;)

And as a sidenote try to keep it more readable by 1. write a comment every here and there what your intention is and 2. go for direct ways :

    var bgBitMapData:BitmapData = new BitmapData(bg.width,bg.height,true,0);
    bgMask = bgBitMapData.clone();
    // this position seems just wrong to me wall.x or wall.y do not effect the draw so keep it somewhere else... since you will copy the inside of wall
    wall.x = bg.x;
    wall.y = bg.y;
    bgMask.draw( wall );

For me it should look like:

    // placing a wall to new / init coordinates 
    wall.x = bg.x;
    wall.y = bg.y;

    // drawing wall on bgMask for hittesting against player or what ever you intende here
    bgMask = new BitmapData(bg.width,bg.height,true,0);
    bgMask.draw( wall );

这篇关于的BitmapData碰撞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆