简体   繁体   English

为什么我的代码没有进入keyPressed()方法? (即使我按了键)

[英]Why doesn't my code go in the keyPressed() method? (Even if i press keys)

I'm trying to create a brickbreakers game. 我正在尝试创建一个打砖块游戏。 Obviously i'm still struggling with the beginning of it. 显然,我仍在努力与它的开始。 I need my "block" to move but if i press some key my code won't even go in the keyPressed()-method. 我需要移动“块”,但是如果我按一些键,我的代码甚至都不会进入keyPressed()方法。 Does anybody know why? 有人知道为什么吗?

import java.util.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class VGKernel extends JPanel implements KeyListener {

public Rectangle screen, ball, block; // The screen area and ball location/size.
public Rectangle bounds;  // The boundaries of the drawing area.
public JFrame frame; // A JFrame to put the graphics into.
public VGTimerTask vgTask; // The TimerTask that runs the game.
public boolean down, right; // Direction of ball's travel.

public VGKernel(){
    super();
    screen = new Rectangle(0, 0, 600, 400);
    ball   = new Rectangle(0, 0, 20, 20);
    block = new Rectangle(0, 350, 40, 10);
    bounds = new Rectangle(0, 0, 600, 400); // Give some starter values.
    frame = new JFrame("VGKernel");
    vgTask = new VGTimerTask();
    addKeyListener(this);
}

class VGTimerTask extends TimerTask{
    public void run(){
      moveBall();
      frame.repaint();
    }
  }

// Now the instance methods:
  public void paintComponent(Graphics g){
    // Get the drawing area bounds for game logic.
    bounds = g.getClipBounds();
    // Clear the drawing area, then draw the ball.
    g.clearRect(screen.x, screen.y, screen.width, screen.height);
    g.fillRect(ball.x, ball.y, ball.width, ball.height);
    g.fillRect(block.x, block.y, block.width, block.height);
  }

  public void moveBall(){
  // Ball should really be its own class with this as a method.
    if (right) ball.x+=1; // If right is true, move ball right,
    else ball.x-=1;       // otherwise move left.
    if (down)  ball.y+=1; // Same for up/down.
    else ball.y-=1;
    if (ball.x > (bounds.width - ball.width)) // Detect edges and bounce.
      { right = false; ball.x = bounds.width -  ball.width; }
    if (ball.y > (bounds.height - ball.height))
      { down  = false; ball.y = bounds.height - ball.height;}
    if (ball.x <= 0) { right = true; ball.x = 0; }
    if (ball.y <= 0) { down  = true; ball.y = 0; }
  }

  public void keyPressed(KeyEvent evt) {

      if(evt.getKeyCode() == KeyEvent.VK_G && block.x > 0) {
          block.x -= 10;
      }

      if(evt.getKeyCode() == KeyEvent.VK_H && block.x < 560) {
          block.x += 10;
      }
  }

  public void keyTyped(KeyEvent evt){ } 
  public void keyReleased(KeyEvent evt){ }

  public static void main(String arg[]){
    java.util.Timer vgTimer = new java.util.Timer();  // Create a Timer.
    VGKernel panel = new VGKernel(); // Create and instance of our kernel.

    // Set the intial ball movement direction.
    panel.down = true;
    panel.right = true;

    // Set up our JFRame
    panel.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    panel.frame.setSize(panel.screen.width, panel.screen.height);
    panel.frame.setContentPane(panel); 
    panel.frame.setVisible(true);

    // Set up a timer to do the vgTask regularly.
    vgTimer.schedule(panel.vgTask, 0, 10);
  }

} }

Put

setFocusable(true);

inside your constructor. 在您的构造函数中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM