我正在为Android手机制作Java射击游戏.我在游戏中有20个奇怪的敌人,每个人都有一些独特的行为,但大多数人都会重复使用某些行为.我需要模拟子弹,爆炸,小行星等以及其他所有有点像敌人的东西.我目前的设计倾向于组合而不是继承,并且代表游戏对象有点像这样:
// Generic game object
class Entity
{
// Current position
Vector2d position;
// Regular frame updates behaviour
Behaviour updateBehaviour;
// Collision behaviour
Behaviour collideBehaviour;
// What the entity looks like
Image image;
// How to display the entity
Renderer renderer;
// If the entity is dead and should be deleted
int dead;
}
abstract class Renderer { abstract void draw(Canvas c); }
abstract class Behaviour { abstract void update(Entity e); }
Run Code Online (Sandbox Code Playgroud)
要只绘制存储为实体图像的内容,您可以附加一个简单的渲染器,例如
class SimpleRenderer extends Renderer
{
void draw(Canvas …Run Code Online (Sandbox Code Playgroud) 我正在为Android编写游戏.举个例子,游戏可能涉及子弹,敌人,宝石等,需要:
在游戏过程中在游戏世界中创造和销毁,例如子弹是火,然后当它撞到墙壁时消失.
按顺序访问很多,例如按顺序更新,然后按顺序绘制.
根据我迄今为止在Android工作中所知,为了保持帧速率,我需要考虑以下因素:
不必在没有时分配对象,因为垃圾收集器会启动并破坏您的帧速率.
首选例如访问对象字段和调用函数的局部变量访问.
对于PC游戏中上面提到的游戏对象,我通常只是喜欢使用像Vector或LinkedList这样的东西.但是,这些不会回收对象,并且使用Iterator会创建一个新对象,并在迭代时涉及多个函数调用.
什么是合适的收藏品?
我发现目前运作良好的是创建一个100个子弹的标准阵列,其中所有100个子弹都是预先创建的.然后,当所有活动子弹出现在阵列的开头时,我会计算有多少子弹是活动的.每当我迭代一系列子弹并且我需要销毁一个子弹时,我只需将当前项目符号索引与最后一个活动项目符号索引交换,然后减少活动项目符号数.这改变了子弹顺序,但没关系.
这非常有效:
优点:Recycles对象,很少/没有函数调用缺点:未实现为集合类时容易出错(特别是删除)
谁能提出更好的选择?我见过许多用于管理对象池的类,但我不确定哪些适合我.
谢谢.
我正在进行的项目要求我编写大量重复的代码.例如,如果我想在我的代码中加载一个名为"logo.png"的图像文件,我会写这样的东西:Bitmap logoImage;
...
// Init
logoImage = load("logo.png")
...
// Usage
logoImage.draw(0, 0);
..
// Cleanup
logoImage.release();
Run Code Online (Sandbox Code Playgroud)
必须编写此代码以使用每个新图像是一件痛苦的事情,包括必须指定logoImage应该加载文件"logo.png".
由于我正在开发一个Java Android游戏并且图像在内部循环中被大量使用,我真的想避免做出虚拟函数调用这样的慢速事情,例如当我可以避免它时访问数组/地图/对象字段.从Android API(生成的R类)复制一个想法,我想我可以在编译之前运行一个实用程序来为我生成一些重复的代码.例如,项目文件中的实际代码将简化为:
logoImage.draw(0, 0);
Run Code Online (Sandbox Code Playgroud)
使用一些命令行工具(例如grep,sed),我可以查找"Image.draw(..."的每个实例,然后自动生成其他所需的代码,即加载/释放文件的代码.png并声明"位图logoImage"某处.此代码可以添加到新类中,也可以在我的代码中添加占位符,告诉代码生成器在哪里插入生成的代码.
要显示新图像,我需要做的只是将图像文件复制到正确的目录并添加一行代码.很好,很简单.这避免了创建图像数组,定义标记的int常量以引用数组以及必须指定要加载的文件名等方法.
这是一个非常糟糕的主意吗?这看起来有点像黑客,但我看不到更简单的方法,它似乎彻底清理我的代码.是否有任何标准工具可用于执行此类简单的代码生成(即该工具不需要了解代码的含义)?还有其他人做这样的事情来弥补语言功能吗?