2012-04-13 6 views
0

私は、文字が矢印キーを使用して歩き回ることができるときに、RPGスタイルのゲームを作っています。文字がドアまで歩くと、内部の変数は真または偽に変わります。私のメインクラスでは論理文を入れました変数がtrueになったらjPanelをどのように切り替えるのですか?

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

これは機能しませんでした。私は多くの研究を行い、どこでもカードレイアウトを見つけましたが、カードレイアウトがグラフィックスを描くことができない限り、私は知っています。 2番目と内側に加えて、外部クラスもありますが、グラフィックとドアの位置を除いて内部と同じです。

これは私の内部クラス

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

私が見る最初の問題は、あなたが最初に既存のパネルを取り外すされていないことであるパネルの間に切り替えるようになっているクラスです。 。第2の問題は、パネルを交換するロジックがJFrameのコンストラクタにあることです。あなたはこの

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

updateGameLogic(のようなループを持っているでしょうJFrameの中に理想的 )は、多くのことを行うことができ、それらの一つは、のJPanelを交換するかどうかを決定するために、ブール値をチェックしています。 UIが他のスレッド(入力)をブロックしないように、Thread.sleep()メソッドが必要です。 2番目のクラスにmainLoop()というメソッドを置き、そのメソッドをオブジェクトの作成後に呼び出します。

+0

私はそれを、updateGameLogic()のif文のif文で試しました。 30の代わりに100を置いたのですが、走ったときに点滅し、左上に赤い四角形が表示され、時には四角形が表示されることがあります。既存のパネルを削除するにはどうすればよいですか? – arrowheadx16

+0

既存のパネルを削除するには、JFrameでremove(panel)を呼び出します。 –

関連する問題