LibGdx练习-像素鸟(七)
生成水管
鸟是上下飞的,地板是循环播放的,那么水管呢?
信息的同学应该发现了BarActor有实现Poolable接口,我们采用对象池的方式来管理水管。
生成水管
private void generateBar(){
// 随机生成缺口位置
float downBarY = MathUtils.random(minDownBarTopY,maxDownBarTopY);
// 搞个下水管先
BarActor downBarActor = barImagePool.obtain();
downBarActor.setMainGame(getGame());
downBarActor.setUpBar(false);
downBarActor.setX(stage.getWidth());
downBarActor.setTopY(downBarY);
downBarActor.setMoveVelocity(Res.Physics.MOVE_VELOCITY);
// 让它跑起来
downBarActor.setMove(true);
stage.addActor(downBarActor);
barImageList.add(downBarActor);
downBarActor.setZIndex(birdActor.getZIndex());
// 再搞个上水管
BarActor upBarActor = barImagePool.obtain();
upBarActor.setMainGame(getGame());
upBarActor.setUpBar(true);
upBarActor.setX(stage.getWidth());
upBarActor.setY(downBarActor.getTopY() + Res.Physics.BAR_INTERVAL);
upBarActor.setMoveVelocity(Res.Physics.MOVE_VELOCITY);
upBarActor.setMove(true);
stage.addActor(upBarActor);
barImageList.add(upBarActor);
upBarActor.setZIndex(birdActor.getZIndex());
}
两根水管凑一对,一上一下一缺口,perfect。
生成完了水管让它去跑去移动去和小鸟亲密玩耍。那么当他跑到头了呢怎么回收?它被小鸟穿过了呢怎么加分?看代码
private void check(){
// 飞行状态
if (gameState == GameState.fly){
// 遍历水管
for (BarActor barActor : barImageList){
// 水管碰撞检测
if (CollisionUtils.isCollision(birdActor,barActor,Res.Physics.DEPTH)){
collisionBar();
getGame().getSoundPlayer().playSound(Res.Audios.AUDIO_HIT);
break;
}
// 通过检测
if (barActor.isUpBar()&&!barActor.isPassByBird()&&birdActor.getX()>barActor.getRightX()){
score += 1;
scoreLable.setText(score);
barActor.setPassByBird(true);
getGame().getSoundPlayer().playSound(Res.Audios.AUDIO_SCORE);
}
}
}
// 移除越界水管
for (BarActor barActor : barImageList){
if (barActor.getRightX()<0){
barImageList.remove(barActor);
barImagePool.free(barActor);
}
}
// 地板碰撞检测
if (CollisionUtils.isCollision(birdActor,floorImage,Res.Physics.DEPTH)){
gameOver();
getGame().getSoundPlayer().playSound(Res.Audios.AUDIO_DIE);
}
}
重开
前一节说到了showOver,我们这里的结算界面非常简单,就一个重新开始的按钮。
public class OverGroup extends BaseGroup {
public OverGroup(MainGame mainGame) {
super(mainGame);
init();
}
private Button button;
private Sound restartSound;
private void init() {
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))
);
restartSound = AssetsUtil.getAssetManager().get(Res.Audios.AUDIO_RESTART, Sound.class);
button.setX(Res.FIX_WORLD_WIDTH/2 - button.getWidth()/2);
button.setY(Res.FIX_WORLD_HEIGHT/2 - button.getHeight()/2);
button.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y) {
super.clicked(event, x, y);
restartSound.play();
mainGame.getGameScreen().restartGame();
}
});
addActor(button);
}
public Button getButton() {
return button;
}
}
点击这个按钮,直接调用restartGame方法执行重开。
public void restartGame() {
overGroup.getButton().setVisible(false);
ready();
}
呼!到这里这个简单的像素鸟小游戏就写完了,附上我简陋的小代码,大家不要笑哈。
本文详细介绍了使用LibGdx框架开发像素风格小鸟游戏中的水管生成及移动机制,包括对象池管理、碰撞检测、得分系统以及游戏结束后的重启流程。
810

被折叠的 条评论
为什么被折叠?



