控制火箭游戏的最佳策略或示例代码? (激活火箭按钮,重力...)

时间:2014-07-12 12:47:56

标签: java android game-engine android-sensors

我想在屏幕上模拟火箭。当用户按下一个键时,火箭被激活,物体必须上升,当没有按下按键时,摇动被停用,并且必须由于重力而下降。

如果用户将手机倾斜,也可以将对象向左或向右移动。

如何实现这一目标?有一些示例如何做到这一点?

我没有使用任何引擎,我使用ObjectAnimator和简单的视图完成所有操作。这是一个非常简单的游戏我不想使用外部引擎,如果它不是强制性的

由于

1 个答案:

答案 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逻辑),但是希望能让你对如何处理这个问题有一个大致的了解。