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

jma*_*edo 4 graphics android opengl-es android-canvas

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

我的背景(相关的东西):

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

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

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

该游戏应该具有:

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

  • 捏缩放/平移手势.

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

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

  • 作为奖励,有一些效果,如发光线,扭曲效果等,这将是很好的,但这不是必需的.

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

我想在半个月内完成游戏.

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

游戏本身很简单.我提到的东西真的是这里最重要的东西,至少对我而言.

与我共享特征的游戏示例包括: Osmos, Spirit

WIl*_*JBD 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 FrameWork,我在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");
}
Run Code Online (Sandbox Code Playgroud)

}

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

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

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

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

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

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