Обновление метода обновления с клавиатуры вводит не нравится вызов метода - PullRequest
0 голосов
/ 31 мая 2018

Я снова вернулся.

Я пытаюсь создать окно, которое перемещается с помощью клавиатурных команд, но, похоже, оно работает не так, как должно.Вот код:

Класс игры

import java.applet.Applet;
import java.awt.Color;
import java.awt.Event;
import java.awt.Graphics;


public class Game extends Applet
{
    Thread loopThread;
    boolean left  = false;
    boolean right = false;
    boolean up = false;
    boolean down = true;
    int x = 0;
    int y = 0;
    int tick = 0;
    int[][] board = new int[12][12];
    Graphics g;
    Player p = new Player(0,0);

    public void run() 
    { 

        long startTime;

        if (loopThread == null) 
        {
            loopThread = new Thread();
            loopThread.start();
        }


        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        startTime = System.currentTimeMillis();
        while(Thread.currentThread() == loopThread) 
        {
            update(g);
        }
    }


    public void update(Graphics g) 
    {

         System.out.println("repaint");
         if(left)
         {
             p.goL();
             p.drawPlayer();
             left = false;
         }
         else if(right)
         {
             p.goR();
             p.drawPlayer();
             right = false;
         }
         else if(up)
         {
             p.goU();
             p.drawPlayer();
             up = false;
         }
         else if(down)
         {
             p.goD();
             p.drawPlayer();
             down = false;
         }
         else
         {
             p.drawPlayer();
         }

    }


    public boolean keyDown(Event e, int key) 
    {
            if (key == Event.LEFT) {
                left = true;
            }

            if (key == Event.RIGHT) {
                right = true;
            }

            if (key == Event.UP) {
                up = true;
            }

            if (key == Event.DOWN) {
                down = true;
            }

            repaint();
            return true;
     }
}

Класс игрока

  import java.applet.Applet;
    import java.awt.Color;
    import java.awt.Event;
    import java.awt.Graphics;

public class Player
{
    private int x;
    private int y;
    private int[][] b;
    Graphics g;

    public Player(int xPos, int yPos)
    {
        int x = xPos;
        int y = yPos;
    }

    public void drawPlayer()
    {
        g.setColor(new Color(0,0,0));
        g.fillRect(40*x, 40*y, 40, 40);
    }

    public int getX()
    {
        return x;
    }

    public int getY()
    {
        return y;
    }

    public void goL()
    {
        x--;
    }

    public void goR()
    {
        x++;
    }

    public void goU()
    {
        y++;
    }

    public void goD()
    {
        y--;
    }

}

Я работал раньше, когда помещал методы рисования внутри операторов if вкласс обновления (и я все еще могу поместить туда методы рисования, и они срабатывают при нажатии соответствующих клавиш), но когда я пытаюсь сослаться на метод в другом рисуемом классе, он кажется не отвечающим.Я не уверен, есть ли проблема с методом update и клавишными командами (что является новым для меня), или если есть что-то принципиально неправильное с моим классом Player, который работает как задумано.

Любой вводполезно, спасибо!(Также я хочу использовать Applet, а не Jframe, это предпочтение)

1 Ответ

0 голосов
/ 31 мая 2018

Я обнаружил, что если вы измените метод drawPlayer на этот:

public void drawPlayer(Graphics g)
{
    g.setColor(new Color(0,0,0));
    g.fillRect(40*x, 40*y, 40, 40);
}

, а затем просто передадите объект Graphics из класса Game следующим образом:

public void update(Graphics g) 
{
     System.out.println("repaint");
     if(left)
     {
         p.goL();
         p.drawPlayer(g);
         left = false;
     }
     else if(right)
     {
         p.goR();
         p.drawPlayer(g);
         right = false;
     }
     else if(up)
     {
         p.goU();
         p.drawPlayer(g);
         up = false;
     }
     else if(down)
     {
         p.goD();
         p.drawPlayer(g);
         down = false;
     }
     else
     {
         p.drawPlayer(g);
     }

}

Ящик должен нарисовать.Хотя по какой-то причине мне пришлось сначала нажать Applet, чтобы начать рисовать, а затем, если вы измените размер Applet, рисунок исчезнет.

Кроме того, в качестве простого исправления, если выне хотите отслеживать предыдущие позиции блока, просто создайте две переменные, чтобы отслеживать предыдущую позицию блока, а затем очистите ее.Например:

private int lastX;
private int lastY;

public void drawPlayer(Graphics g)
{
    g.clearRect(40*lastX, 40*lastY, 40, 40);
    g.setColor(new Color(0,0,0));
    g.fillRect(40*x, 40*y, 40, 40);
    lastX = x;
    lastY = y;
}
...