ActionScript 3 - 阵列问题中对象的碰撞检测
ActionScript 3 - Collision detection of objects in an array issue
我正在开发一款小型 Flash 游戏,目前正在尝试实现最多 4 名玩家的多人游戏。虽然 1 个玩家的碰撞检测工作完美,但当添加更多玩家时 只有最后一个玩家可以与其他对象发生碰撞。
使用跟踪语句我发现从主要 class return 调用有问题玩家的 x 和 y 坐标作为初始 x 和 y 位置 而不是当前坐标 (trace(players[0].x + "/" + players[0].y);
),而从播放器中调用它们时 class (trace(this.x + "/" + this.y);
) 总是给出正确的值。
最后一个玩家总是 return 两个 class 中的正确坐标。下面是主要框架 class.
public class main extends MovieClip {
public var collisionObject: Array = new Array(14);
public var players: Array = new Array();
private var noOfPlayers = 2;
public function main() {
for (var i = 0; i < noOfPlayers; i++) {
setupPlayer(i);
stage.addChild(players[i]);
}
setupCollisionObject();
stage.addEventListener(Event.ENTER_FRAME, checkForCollision);
}
private function setupCollisionObject() {
/* Determines positions of and spawns objects */
}
private function setupPlayer(playerNo) {
switch (playerNo) {
case 3:
players[3] = new player(1000, 576, 180, 104, 100, 102);
case 2:
players[2] = new player(24, 576, 0, 73, 74, 76);
case 1:
players[1] = new player(1000, 384, 180, 38, 37, 39);
case 0:
players[0] = new player(24, 384, 0, 87, 65, 68);
}
}
public function checkForCollision(e: Event) {
trace("x: "+players[0].x+" y: "+players[0].y);
trace("x: "+players[1].x+" y: "+players[1].y);
for (var i in players) {
for (var j in collisionObject) {
if (players[i].hitTestObject(collisionObject[j])) {
//damage player
}
}
}
}
}
我不知道为什么会这样。
您在 setupPlayer()
的 switch-case 中缺少 break;
,这会导致所有玩家在每次调用 setupPlayers(i)
期间重新初始化,但最后一个玩家除外。
private function setupPlayer(playerNo) {
switch (playerNo) {
case 3:
players[3] = new player(1000, 576, 180, 104, 100, 102);
break;
case 2:
players[2] = new player(24, 576, 0, 73, 74, 76);
break;
case 1:
players[1] = new player(1000, 384, 180, 38, 37, 39);
break;
case 0:
players[0] = new player(24, 384, 0, 87, 65, 68);
break;
}
}
我正在开发一款小型 Flash 游戏,目前正在尝试实现最多 4 名玩家的多人游戏。虽然 1 个玩家的碰撞检测工作完美,但当添加更多玩家时 只有最后一个玩家可以与其他对象发生碰撞。
使用跟踪语句我发现从主要 class return 调用有问题玩家的 x 和 y 坐标作为初始 x 和 y 位置 而不是当前坐标 (trace(players[0].x + "/" + players[0].y);
),而从播放器中调用它们时 class (trace(this.x + "/" + this.y);
) 总是给出正确的值。
最后一个玩家总是 return 两个 class 中的正确坐标。下面是主要框架 class.
public class main extends MovieClip {
public var collisionObject: Array = new Array(14);
public var players: Array = new Array();
private var noOfPlayers = 2;
public function main() {
for (var i = 0; i < noOfPlayers; i++) {
setupPlayer(i);
stage.addChild(players[i]);
}
setupCollisionObject();
stage.addEventListener(Event.ENTER_FRAME, checkForCollision);
}
private function setupCollisionObject() {
/* Determines positions of and spawns objects */
}
private function setupPlayer(playerNo) {
switch (playerNo) {
case 3:
players[3] = new player(1000, 576, 180, 104, 100, 102);
case 2:
players[2] = new player(24, 576, 0, 73, 74, 76);
case 1:
players[1] = new player(1000, 384, 180, 38, 37, 39);
case 0:
players[0] = new player(24, 384, 0, 87, 65, 68);
}
}
public function checkForCollision(e: Event) {
trace("x: "+players[0].x+" y: "+players[0].y);
trace("x: "+players[1].x+" y: "+players[1].y);
for (var i in players) {
for (var j in collisionObject) {
if (players[i].hitTestObject(collisionObject[j])) {
//damage player
}
}
}
}
}
我不知道为什么会这样。
您在 setupPlayer()
的 switch-case 中缺少 break;
,这会导致所有玩家在每次调用 setupPlayers(i)
期间重新初始化,但最后一个玩家除外。
private function setupPlayer(playerNo) {
switch (playerNo) {
case 3:
players[3] = new player(1000, 576, 180, 104, 100, 102);
break;
case 2:
players[2] = new player(24, 576, 0, 73, 74, 76);
break;
case 1:
players[1] = new player(1000, 384, 180, 38, 37, 39);
break;
case 0:
players[0] = new player(24, 384, 0, 87, 65, 68);
break;
}
}