Android游戏开发:游戏框架的搭建(1)
通常情况下,游戏开发的基本框架中,一般包括以下模块:
窗口管理(Window management):该模块负责在Android平台上创建、运行、暂停、恢复游戏界面等功能。
输入模块(Input):该模块和视窗管理模块是密切相关的,用来监测追踪用户的输入(比如触摸事件、按键事件、加速计事件等)。
文件输入输出(File I/O):此模块用来读取assets文件下图片、音频等资源。
图像模块(Graphics):在实际游戏开发中,这个模块或许是最复杂的部分。它负责加载图片并把它们绘制到屏幕上。
音频模块(Audio):这个模块负责在不同的游戏界面加载音各类频。
网络(networking):如果游戏提供多人游戏联网功能,此模块就是必须的。
游戏框架(Game framework):该模块把以上各种模块整合起来,提供一个易用的框架,来轻松地实现我们的游戏。
下面对每一个模块进行详细的描述。
1. 窗口管理
我们可以把游戏的窗口想象成一个可以在它上面绘制内容的画布。窗口管理模块负责定制窗口、添加各种UI组建、接受各类用户的输入事件。这些UI组件或许可以通过GPU等硬件加速(比如使用了OpenGL ES)。
该模设计时不是提供接口,而是和游戏框架整合在一起,之后会有相关的代码贴出。我们需要记住的是应用程序状态和窗口事件是该模块必须处理的事情:
Create: 当窗口被创建时被调用的方法。
Pause: 当应用程序由于默写原因暂停时调用的方法。
Resume: 当应用程序恢复到前台时调用的方法。
2.输入模块
大部分操作系统中,输入事件( 比如触屏事件、按键事件)是通过当前的窗口调度(dispatched)的,窗口再进一步把这些事件派发给当前选中的组件。因此我们只需要关注组件的事件即可。操作系统提供的UI APIs提供了事件分发机制,我们可以很容易地注册和监听事件,这也是输入模块的主要职责。有两种处理事件的做法:
轮询(Polling):在这种机制下,我们仅检查输入设备的当前状态,之前和之后的状态并无保存。这种输入事件处理适合处理诸如触屏按钮事件,而不适合跟踪文本的输入,因为按键事件的顺序并未保存。
基于事件的处理(Event-based handling):这种机制提供了记忆功能的事件处理,比较适合处理文本输入或者其他需要按键次序的操作。
在Android平台中,主要有三种输入事件:触屏事件、按键事件和加速计事件,前两种时间使用轮询机制和基于事件处理的机制都适合,加速计事件通常是轮询机制。
触屏事件有三种:
Touch down: 手机触屏时发生。
Touch drag: 手指拖动时发生,此前有Touch down事件产生。
Touch up: 手指抬起时发生。
每种触摸事件有相关的辅助信息:触屏的位置、指针索引(多点触摸时用来追踪识别不同的触点)
键盘事件包括两种:
Key down: 按下键盘时触发。
Key up: 释放键盘时触发。
每种按键事件也有相关的辅助信息:Key-down事件存储按键码,Key-up事件存储按键码和实际的Unicode字符。
加速计事件,系统不停的轮询加速剂的状态,并以三位坐标标识。
基于以上介绍,下面定义输入模块的一些接口,用来轮询触屏事件、按键事件和加速计事件。代码如下:
Input.java
package com.badlogic.androidgames.framework; import java.util.List; public interface Input { public static class KeyEvent { public static final int KEY_DOWN = 0; public static final int KEY_UP = 1; public int type; public int keyCode; public char keyChar; } public static class TouchEvent { public static final int TOUCH_DOWN = 0; public static final int TOUCH_UP = 1; public static final int TOUCH_DRAGGED = 2; public int type; public int x, y; public int pointer; } public boolean isKeyPressed(int keyCode); public boolean isTouchDown(int pointer); public int getTouchX(int pointer); public int getTouchY(int pointer); public float getAccelX(); public float getAccelY(); public float getAccelZ(); public List<KeyEvent> getKeyEvents(); public List<TouchEvent> getTouchEvents(); }
上述定义包括两个静态类:KeyEvent 和 TouchEvent。KeyEvent类和TouchEvent类都定义了相关事件的常量。KeyEvent同时定义了几个存储事件信息的变量:类型(type)、按键码(keyCode)和Unicode字符(keyChar)。TouchEvent也一样,定义了位置信息(x,y)、某个出触摸点的ID。比如第一个手指按下,ID是0,第二个手指按下 ID是1;如果两个手指按下,手指0释放,手指1保持,又一个手指按下时,ID为已经释放的0.
下面是输入接口中的轮询方法:Input.isKeyPressed()输入参数是 keyCode,返回相应的按键是否按下的布尔值;Input.isTouchDown(),Input.getTouchX()和Input.getTouchY()返回给定指针索引是否按下、对应的横竖坐标值,注意当对应的指针索引不存在时坐标值是未定义的。Input.getAccelX(), Input.getAccelY(), and Input.getAccelZ() 返回各自的加速计的坐标值;最后两个方法用作基于事件处理机制的,他们返回KeyEvent和TouchEvent实例,用于记录上次事件触发的信息,最新的事件在列表的最后。
通过这些简单的接口和类的,我们构建了我们的输入接口。下节继续分析文件处理的内容(File I/O)。
3. 文件读写(File I/O)
读写文件在游戏开发中是一项十分重要的功能。在Java开发中,我们主要关注InputStream和OutputStream及其实例,它们是Java中读写文件的标准方法。游戏开发中,比较多的是读取资源文件,比如配置文件、图片、音频文件等;写入文件的操作一般在保存用户进度和配置信息时使用。
下面是文件读写的接口:
FileIO.java
package com.badlogic.androidgames.framework; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public interface FileIO { public InputStream readAsset(String fileName) throws IOException; public InputStream readFile(String fileName) throws IOException; public OutputStream writeFile(String fileName) throws IOException; }
上述代码中,我们传递一个文件名作为参数,返回一个流,具体的执行会在接口的实现中体现。同时我们会抛出一个IOException异常以防止读写文件出错。当我们完成读写后,需要关闭输入输出流。Asset 文件从应用程序的APK文件中读取,其他文件一般从内置存储器或者SDCard上读取,分别对应上述代码中的三个方法。
Android游戏开发:游戏框架的搭建(1)相关推荐
- Android游戏开发–游戏循环
游戏循环是每个游戏的心跳. 到目前为止,我们仅使用了非常简单的一种(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是while循环,该循环一直执行 ...
- android游戏开发_Android游戏开发–游戏循环
android游戏开发 游戏循环是每个游戏的心跳. 到目前为止,我们仅使用了非常简单的一种(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是whi ...
- android_Android游戏开发–游戏循环
android 游戏循环是每个游戏的心跳. 到目前为止,我们使用的是非常简单的游戏(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是while循环 ...
- 1.15 从0开始学习Unity游戏开发--游戏UI
上一章中,我们剩下最后一个任务,需要支持鼠标控制准心来进行设计,那么准心本质上就是一个始终呈现在屏幕上的一个图片,你当然可以用一个3D物体来制作,之前讲解渲染概念的时候也提到过,我们的屏幕就是相机的近 ...
- H5数独游戏开发——游戏通关及重玩
如何判断游戏是否通关?通关后如何重新开始游戏,让用户重玩?今天给大家详细介绍如何实现以上功能.先看一下数独游戏通关后的提示界面,截图如下: 首先,我们需要判断游戏是否通关,那么如何判断呢?有两个条件: ...
- H5数独游戏开发——游戏中的事件处理
假设你正在玩一款角色扮演游戏(RPG),主角走进了一家店铺,你用鼠标点击店铺里管家,这时屏幕显示一个待售物品菜单,然后你可以选购你需要的物品.那么,你知道从你点击鼠标的那一刻起,游戏是怎样响应的吗?让 ...
- 游戏运营全过程剖析,游戏开发,游戏运营,游戏推广问题分析
产品策划:一个好的idea至关重要,结合当时的社会环境,游戏开发水平,玩家喜好,市场需求等考虑.精美的画面,流畅的游戏节奏,情节,完善的游戏系统能让你的游戏立于不败之地. 产品开发:游戏主线框架定好后 ...
- Unity游戏开发-游戏热更新以及登录流程
本篇主要分享基于热更新的游戏初始化方案. 整体初始化的流程大致为:检查是否需要解压资需要则解压,之后再检查是否存在需要热更新的资源文件需要则更新,更新完成后则初始化结束可进入登录界面. 关于登录这块的 ...
- Xcode与C++之游戏开发: 游戏对象
上一篇:Xcode与C++之游戏开发:Pong游戏 游戏对象 在前面的 Pong 游戏中,没有用不同的类去代表墙,球拍和球,仅仅使用了一个 Game 类.像 Pong 这种简单游戏当然没问题,但它不是 ...
- Android应用开发五大框架,android 五大应用开发框架是什么
android应用开发框架是 Application Framework. 其系统架构由5部分组成,分别是:Linux Kernel.Android Runtime.Libraries.Applica ...
最新文章
- Linux命令详解----iostat
- web开发中的 emmet 效率提升工具
- doxygen 命令_doxygen使用
- 【转】ASP.NET MVC 3 Service Location, Part 5: IDependencyResolver
- golang 初始化并赋值_Golang 切片综合指南
- @程序员,这些编程陷阱你中招了吗?
- java stream findlast_恕我直言你可能真的不会java第9篇-Stream元素的匹配与查找
- 富途证券招股书解读:近2个月客户资产下降
- 如何批量修改文件名称
- Python简单99例-训练每天
- 不是吧!做了3年Android还没看过OkHttp源码?好吧,带你彻底理解一波!
- 【HTML、CSS、JS】注册页面实现(带验证码,密码强度验证,表格提交验证等)
- 连接Janusgraph时报Unable to determine Elasticsearch server version. Default to FIVE.异常
- 鸿蒙负责人王成录被曝已离职:华为技术元老,1998年哈工大博士毕业后加入
- 网络购物有风险,某东PINKO自营也有假
- 【测评】抗原乳化方法学评测:去离子水乳化、机械乳化法、PBS 缓冲液乳化..
- Linux查看主机名
- ATA注会考试系统配置
- opencv 图像操作,常用 OpenCV 内置函数
- 获取指定年份的法定节假日