在游戏中要控制角色的移动速度是个比较麻烦的事情,至少对于新人来说,确实是这样的。比如拿贪吃蛇来说,要控制蛇的移动速度,甚至随着关数的增加,还需要加快蛇的移动速度,这个东西怎么来实现的呢?大体想法还是这样,在while循环里判断当前时间是否已经达到角色移动一步所需要的时间,如果达到则更新角色坐标,再更新画面。
如果这样的话,我也就不用单独写博客了,这里主要是以《beginning android games》的贪吃蛇为例,最近发现这本书确实写得很好。作者将游戏的模块封装得很好,很值得学习与借鉴。
关于游戏角色的画面更新有一个很重要的类AndroidFastRenderView:
public class AndroidFastRenderView extends SurfaceView implements Runnable {
AndroidGame game;
Bitmap framebuffer;
Thread renderThread = null;
SurfaceHolder holder;
volatile boolean running = false;
public AndroidFastRenderView(AndroidGame game, Bitmap framebuffer) {
super(game);
this.game = game;
this.framebuffer = framebuffer;
this.holder = getHolder();
}
public void resume() {
running = true;
renderThread = new Thread(this);
renderThread.start();
}
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);
}
}
public void pause() {
running = false;
while(true) {
try {
renderThread.join();
break;
} catch (InterruptedException e) {
// retry
}
}
}
}
这个类里面有很多值得学习或者注意的东西。
1.这个类继承了SurfaceView类,这个SurfaceView也是一个View类,主要作用是在开启另外一个线程,并通过GPU等硬件加速功能将视图渲染显示出来。基本上所有的UI组件显示最好的方法最是单独开启线程显示,这样就不会因独占主线程而导致界面不流畅。
由于AndroidFastRenderView本身继承了Runnable接口,所以它是一个线程,其最重要的逻辑放在run方法内。
2.要使用画图功能时,需要用到Canvas,这个Canvas不是像平时那样直接通过new Canvas()而得到,而是通过SurfaceHolder的lockCanvas方法而来,而得到SurfaceHolder的实例是通过父类的getHolder()方法。在画图时,先由holder.lockCanvas()得到Canvas实例,将所有图画完这后再由holder.unlockCanvasAndPost(canvas)统一提交,这时才开始所有的绘图工作。这样一次性处理既可以利用GPU加速,也可以使用缓冲技术,以此达到性能优化的目的。
3.还有一点需要注意,那就是running字段,这个字段的作用是判断游戏当前是否在运行,需要用volatile关键字申明。这样能保证running的值每次都从主存中读取而不是来自本地内存中。
上面这个类非常关键,但它只保证不停的执行update与present方法,并不能达到精确控制角色移动速度的目的。而控制速度的方法是由World类的update完成的。
。。。
public void update(float deltaTime) {
if (gameOver)
return;
tickTime += deltaTime;
while (tickTime > tick) {
tickTime -= tick;
snake.advance();
if (snake.checkBitten()) {
gameOver = true;
return;
}
SnakePart head = snake.parts.get(0);
//头部接触到stain时
if (head.x == stain.x && head.y == stain.y) {
score += SCORE_INCREMENT;
snake.eat();
if (snake.parts.size() == WORLD_WIDTH * WORLD_HEIGHT) {
gameOver = true;
return;
} else {
placeStain();
}
//增加移动速度
if (score % 100 == 0 && tick - TICK_DECREMENT > 0) {
tick -= TICK_DECREMENT;
}
}
}
}
。。。
上面方法中,deltaTime表示AndroidFastRenderView执行每次循环所需要的时间,tickTime用于存储移动一步所需要累计的时间,如果达到累计时间tickTime达到移动一步所需要的时间tick,则将蛇的坐标更新一次,然后等待下次达到再更新,这样一直循环下去。
总结,虽然控制角色移动本身是件很简单的事,但要用于实战之中,做到模块的分化,性能的优化等还是很有难度的。在此把贪吃蛇的源码也放上来吧。
分享到:
相关推荐
4. **用户交互**:游戏中的用户输入处理是关键部分,源码会展示如何监听和响应用户的触摸事件,控制角色的移动和跳跃等动作。同时,可能还涉及到传感器数据的获取,如加速度计和陀螺仪,以实现更丰富的游戏体验。 5...
在Android游戏开发中,触屏控制人物移动是一个常见的功能,特别是在角色扮演游戏(RPG)或者动作游戏中。这个功能使得玩家能够通过手机或平板电脑的触摸屏来操纵游戏主角的行动,增强游戏的交互性和沉浸感。下面将...
通过分析和研究这款源码,我们可以学习到许多Android游戏开发的关键技术和设计模式。 【描述】: “android 游戏源码 策略类游戏 回到战国” 提供了一个完整的Android项目,展示了如何在移动设备上构建一款策略游戏...
《Android游戏开发:基于Android Studio构建“超级玛丽”》 在Android开发领域,构建一款经典游戏,如“超级玛丽”,可以极大地提升开发者的游戏编程技能。本文将深入探讨如何使用Android Studio这一强大的集成开发...
在Android游戏开发中,View框架扮演着至关重要的角色。它为开发者提供了构建用户界面和交互的核心工具,而在游戏开发中,这些工具被巧妙地利用来创建动态、丰富的游戏体验。本文将深入探讨Android游戏开发中View框架...
- **传感器集成**:Android设备通常带有加速度计和陀螺仪,源码可能利用这些传感器实现重力感应或方向控制。 4. **物理引擎** - **碰撞检测**:游戏中的物体碰撞检测是必不可少的,源码可能会使用简单的矩形碰撞...
Android 加速度和陀螺仪传感器是 Android 设备中两种常用的传感器,它们在 Android 设备中扮演着重要的角色,特别是在游戏、导航、控制等领域中。 一、加速度传感器 加速度传感器是一种能够测量设备加速度的传感器...
在Android游戏开发的世界里,开发者可以利用Android SDK和各种游戏引擎来创造丰富的移动游戏体验。本资源包聚焦于"Android游戏开发大全"的第7至10章,提供了丰富的案例源程序,帮助开发者深入理解游戏开发的核心技术...
本篇将深入探讨如何开发一款基于Android的网球游戏,以此为例,让我们一起探索Android游戏开发的奥秘。 1. **Android SDK与环境配置** 开发Android游戏首先需要安装Android SDK,它提供了开发、调试和发布Android...
在Android游戏开发领域,开发者们可以利用Android平台的开放性和灵活性来创造丰富多彩的游戏体验。这本书——《精通Android游戏开发》由Vladimir Silva撰写,旨在帮助读者深入理解Android游戏的开发过程,掌握从基础...
在实时投屏软件中,ADB扮演了关键角色,使得计算机可以捕获到Android设备的屏幕输出并实时显示。 【QtScrcpy-dev】这个压缩包文件名可能暗示了它是基于Qt库开发的Scrcpy的开发者版本。Scrcpy是一款广受欢迎的开源...
在Android平台上,2D游戏开发是一项非常受欢迎的技术领域,它涉及到许多关键的编程概念和技术。本资源提供的"Scrambled Net"源代码是专为学习Android 2D游戏设计而准备的,其完整且详尽的注释为初学者提供了一个宝贵...
【Android游戏源码支持触屏和按键的推箱子】是一个基于Android平台的开源项目,它展示了如何在Android设备上实现一款经典游戏——推箱子。这个项目不仅提供了触屏操作的游戏体验,还支持物理按键,使得游戏玩法更加...
这款源码包含了完整的游戏逻辑、图像资源和控制机制,使得开发者能够通过分析和修改源代码,进一步提升自己的Android游戏开发能力。 在Android游戏开发中,核心知识点主要包括以下几个方面: 1. **游戏框架**:...
- 帧率控制:通过控制循环执行的频率来控制动画速度。例如,设置每秒60帧(16.67毫秒一次循环)可以获得较为流畅的效果。 - 时间差处理:根据每帧的绘制时间,调整下一帧的计算,以确保动画平滑。 5. **优化技巧*...
本资源"android2D游戏框架源码"提供了一个基于SurfaceView构建的简单2D休闲游戏框架,旨在帮助开发者理解和实践Android游戏开发的基本原理。下面将详细介绍该框架的核心知识点。 1. **SurfaceView**: SurfaceView是...
开发者需要学习如何捕获和处理用户的触摸事件,以及如何利用加速度计和陀螺仪数据来控制游戏视角或游戏物体。 7. **性能优化**:由于移动设备的硬件限制,性能优化是3D游戏开发的关键。这包括减少顶点数量、优化...