玩家和敌人之间发生碰撞的最佳方法是什么?
在停留动画中,我的玩家的宽度为30px,步行动画为40px,在attack1动画宽度为60px。
现在我使用代码:
if (Enemy.hitTestObject(Hero))
{
Enemy.gotoAndStop("attack1");
}
如果敌人触摸英雄(主角)开始攻击动画。但问题是,如果球员的当前状态处于攻击位置,敌人会留下蚂蚁试图击中。
我需要制作类似敌人的东西,总是检查玩家的“停留”动画宽度,而不是当前的动画。或者你可以建议更好的碰撞技巧?谢谢。
更新
所以如果我有简单的攻击1,我需要在这个函数中调用enterFrameHandler()
?这将检查Hero是否与Enemy发生碰撞?或者我需要使用此功能?
if (attack1)
{
enterFrameHandler();
Hero.gotoAndStop("attack1");
}
更新2
这是我宣告敌人的方式:
public var Enemy:Priesas = new Priesas; //Priesas is instance name of Enemy
Hero通过点击按钮选择模板:
public function selectHero(what:int):void {
// this is called with correct "what", design yourself. I use array index
var whatHero:Class = heroes[what]; // get selected hero symbol
if (Hero && Hero.parent) Hero.parent.removeChild(Hero);
// clean up previous hero. Drop listeners here, if any
Hero = new whatHero(); // get new hero
// process as usual, don't forget to "addChild(Hero)" somewhere
create_hero();
}
function choosePlayer(event:MouseEvent):void {
selectHero(0);
start(event);
}
function create_hero()
{
addChild(Hero);
}
所以声明的变量是:英雄和敌人
更新3
现在我遇到以下错误:
1120: Access of undefined property enemyClipBmpData.
1180: Call to a possibly undefined method Point.
1120: Access of undefined property heroClipBmpData.
1180: Call to a possibly undefined method GlowFilter.
以下是我的代码现在的样子(我通过创建变量来了解大写字母,但是现在我需要像这样使用)
public function Script()
{
btn_play.addEventListener(MouseEvent.CLICK, start);
btn_credits.addEventListener(MouseEvent.CLICK, choosePlayer);
btn_control.addEventListener(MouseEvent.CLICK, start);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true); //here added line
}
function enterFrameHandler(event:Event):void
{
Hero.x = mouseX;
Hero.y = mouseY;
if(enemyClipBmpData.hitTest(new Point(Enemy.x, Enemy.y),
255,
heroClipBmpData,
new Point(Hero.x, Hero.y),
255
))
{
trace("hit");
Enemy.filters = [new GlowFilter()];
}
else
{
Enemy.filters = [];
}
}
function create_enemy()
{
addChild(Enemy);
var enemyRect:Rectangle = Enemy.getBounds(this);
var enemyClipBmpData = new BitmapData(enemyRect.width, enemyRect.height, true, 0);
enemyClipBmpData.draw(Enemy);
Enemy.x = 10;
Enemy.y = 420;
}
function create_hero()
{
addChild(Hero);
var heroRect:Rectangle = Hero.getBounds(this);
var heroClipBmpData = new BitmapData(heroRect.width, heroRect.height, true, 0);
heroClipBmpData.draw(Hero);
Hero.gotoAndStop("stay");
Hero.x = stage.stageWidth / 2;
}
答案 0 :(得分:2)
我相信您可以尝试使用BitmapData.hitTest,例如:
//using your instance name (just using lower case for the instance name)
var enemy:Priesas = new Priesas();
enemy.x = enemy.y = 300;
addChild(enemy);
var enemyRect:Rectangle = enemy.getBounds(this);
var enemyClipBmpData = new BitmapData(enemyRect.width, enemyRect.height, true, 0);
enemyClipBmpData.draw(enemy);
//using your instance name (just using lower case for the instance name)
var hero:Sprite = new Hero();
addChild(hero);
var heroRect:Rectangle = hero.getBounds(this);
var heroClipBmpData = new BitmapData(heroRect.width, heroRect.height, true, 0);
heroClipBmpData.draw(hero);
addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);
function enterFrameHandler(event:Event):void
{
hero.x = mouseX;
hero.y = mouseY;
if(enemyClipBmpData.hitTest(new Point(enemy.x, enemy.y),
255,
heroClipBmpData,
new Point(hero.x, hero.y),
255
))
{
trace("hit");
enemy.filters = [new GlowFilter()];
}
else
{
enemy.filters = [];
}
}
基于文档:
public function hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean
在一个位图图像与点,矩形或其他位图图像之间执行像素级命中检测。命中被定义为不透明像素上的点或矩形的重叠,或两个重叠的不透明像素。执行命中测试时,不考虑任何对象的拉伸,旋转或其他变换。
如果图像是不透明图像,则此方法被视为完全不透明的矩形。两个图像必须是透明图像才能执行考虑透明度的像素级命中测试。当您测试两个透明图像时,alpha阈值参数控制从0到255的alpha通道值被视为不透明。
<强>参数强>
firstPoint:Point - BitmapData图像左上角在任意坐标空间中的位置。在定义secondBitmapPoint参数时使用相同的坐标空间。
firstAlphaThreshold:uint - 此点击测试中被视为不透明的最小Alpha通道值。
secondObject:Object - 一个Rectangle,Point,Bitmap或BitmapData对象。
secondBitmapDataPoint:Point (default = null) - 定义第二个BitmapData对象中像素位置的点。仅当secondObject的值为BitmapData对象时才使用此参数。
secondAlphaThreshold:uint (默认值= 1) - 在第二个BitmapData对象中被视为不透明的最小Alpha通道值。仅当secondObject的值是BitmapData对象且两个BitmapData对象都是透明的时才使用此参数。
<强>返回强>
Boolean - 如果发生命中,则值为true;否则,错误。
<强>抛出强>
ArgumentError - secondObject参数不是Point,Rectangle,Bitmap或BitmapData对象。
TypeError - firstPoint为null。