0
자바 7에서 PC 용 최신 버전을 만들고 있지만 수정이 불가능한 큰 문제가 발생했습니다.내 Java 게임에서 if 문이 작동하지 않는 이유는 무엇입니까?
내 if
문이 스페이스 바를 눌렀을 때 수명이 0보다 길고 공의 y 좌표가 600보다 큰 경우에도 왜 실행되지 않습니까?
많은 인쇄 문과 로그 파일을 사용하여 이미 테스트했지만 아무 것도 작동하지 않습니다.
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.*;
//import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Game extends JFrame implements Runnable , KeyListener {
private static final long serialVersionUID = 1L;
private Graphics dbg;
private Image dbi;
int level = 0;
int lives = 6;
int powerup = 0;
int blocksGone = 0;
int vy = 0;
int vx = 0;
int by = 640;
int bx = 0;
int[] powerups = new int[8];
ImageIcon i0 = new ImageIcon("paddle.gif");
ImageIcon i1 = new ImageIcon("sidebar.gif");
ImageIcon i2 = new ImageIcon("laserpaddle.gif");
ImageIcon i3 = new ImageIcon("paddleCannon.gif");
ImageIcon i4 = new ImageIcon("laser.gif");
ImageIcon i5 = new ImageIcon("bullet.gif");
ImageIcon i6 = new ImageIcon("lifeIcon.gif");
ImageIcon i7 = new ImageIcon("ball.png");
ImageIcon i8 = new ImageIcon("bomb.png");
ImageIcon i9 = new ImageIcon("atomic.png");
//ImageIcon i10 = new ImageIcon("bullet.gif");
Image paddle;
Image side;
Image bullet;
Image bomb;
Image ball;
Image atomc;
Image life;
Image dead;
int paddlex = 400;
int pdx = 0;
public Game() {
// TODO Auto-generated constructor stub
setVisible(true);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setTitle("Breakout Smash");
setSize(1024,560);
setResizable(false);
this.addKeyListener(this);
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
init();
while (true) {
move();
Thread.sleep(5);
}
} catch (Exception e) {
System.out.println ("java.lang.Execption in line 25, class Game. Stacktrace:");
e.printStackTrace();
}
}
// TODO Auto-generated method stub
private void init() {
// TODO Auto-generated method stub
paddle = i0.getImage();
side = i1.getImage();
ball = i7.getImage();
}
public void paint (Graphics g) {
dbi = createImage (getWidth(),getHeight());
dbg = dbi.getGraphics();
paintComponent(dbg);
g.drawImage(dbi , 0 , 0 , this);
}
public void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.setColor(Color.DARK_GRAY);
g.fillRect(0,0,getWidth(),getHeight());
g.drawImage(side, this.getWidth() - side.getWidth(null), 0, null);
g.setColor(Color.CYAN);
g.drawString("Score", 950, 50);
g.drawString("Lives: " + lives , 880, 50);
g.drawImage(paddle, paddlex, 520, null);
g.drawImage(ball, bx, by, null);
repaint();
}
public void move() {
//if (by <= getHeight()) {
if (paddlex > 0 && paddlex < getWidth() - side.getWidth(null) - 50) {
paddlex += pdx;
} if (paddlex >= getWidth() - side.getWidth(null) - 50) {
paddlex-= 2;
} if (paddlex <= 0) {
paddlex++;
}
if (bx > 0 && bx < getWidth() - side.getWidth(null) && by > 10 && by < getHeight()) {
bx += vx;
by -= vy;
} if (by > 560) {
by = 575;
bx = 0;
} if (bx < 5) {
bx += 3;
vx = vx * -1;
} if (bx > getWidth() - side.getWidth(null) - 5) {
bx -= 3;
vx = vx * -1;
} if (by < 15) {
by++;
vy = vy * -1;
} if (by >= 515 && by <= 515 + paddle.getHeight(null) && bx + 8 > paddlex && bx + 8 < paddlex + paddle.getWidth(null)) {
vy = vy * -1;
vy ++;
vx *= pdx;
/*if (pdx == -2) {
vx = vx * -2;
}
if (pdx == 2) {
vx = vx * 2;
}*/
}
//} else {
//vy = 0;
//vx = 0;
//}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_ESCAPE) {
int quit = JOptionPane.showConfirmDialog(null, "Are you sure you want to quit?", "Quit?", JOptionPane.YES_NO_OPTION);
if (quit == 0) System.exit(0);
}
else if (keyCode == KeyEvent.VK_LEFT) {
pdx = -2;
}
else if (keyCode == KeyEvent.VK_RIGHT) {
pdx = 2;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT) {
pdx = 0;
}
else if (keyCode == KeyEvent.VK_RIGHT) {
pdx = 0;
}
else if (keyCode == KeyEvent.VK_SPACE) {
//if (by > 600 && lives >= 0) { // this is my problem here
lives--;
vy = 1;
vx = pdx;
bx = paddlex + 10;
by = 500;
System.out.println ("Space hit!");
/*if (lives == 0) {
JOptionPane.showMessageDialog(null, "Game Over!" , "!", JOptionPane.WARNING_MESSAGE);
}
} */
}
}
}
내 코드에 표시되지 않는 항목이 있어야합니다. 큰 문제는 우주 왕복 경기에서 공을 부활시키고 동시에 한 생명을 빼지 않는 이유는 무엇입니까?
당신은 문이 잘못되는 경우의 어느 부분을 이해하는 일부 디버그 정보를 추가 할 수 있습니다. – BobTheBuilder
한때 keyCode 대신 keyChar를 사용해야했습니다. 어쩌면 그것이 당신 문제입니다. –
스택 오버플로에 오신 것을 환영합니다! 코드에서 오류를 발견하도록 사람들에게 요청하는 것은 특히 생산적이지 않습니다. 디버거를 사용하거나 인쇄 문을 추가하여 프로그램의 진행 상황을 추적하고 발생할 것으로 예상되는 것과 비교하여 문제를 격리해야합니다. 이 둘이 갈라지면 문제를 발견했습니다. (그리고 필요하다면 [최소 테스트 케이스] (http://sscce.org)를 구성해야합니다.) –