素人のウィルコム用Javaアプリ制作の記録です
このブログの目次

コード解説(メソッド、クラス編)

このブログではゲーム制作自体の解説よりHowto的な部分をまとめることを主旨としていますが、整理の意味も兼ねてまとめておきます。

関数
case 1内

drawTitle(g, font, largefont, title, high_score, clear);
//タイトル画面描画メソッド タイトル画面で表示するフォント、スプライト、ハイスコア
//タイトル画面変更制御のフラグ(クリア回数)を入力

case 2内

player.PlayerControl(FIRE_PRESSED &keyState);
//ボタン進行判定
player.spacehit();
//移動制限
GameisHit(ame, am, player, p, s, am_cl, p_cl, s.getAmest());
//当たり判定 プレイヤーとオブジェクトの座標を入力
player.inv_check();
//無敵継続処理
s.incProgress();
//進行増加
s.count_up();
//カウンタ増加

GameisHit以外はクラスメソッドとなっている。

drawGameBackground(g, bg);
//背景描画
drawGamePlayer(g, player, p, s.getFramecount());
//プレイヤー描画 Framecountはダメージ受けた時の点滅描画のために使用。
drawGameMoveObj(g, ame, am, s.getAmest());
//オブジェクト描画 オブジェクト座標とスプライト情報とオブジェクト生存状況を入力
drawGameUI(g, font, largefont, s.getScore(), player.getlife(), player.getGraze(), s, g1);
//UI描画 フォント情報とスコア、ライフ、かすり、進行状況、四角の情報を入力

画像の位置関係の問題があるので上に表示したいものを最後に描画

case 3内

drawGameOver(g, font, gover, s.getScore());
//画面描画メソッド ゲームオーバー画面で表示するフォント、スプライト情報、スコア

case 4内

drawClearStage(g, font, s.getScore(), player.getlife(), bg);
//画面描画メソッド クリア画面で表示するフォント、スコア、ライフ、背景

case 5内

Instraction(g, font);
//draw抜けてるけど描画メソッド フォント情報

TeruTeruCanvas.java内Object_Ameクラス

	//雨粒オブジェクトクラス
	class Object_Ame {
		//雨粒初期位置
		private int x;
		private int y;
		//雨粒画像サイズ 現状は直入力
		private int ame_width;
		private int ame_height;
		//雨粒移動距離
		private int dy;
		//画面内生存判定
		private boolean suv;
		
		private int rnd;
		
		//コンストラクタ
		Object_Ame(){
			Set();
			this.ame_width = 32;
			this.ame_height = 5;
			this.dy = 5;
			this.suv = true;
		}
		
		int getX(){return x;}
		int getY(){return y;}
		int getWidth(){return ame_width;}
		int getHeight(){return ame_height;}
		boolean getState(){return suv;}
		
		//xy軸決定
		void Set(){
			setX(randX());
			setY(randY());
		}
		void setX(int setx){
			x = setx;
		}
		void setY(int sety){
			y = sety;
		}
		
		//ランダム生成
		int randX(){
			int field_width = display_width/10;
			rnd = random.nextInt(display_width) - field_width - ame_width*2;
			if(rnd < 0) randX();
			return rnd;
		}
		int randY(){
			int field_height = display_height;
			rnd = (random.nextInt(display_height) - field_height) + 50;
			//if(rnd < 0) randY();
			return rnd;
		}
		
		//dy方向移動
		void MoveAme(){
			y += dy;
		}
		
		//死亡判定
		void deadState(){
			suv = false;
		}
	}

落ちてくるオブジェクトの座標の生成、移動、生存の情報を持っているクラス。オブジェクトを生成するとランダムで座標を決定します。

