Why does he want the method to be static?

I am creating my first game relying mainly on various tutorials and tutorials on the Java website and I ran into a problem. In my game engine, I want to call a method Player.update()

, but it says it should be static

(cannot statically reference a non-static method) However, the method calling it is not static

. Can anyone tell me why this is required static

? It does not require that the only way in Update is 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){}

}

      

This is the main code. Now for the Player class.

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) {  
}

      

}

+3


source to share


2 answers


You named the method update()

Player

like this:

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

      

You haven't created an object here Player

. Therefore, the compiler expects the method to update()

be static. To fix the problem, you can do any of -



1. Make a update()

player static

. Or -
2. Create an instance / object Player

inside your class Game

as a field / property before calling the update()

class method Player

-

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

      

+2


source


Look at the method call:

Player.update();

      



This is called as if it were a static method - on the type, not on an instance of the type. Which player do you want to upgrade? You don't seem to have any instances ... you should almost certainly create an instance Player

internally Game

and keep a reference to it.

+9


source







All Articles