我想为我的游戏设置背景。
情境:
首先,我必须从文本文件中读取,然后根据该文本在其上绘制我的瓷砖地图和图像。其次,我的地图是3600 * 2400像素,它比我的屏幕大,所以我必须滚动它。第三,我的屏幕一角必须有一张迷你地图,告诉我我在哪里。 (我想我应该使用面板和awt.container
。)
这是我的代码:
public class bkg extends Panel implements ImageObserver {
//i Initialize my variables here
// then read my images with image buffer in constructor
public static void main(String[] args) {
//my three panels and frame settings
Frame frame = new Frame();
frame.setLayout(null);
frame.setSize(1350, 700);
frame.setTitle("age of empires");
frame.setVisible(true);
frame.setLayout(null);
Panel p1 = new Panel();
Panel p2 = new Panel();
p2.setLayout(null);
JPanel p3 = new JPanel();
p3.setLayout(null);
p1.setSize(1350, 700); // i divide my screen in to 3 parts , one biggest panel, and two small. the biggest one is for main map
p1.setLayout(null);
p2.setBackground(Color.cyan);//just wanna test showing my panel.
p2.setSize(675, 350);
p3.setSize(675, 350);
p1.setLocation(0, 0);
p2.setLocation(0, 350);// this small panel must be under the main pannel.
p3.setLocation(675, 350);// this is with p2.
frame.add(p1);
p1.add(p2);
p2.add(p3);
tilemap = new int[60][75];// it creat my tilemap in console.
filereader();// it reads the text file.
}
@Override
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
int mod_i = 100 * i;// based on images sizes
int mod_j = 50 * j;// based on images sizes
//now i start to draw images base on the text file numbers
switch (tilemap[i][j]) {
case 1:
g.drawImage(tree, mod_i, mod_j, null);
break;
.........
}
}
}
}
问题:似乎我的代码甚至看不到paint方法。它不会在我的面板上绘制任何图像。有什么问题?
答案 0 :(得分:0)
您的代码充满了错误,我从一开始就创建了一个分为3个区域的GUI。
您必须通过调用SwingUtilities invokeLater方法启动Swing应用程序。这可确保Swing应用程序在Event Dispatch thread (EDT)。
Java类名称以大写字母开头。 Java方法名称和变量名称以小写字母开头。
不要将所有内容都放在main方法中。将代码分解为完成一件事的方法。我的run方法创建了JFrame。我的createMainPanel方法创建主面板。
我使用Swing layout managers来定位JPanel。是的,使用绝对定位似乎更容易,但您无法将应用程序移动到具有不同屏幕分辨率的任何其他计算机。
我决定在这一刻停下来。您将创建更多方法和/或类以进一步定义3个JPanel。在那些JPanel方法/类中,您将覆盖paintComponent方法,而不是paint方法。
祝你好运实现游戏。
这是代码。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class AgeOfEmpires implements Runnable {
private JFrame frame;
public static void main(String[] args) {
SwingUtilities.invokeLater(new AgeOfEmpires());
}
@Override
public void run() {
frame = new JFrame();
frame.setTitle("Age of Empires");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createMainPanel());
frame.pack();
frame.setVisible(true);
}
private JPanel createMainPanel() {
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
JPanel upperPanel = new JPanel();
upperPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
JPanel tilePanel = new JPanel();
tilePanel.setBackground(Color.CYAN);
tilePanel.setPreferredSize(new Dimension(800, 300));
upperPanel.add(tilePanel);
JPanel lowerPanel = new JPanel();
lowerPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
JPanel miniMapPanel = new JPanel();
miniMapPanel.setBackground(Color.BLUE);
miniMapPanel.setPreferredSize(new Dimension(400, 300));
JPanel unknownPanel = new JPanel();
unknownPanel.setBackground(Color.GREEN);
unknownPanel.setPreferredSize(new Dimension(400, 300));
lowerPanel.add(miniMapPanel);
lowerPanel.add(unknownPanel);
mainPanel.add(upperPanel, BorderLayout.CENTER);
mainPanel.add(lowerPanel, BorderLayout.SOUTH);
return mainPanel;
}
}