LibGdx练习-像素鸟(七)

本文详细介绍了使用LibGdx框架开发像素风格小鸟游戏中的水管生成及移动机制,包括对象池管理、碰撞检测、得分系统以及游戏结束后的重启流程。

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();
    }

呼!到这里这个简单的像素鸟小游戏就写完了,附上我简陋的小代码,大家不要笑哈。

https://github.com/zhangduomyk/birdTest-_Plus

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值