好的,这是我的问题,需要一些解释。
上课正在AS3开发街机游戏。该大学有一个街机,机器上的操作系统由我们的老师开发,并提供软件开发工具包。它没什么了不起的,所以大部分内容都相当简单。我只是想指出这一点,主要是因为我使用了一个名为update()的覆盖函数来代替ENTER_FRAME事件和循环函数,SDK提供每个帧执行更新。
好的,这就是我的问题。我有一个名为GameState的文档类,它实际上处理了该状态下的游戏。在这堂课中,我设置了世界和角色。现在它只有2座山,2座城堡,3座岛屿和角色。
private function initWorld():void
{
trace("World has initiated");
addChild(hazardArea)
positionElement(hazardArea, 0, 560);
addChild(mountainSideRight);
positionElement(mountainSideRight, 730, 200)
addChild(mountainSideLeft);
positionElement(mountainSideLeft, 0, 200);
addChild(castleOne);
positionElement(castleOne, 5, 160);
addChild(castleTwo);
positionElement(castleTwo, 765, 160);
addIslands();
}
position元素只是一个函数,用于设置添加到舞台的MC i的x和y坐标。现在我也在AddChild上创建了一个覆盖,这样每当我将一个Child添加到舞台时,它就会将它保存到一个我可以稍后访问的数组中:
override public function addChild(object:*):void
{
super.addChild(object);
worldObjects.push(object);
}
好的,三个岛屿通过addIsland添加,如下所示:
private function addIslands():void
{
var island:Array = Islands.getIslandCords();
for (var x:int = 0; x < DiceNumbers.NUM_ISLS; x++)
{
addChild(island[x].mc);
positionElement(island[x].mc, island[x].x, island[x].y);
}
}
群岛只是一个类,通过一堆数学和东西找到我的3个岛屿的位置...返回的数组只是3个包含moveclip和x的实例的对象并不重要和y coord for it。
我还有一个单独的角色类来代表我的矮人(我游戏中的角色)。除了我的重力系统看起来像这样之外,在课堂上没什么奇怪的:
var gravity:Number = 2;
public var moveX:Number = 300;
public var moveY:Number = 50;
public var xSpeed:Number = 0;
public var ySpeed:Number = 2;
public static const playerSpeed:Number = 3;
public var friction:Number = .75;
然后我提到的update()函数就像EVENT_FRAME循环一样,有这个:
public function update():void
{
xSpeed *= friction;
moveX += xSpeed;
moveY += ySpeed
theDwarf.y += gravity;
this.x = moveX;
this.y = moveY;
updateControls();
}
theDwarf是我的矮人影片剪辑的实例,updateControls为我的矮人移动提供了功能。
好的....所以最后在我的GameState类的update()函数下,我调用了我的碰撞类,并将数组中的所有对象传递给它。在本课程中,我检查了碰撞:
public function checkCollision(listOfObjects:Vector.<MovieClip>):void
{
for (var i:int = 0; i < worldObjects.length; i++) {
if(worldObjects[i] is Player){
var objOne:MovieClip = worldObjects[i];
for (var j:int = 0; j < worldObjects.length; j++){
if (j == i){
// elimates self comparisons.
}
else{
var objTwo:MovieClip = worldObjects[j];
checkIntersect(objOne, objTwo )
}
}
}
}
}
private function checkIntersect(player:MovieClip, objTwo:MovieClip):void
{
if(player.hitTestObject(objTwo)){
player.ySpeed = -1;
}
else{
player.ySpeed = 2;
}
}
我的问题是这个:这个函数检查我的玩家对着舞台上的每个对象。因此,即使我的矮人落在一个岛上,他也没有击中另外两个岛屿,所以ySpeed一直被重置为2.如果我摆脱了其他声明,我的矮人重力永远不会回到2,他再也不会跌倒。我找不到解决方案......我已经努力找到解决这个问题的方法而且我很难过......我希望我的矮人除非他在我的一个岛屿或一座山上摔倒。我希望我已经足够清楚地解释我的问题了,现在这已成为一个巨大的帖子......:谢谢你!
答案 0 :(得分:0)
为了更好地解释之前的评论,您必须更改最后两个函数,如下所示:
public function checkCollision(listOfObjects:Vector.<MovieClip>):void
{
OuterLoop: for (var i:int = 0; i < worldObjects.length; i++) {
if(worldObjects[i] is Player){
var objOne:MovieClip = worldObjects[i];
for (var j:int = 0; j < worldObjects.length; j++){
if (j == i){
// elimates self comparisons.
}
else{
var objTwo:MovieClip = worldObjects[j];
player.ySpeed = checkIntersect(objOne, objTwo )
if (player.ySpeed == -1)
break OuterLoop;
}
}
}
}
}
private function checkIntersect(player:MovieClip, objTwo:MovieClip):int
{
if(player.hitTestObject(objTwo)){
return -1;
}
else{
return 2;
}
}
这也可以做得更好。但这是解决问题的最快方法。