2010-04-13 34 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的教程部分獲取更多信息。