【问题标题】:Java Classes in game programming?游戏编程中的Java类?
【发布时间】:2011-02-07 03:26:04
【问题描述】:

我正在做一个小策略游戏来帮助我以一种有趣的方式学习 Java。问题是我将这些单元想象成可以在游戏地图上自行绘制的对象(使用图像和缓冲),并且会通过附加的侦听器对鼠标动作做出反应。

现在,根据我一直在阅读的一些关于基本游戏编程的教程,所有内容似乎都是在我的 Map 类的 Graphics 方法中绘制的。如果出现一个新单元,我只需更新 Map.Graphics 方法,这并不像制作一个可以自行绘制的新 Unit 对象那么容易......在这种情况下,我会被一大堆 Map 方法而不是使用类来渲染新事物。

所以我的问题是,是否可以将类用于渲染单元、接口对象等,或者我必须创建方法并进行某种结构化编程而不是面向对象?我有点困惑,我想要一个关于如何组织事物的心理蓝图。

谢谢!

【问题讨论】:

    标签: java class


    【解决方案1】:

    听起来你的对象需要有一个通用接口,它们都可以向下转换以进行渲染。

    例如有一个你的接口类型的通用列表,用游戏对象填充它,然后枚举列表并调用通用方法进行渲染。


    这是 C# 代码,但对于 Java 应该类似

    public interface IRenderable
    {
        void RenderMe(Graphics graphics)
    }
    
    List<IRenderable> myGameObjects;
    
    foreach (IRenderable myGameObject in myGameObjects)
    {
        myGameObject.RenderMe(myMap);
    }
    

    当对象保存在列表中时,它们可以响应事件并更新其内部状态,为下一个渲染周期做好准备。

    【讨论】:

      【解决方案2】:

      虽然“真正的”游戏项目有多种形式,但最终你会得到这样的结果:

      while True:
         ProcessUserInput()
      
         for o in objects:
            o.Update()
      
         for o in objects:
            o.Render()
      

      使用您认为重要的任何机制来实现所有这些功能。 :) 多态性很好,所以如果您对此感到满意,您应该可以随意使用它。 “世界地图”可能应该是列表中的第一项,除非您的渲染系统足够先进,可以处理乱序绘制(基本上是深度排序)。

      根据您的问题,这些单位可能归地图所有?在这种情况下,Map.Render 函数将遍历它拥有的所有单元,依次在每个单元上调用 Render。无论如何,如果绘制单元的代码在该单元的类中,它可能是最干净的。

      祝你好运!

      【讨论】:

        【解决方案3】:

        正如 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 已经指出的那样,在所有元素都已经更新之后,所有元素都在一个游戏循环中呈现。如果您使用侦听器执行此操作,并且您有一个游戏循环或任何其他修改单元列表的线程,您最终可能会得到一个并发访问修改。 此外,这样您将在一个点上绘制所有元素,这将避免您的游戏出现一些奇怪的闪烁。

        【讨论】:

          猜你喜欢
          • 2011-10-26
          • 2010-09-09
          • 2012-03-06
          • 1970-01-01
          • 2013-10-08
          • 1970-01-01
          • 2011-03-05
          • 2012-04-25
          • 1970-01-01
          相关资源
          最近更新 更多