「最終課題」の編集履歴(バックアップ)一覧はこちら

最終課題」(2007/01/30 (火) 14:02:07) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

■名前,学籍番号,ログイン名 ・内山 翔平, 70641513, t06151su ・福田 智, 70607757, s06775tf ・飯塚 裕貴, 70600692, s06069yi ■ミニプロジェクトのタイトル インベーダーを*やっつけろ!! ■ミニプロジェクトの概要(グループでやったこと) 育成ゲーム+インベーダーゲーム。 育成したキャラでインベーダーゲームが楽しめる。 ページの下に添付ファイルがあります。GK.lzh,SS.lzh,SS3.lzh,SS4.lzhは各キャラクターのインベーダーゲームのファイルです。 ■自分の担当した部分の説明(必要に応じてプログラムや画像を貼付する) ・内山→インベーダーゲーム インベーダーゲームは、http://javagame.main.jp(Javaでゲーム作りますが何か?)のページを参考にしました。構造はほとんどここと同じように作りました。 【構造】 InvaderGame←MainPanel←Enemy,EnemyBeam,Player,PlayerBeam ScorePanel→InvaderGame,MainPanel スコアを表示させるのに少し苦労しました。 各クラスは以下のメソッドで構成されています。 ●Enemyクラス ・moveメソッド ・collideWithメソッド ・dieメソッド ・getImageWidthメソッド ・getImageHeightメソッド ・getPosメソッド ・setPosメソッド ・isAliveメソッド ・drawメソッド ●EnemeBeamクラス ・moveメソッド ・getPosメソッド ・setPosメソッド ・getImageWidthメソッド ・getImageHeightメソッド ・storeメソッド ・isInStorageメソッド ・drawメソッド ●Playerクラス ・moveメソッド ・collideWithメソッド ・drawメソッド ・getPosメソッド ・getImageWidthメソッド ・getImageHeightメソッド ●PlayerBeamクラス ・moveメソッド ・getPosメソッド ・setPosメソッド ・getImageWidthメソッド ・getImageHeightメソッド ・storeメソッド ・isInStorageメソッド ・drawメソッド EnemyクラスはPlayerクラスと、EnemyBeamクラスはPlayerBeamクラスと ほとんど同じです。 ●InvaderGameクラス(実行するファイル) ScorePanelをNorthに、MainPanelをCENTERに配置する。 setTitleでウインドウ左上に表示する文字を設定、 setResizable(false)でサイズが変更できないように設定。 public InvaderGame() { setTitle("インベーダーゲーム"); setResizable(false); ScorePanel scorePanel = new ScorePanel(); MainPanel panel = new MainPanel(scorePanel); Container contentPane = getContentPane(); contentPane.add(scorePanel, BorderLayout.NORTH); contentPane.add(panel, BorderLayout.CENTER); pack(); } ●MainPanelクラス コンストラクタメソッドは主にinitGameメソッドとスレッドで構成されている。 private Thread gameLoop; ~~~ public MainPanel(ScorePanel scorePanel) { setPreferredSize(new Dimension(WIDTH, HEIGHT)); setFocusable(true); this.scorePanel = scorePanel; initGame(); random = new Random(); fireSound = Applet.newAudioClip(getClass().getResource("se/du.wav")); crySound = Applet.newAudioClip(getClass().getResource("se/gya2.wav")); bombSound = Applet.newAudioClip(getClass().getResource("se/gya.wav")); addKeyListener(this); gameLoop = new Thread(this); gameLoop.start(); } initGameメソッドはゲームの初期化を行うメソッドで、Enemyクラス/EnemyBeamクラス/ Playerクラス/PlayerBeamクラスのコンストラクタをインスタンス化し、 敵とプレイヤーを表示、敵弾と自弾を見えない場所に表示する。 private void initGame() { enemies = new Enemy[NUM_ENEMY]; for(int i = 0; i < NUM_ENEMY; i++) { enemies[i] = new Enemy(20 + (i % 10) * 40, 20 + (i / 10) * 40, 3, this); } player = new Player(0, HEIGHT - 20, this); playerbeams = new PlayerBeam[NUM_PLAYERBEAM]; for (int i = 0; i < NUM_PLAYERBEAM; i++) { playerbeams[i] = new PlayerBeam(this); } enemybeams = new EnemyBeam[NUM_ENEMYBEAM]; for (int i = 0; i < NUM_ENEMYBEAM; i++) { enemybeams[i] = new EnemyBeam(this); } } gameLoopスレッドの処理は次のようになっている。この中にあるmoveメソッド/ tryToFireメソッド/enemyAttackメソッド/collisionDetectionメソッドはMainPanel内で 後に記述してあるメソッド。各メソッドはEnemy/EnemyBeam/Player/PlayerBeamメソッド public void run() { while(true) { move(); if(firePressed) { tryToFire(); } enemyAttack(); collisionDetection(); repaint(); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } } ●ScorePanelクラス ・upScoreメソッド public void upScore(int d) { score += d; repaint(); } このupScoreメソッドをMainPanelクラスのcollisionDetectionメソッド内に配置する。 敵に自弾が当たったと判定されたときにupScoreメソッドが発動するようにする。 private void collisionDetection() { for (int i = 0; i < NUM_ENEMY; i++) { for (int j = 0; j < NUM_PLAYERBEAM; j++) { if (enemies[i].collideWith(playerbeams[j])) { enemies[i].die(); crySound.play(); scorePanel.upScore(KILL_ENEMY); break; } } } ・福田→インベーダーゲーム, 音声, 画像 ●Playerクラス ・moveメソッド public void move(int direction){ if (direction == LEFT) { x -= SPEED; } else if (direction == RIGHT) { x += SPEED; } if (x < 0) { x = 0; } if (x > MainPanel.WIDTH - image_width) { x = MainPanel.WIDTH - image_width; } } moveメソッドは左右にしか動かないプレイヤーを動かすメソッドで、左(右)ボタンが押されたらスピードがマイナス(プラス)になるという感じでプレイヤーを動かす。 プレイヤーが画面から外れないように右(左)端に来たら右(左)ボタンを押してもそれ以上動かないようにした。 ・collideWithメソッド public boolean collideWith(EnemyBeam enemybeam){ Rectangle rectPlayer = new Rectangle(x, y, image_width, image_height); Point pos = enemybeam.getPos(); Rectangle rectBeam = new Rectangle(pos.x, pos.y, enemybeam.getImageWidth(), enemybeam.getImageHeight()); return rectPlayer.intersects(rectBeam); インベーダーのビームとプレイヤーが重なったら衝突するということにする。 プレイヤーとビームの衝突を判定するメソッドである。 ・drawメソッド public void draw(Graphics g){ g.drawImage(image, x, y, null); } プレイヤーを写すメソッドである。 ・getPosメソッド public Point getPos(){ return new Point(x, y); } プレイヤーの位置を返すメソッドである。 ・getImageWidthメソッド public int getImageWidth(){ return image_width; } プレイヤーの横幅を返すメソッドである。 ・getImageHeightメソッド public int getImageHeight(){ return image_height; } プレイヤーの縦幅を返すメソッドである。 ・loadImageメソッド private void loadImage(){ ImageIcon icon = new ImageIcon(getClass().getResource("image/player.gif")); image = icon.getImage(); image_width = image.getWidth(panel); image_height = image.getHeight(panel); } プレイヤーの画像を写すメソッドである。 ●Enemyクラス Playerクラスと同じメソッドは省く ・dieメソッド public void die(){ setPos(TOMB.x, TOMB.y); isAlive = false; } プレーヤーのショットに当たり、インベーダーが死んだら墓へ移動する。 ・setPosメソッド public void setPos(int x, int y){ this.x = x; this.y = y; } インベーダーの位置をxy座標の(x,y)に設置する。 ・isAliveメソッド public boolean isAlive(){ return isAlive; } インベーダーが生きているとそれを返すメソッド。 ・飯塚→育成ゲーム ■うまくいったと思う点とうまくいかなかったと思う点 ・うまくいったと思う点 インベーダーゲーム内で、プレーヤーの能力を4種うまく作れた点。 ・うまくいかなかったと思う点 育成ゲームとインベーダーゲームをつなげることができなかった点。 育成ゲームをグラフィカルに仕上げられなかった。 ■まとめ ・インベーダーゲームに関して はじめて自分達で作るということもあり、どのような構造にしたら良いかわからずサイト頼りになってしまったのが少し残念だった。自分達でプログラムの構造をゼロから作り上げることができたらよかった。でもちゃんと動くものができたし、キャラクター別能力やスコア表示などのオリジナリティを発揮できた部分もあるので全体的には良かったと思う。
■名前,学籍番号,ログイン名 ・内山 翔平, 70641513, t06151su ・福田 智, 70607757, s06775tf ・飯塚 裕貴, 70600692, s06069yi ■ミニプロジェクトのタイトル インベーダーをやっつけろおおおお!! ■ミニプロジェクトの概要(グループでやったこと) 育成ゲーム+インベーダーゲーム。 育成したキャラでインベーダーゲームが楽しめる。 ページの下に添付ファイルがあります。GK.lzh,SS.lzh,SS3.lzh,SS4.lzhは各キャラクターのインベーダーゲームのファイルです。 ■自分の担当した部分の説明(必要に応じてプログラムや画像を貼付する) ・内山→インベーダーゲーム インベーダーゲームは、http://javagame.main.jp(Javaでゲーム作りますが何か?)のページを参考にしました。構造はほとんどここと同じように作りました。 【構造】 InvaderGame←MainPanel←Enemy,EnemyBeam,Player,PlayerBeam ScorePanel→InvaderGame,MainPanel スコアを表示させるのに少し苦労しました。 各クラスは以下のメソッドで構成されています。 ●Enemyクラス ・moveメソッド ・collideWithメソッド ・dieメソッド ・getImageWidthメソッド ・getImageHeightメソッド ・getPosメソッド ・setPosメソッド ・isAliveメソッド ・drawメソッド ●EnemeBeamクラス ・moveメソッド ・getPosメソッド ・setPosメソッド ・getImageWidthメソッド ・getImageHeightメソッド ・storeメソッド ・isInStorageメソッド ・drawメソッド ●Playerクラス ・moveメソッド ・collideWithメソッド ・drawメソッド ・getPosメソッド ・getImageWidthメソッド ・getImageHeightメソッド ●PlayerBeamクラス ・moveメソッド ・getPosメソッド ・setPosメソッド ・getImageWidthメソッド ・getImageHeightメソッド ・storeメソッド ・isInStorageメソッド ・drawメソッド EnemyクラスはPlayerクラスと、EnemyBeamクラスはPlayerBeamクラスと ほとんど同じです。 ●InvaderGameクラス(実行するファイル) ScorePanelをNorthに、MainPanelをCENTERに配置する。 setTitleでウインドウ左上に表示する文字を設定、 setResizable(false)でサイズが変更できないように設定。 public InvaderGame() { setTitle("インベーダーゲーム"); setResizable(false); ScorePanel scorePanel = new ScorePanel(); MainPanel panel = new MainPanel(scorePanel); Container contentPane = getContentPane(); contentPane.add(scorePanel, BorderLayout.NORTH); contentPane.add(panel, BorderLayout.CENTER); pack(); } ●MainPanelクラス コンストラクタメソッドは主にinitGameメソッドとスレッドで構成されている。 private Thread gameLoop; ~~~ public MainPanel(ScorePanel scorePanel) { setPreferredSize(new Dimension(WIDTH, HEIGHT)); setFocusable(true); this.scorePanel = scorePanel; initGame(); random = new Random(); fireSound = Applet.newAudioClip(getClass().getResource("se/du.wav")); crySound = Applet.newAudioClip(getClass().getResource("se/gya2.wav")); bombSound = Applet.newAudioClip(getClass().getResource("se/gya.wav")); addKeyListener(this); gameLoop = new Thread(this); gameLoop.start(); } initGameメソッドはゲームの初期化を行うメソッドで、Enemyクラス/EnemyBeamクラス/ Playerクラス/PlayerBeamクラスのコンストラクタをインスタンス化し、 敵とプレイヤーを表示、敵弾と自弾を見えない場所に表示する。 private void initGame() { enemies = new Enemy[NUM_ENEMY]; for(int i = 0; i < NUM_ENEMY; i++) { enemies[i] = new Enemy(20 + (i % 10) * 40, 20 + (i / 10) * 40, 3, this); } player = new Player(0, HEIGHT - 20, this); playerbeams = new PlayerBeam[NUM_PLAYERBEAM]; for (int i = 0; i < NUM_PLAYERBEAM; i++) { playerbeams[i] = new PlayerBeam(this); } enemybeams = new EnemyBeam[NUM_ENEMYBEAM]; for (int i = 0; i < NUM_ENEMYBEAM; i++) { enemybeams[i] = new EnemyBeam(this); } } gameLoopスレッドの処理は次のようになっている。この中にあるmoveメソッド/ tryToFireメソッド/enemyAttackメソッド/collisionDetectionメソッドはMainPanel内で 後に記述してあるメソッド。各メソッドはEnemy/EnemyBeam/Player/PlayerBeamメソッド public void run() { while(true) { move(); if(firePressed) { tryToFire(); } enemyAttack(); collisionDetection(); repaint(); try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } } ●ScorePanelクラス ・upScoreメソッド public void upScore(int d) { score += d; repaint(); } このupScoreメソッドをMainPanelクラスのcollisionDetectionメソッド内に配置する。 敵に自弾が当たったと判定されたときにupScoreメソッドが発動するようにする。 private void collisionDetection() { for (int i = 0; i < NUM_ENEMY; i++) { for (int j = 0; j < NUM_PLAYERBEAM; j++) { if (enemies[i].collideWith(playerbeams[j])) { enemies[i].die(); crySound.play(); scorePanel.upScore(KILL_ENEMY); break; } } } ・福田→インベーダーゲーム, 音声, 画像 ●Playerクラス ・moveメソッド public void move(int direction){ if (direction == LEFT) { x -= SPEED; } else if (direction == RIGHT) { x += SPEED; } if (x < 0) { x = 0; } if (x > MainPanel.WIDTH - image_width) { x = MainPanel.WIDTH - image_width; } } moveメソッドは左右にしか動かないプレイヤーを動かすメソッドで、左(右)ボタンが押されたらスピードがマイナス(プラス)になるという感じでプレイヤーを動かす。 プレイヤーが画面から外れないように右(左)端に来たら右(左)ボタンを押してもそれ以上動かないようにした。 ・collideWithメソッド public boolean collideWith(EnemyBeam enemybeam){ Rectangle rectPlayer = new Rectangle(x, y, image_width, image_height); Point pos = enemybeam.getPos(); Rectangle rectBeam = new Rectangle(pos.x, pos.y, enemybeam.getImageWidth(), enemybeam.getImageHeight()); return rectPlayer.intersects(rectBeam); インベーダーのビームとプレイヤーが重なったら衝突するということにする。 プレイヤーとビームの衝突を判定するメソッドである。 ・drawメソッド public void draw(Graphics g){ g.drawImage(image, x, y, null); } プレイヤーを写すメソッドである。 ・getPosメソッド public Point getPos(){ return new Point(x, y); } プレイヤーの位置を返すメソッドである。 ・getImageWidthメソッド public int getImageWidth(){ return image_width; } プレイヤーの横幅を返すメソッドである。 ・getImageHeightメソッド public int getImageHeight(){ return image_height; } プレイヤーの縦幅を返すメソッドである。 ・loadImageメソッド private void loadImage(){ ImageIcon icon = new ImageIcon(getClass().getResource("image/player.gif")); image = icon.getImage(); image_width = image.getWidth(panel); image_height = image.getHeight(panel); } プレイヤーの画像を写すメソッドである。 ●Enemyクラス Playerクラスと同じメソッドは省く ・dieメソッド public void die(){ setPos(TOMB.x, TOMB.y); isAlive = false; } プレーヤーのショットに当たり、インベーダーが死んだら墓へ移動する。 ・setPosメソッド public void setPos(int x, int y){ this.x = x; this.y = y; } インベーダーの位置をxy座標の(x,y)に設置する。 ・isAliveメソッド public boolean isAlive(){ return isAlive; } インベーダーが生きているとそれを返すメソッド。 ・飯塚→育成ゲーム ■うまくいったと思う点とうまくいかなかったと思う点 ・うまくいったと思う点 インベーダーゲーム内で、プレーヤーの能力を4種うまく作れた点。 ・うまくいかなかったと思う点 育成ゲームとインベーダーゲームをつなげることができなかった点。 育成ゲームをグラフィカルに仕上げられなかった。 ■まとめ ・インベーダーゲームに関して はじめて自分達で作るということもあり、どのような構造にしたら良いかわからずサイト頼りになってしまったのが少し残念だった。自分達でプログラムの構造をゼロから作り上げることができたらよかった。でもちゃんと動くものができたし、キャラクター別能力やスコア表示などのオリジナリティを発揮できた部分もあるので全体的には良かったと思う。

表示オプション

横に並べて表示:
変化行の前後のみ表示: