KeyListener va MouseListener ishlamayapti

Men oddiy Java o'yinini yaratish ustida ishlayapman va kiritilgan ma'lumotlar bilan ishlashni alohida sinfga, keyin asosiy o'yinga ajratish g'oyasi bor edi. InputHandler klassini haqiqatda kiritish uchun olishda muammoga duch kelyapman.

Asosiy oʻyin klassi (DrawPanel.java)

package com.eriksaulnier.DesignedToFail;

import java.awt.*;
import java.awt.image.*;
import com.eriksaulnier.DesignedToFail.InputHandler;

import javax.swing.*;

public class DrawPanel extends JPanel {
private static final long serialVersionUID = 1L;
BufferedImage buffer;
InputHandler inputHandler;
Entity player;
Entity enemy;
public boolean spawnBullet = false;

public DrawPanel () {
    setIgnoreRepaint(true);
    setVisible(true);
    setFocusable(true);
    addKeyListener(inputHandler);
    addMouseListener(inputHandler);
    new InputHandler();
}

public void initialize() {
    buffer = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
    player = new Entity(370, 270);
    enemy = new Entity(100, 100);
}

public void update() {
    player.move();
}

public void checkCollisions() {
    if (player.getBounds().intersects(enemy.getBounds()))
        player.collision = true;
    else
        player.collision = false;
}

public void drawBuffer() {
    Graphics2D b = buffer.createGraphics();
    b.setColor(Color.white);
    b.fillRect(0, 0, 800, 600);
    if (player.collision == false) {
        b.setColor(Color.blue);
        b.fillRect(player.getX(), player.getY(), player.getWidth(), player.getHeight());
        b.setColor(Color.red);
        b.fillRect(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
        b.dispose();
    }
    else {
        b.setColor(Color.black);
        b.drawString("Collision!", 350, 300);
        b.dispose();
    }
}

public void drawScreen() {
    Graphics2D g = (Graphics2D)this.getGraphics();
    g.drawImage(buffer, 0, 0, this);
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

public void startGame() {
    initialize();
    while(true) {
        try {
            update();
            checkCollisions();
            drawBuffer();
            drawScreen();
            Thread.sleep(15);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

}

}

InputHandler (InputHandler.java)

package com.eriksaulnier.DesignedToFail;

import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

import javax.swing.JPanel;

public class InputHandler extends JPanel implements KeyListener, MouseListener {
public boolean isShooting = false;
Entity player;

public InputHandler () {
    System.out.println("Listener Works!");
}

public void mouseClicked(MouseEvent e) {

}

public void mousePressed(MouseEvent e) {
    int button = e.getButton();
    if (button == MouseEvent.BUTTON1)
        isShooting = true;
        System.out.println("Shooting!");
}

public void mouseReleased(MouseEvent e) {
    int button = e.getButton();
    if (button == MouseEvent.BUTTON1)
        isShooting = false;
        System.out.println("Not Shooting!");
}

public void mouseEntered(MouseEvent e) {

}

public void mouseExited(MouseEvent e) {

}

public void keyTyped(KeyEvent e) {

}

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_W)
        player.up = true;
    if (key == KeyEvent.VK_S)
        player.down = true;
    if (key == KeyEvent.VK_A)
        player.left = true;
    if (key == KeyEvent.VK_D)
        player.right = true;
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_W)
        player.up = false;
    if (key == KeyEvent.VK_S)
        player.down = false;
    if (key == KeyEvent.VK_A)
        player.left = false;
    if (key == KeyEvent.VK_D)
        player.right = false;
}

}

person Erik Saulnier    schedule 03.01.2013    source manba


Javoblar (2)


Siz GUI-ga null ishlov beruvchilarni o'tkazayotganga o'xshaysiz. Masalan, inputHandler o'zgaruvchisini ishlatishdan oldin uni qayerda yaratasiz?

Masalan:

public class DrawPanel extends JPanel {
  //...

  InputHandler inputHandler; // here you declare the variable 

  //...

  public DrawPanel () {
    setIgnoreRepaint(true); // why this line?
    setVisible(true); // not needed in a JPanel's code
    setFocusable(true);
    addKeyListener(inputHandler); // here you use a null variable
    addMouseListener(inputHandler); // ditto, here you use a null variable
    new InputHandler(); // I don't know what you're doing here
  }

Yuqoridagi kodda men uni ishlatishdan oldin sizda inputHandler = new InputHandler() bor joyni ko'rmayapman. Yangi InputHandler yaratgan qatoringiz, siz ob'ektni hech qanday o'zgaruvchiga tayinlamaysiz yoki undan foydalanmaysiz va shuning uchun u befoyda kod qatori bo'lib ko'rinadi, shuning uchun men bu satr nima bo'lishi kerakligiga ishonchim komil emasligi haqidagi sharhim erishmoq. E'tibor bering, bu muammolar Swing bilan hech qanday aloqasi yo'q va barchasi asosiy Java bilan bog'liq.

Shuningdek:

  • Ishlovchi sinflaringiz JPanels kabi Swing komponentlarini kengaytirmasligi kerak. Ular faqat tinglovchi interfeyslarini amalga oshirishlari kerak.
  • Swing GUI-lar bilan KeyListeners-dan foydalanishdan qochishingiz kerak va iloji bo'lsa, Key Bindings-dan foydalaning. Iltimos, Google-dan bu haqda ko'proq ma'lumot olish uchun Key Bindings qo'llanmasini tekshiring.
  • Ishlovchilardan foydalanish Oracle Swing qo'llanmalarida yaxshi tushuntirilgan. Yana, iltimos, bularni Google orqali o'rganing. Men ularning foydaliligini tasdiqlay olaman, chunki ular men Swing kodlashni o'rgandim.
person Hovercraft Full Of Eels    schedule 03.01.2013

Hech bo'lmaganda, ulanishdan oldin inputHandler misolini yaratishni unutgansiz. DrawPanel konstruktoringiz quyidagicha boshlanishi kerak:

public DrawPanel () {
    inputHander=new InputHandler();
    ...
}

Muammoni hal qilgandan keyin ishlamasa, bizga xabar bering va men chuqurroq ko'rib chiqaman.

person MikhailSP    schedule 03.01.2013