非常に単純なプラットフォームゲームをJavaで作成しようとしています。私はパッシブレンダリング(オブジェクトでrepaint()
とrevalidate()
などを呼び出す)を使っていましたが、アクティブレンダリングを実装しようとしていました。レンダリングやアニメーションは動作しますが、何らかの理由でキーリスナー(実際にはうまくいきました)を妨害しているように見えます。アクティブレンダリング時にキーリストが機能しない
私は以下のように問題を最小限に再現しました。キーを押すと、端末出力があるはずですが、何もありません。誰でも私がなぜkeyPressed
などの方法が発射されていないのかを教えてもらえれば、大いに感謝しています。
編集 - デモコードは、要求ごとのような1つのコピー/貼り付けに変更
EDIT2 - アンドリュー・トンプソンによって示唆されるように、私はすべてフルスクリーンコードを削除した、とのKeyListenerはまだありません仕事
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
class FullScreenRenderWithListener implements KeyListener {
private JFrame frame;
private World world;
public static void main(String[] args)
{
FullScreenRenderWithListener main = new FullScreenRenderWithListener();
SwingUtilities.invokeLater(main::run);
}
private void run()
{
initWindow();
setupWorld();
frame.setIgnoreRepaint(true);
frame.pack();
frame.createBufferStrategy(2);
frame.setVisible(true);
world.startActive(frame.getBufferStrategy());
}
private void initWindow()
{
frame = new JFrame();
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
}
private void setupWorld()
{
world = new World();
frame.addKeyListener(this);
frame.add(world);
world.addKeyListener(this);
}
@Override
public void keyPressed(KeyEvent event)
{
System.out.println("Pressed");
}
@Override
public void keyReleased(KeyEvent event)
{
System.out.println("Released");
}
@Override
public void keyTyped(KeyEvent event)
{
System.out.println("Typed");
}
}
class World extends JPanel {
private static final int FRAMES_PER_SEC = 60;
private static final int MILL_IN_SEC = 1000;
private static final int TICK_LENGTH =
MILL_IN_SEC/FRAMES_PER_SEC;
private BufferStrategy strategy;
private void sleepUntilEndOfFrame()
{
try {
long used = System.currentTimeMillis() % TICK_LENGTH;
long left = TICK_LENGTH - used;
Thread.sleep(left);
} catch(InterruptedException e) {
// ... Handle this error
}
}
public void startActive(BufferStrategy strategy)
{
this.strategy = strategy;
setIgnoreRepaint(true);
while(true) {
doFrame();
}
}
private void doFrame()
{
updateGameState();
activeRenderFrame();
}
private void updateGameState()
{
// ..
}
private void activeRenderFrame()
{
Graphics2D graphicsContext = (Graphics2D)strategy
.getDrawGraphics();
paintComponent(graphicsContext);
strategy.show();
Toolkit.getDefaultToolkit().sync();
graphicsContext.dispose();
sleepUntilEndOfFrame();
}
@Override
public Dimension getPreferredSize()
{
return new Dimension(500, 500);
}
// Have overridden this method because the class
// also implements passive rendering if active is
// not supported
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// .. drawing code
}
}
キーリスナーがフレームに追加されているようです。パネルがフレームに追加されると、パネル全体がカバーされ、キーイベントが呑み込まれます。しかし、元のフレームにフォーカスが当てられていないとすれば、どのようにキーイベントが発生したかはわかりません。さらに助けになるように、2つのコードサンプルを1つのコピー/ペーストにして、 'Main'クラスに分かりやすい名前を付けて、私の 'ジャンクコード'パッケージに入れてテストしてください。 –
@AndrewThompson Done –
シングルコピー/ペースト?そしてデモ? O_o他の誰かが問題を抱えているとは思わない、より具体的なものはどうか。 'FullScreenRenderWithKeyListener'? –