我需要“开始android游戏”代码的解释

2024-06-28

这几天我在读《Beginning Android Games》这本书。但我坚持理解代码。

您可以在此处检查或下载代码:http://code.google.com/p/beginnginandroidgames2/downloads/list http://code.google.com/p/beginnginandroidgames2/downloads/list

我指的项目是ch06-mr-mom。该活动称为MrNomGame:

public abstract class AndroidGame extends Activity implements Game {

    AndroidFastRenderView renderView;
    Graphics graphics;
    Audio audio;
    Input input;
    FileIO fileIO;
    Screen screen;
    WakeLock wakeLock;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
        int frameBufferWidth = isLandscape ? 480 : 320;
        int frameBufferHeight = isLandscape ? 320 : 480;
        Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth,
                frameBufferHeight, Config.RGB_565);

        float scaleX = (float) frameBufferWidth
                / getWindowManager().getDefaultDisplay().getWidth();
        float scaleY = (float) frameBufferHeight
                / getWindowManager().getDefaultDisplay().getHeight();

        renderView = new AndroidFastRenderView(this, frameBuffer);
        graphics = new AndroidGraphics(getAssets(), frameBuffer);
        fileIO = new AndroidFileIO(this);
        audio = new AndroidAudio(this);
        input = new AndroidInput(this, renderView, scaleX, scaleY);
        screen = getStartScreen();
        setContentView(renderView);

        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame");
    }

    @Override
    public void onResume() {
        super.onResume();
        wakeLock.acquire();
        screen.resume();
        renderView.resume();
    }

    @Override
    public void onPause() {
        super.onPause();
        wakeLock.release();
        renderView.pause();
        screen.pause();

        if (isFinishing())
            screen.dispose();
    }

    public Input getInput() {
        return input;
    }

    public FileIO getFileIO() {
        return fileIO;
    }

    public Graphics getGraphics() {
        return graphics;
    }

    public Audio getAudio() {
        return audio;
    }

    public void setScreen(Screen screen) {
        if (screen == null)
            throw new IllegalArgumentException("Screen must not be null");

        this.screen.pause();
        this.screen.dispose();
        screen.resume();
        screen.update(0);
        this.screen = screen;
    }

    public Screen getCurrentScreen() {
        return screen;
    }
}

类实现接口Game :

package com.badlogic.androidgames.framework;

public interface Game {
    public Input getInput();
    public FileIO getFileIO();
    public Graphics getGraphics();
    public Audio getAudio();
    public void setScreen(Screen screen);
    public Screen getCurrentScreen();
    public Screen getStartScreen();
}

我的第一个问题是:我错过了该方法的实现getStartScreen()接口的Game。通常我必须实现接口的所有方法。

无论如何,现在onCreate在跑。在这一行:

screen = getStartScreen();

程序回到原来的类MrNomGame,其中方法getStartScreen()给出一个对象LoadingScreen到变量screen. Class LoadingScreen:

public class LoadingScreen extends Screen {

    public LoadingScreen(Game game) {
        super(game);
    }

    public void update(float deltaTime) {
        Graphics g = game.getGraphics();
        Assets.background = g.newPixmap("background.png", PixmapFormat.RGB565);
        Assets.logo = g.newPixmap("logo.png", PixmapFormat.ARGB4444);
        Assets.mainMenu = g.newPixmap("mainmenu.png", PixmapFormat.ARGB4444);
        Assets.buttons = g.newPixmap("buttons.png", PixmapFormat.ARGB4444);
        Assets.help1 = g.newPixmap("help1.png", PixmapFormat.ARGB4444);
        Assets.help2 = g.newPixmap("help2.png", PixmapFormat.ARGB4444);
        Assets.help3 = g.newPixmap("help3.png", PixmapFormat.ARGB4444);
        Assets.numbers = g.newPixmap("numbers.png", PixmapFormat.ARGB4444);
        Assets.ready = g.newPixmap("ready.png", PixmapFormat.ARGB4444);
        Assets.pause = g.newPixmap("pausemenu.png", PixmapFormat.ARGB4444);
        Assets.gameOver = g.newPixmap("gameover.png", PixmapFormat.ARGB4444);
        Assets.headUp = g.newPixmap("headup.png", PixmapFormat.ARGB4444);
        Assets.headLeft = g.newPixmap("headleft.png", PixmapFormat.ARGB4444);
        Assets.headDown = g.newPixmap("headdown.png", PixmapFormat.ARGB4444);
        Assets.headRight = g.newPixmap("headright.png", PixmapFormat.ARGB4444);
        Assets.tail = g.newPixmap("tail.png", PixmapFormat.ARGB4444);
        Assets.stain1 = g.newPixmap("stain1.png", PixmapFormat.ARGB4444);
        Assets.stain2 = g.newPixmap("stain2.png", PixmapFormat.ARGB4444);
        Assets.stain3 = g.newPixmap("stain3.png", PixmapFormat.ARGB4444);
        Assets.click = game.getAudio().newSound("click.ogg");
        Assets.eat = game.getAudio().newSound("eat.ogg");
        Assets.bitten = game.getAudio().newSound("bitten.ogg");
        Settings.load(game.getFileIO());
        game.setScreen(new MainMenuScreen(game));
    }

