【问题标题】:libgdx creating multiple objects in different placeslibgdx 在不同的地方创建多个对象
【发布时间】:2014-10-25 18:52:47
【问题描述】:

我想在随机位置生成我的物品 (Sword1)。当我生成它时,首先它只创建一个,然后它随机移动到任何地方。我应该为对象创建和排列吗?如何?

    public class Sword1 {

        public static TextureRegion sprite;

        public static int x;
        public static int y;
        public static int size;

        public static boolean created;
        public Sword1(){
            created=true;
            Random r = new Random();
            x = (r.nextInt(5)+1)*GameRender.tilesize;
            y = (r.nextInt(5)+1)*GameRender.tilesize;
            size = GameRender.tilesize;
            sprite = AssetLoader.s1;
            createMe();
        }

        public static void createMe() { 
            GameRender.batch.draw(sprite, x, y, size, size);    
        }

   }

我批量渲染:

while(number<4){
    number++;
    Items.createSwords();
}   

我还尝试使用 Items 类,它可以在有更多项目时保存所有项目

public class Items {


    public Items(){}

    public static void createSwords() {
        Object sword = (Sword1) new Sword1();
    }
}

【问题讨论】:

    标签: java object random libgdx spawning


    【解决方案1】:

    您可以清理和重命名 Sword1 类 [我还将静态变量更改为私有],否则它们将在各种类实例之间共享,请参阅:Static Variables — What Are They?。

    public class Sword {
    
        private TextureRegion sprite;
    
        private int x;
        private int y;
        private int size;
    
        public Sword() {
            Random r = new Random();
            x = (r.nextInt(5)+1)*GameRender.tilesize;
            y = (r.nextInt(5)+1)*GameRender.tilesize;
            size = GameRender.tilesize;
            sprite = AssetLoader.s1;        
        }
    
        public void createMe() { 
            GameRender.batch.draw(sprite, x, y, size, size);    
        }
    }
    

    然后,您可以使用多把剑和一个 Swords 的 ArrayList 类,该类使用剑对象 GameRender,如评论中给出的:

        private List<Sword> swords = new ArrayList<Sword>();
    

    有关阵列的更多信息,请参阅Oracle documentation

    现在您将有一个剑对象列表。此列表将用于存储新创建的 Sword 对象并在以后渲染它们。

    造剑

    //create 10 swords
    for (int i = 0; i<10 ; i++ ) {
        swords.add(new Sword());
    }
    

    渲染剑,在每个对象中调用create方法

    for (Sword sword : swords) {
        sword.createMe();
    }
    

    例如 GameRender 类

    中的最小示例
    public class GameRender() { 
        private List<Sword> swords = new ArrayList<Sword>();
    
        public GameRender(){
            // create the swords
            for (int i = 0; i<10 ; i++ ) {
                swords.add(new Sword());
        }
    
        // render the swords
        public void render() {
            for (Sword sword : swords) {
                sword.createMe();
            }
    
        }
    
    }
    

    【讨论】:

    • 它不起作用,我收到大量错误,因为我的渲染在其他类 GameRender 中
    • 然后您必须将 SpriteBatch 传递给剑 createMe() 方法。
    • 我不明白。仍然错误。我应该把列表放在哪里?(即使我把它放在想要成为 ArrayList 而不是列表的地方)如果仅在其他类中存在更新/渲染循环,那么将 foreach 放在哪里?
    • 这搞砸了。还有其他方法吗?首先,您删除了静态,但是当我在其他类(foreach 循环)中调用它时,它必须是静态的,其次-对于每个它都不知道什么是剑:它不知道什么是剑。然后在 Items() 类中它不知道 Swords.add 是什么,因为里面没有别的东西......请告诉我,这不是做这样的事情的唯一方法。
    • 当你在一个类 ALL 中有一个静态变量时,它的实例将在这些变量中具有 SAME 值[即静态变量的计划.因此,如果您想为不同的对象设置唯一值,则必须以某种方式避免它们。 foreach 中的调用是调用 sword 对象 上的方法,而不是 Sword 类 上的方法。 Items 类的用途是什么?如果该类仅持有对 Sword 对象的引用,则可以将其删除。如果您想保留和使用它,则必须在该类中创建剑对象并具有渲染剑的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2013-06-17
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多