■名前,学籍番号,ログイン名
- 内山 翔平, 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クラス
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クラス
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メソッドは左右にしか動かないプレイヤーを動かすメソッドで、左(右)ボタンが押されたらスピードがマイナス(プラス)になるという感じでプレイヤーを動かす。
プレイヤーが画面から外れないように右(左)端に来たら右(左)ボタンを押してもそれ以上動かないようにした。
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);
インベーダーのビームとプレイヤーが重なったら衝突するということにする。
プレイヤーとビームの衝突を判定するメソッドである。
public void draw(Graphics g){
g.drawImage(image, x, y, null);
}
プレイヤーを写すメソッドである。
public Point getPos(){
return new Point(x, y);
}
プレイヤーの位置を返すメソッドである。
public int getImageWidth(){
return image_width;
}
プレイヤーの横幅を返すメソッドである。
public int getImageHeight(){
return image_height;
}
プレイヤーの縦幅を返すメソッドである。
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クラスと同じメソッドは省く
public void die(){
setPos(TOMB.x, TOMB.y);
isAlive = false;
}
プレーヤーのショットに当たり、インベーダーが死んだら墓へ移動する。
public void setPos(int x, int y){
this.x = x;
this.y = y;
}
インベーダーの位置をxy座標の(x,y)に設置する。
public boolean isAlive(){
return isAlive;
}
インベーダーが生きているとそれを返すメソッド。
■うまくいったと思う点とうまくいかなかったと思う点
インベーダーゲーム内で、プレーヤーの能力を4種うまく作れた点。
育成ゲームとインベーダーゲームをつなげることができなかった点。
育成ゲームをグラフィカルに仕上げられなかった。
■まとめ
はじめて自分達で作るということもあり、どのような構造にしたら良いかわからずサイト頼りになってしまったのが少し残念だった。自分達でプログラムの構造をゼロから作り上げることができたらよかった。でもちゃんと動くものができたし、キャラクター別能力やスコア表示などのオリジナリティを発揮できた部分もあるので全体的には良かったと思う。
最終更新:2007年01月30日 14:02