Przesuwanie prostokąta

0

Witam cieplutko.
Na początek troche kodu.
Main.java


//
public void update(Graphics g){
        paint(g);
    }
    public void paint(Graphics g){
        g.drawRect(p.getX(), p.getY(), 10, 100);
System.out.println(p.getX()+" "+p.getY());
    }

Player.java

//..
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
@Override
    public void keyPressed(KeyEvent e) {
          int key = e.getKeyCode();
            if (key == KeyEvent.VK_SPACE) {
                System.out.print(y);
                y -= 100;
                x -= 100;
            }
}

Po naciśnięciu spacji zmieniam wartości y oraz x, następnie zwracam je za pomocą funkcji. Klasa Main powinna przerysować prostokąt, jednak tego nie robi, mimo, że System.out.println(p.getX()+" "+p.getY()); zwraca odpowiedni wartości.
Jakieś sugestie? :)

0

Metoda paint(), albo wychodzi poza panel (canvas), albo rysuje na panelu (canvasie), który w ogóle nie jest wyświetlany.

0
class Main extends Canvas{
Place p;
    public Main(){
        setBackground(Color.white);
        p = new Player();
        addKeyListener(new Place());
    }

    public static void main(String[] args){
        Main m = new Main();
        JFrame okno = new JFrame();
        okno.setSize(400, 200);
        okno.add(m);
        okno.setVisible(true);
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void update(Graphics g){
        paint(g);
    }
    public void paint(Graphics g){
        g.drawRect(p.getX(), p.getY(), 10, 100);

    }
}

Nie widzę nic błędnego

0

U mnie działa, na pewno masz w keyPressed() wywołanie repaint() dla canvasu? W kodzie, który poprzednio zamieściłeś nie było repaint().

0

Fakt, nie miałem wcześniej wywołane repaint(), zrobiłem to i nie pomaga.

            if (key == KeyEvent.VK_SPACE) {
                System.out.print(y);
                y -= 100;
                x -= 100;
                new Main().repaint();
            }
0

Omg, przecież tworzysz nowy obiekt klasy Main i na nim malujesz. On istnieje tylko w pamięci komputera.
Przekaż do Playera referencję do klasy Main

p = new Player(this);

zapamiętaj ją w polu klasy Player (np. pod nazwą m) i wywołaj

m.repaint();
0

Zrobiłem tak jeszcze przed twoją aktualizacją, jednak nadal nie umiem poradzić sobie z tym, nie wiem.

//Main.java
p = new Player(this);

//Player.java
Main main;
    public static void main(String[] args){
    }
    public Player(Main m){
        x = 0;
        y = 0;
        width = 10;
        height = 50;
        main = m;
    }
//..
@Override
    public void keyPressed(KeyEvent e) {
          int key = e.getKeyCode();
            if (key == KeyEvent.VK_SPACE) {

                System.out.print(y);
                y -= 100;
                x -= 100;
                m.repaint();

            }
}
0

Co oznacz zmienna m w funkcji keyPressed()?

main.repaint();
0

Nie pomaga, ale zauważyłem coś. System.out.println(p.x); wrzuciłem do paint() i o dziwo zamiast zmienionej współrzędnej pojawia się smutne zero.
Może podam cały kod?
Main.java

package main;

import java.awt.*;
import javax.swing.JFrame;

public class Main extends Canvas{
    Player p;
    public Main(){
        setBackground(Color.white);
        p = new Player(this);
        addKeyListener(new Player(this));
    }

    public static void main(String[] args){
        Main m = new Main();
        JFrame okno = new JFrame();
        okno.setSize(400, 200);
        okno.add(m);
        okno.setVisible(true);
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void update(Graphics g){
        paint(g);
    }
    public void paint(Graphics g){
        g.drawRect(p.x, p.y, 10, 100);
    }
}

Player.java

package main;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Player implements KeyListener{
int x, y, width, height;
Main main;
    public static void main(String[] args){
    }
    public Player(Main m){
        x = 0;
        y = 0;
        width = 10;
        height = 50;
        main = m;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    } 
    public void keyPressed(KeyEvent e) {
        Main m = new Main();
          int key = e.getKeyCode();
            if (key == KeyEvent.VK_SPACE) {

                x -= 100;
                y -= 100;
                System.out.println("Y: "+getY() + "X: " + x);
                main.repaint();
            }

            if (key == KeyEvent.VK_LEFT) {
                x =- 1;
            }

            if (key == KeyEvent.VK_RIGHT) {
                x =- 1;
            }

            if (key == KeyEvent.VK_UP) {
                x =- 1;
            }

            if (key == KeyEvent.VK_DOWN) {
                x =- 1;
            }
    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }
}
0
p = new Player(this);
addKeyListener(new Player(this));

Tworzysz dwa obiekty: jeden, który nigdy nie zmienia wartości swoich pól (bo nie nasłuchuje), a z którego te wartości odczytujesz (stąd same zera), i drugi, który ustawia odpowiednie wartości, ale z niego nie czytasz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0