如何创建一个Android 2D游戏?

5
我是一名正在学习Android的开发者,目前已经创建了两个应用程序:一个闹钟、一个小部件和一个使用数据库的密码管理器。我有一点经验,但我想创建一个2D横向卷轴游戏。我在网上查阅了不同的教程,但是,什么是开始工作的最佳方法?我已经阅读了关于libgdx的资料,但我不确定它是否已经过时。
我已经看到所有的游戏都是用Java编写的,然后移植到Android上,这是正确的吗?我会感激一些指导,谢谢!

5
LibGDX 绝对不过时,事实上,它的多平台库最近一个月推出了 v1.1.0 版本并增加了对 iOS 的支持。这是我最喜欢的教程http://www.gamefromscratch.com/page/LibGDX-Tutorial-series.aspx ,但这个链接是关于2D平台游戏开发的http://obviam.net/index.php/getting-started-in-android-game-development-with-libgdx-create-a-working-prototype-in-a-day-tutorial-part-1/。 - EpicPandaForce
谢谢您的建议,我会在有时间的时候查看教程并进行一些测试。 - saman0suke
2个回答

13
您有多种选择,可以使用AndEngine(对我来说似乎非常未记录和随机),使用扩展自SurfaceView的“本地”Android游戏(虽然不是不可能,但这确实不会让您的生活变得轻松,特别是在处理图像和声音方面,但是这里有一个设置:使用自定义SurfaceView和线程进行Android游戏编程(示例)),还有LibGDX。
我个人推荐LibGDX,我甚至在其中制作了一个相当简单的4人多人游戏,而且它确实不难。我建议您查看以下教程: http://www.gamefromscratch.com/page/LibGDX-Tutorial-series.aspx 基础知识如下:
- 当您创建项目时,首先要做的是将ApplicationAdapter更改为Game,以便您可以访问setScreen(Screen)委派函数,以便您可以将游戏的显示和逻辑分离成屏幕。 - 您需要在屏幕中处理经过的时间,方法如下:如何在Libgdx(android)中跟踪时间 - 您可能想制作一个菜单,当然可以使用漂亮的图片和BitmapFonts来完成,但我会指向官方wiki(https://github.com/libgdx/libgdx/wiki)。您可以使用Scene2D,尽管我发现它稍微有些困难,所以我个人制作了由矩形组成的菜单,效果还不错:LibGDX - Custom Click Listener? - 我通过LibGDX处理触摸事件的“点击导向”指南:https://dev59.com/NIHba4cB1Zd3GeqPMxyX#24511980 - 然后,就是实现游戏逻辑、计时器、数据模型和行为。 - 我解决拉伸问题的方法不是使用StretchingViewport或内置相机,而是采用以下方法:
public class Resources
{
    public static Texture texture;
    public static SpriteBatch batch;

    public static Matrix4 normalProjection;
    public static BitmapFont bitmapFont;

    public static ShapeRenderer shapeRenderer;
    ....
}

public static void initialize()
{
    int width = Gdx.graphics.getWidth();
    int height = Gdx.graphics.getHeight();
    Resources.bitmapFont = new BitmapFont();
    Resources.shapeRenderer = new ShapeRenderer();
    Gdx.gl.glLineWidth((width < 640 && height < 480) ? 2.5f : 6f);
    //camera = new OrthographicCamera(1, h / w); //I didn't use this at all
    Gdx.gl.glViewport(0,  0,  Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    loadTextures();

    Resources.batch = new SpriteBatch();
    Resources.normalProjection = new Matrix4().setToOrtho2D(0, 0, 480, 320); //model is 480x320
    Resources.batch.setProjectionMatrix(Resources.normalProjection);
    Resources.shapeRenderer.setProjectionMatrix(Resources.normalProjection);
}


public class InputTransform
{
    private static int appWidth = 480;
    private static int appHeight = 320;

    public static float getCursorToModelX(int screenX, int cursorX) 
    {
        return (((float)cursorX) * appWidth) / ((float)screenX); 
    }

    public static float getCursorToModelY(int screenY, int cursorY) 
    {
        return ((float)(screenY - cursorY)) * appHeight / ((float)screenY) ; 
    }
}

请确保在游戏的dispose()回调中处理需要释放的资源。


4
我同意,libgdx将是最佳选择。它易于使用,跨平台,并可以加速开发。 - Robert P
@saman0suke 我不会说libgdx是更好的选择。你可以在这里(https://groups.google.com/forum/#!topic/android-developers/xR6e9JNpwWM)阅读一些讨论。两个库的创建者(Nicolas和Mario)也在那里,并谈论了引擎。 - Robert P
1
@Zhuinden,一开始所有的东西都很混乱,但是一旦你理解了它,scene2d就可以帮助很多。唯一的缺点是逻辑和视图(update()draw())在同一个类中,这使得MVC几乎不可能。 - Robert P
我想专注于游戏的Android版本,我应该在那里创建所有逻辑,还是应该使用名为“core”的逻辑?谢谢! - saman0suke
1
@saman0suke 这就是 libgdx 的巨大优势。你编写一个游戏(“Core”),然后通过几行代码(“DesktopLauncher”,“AndroidLauncher”),你就可以将它移植到 Android、桌面、HTML5 甚至 iOS。当然,在针对移动设备时需要注意一些问题(例如输入)。所以所有的逻辑都应该在“Core”项目中。 - Robert P
显示剩余17条评论

7
Libgdx 不过时,而且在我看来,是最好的 Android 编程方式。原因是你可以将 99% 的开发工作都放在桌面端进行(当然要考虑到在 Android 上不是通过键盘进行控制),然后只需简单几行代码就能得到一个可用的 Android 应用程序。
如果你直接为 Android 开发应用程序,则需要使用非常缓慢的模拟器或将应用程序发送到测试手机上才能调试代码。这比直接在桌面上调试要慢得多。
Libgdx 效率极高,易于使用(一旦你理解了它的工作原理),并且有非常好的文档支持。

关于教程:我在 Stack Overflow 写了一个回答,似乎对一些人有所帮助。这是一个简短的“教程”,仅展示基础内容,并附有一些帮助我学习的教程链接。所以我希望它也能对你有所帮助^^


1
GenyMotion是比默认模拟器更好的模拟器,但在桌面上测试仍然更方便。 - EpicPandaForce
@Zhuinden,我从未使用过模拟器,因为我的(从未完成的:P)游戏一直针对桌面平台。但是通过一些代码更改(控件)和一些附加行(Android后端内容),如果它们在桌面上运行正常,它们也可以在Android上运行(如果它们在桌面上运行正常:P)。 - Robert P
蓝叠模拟器不比Genymotion更好吗? - Boldijar Paul
@Springrbua 我不知道,但是当我使用它时,我的游戏运行得非常完美,帧率高...在我买了手机后,我再也没有使用模拟器了。 - Boldijar Paul
@Paul,问题在于你总是需要将应用程序加载到手机上,而使用libgdx则可以在桌面上开发并在桌面上测试。只需几行代码,就可以拥有一个Android应用程序。 - Robert P
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接