Java,未能实现计时器。请帮忙?
我贴了一个问题,得到了一个极好的答案 我接受了他们的建议,并尝试实现一个计时器来让我的Java游戏循环Java,未能实现计时器。请帮忙?,java,timer,Java,Timer,我贴了一个问题,得到了一个极好的答案 我接受了他们的建议,并尝试实现一个计时器来让我的Java游戏循环 public static void run() { init(); long lastTime = System.nanoTime(); final double amountOfTicks = 60D; double ns = 1000000000/ amountOfTicks; double
public static void run()
{
init();
long lastTime = System.nanoTime();
final double amountOfTicks = 60D;
double ns = 1000000000/ amountOfTicks;
double delta = 0;
while(running)
{
long now = System.nanoTime();//gets time from pc in nano seconds
//tick();//this is the problem, slow computer will slow things down
delta += (now - lastTime) / ns;
lastTime = now;
if(delta >=1)
{
tick();//limited to 60 times a second
delta--;
}
render();//render and draw graphics many times a second// as fast as we can
}
stop();
}
public void tick()
{
//update all game components
runTimer();
}
public void render()
{
//draw the images
//first time game runs
BufferStrategy bs = this.getBufferStrategy();
if(bs == null)//bs equalnothing create
{
createBufferStrategy(3);
return;//exit render method until called again
}
Graphics g = bs.getDrawGraphics();//paint brush, paints all sorts, draw text lines images etc. paint brush yeah
//render here i guess
createGUI();
//end the render please
g.dispose();
bs.show();
}
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Cannot make a static reference to the non-static method init() from the type CbabyBall
Cannot make a static reference to the non-static method tick() from the type CbabyBall
Cannot make a static reference to the non-static method render() from the type CbabyBall
Cannot make a static reference to the non-static method stop() from the type CbabyBall
我已经尝试通过查看oracle和其他示例来植入计时器,但是我实现的代码不喜欢它
我所做的是鼠标点击,当你点击一个二维网格阵列时,玩家X和Y的位置应该会转到那个位置
private void runTimer()
{
if(BPOS_X!=MOUSE_X && BPOS_Y != MOUSE_Y){
if(BPOS_X<MOUSE_X)
{
if(MOUSE_X+1==this)
{
//moveBallR();
//moveRight();
moveUp();
}
else
{
moveRight();
}
}
if(BPOS_X>MOUSE_X)
{
moveLeft();
}
if(BPOS_Y<MOUSE_Y)
{
moveDown();
}
if(BPOS_Y>MOUSE_Y)
{
moveUp();
}
}
else if(BPOS_X==MOUSE_X && BPOS_Y == MOUSE_Y)
{
}
如果您提供的后一个代码实际上在一个循环中,那么您马上就会遇到问题;如果鼠标不在同一点上,它总是会移动的 其次,最可能的问题是init实际上不是一个静态方法,在这个方法中,您将run称为一个静态方法;这会导致冲突,因为您没有将init显式更改为static,并且静态方法中的所有变量都必须具有静态访问修饰符 如果run不一定是静态方法,那么我会修改它。您可以改变它的方式如下:
class Main {
public Thread runThread = new Thread() {
public void run() {
//Put Code Here...
}
}
public static void main(String args[]) {
Main m = new Main();
m.runThread().start();
}
}
希望这有助于:
p.S@HoverCraftFullOfEels意味着你不应该把注意力集中在你应该工作的计时器上,而应该在你做任何其他事情之前确保你的其余代码工作正常
p.p.S以下是JPanel扩展的工作原理:
`class mainRun extends JPanel {
public void paintComponent() {//Code In Here}
public static void main(String args[]) {
JFrame frame = new JFrame("Title");
//JFrame Code
mainRun mr = new mainRun();
KeyEvent event = new KeyEvent() {
//Default Code
}
frame.add(mr);
frame.addKeyListener(event);
}
}
`
你说:
我所做的是鼠标点击,当你点击一个二维网格阵列时,玩家X和Y的位置应该会转到那个位置
private void runTimer()
{
if(BPOS_X!=MOUSE_X && BPOS_Y != MOUSE_Y){
if(BPOS_X<MOUSE_X)
{
if(MOUSE_X+1==this)
{
//moveBallR();
//moveRight();
moveUp();
}
else
{
moveRight();
}
}
if(BPOS_X>MOUSE_X)
{
moveLeft();
}
if(BPOS_Y<MOUSE_Y)
{
moveDown();
}
if(BPOS_Y>MOUSE_Y)
{
moveUp();
}
}
else if(BPOS_X==MOUSE_X && BPOS_Y == MOUSE_Y)
{
}
这听起来根本不需要游戏循环。你需要的只是一个鼠标听筒,就这样
此外,为了重申我的意见,我担心您在最近的另一个问题中收到的建议不是好的建议,因为他们建议您在Swing应用程序中使用java.util.Timer,这可能很危险。通常最好使用javax.swing.Timer,也称为swing计时器
为了获得更好的建议,您需要提供更多关于您正试图创建的内容的详细信息
编辑
你说:
我想刷新我的Jpanel,让它看起来好像正方形正在移动到那个位置
所以,在鼠标侦听器中这样做。你现在的问题不是让计时器工作,而是让代码编译。您不应该尝试运行未编译的代码。首先尝试修复编译问题,然后尝试运行它,然后再处理程序的逻辑问题。查找该错误消息,因为它非常常见,您会发现类似的问题和解决方案:不要尝试对类调用非静态方法。对一个对象,一个实例调用它。@hovercraftfullofels对不起,我对Java很陌生,你是什么意思?这段代码应该做什么?我不太确定您在最近的另一个问题中收到的建议是否是好的建议,因为他们建议您在Swing应用程序中使用java.util.Timer,这可能很危险。通常最好使用javax.swing.Timer,也称为swing计时器。卡地亚,谢谢。但我的代码实现类似于这个公共类CbabyBall扩展了JFrame实现了KeyListener、ActionListener和ChangeListener{我个人认为你应该基于监听器创建一个变量,然后将它们添加到你的jframe中,我也会将其作为一个变量,同时从你的主类扩展jpanel…但这不是破坏了子类和超级类的整个对象吗?我应该删除执行计时器的代码吗?我有太多错误。M无法解决d m.run;@Moynul:一点也不。你只在适当的时候和适当的地方使用子类。过度使用和错误使用继承在新手程序中太常见了。我建议你的GUI程序都不要实现侦听器接口,因为你会创建一些试图做得太多的类。我想刷新我的Jpanel,让它看起来像正方形正在向那个位置移动。