我想使用 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);