【问题标题】:Libgdx render for a rectangle array different texturesLibgdx 为矩形阵列渲染不同的纹理
【发布时间】:2015-05-12 17:49:54
【问题描述】:

我正在使用 libgdx 开发一款游戏,但遇到了问题。所以我的 SpriteBatch 为数组中具有相同纹理的所有矩形绘制,但我希望每个矩形都有自己的纹理。我的代码看起来像这样

    public class GameScreen implements Screen{

    final MrJetpack game;

    OrthographicCamera camera;
    SpriteBatch batch;
    ShapeRenderer rend;
    private Array<Rectangle> raindrops;

    Texture enemy1,enemy2,enemy3,enemy4,endScreen;
    TextureRegion[] enemys = new TextureRegion[4];

    private int random;


    public GameScreen(final MrJetpack game){

this.game = game;

camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);

enemy1  = new Texture(Gdx.files.internal("boxk.png"));
enemy2  = new Texture(Gdx.files.internal("boxg.png"));
enemy3  = new Texture(Gdx.files.internal("kugel.png"));
enemy4  = new Texture(Gdx.files.internal("kugelk.png"));

enemys[0] = new TextureRegion(enemy1);      
enemys[1] = new TextureRegion(enemy2);    
enemys[2] = new TextureRegion(enemy3);     
enemys[3] = new TextureRegion(enemy4); 

raindrops = new Array<Rectangle>();

rend = new ShapeRenderer();
batch = new SpriteBatch();

   }


   @Override
   public void render(float delta) {
     // TODO Auto-generated method stub
//Gdx.gl.glClearColor(0, (float)148/255,(float) 255/255, 1);
  Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
  camera.update();




  batch.setProjectionMatrix(camera.combined);
  rend.begin(ShapeType.Filled);
  rend.rect(0, 0, 800, 10);
  rend.rect(0, 160, 800, 10);
  rend.rect(0, 320, 800, 10);
  rend.setColor(Color.ORANGE);
  rend.end();

  batch.begin();
  for(Rectangle raindrop: raindrops) {
      batch.draw(enemys[random], raindrop.x - 10, raindrop.y);
   }
  batch.end();


  if(TimeUtils.nanoTime() - lastDropTime > spawnTime){
      spawnRaindrop();  
      }
  Iterator<Rectangle> iter = raindrops.iterator();
  while(iter.hasNext()) {
     Rectangle raindrop = iter.next();
     raindrop.x -= 20 * Gdx.graphics.getDeltaTime();

     if(raindrop.x < 0) {
         spawnRaindrop();
         iter.remove();
     }
     }


    }


  private void spawnRaindrop() {
  Rectangle raindrop = new Rectangle();
  raindrop.x = 800;
  stages = MathUtils.random(1, 3);
  random = MathUtils.random(0, 3);
  raindrop.width = 30;
  raindrop.height = 53;
  raindrops.add(raindrop);
  lastDropTime = TimeUtils.nanoTime();
     }

所以实际发生的情况是,每次在屏幕中生成一个新的 Rectangle 时,已经显示的其他 Rectangle 都会更改 Texture ,因此每个 Rectangle 都有相同的 Texture 。有什么解决方案或例子吗?

编辑:http://imgur.com/46ywYyy 对于那些理解我的问题错误的人来说,这是我的问题:) 就像你可以看到所有其他矩形的纹理都在变化,但我希望每个人都有自己的静态纹理

【问题讨论】:

  • 您需要使用 Sprite 类而不是 Rectangle 或其他您自己创建的类。

标签: java android opengl-es libgdx


【解决方案1】:

他们告诉你,一种方法,但我看你不清楚,我会或多或少像你那样做。

我将尝试使表单与您的代码中已有的更相似。

注意 这段代码可能有语法错误等,因为我是从编辑器 StackOverflow 做的。

1- 创建一个派生自 sprite 的类,例如:

public class SpriteRaindrop extends Sprite{

