2012-04-13 38 views
0

當角色可以使用箭頭鍵走動時,我正在製作一款RPG風格的遊戲。當角色走到門口時,裏面的變量會變成真或假。在我的主課中,我把一個邏輯語句如何在變量變爲true時切換jpanel?

if (inside == true) { 
add (new inside()); 
} else if (inside == false) { 
add(new outside()); 

這沒有奏效。我做了大量的研究,發現cardlayout無處不在,但據我所知cardlayout不能繪製圖形。除了第二個和內部之外,還有一個外部類,除了圖形和門的位置外,它與內部相同。

這是我的內部類

public class inside extends JPanel implements ActionListener, KeyListener{ 

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JComponent; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class inside extends JPanel implements ActionListener, KeyListener{ 

Timer timer = new Timer(5, this); 

int x = 10; 
int y = 10; 

public inside() { 

timer.start(); 
addKeyListener(this); 
setFocusable(true); 
setFocusTraversalKeysEnabled(false); 
} 

public void paint(Graphics g) { 

super.paint(g); 
Graphics2D g2 = (Graphics2D) g; 
g2.setColor(Color.red); 
g2.fill(new Rectangle2D.Double(x, y, 30, 30)); //player 
g2.setColor(Color.blue); 
g2.fill(new Rectangle2D.Double(135, 85, 30, 30)); //old man 
g2.setColor(Color.darkGray); 
g2.fill(new Rectangle2D.Double(290, 0, 10, 300)); //wall 
g2.fill(new Rectangle2D.Double(0, 0, 300, 10)); //wall 
g2.fill(new Rectangle2D.Double(0, 0, 10, 300)); //wall 
g2.fill(new Rectangle2D.Double(0, 290, 300, 10)); //wall 
g2.setColor(Color.white); 
g2.fill(new Rectangle2D.Double(290, 135, 10, 30)); //door 
g2.setColor(Color.black); 
g2.drawString(second.inside + "", 15, 15); 
} 

public void actionPerformed(ActionEvent e) { 

repaint(); 
} 

public void keyPressed(KeyEvent e) { 

int code = e.getKeyCode(); 

if (code == KeyEvent.VK_UP) { 
if (y <= 10) { 
y = 10; 
} else { 
y -= 5; 
} 
} else if (code == KeyEvent.VK_DOWN) { 
if (y >= 260) { 
y = 260; 
} else { 
y += 5; 
} 
} else if (code == KeyEvent.VK_LEFT) { 
if (x <= 10) { 
x = 10; 
} else { 
x -= 5; 
} 
} else if (code == KeyEvent.VK_RIGHT) { 
if (x >=260) { 
x = 260; 
if (second.inside == true && x == 260 && y == 135) { 
second.inside = false; 
} 
} else { 
x += 5; 
} 
} 
} 

public void keyReleased(KeyEvent e) { 
} 

public void keyTyped(KeyEvent e) { 
} 
} 

,這是應該面板之間切換類

import javax.swing.JFrame; 

public class second extends JFrame { 

public static boolean inside = true; 

public second() { 

if (inside == true) { 
add(new inside()); 
} else if (inside == false) { 
add(new outside()); 
} 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
setSize(316, 338); 
setLocationRelativeTo(null); 
setTitle("Test Game 3"); 
setVisible(true); 
} 

public static void main(String[] args) { 
new second(); 
} 
} 

回答

0

我看到的第一個問題是,你是不是先刪除現有面板。第二個問題是交換面板的邏輯是在JFrame的構造函數中。 理想在JFrame中你將有一個循環這樣

while(true) 
{ 
    updateGameLogic(); 
    repaint(); 
    try{ 
     System.sleep(30); 
    } catch(Exception e) {} 
} 

的updateGameLogic()可以做很多事情,其中​​之一就是檢查布爾值,以確定是否交換JPanels。 Thread.sleep()方法是必需的,所以UI不會阻塞其他線程(輸入)。我會在第二個類中放入一個名爲mainLoop()的方法,並在創建該對象後調用該方法。

+0

我試着用我的if語句inplace updateGameLogic();而不是30我把100,但是當我跑它它閃爍,並會始終顯示在左上方的紅色方塊,偶爾會顯示它應該在哪裏廣場。我如何刪除現有面板? – arrowheadx16 2012-04-13 23:06:09

+0

要刪除現有面板,只需調用JFrame中的remove(面板)即可。 – 2012-04-17 16:30:47