前提・実現したいこと
以前自作したjavaappletをアプリケーションで動くように変更したいと考えているのですがUIの配置はできているのですが画像の移動の処理やリスナー処理がうまくできていません。コンパイルはできますが理想とする動きをしないです。目標は実行時、敵と自分が表示されている。スターとボタンを押すことでゲームが開始し自分・敵・球が任意で動かすことです。現状は実行時自分と敵が表示されない。スタートボタンを押しても何も起きなく困っています。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
import javax.swing.*; import java.awt.*; import java.awt.event.*; /* <applet code="MyGame.class" width = 400 height=400> </applet> */ //MyGameでピクチャを移動 public class MyGame extends JApplet{ public static void main(final String[] args) { final JFrame frame = new JFrame("game"); final MyGame k = new MyGame(); frame.add("Center", k); frame.pack(); frame.setSize(450, 450); frame.setVisible(true); k.init(); k.start(); } JButton left,right,start,ban; //meがcp,youがplayer Image me = null, you = null, mebl = null, youbl = null; int mv = 10, mex, mey, youx, youy, vme, vyou, bl1x, bl1y, bl1v, bl2x, bl2y, bl2v; int mezanki, youzanki, nowbullet, score; int pm = 2,py = 2,pn = 10,ps = 0; boolean gamest = false, moveleft = false, moveright = false, shot = false; public void init() { //画像の座標 mex = 250; mey = 0; youx = 0; youy = 245;//全体が写るように //弾丸の初期位置 bl1v = 0; bl1x = -10; bl1y = -10; bl2v = 0; bl2x = -10; bl2y = -10; //ゲーム設定 mezanki = pm; youzanki = py; nowbullet = pn; score = ps; //オブジェクトの速度 vme = 100; //画面レイアウトクリア setLayout(null); //キーリスナーの設定 final MyKeyListener kl = new MyKeyListener(); addKeyListener(kl); //アクションリスナーの設定 final MyActionListener al = new MyActionListener(); //ボタンの表示 left = new JButton("←"); left.addActionListener(al); left.setBounds(0,350,60,30); add(left); right = new JButton("→"); right.addActionListener(al); right.setBounds(180,350,60,30); add(right); start = new JButton("START"); start.addActionListener(al); start.setBounds(260,350,80,30); add(start); ban = new JButton("発"); ban.addActionListener(al); ban.setBounds(350,340,50,50); add(ban); //パネルに表示 final MyPanel pn = new MyPanel(); pn.setBackground(Color.BLACK); add(pn); pn.setBounds(0,0,400,297); me = getImage(getDocumentBase(), "me.png"); you = getImage(getDocumentBase(), "you.png"); mebl = getImage(getDocumentBase(),"tama2.jpg"); youbl = getImage(getDocumentBase(),"tama1.jpg"); final MyPicture m = new MyPicture(mex, mey, 'm'); m.start(); final MyPicture n = new MyPicture(bl1x, bl1y, 'n'); n.start(); final MyPicture y = new MyPicture(youx, youy, 'y'); y.start(); final MyPicture q = new MyPicture(bl2x,bl2y,'q'); q.start(); setFocusable(true); }//init // パネルクラスの継承 class MyPanel extends JPanel { // 画像表示 public void paintComponent(final Graphics g) { super.paintComponent(g); g.drawImage(you, youx, youy,this); g.drawImage(me, mex, mey, this); g.drawImage(mebl, bl1x, bl1y, this); g.drawImage(youbl, bl2x, bl2y, this); g.setColor(Color.yellow); g.drawString("残弾数:" + nowbullet + ",スコア:" + score, 250, 295); g.drawString("敵残機:" + mezanki + ",プレイヤー残機:" + youzanki, 250, 275); } }//MyPane //キーリスナークラスの継承 public class MyKeyListener extends KeyAdapter { //キープレス public void keyPressed(final KeyEvent ke) { // 矢印キー"→"をpush if (ke.getKeyCode() == KeyEvent.VK_RIGHT) { moveright = true; } // 矢印キー"←"をpush if (ke.getKeyCode() == KeyEvent.VK_LEFT) { moveleft = true; } //スペースキーをpush if(ke.getKeyCode() == KeyEvent.VK_SPACE){ shot = true; } //エンターキーをpush if(gamest == false){ if(ke.getKeyCode() == KeyEvent.VK_ENTER){ gamest = true; //初期値 mezanki = pm; youzanki = py; nowbullet = pn; score = ps; } } } // キーリリースごとのアクションを設定 public void keyReleased(final KeyEvent ke) { // 矢印キー"→"を if (ke.getKeyCode() == KeyEvent.VK_RIGHT) { moveright = false; } // 矢印キー"←"を else if (ke.getKeyCode() == KeyEvent.VK_LEFT) { moveleft = false; } //スペースキーをpush else if (ke.getKeyCode() == KeyEvent.VK_SPACE) { shot = false; } }// キーリリースアクション }//KeyListener //アクションリスナークラスの継承 public class MyActionListener implements ActionListener{ public void actionPerformed(final ActionEvent e){ if(e.getSource() == left){ if(youx >0)youx -= mv; } if(e.getSource() == right){ if(youx < 365)youx += mv; } if(e.getSource() == ban){ shot = true; } if(gamest == false){ if(e.getSource() == start){ gamest = true; //初期値 mezanki = pm; youzanki = py; nowbullet = pn; score = ps; } } else{ } requestFocus(); } }//ActionListener // スレッドクラスの継承 public class MyPicture extends Thread { // 座標 int picx = 0, picy = 0; // オブジェクト名 char myname; // 方向 boolean picv = true, pich = true; // コンストラクタ 座標初期値とオブジェクト名を設定 public MyPicture(final int x, final int y, final char z) { picx = x; picy = y; myname = z; } // 画像の(移動)runメソッド public void run() { int timer =0; try { while (true) { if(gamest == true){//if sleep(vme); if (myname == 'm') {//m // 水平移動 して壁に当たったら反転 if ( pich ) { picx += mv; } else { picx -= mv; } if ( picx > 360 ) {//全体が写るように pich = !pich; } if ( picx < 0 ) { pich = !pich; } // オブジェクトごとに画像座標設定 if (myname == 'm') { mex = picx; mey = picy; } }//m if (myname == 'n'){//n timer++; //弾丸発射10カウントごと if(timer % 10 == 0){ bl1v = 5;//弾丸の速度 if(bl1x < 0){ bl1x = mex + 13; } } //弾丸の移動 if(bl1v != 0){ bl1y += 20; // 弾丸の落下速度 // 弾が画面下に到達したら弾未発射に戻す if (bl1y >= 250) { // 着弾判定 if ((bl1x >= youx) && (bl1x <= youx + 28)) { //スコアの変動 //score -= 5; youzanki--; } bl1v = 0; bl1x = -10; bl1y = -10; if(youzanki == 0){ gamest = false; } } } }//n if(myname == 'y'){//y //左移動 if(moveleft == true){ if(youx >0){//稼働領域左端限界値 youx -= mv; } } //右移動 if(moveright == true){ if(youx < 365){//稼働領域右端限界値 youx += mv; } } }//y if(myname == 'q'){//q //弾丸発射 if(shot == true && bl2x < 0 && nowbullet > 0){ bl2v = 5; nowbullet --; score-= 2; bl2x = youx + 13; bl2y = youy; shot = false; } //弾丸の移動 if(bl2v != 0){ bl2y -= 20;//弾丸の上昇速度 // 弾が画面上に到達したら弾未発射に戻す if (bl2y < -10) { // 着弾判定 if ((bl2x >= mex) && (bl2x <= mex + 28)) { //スコアの変動 score += 20; mezanki--; } bl2v = 0; bl2x = -10; bl2y = -10; if(mezanki == 0 ||nowbullet == 0 && bl2x < 0){gamest = false;} } } }//q }//if else{ //画像の座標 mex = 250; mey = 0; youx = 0; youy = 245; bl1v = 0; bl1x = -10; bl1y = -10; bl2v = 0; bl2x = -10; bl2y = -10; } repaint(); }//while }//try catch(final InterruptedException e) {} }//run }//画面移動クラス }//mygame
試したこと
JAppletをJPanelに変更して実行するも変化なしでした。
またネット上で見つかる記事をやれるだけ試しましたがうまくいきませんでした。
回答1件
あなたの回答
tips
プレビュー