1

通过做一个简单的游戏继续我学习Java的追求,我偶然发现了一个小问题。我的游戏板扩展了 JPanel 以及板的每一块。现在,这提出了一些问题:

  1. 无法设置每块的大小,因此,每块 JPanel 占据整个 JFrame,隐藏其余部分和背景(游戏板)。

  2. 无法设置碎片的位置。

我有默认的流管理器。试过setbounds,没有运气。

也许我应该制作这件作品来扩展其他 JComponent?添加的图像:这是一块,现在灰色区域也是一块!通过制作一个 mousePressed 侦听器并为其分配一些东西来检查这一点。灰色区域下方是游戏板(或者至少应该是!),另一个 JPanel。

替代文字 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 的地图。

4

4 回答 4

1

对于随机移动棋子的游戏,您可能会使用“空布局”。

阅读 Swing 教程中关于绝对定位的部分以获取更多信息。

于 2010-04-13T01:32:57.530 回答
0

你试过setPreferredSize(Dimension d)吗?

编辑:添加组件后,您需要调用pack()JFrame:

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,它与您的 JFrame 具有相同的尺寸 - 很好。但随后,您将另一个组件添加到默认流程布局中。这不适合您的框架,因为地图已经占据了 100% 的空间。

于 2010-04-13T01:19:36.100 回答
0

您是否尝试过 NetBeans 的可视化编辑器?您可以使用它在设计视图中拖放和调整您方便的 Swing 对象的大小,然后可以切换到代码视图以查看生成的代码。你可以这样学习。

于 2010-04-13T01:26:27.283 回答
0

我用JPanel. 基本上我使用的方式JPanel就像我使用 a Canvas,即我通过覆盖paint()方法直接在它上面绘制。我之所以使用JPanel是因为我可以确定我的游戏世界的大小,然后使用setPreferredSize()来设置面板的大小。然后我将面板添加到JScrollPane. 所以这将处理平移等问题。

假设我正在编写一个 2D 游戏。这就是我使用 JPanel 的方式。我有一个逻辑地图(一个二维数组),其中包含我的游戏地图。假设每个位置都是 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
}      

MouseListener为 JPanel 设置了一个侦听器,因此每次鼠标单击都会转换回地图,例如。鼠标单击 x=54, y=72 将对应于 x=1, y=2。如果您有等轴测视图,则计算有点棘手。

这里需要注意的是,每次通过滚动面板滚动面板时,paint()都会调用。所以最好在 a 上渲染你的游戏板BufferedImage,然后在paint()方法中只绘制aBufferedImage否则它会太慢。

于 2010-04-13T01:34:49.897 回答