java – 为什么它希望该方法是静态的?
发布时间:2020-12-15 04:45:56 所属栏目:Java 来源:网络整理
导读:我正在构建我的第一个游戏,在 Java网站上严重依赖各种教程和指南,我遇到了一个问题. 在我的游戏引擎中,我想调用Player.update()方法,但它说它必须是静态的(不能对非静态方法进行静态引用) 但是,调用它的方法不是静态的.任何人都可以告诉我为什么它要求它是静
我正在构建我的第一个游戏,在
Java网站上严重依赖各种教程和指南,我遇到了一个问题.
在我的游戏引擎中,我想调用Player.update()方法,但它说它必须是静态的(不能对非静态方法进行静态引用) 但是,调用它的方法不是静态的.任何人都可以告诉我为什么它要求它是静态的?它不要求Update中唯一的其他方法是静态的. 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){} } 这是主要代码.现在为Player类. 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) { } } 解决方法
你这样调用了Player的update()方法 –
private void update() { moveBall(); Player.update(); } 在这里你没有创建Player的对象.所以编译器期望update()方法是静态的.要解决此问题,您可以执行以下任一操作 – 1.使播放器的update()静态.要么 – Player aPlayer = new Player(.....); ..... ..... ..... private void update(){ moveBall(); aPlayer.update(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |