Ich habe versucht, die Grafiken für mein Spiel anzuzeigen, aber keine der Grafiken werden auf dem Panel angezeigt.Java-Grafiken werden nicht angezeigt
Folgendes ist mein Code. Die Hauptklasse ruft die Paint-Methoden der anderen beiden Klassen auf.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Simulator extends JFrame implements KeyListener, Runnable, ActionListener {
private final int WIDTH, HEIGHT;
private Boolean right;
private int xMotion;
public Salt salt;
public Player playR;
Boolean running = false;
private Thread thread;
public static int score, highScore;
private int saltSpeed;
public Simulator(int width, int height) {
JPanel panel = new JPanel();
JFrame frame = new JFrame();
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(width, height);
panel.setBackground(Color.BLACK);
frame.add(panel);
playR = new Player();
this.HEIGHT = height;
this.WIDTH = width;
int xCordSalt = (int) (Math.random() * 631);
saltSpeed = 1;
salt = new Salt(saltSpeed);
right = true;
running = true;
}
public static void main(String[] args) {
Simulator game = new Simulator(640, 480);
game.start();
}
public void paintComponent(Graphics g)
{
salt.paint(g);
playR.paint(g);
}
public void start() {
running = true;
thread = new Thread(this);
thread.start();
repaint();
tick();
run();
}
public void stop() {
running = false;
System.exit(0);
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_D) {
right = true;
} else if (e.getKeyCode() == KeyEvent.VK_A) {
right = false;
}
}
public void tick() {
salt.tick(this, playR);
playR.tick();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_D)
{
playR.setDirection(true);
}
else if(e.getKeyCode() == KeyEvent.VK_A)
{
playR.setDirection(false);
}
}
@Override
public void run() {
while (running) {
tick();
repaint();
try {
thread.sleep(7);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void incrementScore() {
score++;
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
tick();
}
}
Und hier ist der Code für das Verfahren Salz:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
public class Salt extends Rectangle{
private final int WIDTH = 10;
private final int HEIGHT = 10;
public int xCordSalt, yCordSalt;
private int speed;
Rectangle boundBox;
public Salt(int speedx)
{
xCordSalt = (int)Math.random()*641;
yCordSalt = 0;
speed = speedx;
boundBox = new Rectangle(xCordSalt, yCordSalt, WIDTH, HEIGHT);
boundBox.setBounds(xCordSalt, yCordSalt, WIDTH, HEIGHT);
}
public void tick(Simulator sim, Player playR)
{
boundBox.setBounds(xCordSalt, yCordSalt, WIDTH, HEIGHT);
if(yCordSalt >= 480)
{
//sim.stop();
}
else if(checkCollision(playR))
{
sim.incrementScore();
speed++;
yCordSalt = -speed;
}
yCordSalt = yCordSalt + speed;
}
public boolean checkCollision(Player playR)
{
if(this.getBoundBox().intersects(playR.getBoundBox()))
{
return true;
}
return false;
}
public void paint(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(xCordSalt, yCordSalt, WIDTH, HEIGHT);
}
public Rectangle getBoundBox()
{
return boundBox;
}
public double getSpeed()
{
return speed;
}
}
Und schließlich das Verfahren Spieler, der die ImageIcon-Klasse verwendet, um ein Bild anzuzeigen:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Player extends JPanel {
private int xCord, yCord;
public Rectangle boundBox;
private static ImageIcon ryan;
boolean isRight;
public Player() {
ryan = new ImageIcon("E:\ryan.png");
xCord = 640/2;
yCord = 460;
boundBox = new Rectangle(xCord, yCord, 20, 20);
}
public static void main(String[] args) {
}
public void tick() {
}
public void setDirection(Boolean right)
{
if(right)
isRight = true;
else
isRight = false;
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(ryan.getImage(), xCord, yCord, null);
}
public Rectangle getBoundBox()
{
return boundBox;
}
}
Jetzt sind einige davon unvollständig, aber ich kann nicht erkennen, warum es überhaupt keine Grafiken anzeigt. Wenn sie ausgeführt wird, erscheint nur ein schwarzer Rahmen/ein schwarzes Feld. Ich habe einige print-Anweisungen zu den tick() - Methoden jeder Klasse, den paint() -Methoden jeder Klasse und der paintComponent() -Methode und der start() -Methode hinzugefügt. Das Spiel wird starten, führen Sie die Tick-Methode jeder Klasse aus, aber paintComponent() oder eine der paint() -Methoden werden immer aufgerufen!
Sie müssen '" E: \ ryan.png "' in '" E: \\ ryan.png "' ändern. Der umgekehrte Schrägstrich (\) ist ein Escape-Zeichen. Um einen tatsächlichen umgekehrten Schrägstrich in eine Zeichenfolge einzufügen, müssen Sie den umgekehrten Schrägstrich mit einem anderen umgekehrten Schrägstrich umgehen. – VGR
@ursinusTheStrong oh man, wie könnte ich über Escape-Sequenzen vergessen! Danke, dass du mich erinnert hast! –
JFrame hat keine paintComponent-Methode, daher wird sie nie aufgerufen. Deshalb sollten Sie @Override verwenden. Erstellen Sie eine Klasse, die von einem JPanel ausgeht, überschreiben Sie ihre paintComponent-Methode und führen Sie dort ein angepasstes Keeping aus. Stellen Sie sicher, dass Sie zuerst super.paintComponent aufrufen. Eine Idee ist es, eine Entity zu erstellen, die ein Element in deinem Spiel beschreibt, high do "stuff" eines dieser Elemente wäre dann "paintable", welches eine Methode hat, an die du eine Referenz von Graphics übergeben kannst und die sich selbst zeichnet So, alles, was Sie tun müssen, ist eine Liste von Entitäten zu pflegen, aktualisieren Sie die und malen sie – MadProgrammer