обновление графики Java - PullRequest
1 голос
/ 28 ноября 2011

эй, я пытаюсь сделать простую игру ascii в java, но я не могу получить графику для обновления при нажатии клавиш

я пытаюсь сделать так, чтобы парень управлялся клавишами со стрелками

вот код

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.Timer;


public class shooter extends JFrame{
    int x = 100, y = 100, dx, dy;
    Timer time;
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public void move(){
        x = x + dx;
        y = y + dx;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }

    public shooter() {
        setTitle("title of gip");
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

        //keep at bottom
        setVisible(true);
        //dont code here >:(
    }

    ///////////GRAPHICS ////////////////////
    public void paint(Graphics g){
        g.clearRect(0, 0, getWidth(), getHeight());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.white);
        g.drawString("☺", getX(), getY());
    }
    public void paintComponent(Graphics g){

    }
    //////////////end of graphics//////////////

    public void keyPressed(KeyEvent e){
        int pressed = e.getKeyCode();
        if (pressed == KeyEvent.VK_LEFT){
            dx = -1;
        }
        if (pressed == KeyEvent.VK_RIGHT){
            dx = 1;
        }
    }
    public void keyReleased(KeyEvent e){
        int rel = e.getKeyCode();
        if (rel == KeyEvent.VK_LEFT){
            dx = 0;
        }
        if (rel == KeyEvent.VK_RIGHT){
            dx = 0;
        }
    }
    public void actionPerformed(ActionEvent e) {
        move();
        repaint();
    }
    public static void main(String[] args){
        new shooter();


    }

} 

помогите пожалуйста спасибо

Ответы [ 3 ]

3 голосов
/ 28 ноября 2011

Вы не добавили слушателя действий в свой фрейм. Нажатие клавиши и выполняемые действия методы вызываются, когда происходят эти события, но только из объектов, к которым подключены прослушиватели действий или Ключевые прослушиватели.

Выезд http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html.

Короче, хотя вам нужно следующее, public class TryItOut extends JFrame implements ActionListener,KeyListener{ и в вашем конструкторе addActionListener(this); и addKeyListener(this);

Сделайте это, а затем попробуйте оттуда.

3 голосов
/ 28 ноября 2011

1) для прослушивания событий клавиш с клавиатуры было бы лучше реализовать KeyBinding s, пример здесь

2) ClassName будет public class Shooter extends JFrame {

3) метод рисования для Swing будет public void paintComponent(Graphics g){

4) основной метод будет

   public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Shooter();
            }
        });
    }

РЕДАКТИРОВАТЬ:

5) @camickr правильно заметилme -> CustomPainting должно быть сделано на JComponent или JPanel, или вы можете использовать метод рисования для GlassPane или RootPane

3 голосов
/ 28 ноября 2011

@dann.dev хорошо нашел проблему. Вы не подключаете свои основные нажатия и события к основному кадру. Кроме того, я просто хочу прокомментировать, как вы рисуете свою сцену. Вы должны рисовать JPanel вместо JFrame, это облегчит вашу жизнь, если вы захотите добавить кнопки и меню в основной кадр.

Переопределить и нарисовать paintComponent, а не paint.

class DrawingPanel{
    // ....
    @Override
    public void paintComponent(Graphics g){
        g.clearRect(0, 0, getWidth(), getHeight());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.white);
        g.drawString("☺", getX(), getY());
    }
    // ....
}

После этого установите эту панель в качестве панели содержимого вашего фрейма.

frame.setContentPane(new DrawingPanel());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...