gpt4 book ai didi

java - 有没有办法从 JPanel 对象的类外部进行绘制?

转载 作者:行者123 更新时间:2023-12-01 10:56:40 24 4
gpt4 key购买 nike

我搜索并发现了一些措辞相似的问题,但没有一个适用于我的情况,所以我开始了。

我正在尝试制作一个具有不同级别的游戏,每个级别的玩法完全不同。

最初,我的代码看起来像这样并且运行良好:

public class Life extends JPanel{

private Story story;

public Life(){
story = new Story(this);

}

public void paintComponent(Graphics g) {
super.paintComponent(g);
story.render(g)

public void terminate(){
story.terminate();
System.out.println("Terminated");
}

public static void main(String[] args){
final JFrame frame = new JFrame("Life");
final Life life = new Life();
frame.add(life);
}
}



public class Story {

private int phase;
private Life life;


public Story(Life life){
this.life = life;
phase = 0;
}

public void render(Graphics g){
if(phase == 0) levelOneRender(g);
if(phase == 1) levelTwoRender(g);
}
}

我担心每次游戏都会浪费时间检查我所处的阶段。由于我计划有 20 多个阶段,代码会很快变得低效。

所以我有一个想法,简单地将 JPanel 中的 Graphics 对象从我的 Life 对象传递到我的 Story 对象,并为每个阶段在不同的类中绘制 Jpanel,如下所示:

public class Life extends JPanel{

public Life(){

story = new Story(this);
}


public static void main(String[] args){
final JFrame frame = new JFrame("Life");
final Life life = new Life();

}

}


public class Story {

private int phase;
private Intro intro;
private Life life;


public Story(Life life){
this.life = life;
phase = 0;
intro = new Intro(this);
}

public void nextPhase(){
this.phase++;
}


public Life getLife() {
return this.life;
}
}

public class Intro {

private static final int DELAY = 100; // in milliseconds, so 10 ticks per second

private Timer timer;
private Story story;
private Graphics g;
private int counter;


public Intro(Story story) {
this.story = story;
this.g = story.getLife().getGraphics();
this.counter = 0;

timer = new Timer(DELAY, new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
tick();
story.repaint();
}
});
timer.start();
}

public void tick(){
if(counter <= 40){
terminate();
}
counter++;
render();
}

public void render(){
story.getLife().paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2.draw(new Rectangle(0,0,10,10));


}

public void terminate(){
timer.stop();
story.nextPhase();
}
}

不幸的是,这不起作用,如story.getLife().paint(g);当我运行 Intro 类时,它会抛出 nullPointerException 。我很确定这不是我尝试的唯一问题。

有正确的方法来做我想做的事情吗?

非常感谢您抽出宝贵的时间。任何见解将不胜感激。

最佳答案

public void render(Graphics g){
if(phase == 0) levelOneRender(g);
if(phase == 1) levelTwoRender(g);
}

这并不像您想象的那么大问题。你现在拥有的一切都很好。但这些检查是可以避免的(如您所要求的)。

不要在单独的方法中处理每个级别的绘画,而是在单独的对象中处理它们:

public bstract class Level {
public abstract void paint(Graphics g);
}

public final class LevelOne extends Level {
public void paint(Graphics g) {
//...
}
}

public final class LevelTwo extends Level {
public void paint(Graphics g) {
//...
}
}

这样,您无需检查 int 值来查看要绘制的渲染,而是只需切换 Level 值即可渲染新级别:

Level one = new LevelOne();
Level two = new LevelTwo();

Level currentLevel = one;

public void paintComponent(Graphics g) {
super.paintComponent(g);

currentLevel.paint(g);
}

只需切换level的值即可渲染不同级别

关于java - 有没有办法从 JPanel 对象的类外部进行绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33591193/

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