从键盘输入更新的更新程序方法不喜欢方法调用?

Updater method updating from keyboard input doesn't like method calls?

我又回来了。

我正在尝试制作一个随键盘命令移动的框,但它似乎无法正常工作。这是代码:

游戏Class

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;
     }
}

玩家Class

  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--;
    }

}

我之前在更新 class 中将绘图方法放在 if 语句中时它就可以工作(我仍然可以将绘图方法放在那里,当按下相应的键时它们会触发),但是当我尝试在另一个绘制的 class 中引用方法时,它似乎没有响应。我不确定更新方法和键命令是否存在问题(这对我来说是新的),或者我的播放器 class 是否存在根本性错误,无法正常工作。

任何意见都有帮助,谢谢! (还有,我想用Applet,不是Jframe,这是一个偏好)

我发现如果将 drawPlayer 方法更改为:

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

然后像这样从 Game class 传递 Graphics 对象:

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;
}