TeruTeruCanvas.java内Object_Playerクラス

    class Object_Player {
		private int life;
		private int p_width; //プレイヤースプライトサイズ
		//プレイヤー初期位置
		private int x;
		private int y;
		//移動速度
		private int dir; //移動方向
		private int dx; //通常移動速度
		//無敵時間
		private int inv; //無敵時間
		private int inv_f; //無敵経過時間
		//接近フラグ
		private boolean close;
		//点滅管理用
		private int visflag;
		
		Object_Player(){
			this.life = 4;
			this.p_width = 40;
			this.x = 0;
			this.y = display_height * 4/ 5;
			this.dir = 0; //移動方向
			this.dx = 4; //通常移動速度
			this.inv = 25; //無敵時間
			this.inv_f = 0; //無敵経過時間
			this.visflag = 0;
			this.close = false;
		}
		int getX(){return x;}
		int getY(){return y;}
		int getdir(){return dir;}
		int getinv(){return inv;}
		int getinv_f(){return inv_f;}
		int getlife(){return life;}
		int getvisflag(){return visflag;}
		boolean getclose(){return close;}
		
		void PlayerControl(int key){
			//ボタン進行判定
			if (key != 0){
				setdir(1);
			}else if(getX() > 0){
				setdir(-1);
			}else{
				setdir(0);
			}
			PlayerMove();
		}
		
		void PlayerMove(){
			x += dx * dir;
		}
		
		void setdir(int setDir){
			dir = setDir;
		}
		void setinv_f(int sett){
			inv_f = sett;
		}
		
		void inv_check(){
			if(inv_f >= inv){
				setinv_f(0);
			}else if(isinv()){
				inv_f++;
			}
		}
		boolean isinv(){
			if(inv_f >= 1 & inv_f < inv){
				return true;
			}
			return false;
		}
		
		void lifedown(){
			life--;
		}
		
		int switchvisflag(){
			if(visflag == 0){
				visflag = 1;
			}else if(visflag == 1){
				visflag = 0;
			}
			return visflag;
		}
		
		void setclose(boolean st){
			close = st;
		}
		
		void spacehit(){
			int field_width = display_width/10;
			if(x < 0) x = 0;
			if(x > display_width - p_width - field_width) x = display_width - p_width - field_width;
		}
	}

プレイヤーに関する情報と制御を行うクラス。inv_checkとisinvの役割がかぶってる気がしますが、inv_checkはインクリメントしてるのでコード中1回はこっちを呼び出すんだと思う()多分もっとうまくやれる

TeruTeruCanvas.java内Stageクラス

	class Stage {
		private int stagesize; //ステージ長さ
		private int progress; //進行状況
		private int score; //スコア
		//画面内の雨粒数
		private int ame_st;
		private int ame_max;
		private int framecount; //フレームカウント
		
		Stage(){
			this.stagesize = 1000; //ステージ長さ
			this.progress = 0; //進行状況
			this.score = 0; //スコア
			//画面内の雨粒数
			this.ame_st = 7;
			this.ame_max = 7;
			this.framecount = 0;
		}
		int getProgress(){return progress;}
		int getStage(){return stagesize;}
		int getScore(){return score;}
		int getAmest(){return ame_st;}
		int getAmemax(){return ame_max;}
		int getFramecount(){return framecount;}
		//進行増加
		void incProgress(){
			progress++;
		}
		//ステージスコア増加
		void incScore(){
			score++;
		}
		//ステージ終了判定用メソッド
		boolean StageEnd(){
			if(progress > stagesize){
				return true;
			}
			return false;
		}
		//現在のフレーム総数
		void count_up(){
			framecount++;
		}
	}

ステージ制御。progressに現在地、stagesizeでステージの長さ

TeruTeruCanvas.java内Sqerクラス

	class Sqer {
		private int x;
		private int y;
		private int w;
		private int h;
		
		Sqer(int sq_x, int sq_y, int sq_w, int sq_h){
			this.x = sq_x;
			this.y = sq_y;
			this.w = sq_w;
			this.h = sq_h;
		}
		
		int getX(){return x;}
		int getY(){return y;}
		int getW(){return w;}
		int getH(){return h;}
		int getCX(){
			return (x+w)/2;
		}
		int getCY(){
			return (y+h)/2;
		}
	}

当たり判定とかで四角形の座標をまとめて扱うためのクラス。中点を返したりできます。