我正在尝试找出一个最好的方法来执行一个带有角色,敌人和在地图中不可走路的物体的游戏的hitTestPoint。
我创建了一个有效的版本,可以在这里看到: http://www.hosted101.net/hit/mapHitTest.html(箭头键移动,你就是方形)。
使用以前建议的方法,我在地图上创建了所有对象的辅助版本,增加了玩家大小的一半,并且从播放器的centerX和centerY运行了hitTestPoint。
这很棒并且工作正常。
但是,我觉得它并不是最佳的,即使用户看不到它们,也可能无法创建所有这些额外的“边界框”。
所以,我创建了第二个版本。这次没有边框: http://www.hosted101.net/hit/mapHitTestNew.html(要移动的方向键)。
由于这仍然是从玩家的centerX和centerY运行,如果你接近一个物体但是在中心X / Y以下,你将能够穿过它。
我的问题是:在这样的游戏中击中测试对象与玩家/敌人/任何东西,最好的方法是什么? (这个简单项目的固定示例很棒)
它是否真的使用其他边界框创建了地图图层的副本,还是可以更干净的方式完成?
我的代码如下,适用于mapHitTestNew。
感谢。
var moveL:Boolean = new Boolean
var moveR:Boolean = new Boolean
var moveU:Boolean = new Boolean
var moveD:Boolean = new Boolean
var moveSpeed:int = 2
stage.addEventListener(KeyboardEvent.KEY_DOWN, updateKeysDown)
stage.addEventListener(KeyboardEvent.KEY_UP, updateKeysUp)
function updateKeysDown(e:KeyboardEvent){
var _keyCode = e.keyCode
switch (_keyCode){
case 37:
moveL = true;
break;
case 38:
moveU = true;
break;
case 39:
moveR = true;
break;
case 40:
moveD = true;
break;
}
collisionCheck()
}
function updateKeysUp(e:KeyboardEvent){
var _keyCode = e.keyCode
switch (_keyCode){
case 37:
moveL = false;
break;
case 38:
moveU = false;
break;
case 39:
moveR = false;
break;
case 40:
moveD = false;
break;
}
}
/**
***
*** Hit Test
***
***
**/
function collisionCheck():void{
var _MC:MovieClip = new MovieClip;
_MC.x = player.x
_MC.y = player.y
_MC.mouseEnabled = false
var centerX:Number = _MC.x + (player.width/2)
var centerY:Number = _MC.y + (player.height/2)
if(moveL){
trace("Stage 1 Move")
centerX -= moveSpeed
if(map.hitTestPoint((centerX-player.width/2), centerY, true)){
trace("Stage 1 HIT TEST!")
moveL = false
}
}
if(moveR){
trace("Stage 2 Move")
centerX += moveSpeed
if(map.hitTestPoint((centerX+player.width/2), centerY, true)){
trace("Stage 2 HIT TEST!")
moveR = false
}
}
if(moveU){
trace("Stage 3 Move")
centerY -= moveSpeed
if(map.hitTestPoint(centerX, (centerY-player.height/2), true)){
trace("Stage 3 HIT TEST!")
moveU = false
}
}
if(moveD){
trace("Stage 4 Move")
centerY += moveSpeed
if(map.hitTestPoint(centerX, (centerY+player.height/2), true)){
trace("Stage 4 HIT TEST!")
moveD = false
}
}
refreshMovement()
}
function refreshMovement():void{
if(moveL){
player.x -= moveSpeed
}
if(moveR){
player.x += moveSpeed
}
if(moveU){
player.y -= moveSpeed
}
if(moveD){
player.y += moveSpeed
}
}
答案 0 :(得分:0)
听起来你正在做一种头顶视图(考虑到你的盒子在X和Y中移动)。我会有一个0和1的2D数组(真/假)。当你的角色四处移动时,查看你占据的瓷砖的角色命中框,通常是1到4个瓷砖。
如果任何一个位置都有一个真正的东西,他正在打一些东西。这样,您只需要活动对象(它们移动等)的命中框
我还会查看这篇文章,并实施似乎最适合您的解决方案:
http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/