gpt4 book ai didi

Java 图形不显示

转载 作者:行者123 更新时间:2023-11-30 07:23:12 24 4
gpt4 key购买 nike

我一直在尝试显示游戏的图形,但面板上没有显示任何图形。

以下是我的代码。主类调用其他两个类的paint方法。

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();

}

}

这是盐方法的代码:

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;
}


}

最后是方法player,它使用imageIcon类来显示图像:

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;
}

}

现在其中一些不完整,但我不明白为什么它不显示任何图形。运行时,仅出现黑色框架/面板。我在每个类的tick()方法、每个类的paint()方法以及paintComponent()方法和start()方法中添加了一些打印语句。游戏将开始,运行每个类的tick方法,但会调用paintComponent()或任何paint()方法!

最佳答案

让我们从显而易见的开始......

public class Simulator extends JFrame ... {
//...
public void paintComponent(Graphics g) {

salt.paint(g);
playR.paint(g);

}

JFrame 没有名为 paintComponent 的方法,因此您的 paintComponent 永远不会被调用,因此 salt > 和 playR 永远不会被绘制。

您可以通过将 @Override 添加到 paintComponent 来测试这一点,它会为您进行编译时健全性检查

public class Simulator extends JFrame ... {
//...
@Override
public void paintComponent(Graphics g) {

salt.paint(g);
playR.paint(g);

}

这将无法编译。

现在,您可以重写paint,但是 because , because , because , because , because ...我不会推荐它...

退后一步。 JFrame 真正负责什么?提供一个容器,您可以在其中添加 gui 并将其显示在屏幕上。您并没有真正向 JFrame 添加任何新功能,因此我不会将它用作您的“主要”组件,相反,我只是创建它的一个实例并添加任何组件你想使用它。

相反,我会从 JPanel 开始,并重写其 paintComponent 方法,并将所有自定义绘画放入其中。

然后,我将使用该组件作为核心逻辑和 Controller 的起点。

您甚至可以创建多个组件来充当菜单和选项 View 等内容,并使用 CardLayoutOverlayoutLayout 来显示它们。

我还建议您查看 How to Use Key Bindings而不是 KeyListener 当您使用它时,这将回答您的下一个问题。

关于Java 图形不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com