0

キャラクターが矢印キーを使用して歩き回ることができるときに、RPG スタイルのゲームを作成しています。キャラクターがドアまで歩くと、内部の変数が true または false に変わります。私のメインクラスでは、論理ステートメントを入れます

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

これはうまくいきませんでした。私は多くの調査を行い、どこでも cardlayout を見つけましたが、私の知る限り、cardlayout はグラフィックスを描画できません。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();
}
}
4

1 に答える 1

0

最初に目にする問題は、既存のパネルを最初に削除していないことです。2 つ目の問題は、パネルを交換するロジックが JFrame のコンストラクターにあることです。理想的には、JFrame で次のようなループを作成します。

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

updateGameLogic() は多くのことを行うことができます。そのうちの 1 つは、JPanels を交換するかどうかを判断するためにブール値をチェックすることです。UI が他のスレッド (入力) をブロックしないように、Thread.sleep() メソッドが必要です。Second クラスに mainLoop() というメソッドを配置し、オブジェクトの作成後にそのメソッドを呼び出します。

于 2012-04-13T21:28:22.527 に答える