現在ゲームの枠組みを作っています。MainPanelを用意し、そこにstartpanelやgamepanel,gameclearpanelなどをMainpanel上で入れ替えるといったプログラムを作りたいと思っています。初めはMainpanelにはstartpanelが載せられており、「s」キーを押すとゲームがスタートしてgemapanelに行くようにしたいのですが、キーがうまく取得されません。おそらく下記のStartPanelに問題があると思うのですが、どこが間違っているのかわからないので、解決策を教えてください。
java
1import javax.swing.JFrame; 2import java.awt.BorderLayout; 3 4import javax.swing.JPanel; 5import java.awt.Color; 6import java.awt.Font; 7import java.awt.FontMetrics; 8import java.awt.Graphics; 9import java.awt.event.ActionEvent; 10import java.awt.event.ActionListener; 11import java.awt.event.KeyAdapter; 12import java.awt.event.KeyEvent; 13 14import javax.swing.JButton; 15import javax.swing.JPanel; 16 17public class GameFrame extends JFrame { 18 19 public GameFrame() { 20 21 setLayout(null); 22 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 23 setSize(500,500); 24 setLocationRelativeTo(null); 25 MainPanel pn =new MainPanel(); 26 add(pn); 27 setVisible(true); 28 29 } 30 31 public static void main(String[] args) { 32 GameFrame GF=new GameFrame(); 33 34 35 36 } 37 38} 39 40public class MainPanel extends JPanel implements Runnable { 41 StartPanel sp; 42 GamePanel gp; 43 GameClearPanel gcp; 44 GameOverPanel gop; 45 boolean in_game=true;//ゲーム実行中はtrue 46 public int state=0;//ゲーム状態 47 public int level=1;//ゲームレベル 48 int old_state=0;//直前のゲーム状態 49 Thread td; 50 int width=500; 51 int hight=500; 52 53 public MainPanel() { 54 55 setSize(width,hight); 56 setLayout(new BorderLayout()); 57 sp=new StartPanel(this); 58 add(sp,BorderLayout.CENTER); 59 td=new Thread(this); 60 td.start(); 61 62 } 63 64 public void run() { 65 while(in_game) { 66 try { 67 td.sleep(100); 68 }catch(InterruptedException e) {} 69 if(state!=old_state) { 70 if(old_state==0) { 71 remove(sp); 72 } 73 else if(old_state==1) { 74 remove(gp); 75 } 76 else if(old_state==2) { 77 remove(gcp); 78 } 79 else { 80 remove(gop); 81 } 82 } 83 //新しいパネルの追加 84 if (state==4) { 85 in_game=false; 86 } 87 else if(state==1) { 88 gp=new GamePanel(this); 89 add(gp); 90 } 91 else if(state==2) { 92 gcp=new GameClearPanel(this); 93 add(gcp); 94 } 95 else if(state==3){ 96 gop=new GameOverPanel(this); 97 add(gop); 98 } 99 validate(); 100 old_state=state; 101 } 102} 103} 104 105public class StartPanel extends JPanel implements ActionListener{ 106 boolean in_game=true; 107 MainPanel mp; 108 JButton bt; 109 110 public StartPanel(MainPanel mp1) { 111 112 mp=mp1; 113 setLayout(null); 114 setBackground(Color.white); 115 Font f=new Font("SansSerif",Font.BOLD,20); 116 FontMetrics fm=getFontMetrics(f); 117 String str="遊び方"; 118 int w=fm.stringWidth(str)+50; 119 int h=fm.getHeight()+20; 120 bt=new JButton(str); 121 bt.setFont(f); 122 bt.addActionListener(this); 123 bt.setSize(w,h); 124 bt.setLocation(250-w/2,400); 125 add(bt); 126 addKeyListener(new Key()); 127 setFocusable(true); 128 129 130 131 } 132 133 public void paint(Graphics g) { 134 super.paint(g); 135 FontMetrics fm; 136 Font f; 137 String str1,str="Game Title"; 138 int w,h; 139 140 f=new Font("Serif",Font.BOLD,25); 141 fm=g.getFontMetrics(f); 142 str1=str+"(Serif)"; 143 w=fm.stringWidth(str1); 144 h=fm.getHeight(); 145 g.setFont(f); 146 g.drawString(str1,250-w/2,h); 147 148 f=new Font("SansSerif",Font.BOLD,25); 149 fm=g.getFontMetrics(f); 150 str1=str+"(SansSerif)"; 151 w=fm.stringWidth(str1); 152 h=h+fm.getHeight()+10; 153 g.setFont(f); 154 g.drawString(str1,250-w/2,h); 155 156 157 f=new Font("Dialog",Font.BOLD,25); 158 fm=g.getFontMetrics(f); 159 str1=str+"(Dialog)"; 160 w=fm.stringWidth(str1); 161 h=h+fm.getHeight()+10; 162 g.setFont(f); 163 g.drawString(str1,250-w/2,h); 164 165 f=new Font("DialogInput",Font.BOLD,25); 166 fm=g.getFontMetrics(f); 167 str1=str+"(DialogInput)"; 168 w=fm.stringWidth(str1); 169 h=h+fm.getHeight()+10; 170 g.setFont(f); 171 g.drawString(str1,250-w/2,h); 172 173 f=new Font("Serif",Font.PLAIN,20); 174 fm=g.getFontMetrics(f); 175 str1="ゲーム開始: 「s」キー"; 176 w=fm.stringWidth(str1); 177 h=500-fm.getHeight()-10; 178 g.setFont(f); 179 g.drawString(str1,250-w/2,h-200); 180 requestFocusInWindow(); 181 182 183S 184 185 186 } 187 188 public void actionPerformed(ActionEvent e) { 189 if(e.getSource()==bt) { 190 System.out.println("遊び方"); 191 } 192 } 193 194 class Key extends KeyAdapter{ 195 public void KeyPressed(KeyEvent ke) { 196 if(ke.getKeyCode()==KeyEvent.VK_S) { 197 mp.state=1; 198 System.out.println("キーを取得"); 199 } 200 } 201 } 202 203}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/13 02:25
2021/02/13 02:35
2021/02/13 04:40