从键盘输入更新的更新程序方法不喜欢方法调用?
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;
}
我又回来了。
我正在尝试制作一个随键盘命令移动的框,但它似乎无法正常工作。这是代码:
游戏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;
}