LibGdx练习-像素鸟(六)
初始化
// 用户输入设置到当前stage
Gdx.input.setInputProcessor(stage);
bgImage = new ImageActor(AssetsUtil.atlas.findRegion(Res.Atlas.IMAGE_GAME_BG));
bgImage.setSize(getGame().getWorldWidth(),getGame().getWorldHeight());
bgImage.setPosition(stage.getWidth()/2,stage.getHeight()/2,Align.center);
stage.addActor(bgImage);
floorImage = new FloorActor(getGame());
floorImage.setMoveVelocity(Res.Physics.MOVE_VELOCITY);
floorImage.setCenterX(0);
floorImage.setTopY(
Math.min(
floorImage.getHeight(),
stage.getHeight() * (floorImage.getHeight() / getGame().getWorldHeight() / 2)
)
);
floorImage.setWidth(1280);
stage.addActor(floorImage);
Label.LabelStyle style = new Label.LabelStyle();
style.font = AssetsUtil.bitmapFont;
scoreLable = new Label("" + score, style);
stage.addActor(scoreLable);
getReadyActor = new ImageActor(AssetsUtil.atlas.findRegion(Res.Atlas.IMAGE_GAME_READY));
getReadyActor.setCenterX(stage.getWidth() / 2);
getReadyActor.setTopY(stage.getHeight() - 182);
stage.addActor(getReadyActor);
tapTipImage = new ImageActor(AssetsUtil.atlas.findRegion(Res.Atlas.IMAGE_GAME_TAP_TIP));
tapTipImage.setCenterX(stage.getWidth() / 2);
tapTipImage.setCenterY((getReadyActor.getY() + floorImage.getTopY()) / 2);
stage.addActor(tapTipImage);
birdActor = new BirdActor(getGame());
birdActor.setX(tapTipImage.getX()-20);
birdActor.setY(tapTipImage.getY()+80);
birdStartPositionY = birdActor.getY();
birdActor.setScale(1.2f);
birdActor.setOrigin(Align.center);
stage.addActor(birdActor);
floorImage.setZIndex(birdActor.getZIndex());
scoreLable.setZIndex(stage.getRoot().getChildren().size-1);
barImagePool = Pools.get(BarActor.class,10);
float barHeight = 400;
float maxRegion = 300;
minDownBarTopY = Math.max(floorImage.getTopY() + 40, stage.getHeight() - barHeight - Res.Physics.BAR_INTERVAL);
maxDownBarTopY = Math.min(minDownBarTopY + maxRegion, stage.getHeight() - Res.Physics.BAR_INTERVAL - 60);
maxDownBarTopY = Math.min(maxDownBarTopY, floorImage.getTopY() + barHeight);
button = new ImageButton(
new TextureRegionDrawable(AssetsUtil.atlas.findRegion(Res.Atlas.IMAGE_GAME_START_01_TO_02, 1)),
new TextureRegionDrawable(AssetsUtil.atlas.findRegion(Res.Atlas.IMAGE_GAME_START_01_TO_02, 2))
);
把之前的那些元素初始化一下哈,给个资源设置一下位置大小边界值。
暂停
给我们屏幕上的小按钮加一个监听
button.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y) {
super.clicked(event, x, y);
if (gameState == GameState.fly){
gamePause();
}else if (gameState == GameState.pause){
gameResume();
}
}
});
游戏中点击就暂停,暂停时点击就继续。具体实现如下:
/**
* 暂停
*/
private void gamePause(){
gameState = GameState.pause;
birdActor.refreshFrameAndRotation(gameState);
for (BarActor barActor : barImageList) {
if (barActor.isMove()) {
barActor.setMove(false);
}
}
floorImage.setMove(false);
}
/**
* 继续
*/
private void gameResume(){
gameState = GameState.resume;
for (BarActor barActor : barImageList) {
if (!barActor.isMove()) {
barActor.setMove(true);
}
}
floorImage.setMove(true);
gameState = GameState.fly;
birdActor.refreshFrameAndRotation(gameState);
}
其实很简单的,设置一下鸟的游戏状态,把地板和水管的移动状态设置为否下次刷新绘制游戏自然就会暂停。然后恢复的时候在全都设置为false即可。
说过暂停按钮,继续说一下游戏之间其他的状态转换。
游戏开始
游戏从就绪态转变到进行中
private void startGame() {
gameState = GameState.fly;
birdActor.refreshFrameAndRotation(gameState);
floorImage.setMove(true);
tapTipImage.setVisible(false);
getReadyActor.setVisible(false);
generateBarTimeCounter = 0.0F;
}
说的霸道一点,所有的元素全都给爷走起来!当然啦,提示信息就要功成身退隐藏起来了。
触碰水管
我们在游戏中触碰水管并不会直接死亡,而是失去控制,鸟有一个始终向下的速度,让鸟掉到地上才判定为死亡。
private void collisionBar() {
gameState = GameState.die;
// 所有水管停止移动
for (BarActor barActor : barImageList) {
if (barActor.isMove()) {
barActor.setMove(false);
}
}
floorImage.setMove(false);
}
触碰地板
这回真死了
private void gameOver() {
gameState = GameState.gameOver;
birdActor.refreshFrameAndRotation(gameState);
floorImage.setMove(false);
for (BarActor barActor : barImageList) {
if (barActor.isMove()) {
barActor.setMove(false);
}
}
button.setVisible(false);
// 显示游戏结束舞台
showOver(score);
}
注意游戏结束要展示结束舞台哦,要不只能×了。
看下showOver方法
public void showOver(int currScore){
overGroup = new OverGroup(getGame());
stage.addActor(overGroup);
}
一个group搞定。