    public void present(float deltaTime) {

    }

    public void pause() {

    }

    public void resume() {

    }

    public void dispose() {

    }
}

Class Screen:

public abstract class Screen {
    protected final Game game;

    public Screen(Game game) {
        this.game = game;
    }

    public abstract void update(float deltaTime);
    public abstract void present(float deltaTime);
    public abstract void pause();
    public abstract void resume();
    public abstract void dispose();
}

经过一定时间后,onCreate()方法完毕。但是在调试模式下我的手机屏幕已经黑了。看来程序是在循环中。我可以随意按 F6。但是当我恢复时,将显示主菜单。如果你查看代码,你会发现主菜单将调用update()的方法loadingScreen.

我的大问题是:之后会发生什么onCreate()方法完毕以及程序如何进入update()的方法loadingScreen?

我知道这是很多代码。但理解它对我来说非常有用。


对于你的第一个问题:AndroidGame is an abstract班级。这意味着它不必实现所有方法Game,只要其中一个类扩展AndroidGame做这个。从代码中可以看出,这是在MrNomGame:

public class MrNomGame extends AndroidGame {
    public Screen getStartScreen() {
        return new LoadingScreen(this); 
    }
} 

现在回答你的大问题:

In onCreate,创建渲染器:

renderView = new AndroidFastRenderView(this, frameBuffer);

如果你看一下那个类,你就会发现onResume创建一个运行以下代码的新线程:

public void run() {
    Rect dstRect = new Rect();
    long startTime = System.nanoTime();
    while(running) {  
        if(!holder.getSurface().isValid())
            continue;           

        float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f;
        startTime = System.nanoTime();

        game.getCurrentScreen().update(deltaTime);
        game.getCurrentScreen().present(deltaTime);

        Canvas canvas = holder.lockCanvas();
        canvas.getClipBounds(dstRect);
        canvas.drawBitmap(framebuffer, null, dstRect, null);
        holder.unlockCanvasAndPost(canvas);
    }
}

