这就是我的困境
我的游戏舞台周围有4面墙,当玩家撞到这些墙壁时,我不想为每一个墙壁制作一个if语句来检查玩家是否正在击中它,所以我创造了一个用于固定墙壁的阵列,然后检查玩家是否正在击中它。现在,因为我这样做,我不知道如果他击中某些东西,玩家实际上是在打什么,如果他打[0], [1], [2]
之类的话,我就不能在我的阵列中检查,因为那时我&#39如果他碰到特定的墙壁,我会回去做检查。我不想这样做的原因是为了将来,当我添加更多障碍,建筑物等时。
所以我的问题是,如何在不对特定对象进行硬编码检查的情况下进行碰撞检查,并提供某种可用于玩家响应的值,例如,如果您击中顶墙并且您如果不做上述事情,可以以某种方式解决这个问题,然后做到这一点,这样你就无法通过什么,
if (main.playerPosKeeper_mc.hitTestObject(this[main.StageCollisions]))
{
trace("hit");
}
StageCollisions是一个包含我所有障碍的数组。
当玩家在StageCollisions中点击任何内容时,我不能简单地从他的y值或x值中减去,因为我不知道他击中了哪个对象,但是我也不想硬编码它以便我检查一下我是否可以说顶部屏障,因为如果我只是回到制作静态的if else语句,为什么首先要做一个数组呢。
^^完善此主题
AS3 - How to Cycle States of Character Animations (moving & stopped)
这一直困扰我一段时间,所以非常感谢帮助。这是一个很难形成的问题,所以如果有必要我可以澄清一点。
答案 0 :(得分:1)
所以我的问题是,如何在没有硬编码的情况下进行碰撞检查 检查特定对象,并提供某种可能的值 用于玩家回应,例如,如果你击中顶部 墙,你可以不知不觉地做出来,然后 使它成为你无法走过的东西
是的,所以你想要一种方法来执行通用的碰撞响应。这可能是一个很大的话题。最简单的方法通常是在移动后检查碰撞,如果发生碰撞则反转移动。
这样的事情:
function movePlayer(movementX:Number, movementY:Number):void {
var originalX:Number = player.x;
var originalY:Number = player.y;
player.x += movementX;
if (checkCollision()) {
player.x = originalX;
}
player.y += movementY;
if (checkCollision()) {
player.y = originalY;
}
}
function checkCollision():Boolean {
for each (var wall:MovieClip in walls) {
if (player.hitTestObject(wall)) {
return true;
}
}
return false;
}
这样你可以checkCollision()
检查4面墙或50面墙,这没关系。它不会让玩家进入它们。
这只是一个起点,有许多方法可以分解或改进。
答案 1 :(得分:0)
一些简单的伪代码供您学习:
private function collisionCheck(h:Sprite):Sprite{ // pass the hero Sprite into this function and it will return the wall that it hit
for each (b:Sprite in blockArray){ // if your array of hit-able objects is called "blockArray"
if (h.hitTtestObject(b)){ // check the hero Sprite against all objects in the array
return b;
}
}
return null;
}
然后,在你的代码中的其他地方(可能在你的gameTick函数或gameLoop函数中,或者你在每一帧上重复游戏逻辑的地方:
private function gameTick():void{
var objectHit:Sprite = collisionCheck(_myHero); // this will run the collision check function, and return the sprite that the hero collides with;
if (objectHit != null){
objectHit.alpha = 0.5;
// this will give you a visible representation that your code is indeed working, or not.
}
}
对于那些你的英雄没有与任何东西发生碰撞的时刻,这个函数将返回null。这就是为什么我在尝试对其alpha值执行操作之前首先检查objectHit是否为null。当然,除了在项目中更改其alpha值之外,您还会做一些事情,但这是我经常做的事情(使用alpha)来快速获得事物正在检测它们应该是什么的视觉确认。