【问题标题】:LibGdx -simple game with different type of dropsLibGdx - 具有不同类型掉落的简单游戏
【发布时间】:2017-12-08 19:56:35
【问题描述】:

希望大家都知道这个链接里的基本Libgdx游戏:

https://github.com/libgdx/libgdx/wiki/A-simple-game

在简单的游戏中,雨滴从顶部随机落下,属于一种。 就我而言,我想实现与水滴相同的东西。不同之处在于,水滴有四种类型。当它与另一个物体碰撞时,四种应该表现出四种不同的特征。

简而言之,我用它的对象和数组创建了一个 Drop 类,并且也可以生成 drop 对象。

   Drop drop=new Drop();
   private Array<Drop> drops=new Array<Drop>();

但是如果我想在这种情况下为 drop 定义单独的属性怎么办? 我希望将放置对象分为四种类型。例如有不同颜色的黄色、红色、绿色和蓝色。还有四种水滴应该从顶部随机落下。

以何种方式,我应该如何实现这样的概念?

如果我对此有所了解会非常有帮助。

编辑:

我有一个抽象类 Drop 和。我没有在构造函数中传递纹理和矩形。因为图形现在不适用于该项目。我计划在稍后阶段分配它。截至目前,我所做的一切我正在使用 shaperenderer。

我在我用来创建所有对象的 objectFactory 类中为三个不同颜色的水滴提供了 create() 方法:

 public YellowDrop createYellow(){
    YellowDrop yellow = new YellowDrop();
    yellow.setSize(100f,100f);
    yellow.setPosition(MathUtils.random(0, 800),1280);
    return yellow;
}
public RedDrop createRed(){
    RedDrop red = new RedDrop();
    red.setSize(100f,100f);
    red.setPosition(MathUtils.random(0, 800),1280);
    return red;
}
public GreenDrop createGreen(){
    GreenDrop green = new GreenDrop();
    green.setSize(100f,100f);
    green.setPosition(MathUtils.random(0, 800),1280);
    return green;
}

我写了这样的 createRandomDrop() 代码(对我来说,你的代码很混乱。我怎样才能在方法中使用那个冒号?我从来没有用过。)

私有块 createRandomDrop() { 开关 (MathUtils.random(0, 3)) { 案例 0: System.out.println("000000"); 返回 objectFactory.createYellow(); 情况1 : return objectFactory.createGreen();

 case 2 : return objectFactory.createRed(); 
 default:
     return objectFactory.createGreen();

} } 在这里,我对如何返回单个放置对象感到困惑。 即使我写了这样的电话:

if(TimeUtils.nanoTime() - lastDropTime > 1000000000) {
  drops.add(createRandomDrop());  
  } 

private void updateBlocks(float delta) {

   Iterator<Drop> iter = drops.iterator();
      while(iter.hasNext()) {
         Drop b = iter.next();
        b.update(delta);//moving drop from top to bottom in update()
         if(b.getY()<0) iter.remove();
      }
    //  System.out.println(drops.size);

}

最后我正在为所有数组元素绘制 shaperenderer:

  for (Drop b : drops) {
    b.drawDebug(shapeRenderer);}

这个 drawdebug() 在 Drop 类中,我将覆盖它

  public void drawDebug(ShapeRenderer shapeRenderer) {
    shapeRenderer.setColor(Color.YELLOW);
    shapeRenderer.rect(collisionRectangle.x, collisionRectangle.y, 
   collisionRectangle.width,
            collisionRectangle.height);
 } 

问题是,创建和重叠的水滴太多。可能是开关盒造成了问题。

【问题讨论】:

  • 投反对票的人至少可以发表评论。这样我就可以理解我做错了什么并改进我的问题。我真诚地试图得到答案以及如果有人投反对票的感觉简单地走吧。

标签: libgdx


【解决方案1】:

你的问题是什么?这很简单。

创建 Drop 类的 4 个子级。 YellowDrop、greenDrop 等...并在 Drop 类中创建 collide() 方法,该方法将为所有孩子实现相同的功能。

类似这样的:

abstract class Drop {

     abstract Texture tex;
     abstract Rectangle rect;

     Drop(Texture tex, Rectangle rect){ 
         // initialize values here
     }

     void showCollideAnimation(){  // example. here you can create your own void to show different characteristics.
           tex.blabla()     
     }

     void collide(){
           showCollideAnimation();
     }

     // also draw, update methods etc... Hope you got that they should do functionality same for all children
}

然后创建将覆盖 showCollideAnimation 方法的子节点。

class GreenDrop extends Drop {

        @override
        void showCollideAnimation(){  
             ....     // here you pass effect for Green child
        }
}

要选择随机孩子,您可以创建返回 Drop 的函数

Drop createRandomDrop(Rectangle rect): Drop {

            switch (MathUtils.random(0, 3)) {
                case 0 : return new YellowDrop(Texture("pathToYellowTexture"), rect) break;
                case 1 : return new GreenDrop(Texture("pathToGreenTexture"), rect) break;
                // etc.
            }

} 

现在您可以填充 ArrayList of Drops。

private ArrayList<Drop> drops = new ArrayList<Drop>();

in render method:

if(TimeUtils.nanoTime() - lastDropTime > 1000000000) {
      drops.add(createRandomDrop(Texture(""), Rectangle()));  // specify texture and rectangle yourself
}

【讨论】:

  • 但是我将如何创建包含所有这些继承的子类对象的 Drop 类型的动态数组?
  • 请说明如何将子类对象添加到数组中。我没用过,也不太清楚。会很有帮助的。
  • 我试过了,但又卡住了。创建子对象后,如何迭代 drop 数组?似乎应该创建那个对象。但是我将如何创建一个公共对象?Drop 类是抽象的.
  • 我也试过不使用抽象。但是当我为迭代创建对象时,它会在创建的对象上抛出空指针异常。在 createRandomDrop() 中的 switch case 之后的返回语句也令人困惑。
  • 它现在几乎可以工作了!感谢您的帮助!唯一的事情是我必须控制从开关创建的水滴数量。我希望一切都会好起来的。非常感谢!@伊卡伦巴斯
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2016-03-03
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
相关资源
最近更新 更多