     Rectangle raindrop = new Rectangle();

public SpriteRaindrop(Texture t, int srcWidth, 
                                 int srcHeigth, 
                                 float posX, 
                                 float posY){

      super(t, srcWidth, srcHeigth);

      raindrop.x      = posX;
      raindrop.y      = posY;
      raindrop.width  = srcWidth;
      raindrop.height = srcHeigth;

      setPosition(posX, posY);
 }

 public void updateR(){
     raindrod.x = getX();
     raindrod.y = getY();
 }
}

您的代码有任何更改

public class GameScreen implements Screen{

    final MrJetpack game;

    OrthographicCamera camera;
    SpriteBatch batch;
    ShapeRenderer rend;
    private Array<SpriteRaindrop> raindrops;

    Texture enemy1,enemy2,enemy3,enemy4,endScreen;
    TextureRegion[] enemys = new TextureRegion[4];

    private int random;


    public GameScreen(final MrJetpack game){

this.game = game;

camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);

enemy1  = new Texture(Gdx.files.internal("boxk.png"));
enemy2  = new Texture(Gdx.files.internal("boxg.png"));
enemy3  = new Texture(Gdx.files.internal("kugel.png"));
enemy4  = new Texture(Gdx.files.internal("kugelk.png"));

enemys[0] = new TextureRegion(enemy1);      
enemys[1] = new TextureRegion(enemy2);    
enemys[2] = new TextureRegion(enemy3);     
enemys[3] = new TextureRegion(enemy4); 

raindrops = new Array<SpriteRaindrop>();

rend = new ShapeRenderer();
batch = new SpriteBatch();

   }


   @Override
   public void render(float delta) {
     // TODO Auto-generated method stub
//Gdx.gl.glClearColor(0, (float)148/255,(float) 255/255, 1);
  Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
  camera.update();




  batch.setProjectionMatrix(camera.combined);
  rend.begin(ShapeType.Filled);
  rend.rect(0, 0, 800, 10);
  rend.rect(0, 160, 800, 10);
  rend.rect(0, 320, 800, 10);
  rend.setColor(Color.ORANGE);
  rend.end();

  batch.begin();

  for(SpriteRaindrop raindrop: raindrops) {
      //raindrop.translatex(-10f);
      //what is raindrop.y value
      raindrop.updateR();
      raindrop.draw(batch);
   }

  batch.end();


  if(TimeUtils.nanoTime() - lastDropTime > spawnTime){
      spawnRaindrop();  
  }

  Iterator<SpriteRaindrop> iter = raindrops.iterator();

  while(iter.hasNext()) {

     SpriteRaindrop raindrop = iter.next();

     raindrop.translateX(-20f * Gdx.graphics.getDeltaTime());

         if(raindrop.getX() < 0) {
             spawnRaindrop();
             iter.remove();
         }
 }


 }


  private void spawnRaindrop() {

      stages = MathUtils.random(1, 3);
      random = MathUtils.random(0, 3);

      lastDropTime = TimeUtils.nanoTime();

      SpriteRaindrop raindrop = new SpriteRaindrop(enemys[random],
                                                   30, 53, 
                                                   800, 0);
      raindrops.add(raindrop);
     }

这只是一个想法,但我认为它可以工作,希望你能帮助

【讨论】:

  • @user3629585 如果此答案有助于或解决您的问题,请 cosera 支持/接受,因为我有几个像您这样仍然有效的回复不是支持,也许在某些时候我不能回答更多接受率,看看这个stackoverflow.com/tour
  • 将SpriteRaindrop的构造函数改为public SpriteRaindrop(TextureRegion t, int srcWidth, int srcHeigth, float posX, float posY){ super(t);雨滴.x = posX;雨滴.y = posY;雨滴.width = srcWidth;雨滴.高度 = srcHeigth;设置位置(posX,posY); } 然后它的工作原理。谢谢老哥帮我
【解决方案2】:

变量random对于类来说是全局的,一旦一个新的精灵生成,它就会将值设置为新的随机值并且它们都被绘制:

batch.draw(enemys[random], raindrop.x - 10, raindrop.y);

您需要将其与每个实例的位置一起跟踪。

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 2012-05-25
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多