2012-04-13 4 views
0

캐릭터가 화살표 키를 사용하여 걸어 다닐 수있을 때 rpg 스타일의 게임을 만들고 있습니다. 캐릭터가 문으로 걸어 가면 변수가 true 또는 false로 변경됩니다. 내 주 수업에서 나는 논리 문장을 넣어변수가 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을(), 인 JPanel의 교체 여부를 결정하기 위해 부울 확인 중 하나를 많은 일을 할 수있는 루프를 가질 것이다. UI가 다른 스레드 (입력)를 차단하지 않도록 Thread.sleep() 메서드가 필요합니다. 두 번째 클래스에 mainLoop()이라는 메서드를 추가하고 개체를 만든 후에 해당 메서드를 호출합니다.

+0

나는 그 if 문 내에서 updateGameLogic(); 그리고 30 대신에 100을 넣었습니다. 그러나 나는 그것을 돌렸을 때 항상 왼쪽 상단에 빨간색 사각형을 표시하고 때로는 그것이 있어야하는 사각형을 보여줍니다. 기존 패널을 제거하려면 어떻게합니까? – arrowheadx16

+0

기존 패널을 제거하려면 JFrame에서 remove (panel)을 호출하면됩니다. –

관련 문제