2010-04-13 33 views
1

继续我做一个简单的游戏学习Java的追求,我偶然发现了一个小问题。我的游戏板扩展了JPanel以及每块棋盘。现在,这存在一些问题:每件移动和调整JPanels对象内部的JFrame

  1. 广东话集的大小,因此,每一块的JPanel按观测整个的JFrame,隐瞒件的休息和后台(游戏键盘)。

  2. 广东话设置片的位置。

我有默认流量管理器。尝试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

LayeredPane任何人? – 2010-04-13 02:28:15

+0

我结束了使用JLayeredPane把所有的东西(地图和单位)。 JLP不支持布局管理器,所以我必须手工找到它们,但我工作。 – 2010-04-13 02:53:25

+0

“布局管理器将影响此容器的所有子组件,而不考虑图层设置。”-http://java.sun.com/javase/6/docs/api/javax/swing/JLayeredPane.html – trashgod 2010-04-13 03:21:38

回答

0

我使用JPanel写了几场比赛。基本上我使用JPanel的方式就像我使用的是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()将被调用。因此,最好将您的游戏板放在BufferedImage上,然后在paint()方法中画出BufferedImage,否则它会太慢。

+1

您应该为自定义绘画重写paintComponent()NOT paint()。 – camickr 2010-04-13 01:36:47

+0

我认为,因为我绘制了所有内容,而不是自定义组件,所以我将使用paint()。可能我应该做的唯一事情就是在paint()中调用paintBorder()。无论如何感谢评论它。 – 2010-04-13 02:14:43

+0

是啊,但是如果你想点击一个单位/件怎么办?你如何找到这件作品?这就是为什么我使用这种方法,一个地图/游戏板和另一个单位/件类。 – 2010-04-13 03:14:25

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%的空间。

+0

刚刚做过,没有工作。 – 2010-04-13 01:27:04

+1

我认为我们错过了一些细节。发布一些代码,这样我们就可以看到你已经尝试过了。 – 2010-04-13 01:30:45

0

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

1

对于一个游戏,有你可能会用一个“空布局”件随机运动。

阅读从Absolute Positioning Swing的教程部分获取更多信息。