适用于2D游戏的Android Canvas或Open GL ES?

时间:2012-08-10 01:14:52

标签: android graphics opengl-es android-canvas

我想创建一个2D游戏,我想知道哪条路可以根据我的知识背景和游戏本身的一些细节。

我的背景(相关内容):

  • 我10天前开始学习android编程,我已经完成了游戏菜单。

  • 我在java(用于桌面)编程方面有相当多的经验。

  • 我在过去使用C ++中的openGL有一些经验,但只做了三件事(我也记不起很多东西)。我从来没有编写任何开放的GL着色器。我学习了基本的变换,如旋转/缩放/平移,应用纹理(纹理坐标)和一些非常原始的灯光。

游戏应该有:

  • 精灵。每帧+ -50平均可见。

  • 捏缩放/平移 手势。

  • 此功能:能够将一个精灵移动到 另一个地方,用手指画出要跟随的路径。这个 应该可以在任何缩放级别。

  • 声音。枪声,爆炸,简单的短音。

  • 作为奖励,有一些效果会很好 像发光,扭曲效果等线,但事实并非如此 必需的。

  • 应该有简单的方法来绘制圆形/正方形/三角形等几何形状(我的意思是不是在游戏中自己,而是用于开发它的API)

我想在半个月内完成比赛。

现在您认为最好的解决方案是游戏的特点,我的背景和可用的时间? OpenGL ES 2.0?帆布?或API /图形/游戏引擎/库(哪些,是否有文档/教程?)?

游戏本身很简单。我提到的东西真的很重要,至少对我而言。

与我共享特征的游戏示例包括: OsmosSpirit

3 个答案:

答案 0 :(得分:7)

首先,Canvas无法进行游戏。然而,如果你看一下我完全用帆布“Squirrel Wars”(市场上)做的游戏,那就是关于在普通设备上使用画布的游戏的局限性。

使用Canvas的问题是你必须使用的内存的限制,& FPS的局限性,因为它不是硬件加速的。

最大的限制和我切换到OpenGL ES 1.1的原因之一是,如果需要,OpenGL将更容易移植到iOS。

同样使用OpenGL ES,你将拥有比你所做的更多的力量,更多的控制力,并且它应该足以容纳许多精灵,因为你可以放在屏幕上而不会弄乱它。

在我目前正在设计的Open GL游戏中,我能够以25-32 FPS的速度渲染300-400个精灵。

然而,通过将精灵的绘制限制在屏幕上的数字,更像是20-50,我坚持在60-70 FPS左右。

虽然OpenGL有一个学习曲线,但值得学习。我有一个2D框架,我在2D介绍和研究主题的过程中设计,它完美地满足了我所有的2D需求。

我现在可以将我的FrameWork重用于任何我想要设计的2D游戏。

在这里没有给出太多的内容是一些启动你的代码

    import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;

public class RunGameActivity extends Activity{
private GLSurfaceView glSurfaceView;
private GLRenderer GLRENDERER;

@Override
public void onCreate(Bundle savedInstanceState) {
    /***************************************************************************************** 
     * This is called when this activity is first creates.
     * First we remove the title bar, make our app full screen
     * It is set to landscape in the manifest file.
     * We than create our OPENGL ES surfaceview and its renderer for us to use
     * and finally setContentView() view so we see the OPENGL ES surfaceview
     * ***************************************************************************************/
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    super.onCreate(savedInstanceState);

    Log.d("RunGameActivity", "onCreate");

    glSurfaceView = new GLSurfaceView(this);
    GLRENDERER = new GLRenderer(this);
    glSurfaceView.setRenderer(GLRENDERER);
    setContentView(glSurfaceView);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    /***************************************************************************************** 
     * Here we get the incoming on touch event and send it down towards our game
     * via the GLRenderer class. The game does all the actual work with it.
     * ***************************************************************************************/
    Log.d("RunGameActivity", "OnTouchEvent");
synchronized(this) {
        GLRENDERER.HandleMotionEvent(event);
}
    return true;
}



/* Remember to resume the glSurface  */
@Override
protected void onResume() {
    /***************************************************************************************** 
     * Called when app resumes
     * ***************************************************************************************/
    super.onResume();
    glSurfaceView.onResume();
    Log.d("RunGameActivity", "onResume");
}

/* Also pause the glSurface  */
@Override
protected void onPause() {
    /***************************************************************************************** 
     * Called when app pauses
     * ***************************************************************************************/
    super.onPause();
    glSurfaceView.onPause();
    Log.d("RunGameActivity", "onPause");
}

}

我真的不想放弃一切,它的价值学习

但我创造了一种方式让我以一种非常有条理的方式处理所有事情,从创建顶点,纹理,动态文本到处理输入,伪造“Camera”管理帧速率独立运动,处理重力当我需要它时,检测碰撞和动画精灵。更不用说处理AdMob广告,inAppBilling以及所有需要的声音。

刚开始阅读。它遍布网络和书籍。如果你能找到一本好书,值得投资40美元。

您需要自定义的许多代码。但值得建立自己的框架。

我再次推荐OpenGL 1. * 兼容您可能想要的所有设备。

开始使用我给你的代码,将其粘贴到你的活动中,右键单击对象,然后创建他们的类。 Eclipse将自动告诉/填充很多基本的东西。

答案 1 :(得分:3)

如果您想要包含Android 3.0以前的设备,我不会使用画布。这不是硬件加速,所以你会得到非常可怕的帧率。

我在我的android 2.3设备上做了一些小帆布试验,即使使用高端处理器,我也无法在没有严重卡顿的情况下在屏幕上滑动纹理方块。

Android 3& 4有硬件加速视图,但对于2.3我认为你真的需要GPU利用来制作任何可远程播放的东西。如果你没有GPU加速,你可能会忘记特效(粒子,发光等)。

OpenGL我相信是这里的方法,或者你可以使用OpenGL包装器库(AndEngine似乎很受欢迎),如果你不想自己处理API。

答案 2 :(得分:0)

我建议使用AndEngine制作游戏。它是硬件加速的(使用OpenGL ES)并提供良好的API来操作精灵。