LibGdx练习-像素鸟(六)

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搞定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值