当前位置: 首页 > 知识库问答 >
问题:

从多个类绘制图形?

卢景澄
2023-03-14

我正在制作一个类似飞鸟的飞机游戏,在一个类中,我有移动的背景,然后我将其添加到主jPanel中,它在自己的类中,在另一个类中,我有玩家,我将其添加到主jPanel中。但是,当我将第二个类添加到JPanel时,我添加的第一个类将消失。这是我的背景课:

     import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;


public class map1 extends JPanel implements ActionListener{
Timer t = new Timer(5, this);
int rect1x = 1000, rect1y = 0;
int rect2x = 1250, rect2y = 0;
int rect3x = 1500, rect3y = 0;
int rect4x = 1750, rect4y = 0;
int rect5x = 2000, rect5y = 0;
int rect1dx = 1000, rect1dy = 300;
int rect2dx = 1250, rect2dy = 350;
int rect3dx = 1500, rect3dy = 400;
int rect4dx = 1750, rect4dy = 350;
int rect5dx = 2000, rect5dy = 300;
public map1(){t.start();}
public void rectset1(Graphics g){
g.drawRect(rect1x, rect1y, 50, 100);
g.drawRect(rect1dx, rect1dy, 50, 300);
}
public void rect2(Graphics g){
g.drawRect(rect2x, rect2y, 50, 150);
g.drawRect(rect2dx, rect2dy, 50, 300);
}
public void rect3(Graphics g){
g.drawRect(rect3x, rect3y, 50, 200);
g.drawRect(rect3dx, rect3dy, 50, 300);
}
public void rect4(Graphics g){
g.drawRect(rect4x, rect4y, 50, 150);
g.drawRect(rect4dx, rect4dy, 50, 300);
}
public void rect5(Graphics g){
g.drawRect(rect5x, rect5y, 50, 100);
g.drawRect(rect5dx, rect5dy, 50, 300);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
rectset1(g);
rect2(g);
rect3(g);
rect4(g);
rect5(g);

}

@Override
public void actionPerformed(ActionEvent e) {
repaint();
 rect1x--;
 rect2x --;
 rect3x --;
rect4x --;
 rect5x --;
 rect1dx --;
 rect2dx --;
 rect3dx --;
 rect4dx --;
 rect5dx --;


}

}

这是我的平面类:导入java.awt.图形;导入java.awt.event.动作事件;导入java.awt.event.动作监听器;导入java.awt.event.关键事件;导入java.awt.event.关键监听器;

import javax.swing.JPanel;
import javax.swing.Timer;


public class player extends JPanel implements ActionListener, KeyListener   {
int x = 200, y = 300;
Timer t = new Timer(5, this);
public void space(){
    y+=20;
}
public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawOval(x, y, 50, 50);

}
@Override
public void keyTyped(KeyEvent e) {


}

@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
    if(code == KeyEvent.VK_SPACE){space();}
}

@Override
public void keyReleased(KeyEvent e) {


}

@Override
public void actionPerformed(ActionEvent e) {
    repaint();
    y--;
}
}

最后是我的主要观点:导入javax。摆动JFrame;

@SuppressWarnings("serial")
public class testMain extends JFrame{

public testMain(){}
public static void main(String args[]){
map1 m = new map1();
player q = new player();
JFrame j = new JFrame();
j.setSize(800,600);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.add(m);
j.add(q);
j.setVisible(true);
}


}

共有2个答案

潘皓
2023-03-14

首先在您的主类中,您要扩展JFrame,但随后也实例化它,这是多余的。您应该做两者中的任何一个,而不是两者兼而有之!例如:

public class main extends JFrame{
    public main(){
        setSize(800,600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(m);
        add(q);
        setVisible(true);
    }
}

其次,回答你的问题,你应该有一个单独的类,为你的游戏做所有的绘图。我们将其称为Board类。您可以使用其他类来绘制函数,但这些函数应该在paintComponent()函数内的Board类中调用。注意:还要确保这样做-

void paintComponent(Graphics g){
    super.paintComponent(g);
    ......
    g.dispose();
}
习海
2023-03-14

你应该有一个JPanel,它通过覆盖画组件()来绘制自己。那个JPanel类应该有一个对任何需要绘制的东西的引用。从画组件()方法中,你只需遍历每个需要绘制的游戏对象并绘制它。更好的是,每个游戏对象都应该有一个绘制自己的绘图方法,你的画组件()方法可以把它的图形实例传递给每个方法。

public class GamePanel extends JPanel{

   //example GameObjects, these could be in a list
   GameObject bird = new Bird();
   GameObject cloud = new Cloud();

   public void paintComponent(Graphics g){
      bird.drawMe(g);
      cloud.drawMe(g);
   }
}
 类似资料:
  • 我正在创建一个简单的Java2D程序。它应该从另一个类中绘制矩形,但它不起作用。如果你们中有人能花点时间看看我哪里出了问题,我将不胜感激。这是我明天要交的最后一项作业。 以下是我迄今为止所编写的代码: Block.java 下面是主类: 非常感谢。

  • 本文向大家介绍python绘制多个子图的实例,包括了python绘制多个子图的实例的使用技巧和注意事项,需要的朋友参考一下 绘制八个子图 以上这篇python绘制多个子图的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我有多个数据帧,我想在分组条形图视图中的同一个图上绘制它们。 这是两个非常小的数据帧,我想在同一个图中一起绘制。 数据帧是: 我想画一个像这样的图: 我尝试这样做,只绘制一个图形: 我也试过: 结果只是图片中单个数据帧的数据,而不是两个数据帧的两个数据。请注意,只有两个数据帧的标题出现在同一张图片中,数据仅来自单个独立的数据帧。

  • 使用matplotlib时,我可以使用{importmatplotlib.pyplotas plt}因为我使用Tkinter,所以我也会使用PicreCanvasTkAgg来做同样的事情 有人能帮我在如何实现matplotlib的停顿效果在菲格勒CanvasTkAgg。

  • 在地图上绘制标记时遇到麻烦,我能够从Firebase获取我的用户的纬度和经度并将其存储到我的数组列表中,我的问题是我如何能够全局设置我的数组列表?这是我的代码。 我不知道这东西有什么问题,不知何故,我的地图没有显示标记,我的列表“latlngs”显示“0.0,0.0”我不知道如何全局设置我的latlngs,因为它在从Firebase获取数据的代码中。

  • 我试图将多个图形绘制到一个PDF,但它会生成损坏的PDF。 我应该如何修改上面的代码,以便我在一个PDF文件中成功地获得4个图。