現在ゲームの枠組みを作っています。MainPanelを用意し、そこにstartpanelやgamepanel,gameclearpanelなどをMainpanel上で入れ替えるといったプログラムを作りたいと思っています。初めはMainpanelにはstartpanelが載せられており、「s」キーを押すとゲームがスタートしてgemapanelに行くようになっているのですが、StartPanelに設置した「遊び方」のボタン(押すと標準出力に遊び方と表示される。)を押すとkeyEventが取得されず、sキーを押してもゲームが始まらなくなってしまいます。原因がわかる方がいましたら、解決策を教えてください。
java
1//GameFrame ファイル 2import javax.swing.JFrame; 3 4public class GameFrame extends JFrame { 5 6 public GameFrame() { 7 8 setLayout(null); 9 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 10 setSize(500,500); 11 setLocationRelativeTo(null); 12 MainPanel pn =new MainPanel(); 13 add(pn); 14 setVisible(true); 15 16 } 17 18 public static void main(String[] args) { 19 GameFrame GF=new GameFrame(); 20 21 22 23 } 24 25} 26
java
1//StartPanelファイル 2import java.awt.Color; 3import java.awt.Font; 4import java.awt.FontMetrics; 5import java.awt.Graphics; 6import java.awt.event.ActionEvent; 7import java.awt.event.ActionListener; 8import java.awt.event.KeyAdapter; 9import java.awt.event.KeyEvent; 10 11import javax.swing.JButton; 12import javax.swing.JPanel; 13 14public class StartPanel extends JPanel implements ActionListener{ 15 boolean in_game=true; 16 MainPanel mp; 17 JButton bt; 18 19 public StartPanel(MainPanel mp1) { 20 21 mp=mp1; 22 setLayout(null); 23 setBackground(Color.white); 24 Font f=new Font("SansSerif",Font.BOLD,20); 25 FontMetrics fm=getFontMetrics(f); 26 String str="遊び方"; 27 int w=fm.stringWidth(str)+50; 28 int h=fm.getHeight()+20; 29 bt=new JButton(str); 30 bt.setFont(f); 31 bt.addActionListener(this); 32 bt.setSize(w,h); 33 bt.setLocation(250-w/2,400); 34 add(bt); 35 addKeyListener(new Key()); 36 setFocusable(true); 37 38 39 40 } 41 @Override 42 public void paint(Graphics g) { 43 super.paint(g); 44 FontMetrics fm; 45 Font f; 46 String str1,str="Game Title"; 47 int w,h; 48 49 f=new Font("Serif",Font.BOLD,25); 50 fm=g.getFontMetrics(f); 51 str1=str+"(Serif)"; 52 w=fm.stringWidth(str1); 53 h=fm.getHeight(); 54 g.setFont(f); 55 g.drawString(str1,250-w/2,h); 56 57 f=new Font("SansSerif",Font.BOLD,25); 58 fm=g.getFontMetrics(f); 59 str1=str+"(SansSerif)"; 60 w=fm.stringWidth(str1); 61 h=h+fm.getHeight()+10; 62 g.setFont(f); 63 g.drawString(str1,250-w/2,h); 64 65 66 f=new Font("Dialog",Font.BOLD,25); 67 fm=g.getFontMetrics(f); 68 str1=str+"(Dialog)"; 69 w=fm.stringWidth(str1); 70 h=h+fm.getHeight()+10; 71 g.setFont(f); 72 g.drawString(str1,250-w/2,h); 73 74 f=new Font("DialogInput",Font.BOLD,25); 75 fm=g.getFontMetrics(f); 76 str1=str+"(DialogInput)"; 77 w=fm.stringWidth(str1); 78 h=h+fm.getHeight()+10; 79 g.setFont(f); 80 g.drawString(str1,250-w/2,h); 81 82 f=new Font("Serif",Font.PLAIN,20); 83 fm=g.getFontMetrics(f); 84 str1="ゲーム開始: 「s」キー"; 85 w=fm.stringWidth(str1); 86 h=500-fm.getHeight()-10; 87 g.setFont(f); 88 g.drawString(str1,250-w/2,h-200); 89 //requestFocusInWindow(); 90 91 92 93 94 95 } 96 97 public void actionPerformed(ActionEvent e) { 98 if(e.getSource()==bt) { 99 System.out.println("遊び方"); 100 } 101 } 102 103 class Key extends KeyAdapter{ 104 105 public void keyPressed(KeyEvent ke) { 106 if(ke.getKeyCode()==KeyEvent.VK_S) { 107 mp.state=1; 108 109 } 110 } 111 } 112 113} 114
java
1//MainPanel ファイル 2import java.awt.BorderLayout; 3 4import javax.swing.JPanel; 5 6public class MainPanel extends JPanel implements Runnable { 7 StartPanel sp; 8 GamePanel gp; 9 GameClearPanel gcp; 10 GameOverPanel gop; 11 boolean in_game=true;//ゲーム実行中はtrue 12 public int state=0;//ゲーム状態 13 public int level=1;//ゲームレベル 14 int old_state=0;//直前のゲーム状態 15 Thread td; 16 int width=500; 17 int hight=500; 18 19 public MainPanel() { 20 21 setSize(width,hight); 22 setLayout(new BorderLayout()); 23 sp=new StartPanel(this); 24 add(sp,BorderLayout.CENTER); 25 td=new Thread(this); 26 td.start(); 27 28 } 29 30 public void run() { 31 while(in_game) { 32 try { 33 td.sleep(100); 34 }catch(InterruptedException e) {} 35 if(state!=old_state) { 36 if(old_state==0) { 37 remove(sp); 38 } 39 else if(old_state==1) { 40 remove(gp); 41 } 42 else if(old_state==2) { 43 remove(gcp); 44 } 45 else { 46 remove(gop); 47 } 48 49 //新しいパネルの追加 50 if (state==4) { 51 in_game=false; 52 }else if(state==0) { 53 sp=new StartPanel(this); 54 add(sp); 55 }else if(state==1) { 56 gp=new GamePanel(this); 57 add(gp); 58 } 59 else if(state==2) { 60 gcp=new GameClearPanel(this); 61 add(gcp); 62 } 63 else if(state==3){ 64 gop=new GameOverPanel(this); 65 add(gop); 66 } 67 validate(); 68 old_state=state; 69 } 70 } 71} 72}
回答1件
あなたの回答
tips
プレビュー