JAVA 实现《布谷鸟闯关-简单版》游戏_java闯关类游戏

private static final int READY_HEIGHT = ImageMgr.ready.getHeight();
private static final int START_WIDTH = ImageMgr.start.getWidth();
private static final int BIRD_WIDTH = ImageMgr.bird[0].getWidth();
private static final int BIRD_HEIGHT = ImageMgr.bird[0].getWidth();
private static final int GROUND_HEIGHT = ImageMgr.ground.getHeight();
private static final int GAME_OVER_WIDTH = ImageMgr.gameOver.getWidth();
private static final int GAME_OVER_HEIGHT = ImageMgr.gameOver.getHeight();
private static final int BACKGROUND_HEIGHT = ImageMgr.background.getHeight();

private static Image offScreenImage;
private static Rectangle pipeRectangle1;
private static Rectangle pipeRectangle2;
private static Rectangle birdRectangle;

Cuckoo(){
    setVisible(true);
    setResizable(false);
    //setTitle("cuckoo");
    setBounds(L_X, L_Y,GAME_WIDTH,GAME_HEIGHT);

    addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            switch (e.getKeyCode()){
                case KeyEvent.VK_SPACE : start = true;break;
                case KeyEvent.VK_ENTER : reopen();break;
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                bird_y -= 20;
            }
        }
    });

    addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
}

@Override
public void update(Graphics g) {
    if(offScreenImage == null){
        offScreenImage = this.createImage(GAME_WIDTH,GAME_HEIGHT);
    }
    Graphics gOffScreen = offScreenImage.getGraphics();
    Color c = gOffScreen.getColor();
    gOffScreen.setColor(Color.BLACK);
    gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
    gOffScreen.setColor(c);
    paint(gOffScreen);
    g.drawImage(offScreenImage,0,0,null);
}

@Override
public void paint(Graphics g) {
    background(g);
    ground(g);
    start(g);

    if(start){
        bird(g);
        pipe(g);
        colliedWith();
        gameOver(g);
        score(g);
    }

}

//如果碰撞后,可以嗯enter键重开
private void reopen(){
    if(crash){
        score = 0;
        over = false;
        crash = false;
        start = false;
        moveLeft = 0;
        pipeMove = 0;
        //bird\_y = 270;//继上次死的位置开始
    }
}

private void score(Graphics g){
    Font font = new Font("微软雅黑",Font.BOLD,18);
    g.setFont(font);
    Color c = g.getColor();
    g.setColor(Color.lightGray);
    g.drawString("score " + score,20,70);
    g.setColor(c);
}

private void background(Graphics g){
    g.drawImage(ImageMgr.background,
            GAME_X_Y_0 - moveLeft,GAME_X_Y_0,
            GAME_WIDTH - moveLeft,GAME_HEIGHT,
            GAME_X_Y_0,
            GAME_X_Y_0,
            GAME_WIDTH,
            GAME_HEIGHT, null);
    g.drawImage(ImageMgr.background,
            GAME_WIDTH-1 - moveLeft,GAME_X_Y_0,
            GAME_WIDTH\*2 - moveLeft, GAME_HEIGHT,
            GAME_X_Y_0,
            GAME_X_Y_0,
            GAME_WIDTH,
            GAME_HEIGHT, null);
    moveLeft += SPEED;
    //游戏启动计分
    if(start && moveLeft % 100 == 0){
        score += 1;
    }
    if(moveLeft >= GAME_WIDTH){
        moveLeft = 0;
    }
}

private void ground(Graphics g){
    g.drawImage(ImageMgr.ground,0,BACKGROUND_HEIGHT - GROUND_HEIGHT,null);
}

private void bird(Graphics g){
    Color c = g.getColor();
    g.setColor(Color.BLUE);
    g.drawRect(BIRD_X, bird_y,BIRD_WIDTH,BIRD_HEIGHT);
    g.setColor(c);

    g.drawImage(ImageMgr.bird[step++], BIRD_X, bird_y,null);
    if(step >= ImageMgr.bird.length){
        step = 0;
    }

    if(start){
        bird_y += 4;
    }

    birdRectangle = new Rectangle(BIRD_X,bird_y,BIRD_WIDTH,BIRD_HEIGHT);
}

