【问题标题】:Dynamic Methods for Collision Handler in JavaJava中碰撞处理程序的动态方法
【发布时间】:2013-05-09 21:37:12
【问题描述】:

我想为我的游戏设置一个碰撞处理程序,这样我就不必复制大量代码并缩短存储空间。在我将在一个类中使用的方法中,对于两个特定对象,它看起来像这样。

   //Inside collision class     
   public void checkCollision(Block block, Ball ball){
   //do stuff with the variables given
   }

这意味着我只能检查块 + 球的碰撞

我的问题是:是否可以更改例如给定的对象,以便我可以使用相同的方法并仅解析对象,例如地板物体和球,但有时使用积木和球。

而且有时地板不可用,所以如果它想要全部三个,我不能只解析块和球

这样可以省去我的投入

    public void collision(Block block, Floor floor, Ball ball){
    }

不明白的请追问, 非常感谢

查尔顿桑塔纳

【问题讨论】:

    标签: java android collision game-physics


    【解决方案1】:

    如果你有这样的方法:

    // ...
    public void checkCollision(Collidable a, Collidable b) {
        a.collideWith(b);
    }
    

    还有一个界面

    public interface Collidable {
    
        SomeReturnType collideWith(Collidable coll);
    }
    

    在这种情况下,您可以将任何Collidable 与另一个在collideWith 方法中处理冲突的@发生碰撞。

    这只是一个想法,目前还不清楚如何你想达到这个效果。因此,如果您扩展答案,我可以进一步帮助您。

    【讨论】:

    • 同意这一点。我会用静态 void CheckCollision(Collidable[] objects) 方法编写一个 CollisionHandler 类,在那里你可以决定如何对对象等进行分区......
    【解决方案2】:

    重载方法

    public void collision(Block block, Floor floor, Ball ball){
       //do stuff
    }
    
    public void collision(Floor floor, Ball ball){
       //do stuff
    }
    
    public void collision(Block block, Ball ball){
       //do stuff
    }
    

    【讨论】:

    • 重载会导致重载方法的泛滥。他必须通过继承或策略模式恕我直言解决这个问题。
    • 好吧,这很好,我只是想,因为如果我这样做,我将不得不为每个级别做一个方法......在每种方法中,我将有大约 50 行代码,我计划有很多级别。
    【解决方案3】:

    您可以使用集合和泛型,例如:

        public void void checkCollision(List<? extends Collidable> objects) {
        // test whatever you want
    
    }
    

    这样,您可以使用相同的方法来测试 2-n 对象碰撞,其中对象必须继承 Collidable 类,这样您就可以保持它的类型安全,而不是使用 List。

    注意:没有理由给 Android 加上标签,“Pure Java”用户可能会给你更多答案。也许把 API 设计或其他东西作为标签更合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多