我想在屏幕上模拟火箭。当用户按下一个键时,火箭被激活,物体必须上升,当没有按下按键时,摇动被停用,并且必须由于重力而下降。
如果用户将手机倾斜,也可以将对象向左或向右移动。
如何实现这一目标?有一些示例如何做到这一点?
我没有使用任何引擎,我使用ObjectAnimator和简单的视图完成所有操作。这是一个非常简单的游戏我不想使用外部引擎,如果它不是强制性的
由于
答案 0 :(得分:2)
好的,如果我理解正确,并且因为你已经有一个游戏循环工作在每个周期更新游戏的渲染/逻辑,我可以得出结论你有类似的东西:
//Game loop:
while(running){
//game cycle starts here:
//---------
//code handling fps
//---------
update();
render();
//---------
//code handling fps
//---------
}
每个游戏循环执行的两个主要步骤(通常)是更新游戏逻辑,根据逻辑(渲染)更新屏幕显示。
这两种方法都是游戏引擎的一部分,每当您在屏幕上添加新实体时,他们需要遵循这些规则" (引擎的设计模式)。
以下是上一段代码的基本示例:
private class GameEngine extends Activity {
private boolean running;
@Override
protected void onCreate(Bundle savedInstanceState){
//We initiate game loop:
running = true;
new Thread(new GameLoop ()).start();
}
private void update(){
}
private void render(){
}
class GameLoop implements Runnable {
@Override
public void run() {
while(running){
//game cycle starts here:
//---------
//code handling fps
//---------
update();
render();
//---------
//code handling fps
//---------
}
}
}
}
现在我可以从你的帖子中了解到你为Rocket重写了android api View类(可能还有我打赌的屏幕上的任何其他实体)。 知道你需要做的是,首先,根据用户输入生成位置/速度逻辑(按一个按钮/不按一个按钮)每个更新()强>打电话给发动机。之后,结果值(每个特定实体) updateSelf()调用(例如:x,y,velocity,previousX,previousY ....),引擎将发出一个调用 renderSelf(),在您的情况下可以将其转换为实体的onDraw()回调,您可以在其中更新给定值的视图位置。
因此我们需要对象的引用(在本例中为火箭),以便引擎循环到 update()和 render()。我们可以存储我们想要在 ArrayList 上显示的每个实体的引用,以供引擎使用。 这些"实体"对于发动机循环的各个步骤,都将具有updateSelf()和renderSelf()的实现。现在主要课程应该是这样的:
private class GameEngine extends Activity {
private boolean running;
private ArrayList<Entity> mEntitiesOnScreen;
@Override
protected void onCreate(Bundle savedInstanceState){
//We create a Rocket for the game loop:
mEntitiesOnScreen = new ArrayList<Entity>();
mEntitiesOnScreen.add(new Rocket());
//We initiate game loop:
running = true;
new Thread(new GameLoop ()).start();
}
private void update(){
for (int i=0; i<= mEntitiesOnScreen.size(); i++){
mEntitiesOnScreen.updateSelf();
}
}
private void render(){
for (int i=0; i<= mEntitiesOnScreen.size(); i++){
mEntitiesOnScreen.renderSelf();
}
}
class GameLoop implements Runnable {
@Override
public void run() {
while(running){
//game cycle starts here:
//---------
//code handling fps
//---------
update();
render();
//---------
//code handling fps
//---------
}
}
}
}
有类似于上面的内容,火箭类的实现可能是这样的:
public class Rocket extends Entity {
int currentX, currentY = 0;
int velocityX, velocityY = 0;
/*We override these methods from Entity superclass,
which would be a custom class
extending View and implementing a custom interface
(could be named CustomEntityCycleInterface for example)
for updateSelf() and renderSelf()*/
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//Here it will go drawing code, using updated values
//of currentY and currentX
}
@Override
public void updateSelf(){
if (isUpPressed){
velocityY = velocityY + 1;
}else{
velocityY = velocityY - 1;
}
currentY = currentY + velocityY;
}
@Override
public void renderSelf(){
//not sure this call will work synchronized
//on a custom game loop, you will have to check:
this.invalidate();
}
}
我知道现在这个问题真的很糟糕,有些部分缺失了(例如onDraw逻辑),但是希望能让你对如何处理这个问题有一个大致的了解。