我目前正在开发一款游戏。这是一个简单的,不需要,因此不使用任何类型的框架。现在,代码在对象之间的移动和碰撞方面工作得很好;但是,我相信我的递归功能太“快”,只显示对象的最后一个动作,而不是显示它们采取的步骤。
简而言之: 水平边界,这些边界内部是可移动的物体,可以在4个方向滑动,具体取决于你的“甩动”动作。但是,不是物体明显滑动,而是“传送”到最终目的地。
这是我的功能:
public void MoveObjects(){
boolean allCollided = true;
int moveSpeed = 8;
//Up and Left movement
if(upMotion || leftMotion){
for(int i = 0; i < movables.size(); i++){
int oldX = movables.get(i).position.x;
int oldY = movables.get(i).position.y;
int newX = 0;
int newY = 0;
if(leftMotion)
newX = oldX-moveSpeed;
if(upMotion)
newY = oldY-moveSpeed;
//Make sure neither newX or newY is 0
if(newX == 0)
newX = oldX;
if(newY == 0)
newY = oldY;
movables.get(i).Position(newX, newY);
for(GameObject go : level){
if(movables.get(i).Collision(go) && go.spriteID != R.drawable.nothing){
if(leftMotion)
newX=oldX;
if(upMotion)
newY=oldY;
movables.get(i).collided = true;
}
}
for(GameObject go : movables){
if(movables.get(i).Collision(go) && go.spriteID != R.drawable.nothing && go != movables.get(i)){
if(leftMotion)
newX=oldX;
if(upMotion)
newY=oldY;
movables.get(i).collided = true;
}
}
movables.get(i).Position(newX, newY);
}
}
//Down and Right movement
if(downMotion || rightMotion){
for(int i = movables.size()-1; i > -1 ; i--){
int oldX = movables.get(i).position.x;
int oldY = movables.get(i).position.y;
int newX = 0;
int newY = 0;
if(rightMotion)
newX = oldX+moveSpeed;
if(downMotion)
newY = oldY+moveSpeed;
//Make sure neither newX or newY is 0
if(newX == 0)
newX = oldX;
if(newY == 0)
newY = oldY;
movables.get(i).Position(newX, newY);
for(GameObject go : level){
if(movables.get(i).Collision(go) && go.spriteID != R.drawable.nothing){
if(rightMotion)
newX=oldX;
if(downMotion)
newY=oldY;
movables.get(i).collided = true;
}
}
for(GameObject go : movables){
if(movables.get(i).Collision(go) && go.spriteID != R.drawable.nothing && go != movables.get(i)){
if(rightMotion)
newX=oldX;
if(downMotion)
newY=oldY;
movables.get(i).collided = true;
}
}
movables.get(i).Position(newX, newY);
}
}
//Check all objects for collision
for(int i = 0; i < movables.size(); i++){
if(!movables.get(i).collided)
allCollided = false;
}
checkShapes();
updateDraw();
if(!allCollided)
MoveObjects();
}
我知道我的代码中有些奇怪,我需要在某些时候清理它,但这是一个描述:
- 根据飞行方向,使用不同的循环来精确计算碰撞
-movables是当前级别中所有可移动对象的“GameObject”向量
- 初始碰撞检查后,另一个for循环(我可以将其转换为for-each循环,我知道)用于查看是否存在任何未崩溃的对象。
- 基于此最终循环,'allCollided'布尔值设置为false。
- 游戏然后检查哪些匹配对象已经碰撞并将其从屏幕上移除,然后相应地更新屏幕。
- 使用最后的'if'语句关闭,看看是否需要再次调用'MoveObjects()'函数(递归)
现在提问: 如何手动减慢此循环,这样做是否明智?这个问题可能有不同的解决方案吗? Thread.sleep()不起作用,这也是不明智的,但值得一试。
答案 0 :(得分:0)
我已经设法通过将我的MoveObjects()函数放在CountDownTimer中来解决这个问题。这样,每个tick都调用一次MoveObjects()函数和updateDraw()方法,而不是在一个帧中递归调用。