当前位置: 首页 > 知识库问答 >
问题:

如何创建Android2D游戏?

薛宇
2023-03-14

我是一个仍在学习Android系统的开发人员,到目前为止,我已经创建了两个应用程序,一个闹钟,一个小部件和一个使用数据库的通行证管理器,我有一点经验,但我想创建一个2D侧滚动游戏,我在网上查看,有不同的教程,但是,开始使用它的最佳方法是什么?我读过libgdx,但我不确定它是否过时。

我看到所有的游戏都是用Java制作的,然后移植到Android系统,这是正确的吗?我希望得到一些指导,谢谢!

共有2个答案

洪胜涝
2023-03-14

Libgdx并没有过时,恕我直言,它是为机器人编程的最佳方式。原因是,你可以在桌面上开发99%(ofc考虑一下控件,这在Android上不会是键盘),然后你有一个只有几行的工作Android应用程序。
如果您直接针对Android进行开发,则需要使用verry慢速模拟器,或者您必须将应用程序发送到测试电话,只是为了调试代码。这比直接在桌面上调试要慢得多。
Libgdx非常高效,易于使用(只要你了解它是如何工作的),并且有一个非常好的文档。

对于教程:我在SO上这里写了一个回答,貌似对一些人有帮助。这是一个简短的“教程”,只显示了verry基础知识,我已经添加了一些教程的链接,帮助我学习它。所以我希望它能帮助你to^^

马才
2023-03-14

你有多种选择,你可以选择AndEngine(对我来说,这似乎是非常不成熟和随机的),通过从SurfaceView扩展来制作自己的“原生”Android游戏(这不是不可能的,但肯定不会让你的生活变得容易,特别是在处理图像和声音时,但这里有一个设置:使用自定义SurfaceView和线程进行Android游戏编程(示例)),还有LibGDX。

我个人推荐LibGDX,我甚至用它做了一个相当简单的4人多人游戏,这当然不难。我推荐以下如何使用它的教程:http://www.gamefromscratch.com/page/LibGDX-Tutorial-series.aspx

基本情况如下:

>

  • 创建项目时,首先要做的是将ApplicationAdapter更改为Gamedelegation函数,以便将游戏的显示和逻辑分离为Screen。

    您想在屏幕中处理经过的时间,如下所示:如何在Libgdx(android)中跟踪时间

    你可能想做一个菜单,这当然可以用漂亮的图片和位图字体来完成,但我会用它指向官方wiki(https://github.com/libgdx/libgdx/wiki)。你可以使用Scene2D,尽管我发现它有点困难,所以我亲自制作了一个由矩形组成的菜单,它工作得相当不错:LibGDX - 自定义点击侦听器?

    关于我如何使用LibGDX处理触摸事件的更多“面向单击”指南:https://stackoverflow.com/a/24511980/2413303

    我解决拉伸而不是使用拉伸视口或内置相机的方法如下:

    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()回调中释放需要释放的资源。

  •  类似资料:
    • 问题内容: 我正在尝试为xlib窗口创建游戏循环,但是无法正确绘制该窗口。现在,我正在使用XCreateSimpleWindow(…)创建一个窗口,并使用for循环一次绘制所有像素。(这些像素的颜色是从一个大的整数数组中读取的,现在,我将所有像素设置为蓝色。)现在,实际的游戏循环如下: 全局定义了变量dsp,win,pixels,gc。 现在,当我编译并执行二进制文件时,y坐标低的行主要是蓝色,而

    • Unity empowers game designers to make games. What's really special about Unity is that you don't need years of experience with code or a degree in art to make fun games. There are a handful of basic w

    • 问题内容: 我想 动态地在过程主体内 创建 游标, 我也必须使用 for循环 而不是下面的代码。我做了动态光标,但我不能使用for循环。 如果我使用注释的代码(用于循环),我会报错 PLS-00221:不是过程或未定义。 是否可以在动态游标中使用for循环? 问题答案: 您不能在游标FOR循环中引用游标变量 但是您可以直接使用选择语句:

    • 问题内容: 我在詹金斯(Jenkins)有2个工作: 建立并运行单元测试 (构建并)运行集成测试 Job-2 是 Job-1 的下游项目。 Job-1 在其上启动构建并运行单元测试。 Job-2 也会启动构建并运行集成测试。 我想更改它, 并使 Job-2 在由 Job-1 启动的结果构建上运行测试。 问题答案: 您可以使用Copy Artifact插件,并使用Job-2中的Job-1工件对它们进

    • 问题内容: 我正在尝试创建一个对OOP友好的Java BlackJack游戏,以增进我的知识。 我碰壁了,我只是不知道该问题。想知道是否有人可以指出我的问题。 另外,在搜索了与此相关的主题之后,我发现人们一次又一次地说使用枚举会更有益,因为建议初学者这样做?还是我暂时应该坚持使用String数组。 谢谢。 我的代码: 编辑:目前我从println发出的输出是:[Card @ addbf1,Card

    • 我目前的android应用程序使用Google play games服务作为一个基于回合的游戏。它已经发布,工作正常,但我想增加玩家与“电脑”对手对抗的能力,作为一个“真实”的人。这可能吗?这“合法”吗?从搜索Google play服务文档和代码来看,这似乎是不可能的。死了有谁知道不一样吗?