簡體   English   中英

在我的破磚游戲中,球不會從槳或牆上反彈

[英]Ball will not bounce off paddle nor wall in my brick breaker game

我已經在這里坐了 5 個小時,試圖讓我的球在擊中它時從槳和牆壁上反彈,但它只是直接穿過牆壁和槳然后重新從頂部進入,並且相同的循環繼續。 我不知道我哪里錯了

我的 MainWindow 類:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

public class MainWindow extends JPanel implements KeyListener, ActionListener {

private boolean gameRunning = true;
private int BOARD_WIDTH = 500;
private int BOARD_HEIGHT = 500;
private Thread animator;
private BufferedImage img;
private Dimension dimension;
private int ballX = 20;
private int ballY = 200;
private int ballSpeedX = 4;
private int ballSpeedY = 5;
private int ballWidth = 20;
private Brick[] bricks = new Brick[24];
private boolean[] showBrick = new boolean[24];
private int paddleX = BOARD_WIDTH/2;
private int paddleY = BOARD_HEIGHT-50;
private int paddleW = 100;
private int paddleH = 10;
boolean paddleLeft = false;
boolean paddleRight = true;
private Timer timer;
private int delay = 50;


public MainWindow(){
    addKeyListener(this);
    //addMouseListener(this);
    setFocusable(true);
    dimension = new Dimension(BOARD_WIDTH, BOARD_HEIGHT);
    setBackground(Color.BLACK);

    int x = 20;
    int y = 20;
    int count = 1;
    for(int i = 0; i < bricks.length; i++){
        bricks[i] = new Brick(x, y, 50, 10);
        showBrick[i] = true;
        x += 55;
        if (count%8 == 0){
            x = 20;
            y += 20;
        }
        count++;
    }
    timer = new Timer(delay, this);
    timer.start();

    //if (animator == null || !gameRunning) {
      // animator = new Thread(this);
        //animator.start();
    //}
    setDoubleBuffered(true);
}

public void paint(Graphics g) {
    super.paint(g);
    g.setColor(Color.pink);
    g.fillRect(0,0, dimension.width, dimension.height);
    g.setColor(Color.black);

    // for the bricks
    for(int i = 0; i<bricks.length; i++) {
        if(showBrick[i])
            g.fillRect(bricks[i].getBrickX(), bricks[i].getBrickY(),bricks[i].getBrickW(),bricks[i].getBrickH());

    }
    // for the paddle
    g.fillRect(paddleX, paddleY, paddleW, paddleH);

    // for the ball
    g.fillOval(ballX, ballY, ballSpeedX,ballSpeedY);


    //if (gameRunning){
        //ballX+=ballSpeedX;
      //  movingBall();
        //repaint();

    //}
    g.dispose();
}

private void movingBall(){

}

   
@Override
public void keyTyped(KeyEvent e) {
    //if (e.getKeyCode() == KeyEvent.VK_RIGHT){
      //  paddleX+=5;
    //}

}

@Override
public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if (e.getKeyCode() == KeyEvent.VK_RIGHT){
        if(paddleX >= 385){
            paddleRight = false;
        }
        else {
            //ballX+=ballSpeedX;
            paddleRight = true;
            paddleX+=5;
            repaint();
        }
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT){
        if(paddleX <= 10){
            paddleLeft = false;
        }
        else {
            paddleLeft = false;
            paddleX-=5;
            repaint();
        }
    }

}

@Override
public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    if (e.getKeyCode() == KeyEvent.VK_RIGHT){
        paddleRight = false;
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT){
        paddleLeft = false;
    }

}


@Override
public void actionPerformed(ActionEvent e) {
    timer.start();
    if(ballX < 0 || ballX > BOARD_WIDTH){
        ballSpeedX = ballSpeedX * -1;
    }
    if(ballY < 0){
        ballSpeedY = ballSpeedY * -1;

    }
    if(ballY > BOARD_HEIGHT){
        ballX = 20;
        ballY = 200;
        ballSpeedY *= -1;
    }
    if(ballX == paddleX && ballY == paddleY){
        ballSpeedY *= -1;
    }
    if(ballX + ballWidth > paddleX && ballX < paddleX + paddleW && ballY + ballWidth > paddleY && ballY < paddleY + paddleH) {
        ballSpeedY *= -1;
    }
    ballX += ballSpeedX;
    ballY += ballSpeedY;
    repaint();
    //System.out.println("its working");
}

}

我的窗口類:

import javax.swing.*;

public class Window {

public Window() {

    JFrame frame = new JFrame("Brick Builder Game");
    frame.setDefaultCloseOperation(frame.DISPOSE_ON_CLOSE);
    frame.setSize(500,500);
    frame.add(new MainWindow());
    frame.setVisible(true);
    frame.setResizable(false);

}

public static void main(String[] args){
    new Window();
}
}

我的積木課:

public class Brick {

// X-position of brick
private int brickX;
// Y-position of brick
private int brickY;
// width of brick
private int brickW;
// height of brick
private int brickH;

public Brick(int brickX, int brickY, int brickW, int brickH) {
    this.brickX = brickX;
    this.brickY = brickY;
    this.brickW = brickW;
    this.brickH = brickH;
}

public int getBrickX(){
    return brickX;
}

public int getBrickY(){
    return brickY;
}
public int getBrickW(){
    return brickW;
}
public int getBrickH(){
    return brickH;
}

}

fillOval 的簽名如下:(x_position, y_position, width, height)。 在您的簽名中,您嘗試使用 ballSpeedX 和 ballSpeedY 作為寬度和高度。

因此,當您執行 ballSpeedX 或 ballSpeedY *= -1 時。 Swing 試圖用負數繪制一個橢圓,這是不可能的,因此無法顯示球

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM