有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么希望方法是静态的?

我正在开发我的第一个游戏,严重依赖Java网站上的各种教程和指南,我遇到了一个问题。 在我的游戏引擎中,我想调用Player.update()方法,但它说它必须是static(不能静态引用非静态方法) 然而,调用它的方法不是static。谁能告诉我为什么它要求它是static?它不需要更新中唯一的其他方法是static

package Main;

import java.awt.*;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

import Graphics.Assets;
import Sprites.Player;

@SuppressWarnings("serial")
public class Game extends JPanel
implements Runnable, KeyListener{

//TEST CODE
private int x = 0;
private int y = 0;
private int dY = 1;
private int dX = 1;

public void moveBall() {
    x = x + dX;
    y = y + dY;

    if(x > WIDTH - 28) {
        dX = -1;
    }
    if(y > HEIGHT) {
        dY = -1;
    }
    if(x < 0) {
        dX = 1;
    }
    if(y < 10) {
        dY = 1;
    }
}

//dimensions
public static final int WIDTH = 400;
public static final int HEIGHT = 300;
public static final int SCALE = 2;

//game thread
private Thread thread;
private boolean running;
private int FPS = 60;
private long targetTime = 1000 / FPS;

//image
private BufferedImage image;
private Graphics2D g;

//Constructor
public Game () {
    super();
    setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    setFocusable(true);
    requestFocus();
}

public void addNotify() {
    super.addNotify();
    if(thread == null) {
        thread = new Thread(this);
        addKeyListener(this);
        thread.start();
    }
}

private void init () {
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

    g = (Graphics2D)image.getGraphics();

    running = true;
    Assets.init();
}

public void run() {

    init();

    long start;
    long elapsed;
    long wait;

    //game loop
    while(running){
    start = System.nanoTime();

    update();
    draw(g);
    drawToScreen();

    elapsed = System.nanoTime() - start;

    wait = targetTime - elapsed / 1000000;
    if(wait < 0) wait= 5;

    try {
        Thread.sleep(wait);
    }
    catch(Exception e) {
        e.printStackTrace();
    }
    }
}

private void update() {
    moveBall();
    Player.update();
}
private void draw(Graphics g2d) {
    super.paint(g2d);
    Graphics2D g = (Graphics2D) g2d;
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g.drawString("Hello", x, y);
}
private void drawToScreen() {
    Graphics g2 = getGraphics();
    g2.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
    g2.dispose();
}



public void keyPressed(KeyEvent e){}

public void keyReleased(KeyEvent e){}

public void keyTyped(KeyEvent e){}

}

这是主要代码。现在是球员课

package Sprites;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import Main.Game;
import Graphics.*;


public class Player extends Creature implements KeyListener{

private int dir;

public Player(Game game, float x, float y) {
    super(game, x, y, Creature.DEFAULT_CREATURE_WIDTH, Creature.DEFAULT_CREATURE_HEIGHT);
    dir = 0;
}

public void update() {
    getInput();
    move();

}

private void getInput() {
    xMove = dir;
}

public void render(Graphics g) {
    g.drawImage(Assets.player, (int) (x), (int) (y), width, height, null);
}

public void keyPressed(KeyEvent e) {

    if(e.getKeyCode()  == KeyEvent.VK_A)
        dir = -1;
    if(e.getKeyCode() == KeyEvent.VK_D)
        dir = 1;
    else dir = 0;
}

public void keyReleased(KeyEvent e) {

    if(e.getKeyCode()  == KeyEvent.VK_A)
        dir = 0;
    if(e.getKeyCode() == KeyEvent.VK_D)
        dir = 0;
}

public void keyTyped(KeyEvent e) {  
}

}


共 (2) 个答案

  1. # 1 楼答案

    看看你的方法调用:

    Player.update();
    

    这就像是在类型上调用静态方法一样,而不是在类型的实例上调用你想更新哪个玩家?你似乎没有这样的例子。。。几乎可以肯定,您应该在Game中创建Player的实例,并保存对它的引用

  2. # 2 楼答案

    您已经这样调用了update()Player方法——

    private void update() {
        moveBall();
        Player.update();
    }  
    

    这里没有创建Player的对象。因此编译器希望update()方法是静态的。要解决问题,您可以执行以下任一操作:

    1制作玩家的update()。或者-
    2在调用Player类的update()方法之前,在Game类中创建Player的实例/对象作为字段/属性-

        Player aPlayer = new Player(.....);
        .....
        .....
        ..... 
        private void update(){   
           moveBall();
           aPlayer.update();
       }