Java – why does it want the method to be static?
•
Java
I'm building my first game. I rely heavily on various tutorials and guides on the Java website. I have a problem
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,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 it is 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,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) { }
}
Solution
You called the player's update () method like this –
private void update() { moveBall(); Player.update(); }
You have no object to create player here So the compiler expects the update () method to be static To resolve this issue, you can do any of the following –
1. Make the update() of the player static Or – 2 Before calling the update () method of the player class, create an instance / object of the player as a field / property in the game class
Player aPlayer = new Player(.....); ..... ..... ..... private void update(){ moveBall(); aPlayer.update(); }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码