Java 绘制和重新绘制以及JFrame/JPanel创建
在我开始了解这一点之前:我对Java和编程非常陌生。如何正确地将“grass.jpg”绘制到屏幕上Java 绘制和重新绘制以及JFrame/JPanel创建,java,image,swing,jframe,jpanel,Java,Image,Swing,Jframe,Jpanel,在我开始了解这一点之前:我对Java和编程非常陌生。如何正确地将“grass.jpg”绘制到屏幕上 import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.ImageIcon; import java.util.Random; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import java.util.Random;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Game extends Canvas {
private static int Height = 300, Width = 600; //25x50
private Random generator = new Random();
private String[][] TerrainList = new String[12][12];
public void GameSetup() {
JFrame container = new JFrame("CARSSémon");
// get hold the content of the frame and set up the resolution of the game
JPanel panel = (JPanel) container.getContentPane();
panel.setPreferredSize(new Dimension(Width,Height));
//panel.setLayout(null);
//setBounds(0,0,800,600);
//panel.add(this);
// finally make the window visible
container.pack();
container.setResizable(false);
container.setVisible(true);
container.setLocationRelativeTo(null); //Centers screen
container.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
PrepareTerrain();
PreparePlayer();
}
public void PrepareTerrain() {
for (int a=0; a<=11; a++){
for (int b=0; b<=11; b++){
TerrainList[a][b]="grass"; //Sets defult terrain of grass
}
}
int BushLocationx = generator.nextInt(12);
int BushLocationy = generator.nextInt(12);
BushCheck(BushLocationx,BushLocationy); //Checks to see if it can make bushs at the location
}
@Override
public void paint(Graphics g) {
super.paint(g);
// Draw an Image object
Image grass = new ImageIcon("grass.jpg").getImage();
Image bushes = Toolkit.getDefaultToolkit().getImage("bushes.jpg");
g.setColor(Color.BLACK);
g.drawImage(grass, 0, 0, null);
g.drawImage(grass, 0, 50, null);
g.drawImage(grass, 50, 0, null);
g.drawImage(grass, 200, 200, null);
}
public void DrawTerrain() {
for (int r=0; r<=11; r++){
for (int c=0; c<=11; c++){
}
}
}
private void BushCheck(int x, int y){
}
public void PreparePlayer() {
}
public static void main(String[] args) {
Game G =new Game();
G.GameSetup();
}
}
import javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.ImageIcon;
导入java.util.Random;
导入java.awt.*;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
公共类游戏扩展画布{
私有静态整数高度=300,宽度=600;//25x50
专用随机生成器=新随机();
私有字符串[][]TerrainList=新字符串[12][12];
public void GameSetup(){
JFrame容器=新JFrame(“CARSSémon”);
//获取帧的内容并设置游戏的分辨率
JPanel面板=(JPanel)container.getContentPane();
面板。设置首选尺寸(新尺寸(宽度、高度));
//panel.setLayout(空);
//立根(0,0800600);;
//小组。添加(本);
//最后使窗口可见
container.pack();
容器。可设置大小(false);
container.setVisible(true);
container.setLocationRelativeTo(null);//中心屏幕
container.addWindowListener(新的WindowAdapter(){
公共无效窗口关闭(WindowEvent e){
系统出口(0);
}
});
准备训练();
PreparePlayer();
}
公众假期{
对于(int a=0;a不要重新发明轮子。使用a和an为您绘制图像。只需将其添加到aJPanel
即可
我刚刚阅读了大量关于图形的Java文本,但只能找到有关加载图像的信息,而不能通过画图显示
对于口袋妖怪风格的游戏,我认为对每个图标/图像使用JLabel
不会带来任何好处。相反:
- 创建游戏区域所需大小的
buffereImage
- 为可能需要绘制的每个较小图标(字符、地形中的元素等)获取
Image
实例,并将它们绘制到主BufferedImage
1的Graphics
实例中
- 要显示主“游戏”图像,有两个很好的选项:
- 将主图像添加到
JLabel
并将其添加到JPanel
,调用label.repaint()
- 将游戏图像直接绘制到提供给
JComponent
的paintComponent()
方法的Graphics
实例
关于最后一部分,我建议选择1
1.例如。
处理缓冲区图像
和图形
非常简单的示例。
更复杂的例子。
显示的是略微不同的定位(扩展JLabel
)。
标签是输出50x25个图像的最有效方式吗?我如何处理这样的数量?你能链接一些东西让我开始吗?(对不起,我应该在我的原始帖子中提到这一点。)@Pyropylon。非常感谢Jeffrey,我现在正在检查标签。对我的工作质量非常抱歉。这应该会有很大帮助。再次感谢。建议:你不想将AWT与Swing混用,所以请扔掉所有的“画布”-相关代码。切勿使用paint或paintComponent方法从中打开文件。这会不必要地降低方法的速度,并使程序响应速度大大降低。不要使用paint方法,而是使用JComponent或其子对象(如JPanel)的paintComponent(…)
方法。更简单的方法是将图像放入ImageIcon中,并将图标放入JLabel中,如下所述。最重要的是,您需要阅读与图形相关的教程。这些教程将非常有用。非常感谢,对于我的代码质量,我感到非常抱歉。我仍在学习,但我意识到这不是借口。因此我应该确定使用JLabels输出25x50网格的图像?我不是在听,只是尽管我100%肯定,但看起来我并没有花太多时间来这里。我只是想确保使用JLabels对许多图像进行正确的处理。如果你的25x50网格的图像包含许多相同的图像,那么是的,我会选择w使用ImageIcons。您可以将一个ImageIcon添加到多个JLabel中,这样您可能只需要处理几个图像/ImageIcons。只有大约5个大小相同的不同图像,因此您的方法看起来非常有前途。再次感谢气垫船,这真的帮了我大忙。我最初计划输出一个25x50网格的图标整个游戏区域总共只有大约5个不同的图标。你创建BuffereImage和绘制它的方法似乎更灵活,并且在将来提供了一种更容易实现更多功能的方法,但我不认为我完全理解。你能给我链接一个关于绘制和使用BuffereImage的好来源吗?非常感谢!这应该有助于我更好地掌握BuffereImage。安德鲁,你是个救命恩人。很高兴你找到了一个策略。:)
public void gameRenderLoop() {
Graphics2D g2 = gameImage.createGraphics();
g2.drawImage(playerImage, 22, 35, this);
...
g2.dispose();
}