1

我正在尝试为具有地图中不可行走的角色、敌人和物体的游戏找出执行 hitTestPoint 的最佳方法。

我创建了一个有效的版本,可以在这里看到:http: //www.hosted101.net/hit/mapHitTest.html(箭头键移动,你是正方形)。

使用之前建议的方法,我创建了地图上所有对象的第二个版本,增加了一半的播放器大小,并从播放器的 centerX 和 centerY 运行 hitTestPoint。

这很棒,而且效果很好。

但是,我觉得这不是最佳的,创建所有这些额外的“边界框”可能是不必要的,即使用户看不到它们。

所以,我创建了第二个版本。这次没有边界框: http: //www.hosted101.net/hit/mapHitTestNew.html(箭头键移动)。

由于它仍然从玩家的 centerX 和 centerY 运行,如果你接近一个物体但在 centerX/Y 以下,你将能够穿过它。

我的问题是这样的:在这样的游戏中,要在这样的游戏中 hitTest 对象与玩家/敌人/任何东西,最好的方法是什么?(对于这个简单的项目有一个固定的例子会很棒)

它真的是使用额外的边界框创建地图图层的副本,还是可以以更干净的方式完成?

我的代码在下面,用于 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
}
}
4

1 回答 1

0

听起来你正在做一种俯视图(考虑到你的盒子在 X 和 Y 方向移动)。我会有一个包含 0 和 1 的二维数组(真/假)。当您的角色四处移动时,查看您的角色命中框以查找它所占据的图块,通常为 1 到 4 个图块。

如果在这些位置中的任何一个有 TRUE,那么他正在击中某些东西。这样,您只需要活动对象上的命中框(它们移动等)

我还将查看这篇文章,并实施似乎最适合您的解决方案:

http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/

于 2012-07-08T08:54:17.180 回答