通过做一个简单的游戏继续我学习Java的过程,我偶然发现了一个问题。我的游戏板扩展了JPanel以及每块板子。现在,这提出了一些问题:
不能设置每件作品的大小,因此,JPanel每件作品都是整个JFrame,隐藏其余部分和背景(游戏板)。
无法确定棋子的位置。
我有默认的流管理器。尝试过setbounds,没有运气。
也许我应该让这篇文章扩展其他JComponent? 添加图片: 这是件,现在灰色的区域也是一块!通过制作一个mousePressed监听器并为其分配一些东西来检查它。在灰色区域下方,是游戏板(或者至少应该是!),另一个是JPanel。
alt text http://img42.imageshack.us/img42/2227/screenshotvdy.png
一些代码:
package TheProject;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameWindow extends JFrame {
public GameWindow() {
setSize(800, 600);
setLocationRelativeTo(null);
Map map = new Map(800, 600, 2);
add(map);
MilitaryUnit imperialRussia = new MilitaryUnit(30, Color.BLACK, Color.YELLOW, Color.WHITE);
imperialRussia.setPreferredSize(new Dimension(30, 30));
add(imperialRussia);
}
}
当我应用pack()方法时会发生这种情况: alt text http://img442.imageshack.us/img442/5813/screenshot2ml.png
在单位周围打包,而不是更大的地图并填充JFrame。
答案 0 :(得分:1)
对于随机移动棋子的游戏,您可能会使用“空布局”。
阅读Absolute Positioning上的Swing教程中的部分以获取更多信息。
答案 1 :(得分:0)
您是否尝试过setPreferredSize(Dimension d)
?
修改:在添加组件后,您需要在JFrame上调用pack()
:
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(800,600));
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(200,200));
frame.add(panel);
frame.pack();
frame.setvisible(true);
另外,您向JFrame添加了一个Map,它与JFrame具有相同的尺寸 - 很好。但之后,您将另一个组件添加到默认的flowlayout。这不适合您的框架,因为地图已经占据了100%的空间。
答案 2 :(得分:0)
您是否尝试过NetBeans的可视化编辑器?您可以使用它在设计视图中拖放,调整大小以方便Swing对象,然后可以切换到代码视图以查看生成的代码。你可以这样学习。
答案 3 :(得分:0)
我使用JPanel
写了几个游戏。基本上我使用JPanel
的方式就像我正在使用Canvas
,即我通过覆盖paint()
方法直接绘制它。我使用JPanel
的原因是因为我可以确定游戏世界的大小,然后使用setPreferredSize()
来设置面板的大小。然后我将面板添加到JScrollPane
。所以这将照顾平移等。
说我正在写一个2D游戏。这就是我使用JPanel的方式。我有一个逻辑地图(一个2D数组)来保存我的游戏地图。假设每个位置都是32x32像素。所以你开始绘制地面以及该地点的地面。例如,在x = 1,y = 2,即屏幕位置x = 32,y = 64,首先绘制地面,然后绘制地面上的内容。因此渲染循环的粗略轮廓将是这样的
for (int y = 0; y < map.length; y++)
for (int x = 0; x < map[y].length; x++) {
drawGround(map[y][x])
for very element on on map[y][x] - render them
}
您为JPanel设置了一个MouseListener
侦听器,因此每次点击鼠标都会转换回地图,例如。鼠标点击x = 54,y = 72对应于x = 1,y = 2。如果你有一个等轴测视图,计算有点棘手。
这里需要注意的是,每次通过滚动面板滚动面板时,都会调用paint()
。所以最好用BufferedImage
渲染你的游戏板,然后在paint()
方法中绘制BufferedImage
,否则它会太慢。