「最終課題」の編集履歴(バックアップ)一覧に戻る
最終課題」を以下のとおり復元します。
■名前,学籍番号,ログイン名
・内山 翔平, 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種うまく作れた点。

・うまくいかなかったと思う点
育成ゲームとインベーダーゲームをつなげることができなかった点。
育成ゲームをグラフィカルに仕上げられなかった。

■まとめ
・インベーダーゲームに関して
はじめて自分達で作るということもあり、どのような構造にしたら良いかわからずサイト頼りになってしまったのが少し残念だった。自分達でプログラムの構造をゼロから作り上げることができたらよかった。でもちゃんと動くものができたし、キャラクター別能力やスコア表示などのオリジナリティを発揮できた部分もあるので全体的には良かったと思う。

復元してよろしいですか?