希望每个人都知道这个链接中的基本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);
}
问题在于,创建和重叠的过多滴。可能是开关案例会产生问题。
答案 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
}