我正在做一个小策略游戏,以帮助我以有趣的方式学习Java。事情是我将单位视为在游戏地图上自我绘制的对象(使用图像和缓冲),并且会对附加到其上的听众做出反应。
现在,基于我一直在阅读的有关基本游戏编程的一些教程,所有内容似乎都是在我的Map类的Graphics方法中绘制的。如果出现一个新单元,我只是更新Map.Graphics方法,它不像制作一个自绘的新单元对象那么容易......在这种情况下,我会被一大堆Map方法所困扰,而不是使用类来渲染新东西。
所以我的问题是,是否可以使用类来渲染单元,接口对象等,或者我必须创建方法并且只是做某种结构编程而不是面向对象?我有点困惑,我想有一个关于事情如何组织的心理蓝图。
谢谢!
答案 0 :(得分:4)
听起来你的对象需要有一个公共接口,可以将它们全部下载到渲染中。
E.g。有一个你的接口类型的通用列表,用游戏对象填充它,然后枚举列表并调用常用方法来进行渲染。
这是C#代码,但它应该类似于Java
public interface IRenderable
{
void RenderMe(Graphics graphics)
}
List<IRenderable> myGameObjects;
foreach (IRenderable myGameObject in myGameObjects)
{
myGameObject.RenderMe(myMap);
}
当对象保存在列表中时,它们可以响应事件并更新其内部状态,为下一个渲染周期做好准备。
答案 1 :(得分:1)
虽然“真正的”游戏项目有多种形式,但最终你会有这样的事情:
while True:
ProcessUserInput()
for o in objects:
o.Update()
for o in objects:
o.Render()
使用您发现的任何机制来实现任何和所有这些功能。 :)多态性很好,所以如果你对此感到满意,你应该随意使用它。 “世界地图”可能应该是列表中的第一项,除非您的渲染系统足够先进以处理无序绘图(基本上是深度排序)。
根据您的问题,可能是这些单位归地图所有?在这种情况下,Map.Render函数将迭代它拥有的所有单元,依次调用每个单元上的Render。无论如何,如果绘制单位的代码在该单元的类中,它可能是最干净的。
祝你好运!答案 2 :(得分:1)
正如ck所说,你可以用一个可绘制的界面来做到这一点,例如:
public interface GameElement {
public void draw(Graphics g);
}
public class Sprite implements GameElement{
private Image image;
private int x;
private int y;
public void draw(Graphics g) {
g.drawImage(image,x,y,null);
}
}
public class GameLoop {
public void drawElements(final Graphics2D g, final List<GameElement> elements) {
for (final GameElement gameElement : elements) {
gameElement.draw(g);
}
}
}
但是你说你想要这样做的方式,听众,可能会在将来给你带来麻烦。 正如dash-tom-bang已经指出的那样,在所有元素都已经更新之后,所有元素都在一个游戏循环中呈现。如果您使用侦听器执行此操作并且您有游戏循环或修改单元列表的任何其他线程,则最终可以进行并发访问修改。 此外,通过这种方式,您可以在一个点上绘制所有元素,这样可以避免游戏中出现一些奇怪的闪烁。