所以,它会重复调用update在当前屏幕上,这是LoadingScreen.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我需要“开始android游戏”代码的解释 的相关文章

  • Java错误:线程“main”中出现异常java.lang.ArrayIndexOutOfBoundsException

    我是 Java 初学者 正在学习该课程算法 由普林斯顿大学提供 我按照书上的例子 二分查找在第 9 页 import edu princeton cs algs4 import java util Arrays public class B
  • 缺少 x86 架构的 Android 库 .so? (Vuforia)[重复]

    这个问题在这里已经有答案了 我想将 Vuforia 增强现实库 jni 集成到 Android 项目中 AR并不是应用程序的核心 它更像是一个辅助工具 但 Vuforia 库不提供用于 x86 架构 这意味着 x86 Android 手机将
  • 我在这个正则表达式中做错了什么?

    我正在做一个关于正则表达式的学校作业 我先解释一下 我必须编写一个正则表达式来检查 URL 我必须检查的条件是 URL 是 http s 还是 ftp s 域名是 nl 还是 edu 至少有一个第三级域名 但如果该域名以 万维网 必须有一个
  • Android 和 Azure 移动服务:使用 invokeAPI 返回记录集

    我正在尝试一些非常简单的事情 我有一个名为 missingvehiclesfrominventoryjob 的自定义 API 它只是从标准 SQL 查询返回记录集 我可以在我的 WinForms 和 Windows Phone 应用程序中轻
  • java.util.Currency.getInstance 抛出 IllegalArgumentException

    我只是想尝试一下java util Currency 但对于少数货币代码来说它让我困惑java lang IllegalArgumentException 这是我的简单代码 java util Currency c java util Cu
  • Android 中的发布与调试构建差异

    全部 我们面临一个奇怪的问题 我们的应用程序在调试构建变体中运行良好 但它无法在发布版本变体上正确执行 甚至奇怪的是 如果我们将发布构建变体的 debuggable 设置为 true 它就可以正常工作 Proguard 在这两个变体中都被禁
  • Hibernate 过滤器仅在从数据库加载数据后应用吗?

    我在网上发现了一些相互矛盾的信息 有谁知道Hibernate过滤器是否影响生成的sql 或者只是过滤从数据库读取的数据 休眠过滤器影响 where 子句生成的 SQL The Hibernate 过滤器简介 http java dzone
  • 使用 useStats.getTotalTimeInForeground() 获取设备中每个应用程序在前台花费的时间

    我想知道 Android 设备中运行的所有应用程序所花费的时间 我使用以下代码获取所有包名称 请指导我如何链接包和上述方法来获取应用程序花费的时间 这是代码 List
  • 如何在类图中对自定义异常关联进行建模?

    Reading here http www jguru com faq view jsp EID 62790 似乎使用泛化来建模自定义异常类很常见 它没有提到的是我如何对与可能引发自定义异常的类的关联进行建模 请注意 我并不是在问如何在引发
  • 使用 Maven 时如何在 Tomcat 7.0 中将上下文路径设置为根(“/”)

    我有一个maven项目 pom xml包含tomcat插件
  • 从 URI 创建可写的 DocumentFile

    我正在尝试适应File基于文档系统的东西使用DocumentFile为了允许 API gt 29 上的外部存储读 写访问 我让用户使用以下命令选择 SD 卡根目录Intent ACTION OPEN DOCUMENT TREE 我得到一个U
  • BillingClient 始终返回 SERVICE_DISCONNECTED

    所以我有一个计费客户端 我用它实例化 billingClient BillingClient newBuilder this setListener this build 然后我打电话 billingClient startConnecti
  • Android 上的推送器

    我正在尝试让 Pusher 在 Android 上运行 这是我的需求 必须支持 私人 频道 必须支持安全连接 必须能够覆盖推送器 身份验证端点 注意 我已经尝试过以下路线 在 WebView 中加载 Pusher js 并让它回退到 Soc
  • NoClassDefFound错误:org/apache/tools/ant/util/ReaderInputStream

    我在 Intellij 中有一个带有 gradle 的 java 项目 它直到几个小时前才工作 但在进行微小更改 或者我认为是这样 后突然出现错误 Error gradle resources test analyzer main java
  • JavaFX ComboBox - 显示文本但在选择时返回 ID

    我有一个包含机场的数据库表 每个机场都有一个名称和一个 ID 在 JavaFX 中我有一个表单 其中包含ComboBox 组合框需要显示所有机场名称 并且在提交表单时需要将机场的 ID 插入数据库 而不是其名称 但我并没有真正弄清楚解决方案
  • 语音识别器在第一个结果后听不到声音

    我在Android中使用SpeechRecognizer和RecognizerIntent来实现语音识别 我的目标是在语音识别器在屏幕上显示结果后重新开始收听语音 为此 我使用以下代码 问题是 第一次运行良好并显示结果 但在第二次开始监听
  • 无法导出已签名的应用程序

    我有一个 Eclipse 工作区 其中包含两个 Android 应用程序和两个 Android 库 Facebook SDK 和我自己的库 当我尝试创建 APK 文件时 我有时收到错误 转换为 dalvik 格式失败 错误 1 我浏览了类似
  • 从 Eclipse 启动时创建新的 JFrame 时 Java 将关闭。没有抛出异常

    我正在开发一个在 Eclipse 中开发的 Java 项目 直到今天一切都很好 昨天 在完成我的项目之前 我最后一次运行它以检查一切是否正常并且运行正常 但是今天 当我启动该项目并按下 运行 时 我的应用程序就神秘地关闭了 没有崩溃 没有消
  • Android:“无法初始化可视化引擎”

    我三天前开始为 Android 编程 今天我想使用 android Api 中的一些类来做一些更困难的事情 我找到了 Visualizer 类 第一次尝试时遇到了问题 我在不同论坛上读到很多帖子 人们有同样的问题 无法初始化可视化引擎 我将
  • SQLDroid 和加密数据库

    我的应用程序有一个已经存在的数据库 已经存在 是指我不在我的应用程序中创建数据库 我只是连接到它并读取数据 为了设置连接 我使用 SQLDroid 现在我想知道是否有可能使用 SQLDroid 加密我的数据库 否则我的数据库未加密 任何人都

随机推荐