LibGdx - 具有不同类型的丢弃的简单游戏

时间:2017-12-06 10:37:23

标签: libgdx

希望每个人都知道这个链接中的基本Libgdx游戏:

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

在简单的游戏中,雨滴从顶部随机掉落,这是一种类型。 在我的情况下,我想实现与drop相同的东西。不同之处在于,有四种类型的drop。当它与另一个对象碰撞时,四个应该显示四种不同的特征。

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

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

但是,如果我想在这种情况下定义drop的各个属性呢? 我希望drop对象分为四种类型。例如,有不同颜色的黄色,红色,绿色和蓝色。另外四种水滴应从顶部随机掉落。

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

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

修改

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

我在objectFactory类中有三个不同颜色的drop的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()代码(对我来说,你的代码很混乱。我怎么能在方法中使用那个冒号?我从来没用过它。)

private Block createRandomDrop(){      switch(MathUtils.random(0,3)){      案例0:          的System.out.println( “000000”);          return objectFactory.createYellow();      情况1 :          return objectFactory.createGreen();

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

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

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);
 } 

问题在于,创建和重叠的过多滴。可能是开关案例会产生问题。

1 个答案:

答案 0 :(得分:3)

你有什么问题?这很简单。

创建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.
            }

} 

现在你可以填充Drops的ArrayList。

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
}