private void pipe(Graphics g){
    drawPipe(g);
    pipeMove += SPEED;
    if(pipeMove >= GAME_WIDTH + PIPE_WIDTH){
        pipeMove = 0;
        Random ran = new Random();
        height = ran.nextInt(10)\*20;
        drawPipe(g);
    }

}

private void drawPipe(Graphics g){
    g.setColor(Color.RED);

// g.drawRect(GAME_WIDTH - pipeMove,GAME_HEIGHT/5*3 - height,PIPE_WIDTH,PIPE_HEIGHT);
// g.drawRect(GAME_WIDTH - pipeMove,-GAME_HEIGHT/5*4 - height,PIPE_WIDTH,PIPE_HEIGHT);

    g.drawImage(ImageMgr.pipe,GAME_WIDTH - pipeMove,GAME_HEIGHT/5\*3 - height,null);
    g.drawImage(ImageMgr.pipe,GAME_WIDTH - pipeMove,-GAME_HEIGHT/5\*4 - height,null);

    pipeRectangle1 = new Rectangle(GAME_WIDTH - pipeMove,GAME_HEIGHT/5\*3 - height,PIPE_WIDTH,PIPE_HEIGHT);
    pipeRectangle2 = new Rectangle(GAME_WIDTH - pipeMove,-GAME_HEIGHT/5\*4 - height,PIPE_WIDTH,PIPE_HEIGHT);
}

private void gameOver(Graphics g){
    if(over){
        g.drawImage(ImageMgr.gameOver,GAME_WIDTH/2 - GAME_OVER_WIDTH/2, GAME_HEIGHT/2 - GAME_OVER_HEIGHT,null);
    }
}

private void start(Graphics g){
    if(!start){
        g.drawImage(ImageMgr.ready,GAME_WIDTH/2 - READY_WIDTH/2, GAME_HEIGHT/2 - READY_HEIGHT,null);
        g.drawImage(ImageMgr.start,GAME_WIDTH/2 - START_WIDTH/2, GAME_HEIGHT/2,null);
    }
}

private void colliedWith(){
    if(birdRectangle.intersects(pipeRectangle1) || birdRectangle.intersects(pipeRectangle2)){
        crash = true;
        over = true;
        //gameOver(g);
    }
}

}


工具类



public class ImageMgr {
static BufferedImage background,ground,pipe,gameOver,start,ready;
static BufferedImage[] bird = new BufferedImage[3];
private static final ImageMgr INSTANCE = new ImageMgr();
//nothing
private ImageMgr(){
initImage();
};

private void initImage(){
    try {
        background = ImageIO.read(Objects.requireNonNull(Cuckoo.class.getClassLoader().getResourceAsStream("images/bg\_light.png")));
        ground = ImageIO.read(Objects.requireNonNull(Cuckoo.class.getClassLoader().getResourceAsStream("images/ground.png")));
        pipe = ImageIO.read(Objects.requireNonNull(Cuckoo.class.getClassLoader().getResourceAsStream("images/pipe.png")));
        gameOver = ImageIO.read(Objects.requireNonNull(Cuckoo.class.getClassLoader().getResourceAsStream("images/gameover.png")));
        start = ImageIO.read(Objects.requireNonNull(Cuckoo.class.getClassLoader().getResourceAsStream("images/start.png")));
        ready = ImageIO.read(Objects.requireNonNull(Cuckoo.class.getClassLoader().getResourceAsStream("images/ready.png")));

        for(int i = 0;i < 3;i++){
            bird[i] = ImageIO.read(Objects.requireNonNull(Cuckoo.class.getClassLoader().getResourceAsStream("images/blueBird\_" + (i+1) + ".png")));
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public static ImageMgr getInstance(){
    return INSTANCE;
}

}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值