【问题标题】:Using Parallax screen使用视差屏幕
【发布时间】:2013-08-11 12:40:33
【问题描述】:

我想使用 libgdx 在我的游戏代码中使用视差屏幕,其中屏幕沿 y 方向移动。我的游戏代码是...

   public class ParallaxLayer{
   public TextureRegion region ;
   public Vector2 parallaxRatio;
   public Vector2 startPosition;
   public Vector2 padding ;
   public ParallaxLayer(TextureRegion region,Vector2 parallaxRatio,Vector2 padding){
      this(region, parallaxRatio, new Vector2(0,0),padding);
   }

   public ParallaxLayer(TextureRegion region,Vector2 parallaxRatio,Vector2 startPosition,Vector2 padding){
      this.region  = region;
      this.parallaxRatio = parallaxRatio;
      this.startPosition = startPosition;
      this.padding = padding;
   }
}


   public class ParallaxBackground {
   private ParallaxLayer[] layers;
   private Camera camera;
   private SpriteBatch batch;
   private Vector2 speed = new Vector2();

   public ParallaxBackground(ParallaxLayer[] layers,float width,float height,Vector2 speed){
      this.layers = layers;
      this.speed.set(speed);
      camera = new OrthographicCamera(width, height);
      batch = new SpriteBatch();
   }

   public void render(float delta){
    this.camera.position.add(speed.x * delta, speed.y * delta, 0);
    for(ParallaxLayer layer : layers){
        batch.setProjectionMatrix(camera.projection);
        batch.begin();
        float currentY = - camera.position.y * layer.parallaxRatio.y % ( layer.region.getRegionHeight() + layer.padding.y) ;

        if( speed.y < 0 )
            currentY += -( layer.region.getRegionHeight() + layer.padding.y);
        do{
            float currentX = -camera.position.x * layer.parallaxRatio.x % ( layer.region.getRegionWidth() + layer.padding.x) ;
            if( speed.x < 0)
                currentX += -(layer.region.getRegionWidth() + layer.padding.x);
            do{
                batch.draw(layer.region,
                        -this.camera.viewportWidth/2 + currentX + layer.startPosition.x ,
                        -this.camera.viewportHeight/2 + currentY + layer.startPosition.y);
                currentX += ( layer.region.getRegionWidth() + layer.padding.x);
            }while(currentX < camera.viewportWidth);
            currentY += ( layer.region.getRegionHeight() + layer.padding.y);
        }while( currentY < camera.viewportHeight);
        batch.end();
    }
}

并在渲染方法中将其绘制为

 ParallaxBackground rbg = new ParallaxBackground(new ParallaxLayer[]{
                new ParallaxLayer(bgRegion,new Vector2(),new Vector2(0, 0)),
                new ParallaxLayer(bgRegion2,new Vector2(1.0f,1.0f),new Vector2(0, 500)),
                new ParallaxLayer(bgRegion3,new Vector2(0.1f,0),new Vector2(0,480),new Vector2(0, 0)),
        }, 480, 800, new Vector2(350,0)); 
}

rbg.render(deltaTime);

【问题讨论】:

    标签: java libgdx


    【解决方案1】:
    ParallaxBackground rbg = new ParallaxBackground(new ParallaxLayer[]{
                new ParallaxLayer(bgRegion,new Vector2(),new Vector2(0, 0)),
                new ParallaxLayer(bgRegion2,new Vector2(1.0f,1.0f),new Vector2(0, 500)),
                new ParallaxLayer(bgRegion3,new Vector2(0.1f,0),new Vector2(0,480),new Vector2(0, 0)),
        }, 480, 800, new Vector2(0,350)); 
    

    }

    如果你阅读了这个类的文档,你会发现最后一个参数是相对速度比,你在 y 中传递了 0。你需要传递一些其他的值而不是它

    我正在提供我的游戏的另一个示例

       new ParallaxLayer(Assets.backgroundSprite, new Vector2(0, 0), new Vector2(0, 200000)), 
           new ParallaxLayer(Assets.clouds, new Vector2(0, 0.05f), new Vector2(0, 440), new Vector2(0, 200000)),
            new ParallaxLayer(Assets.cloud1, new Vector2(0.4f, 0), new Vector2(240, 750), new Vector2(1000, 200000)), 
            new ParallaxLayer(Assets.cloud2, new Vector2(0.06f, 0), new Vector2(40, 600), new Vector2(500, 200000)),
            new ParallaxLayer(Assets.cloud1, new Vector2(0.5f, 0), new Vector2(700, 680), new Vector2(1500, 200000)), 
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回复。当我使用您的代码时,相机位置会随着游戏对象的位置而更新,但背景屏幕仍然没有移动。我想沿 y 轴移动我的背景屏幕。
    • 为此你需要多做一层背景。理想的做法不是 mobe bg。但是由于我们无法帮助它,所以至少制作一个 satic layer.by 静态我的意思是没有速度,并使其他层获得运动感,并使 bg 高度大于相机高度。例如 900,而不是 800。它给人的感觉很好
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    相关资源
    最近更新 更多