クラスを作ってみよう


package{ 
	import 使う.クラスは.ここで.インポート
	public class クラス名{
		public var 変数名 : 型
		public var 変数名 : 型
		public function クラス名と同じ名前の関数(){ 
			newすると最初にここが実行される。 
		}
		//値を返さない関数 
		public function 関数名( 引数 : 型 ):Void{
			ここに関数処理 
		} 
		//値を返す関数 
		public function 関数名( 引数 : 型 ) : 帰る値の型{ 
			ここに関数処理 
			return 値 
		} 
	}
}

まず上から意味をざっと説明すると。

  • 一番外側は package { } で囲む。意味はまだわからなくてOK。そういうもんだと思って。
  • 次に使うクラスをインポート。クラス内でMovieClip使うなら、flash.display.MovieClip みたいに指定してインポ
  • クラス宣言。 public class クラス名 {} で囲む。public とかはまだ意味わからなくてOK。
  • 変数宣言。頭にpublicつけるのと型指定を忘れずに。public の意味は、今は気にしないでOK。
  • クラス名と同じ名前の関数。newで作成するとまずコレが呼ばれます。初期化処理はココ。専門用語でコンストラクタ。
  • 関数。頭に public 、引数にもちゃんと型指定、戻り値があるなら最後に戻り値の型、なければvoid をつける。

OOPってなんだっけをまずちょっと復習。


オブジェクト指向は、関連する機能と値を1つにまとめてクラスというものにする。
そんだけ。それ以上でもそれ以下でもない。

考え方的には、関連する絵とアニメーションとフレームスクリプトをまとめて、ライブラリにシンボルとして登録するのとあまり変わらない。

例題:ゲームスコア計算用クラスの作成


たとえば、ゲームで使うスコア計算用のクラスとかを作ってみよう。
つまり、スコア計算に関連する関数、プロパティをまとめあげて1つにするってことね。
一度作ったら、一生使いまわせるつもりで考える。
仕様的にはとりあえず。

  • スコアの記録、保存
  • ハイスコアの記録
  • カンスト(スコア上限値)設定
  • 表示用に0000300みたいなテキストを出力可能

こんな感じでいってみよう。

まず仕様から、変数と関数を決める

  • 変数
    • 現在のスコア
    • ハイスコア
    • スコアの上限値
  • 関数
    • 現在のスコアをセット
    • 現在のスコアをゲット
    • ハイスコアをゲット
    • テキストとして出力

こんな感じかな。

実際にクラスを書いてみる


package {
	public class Score {
		//protected変数は、クラスの外からアクセスできません(内部処理用)。 
		protected var _score:Number = 0;//スコア 
		protected var _highScore:Number = 0;//ハイスコア 
		protected var _maxScore:Number = 99999;//上限
		//初期化
		public function Score(maxScore:Number) {
			_maxScore = maxScore;
		}
		//スコア取得
		public function getScore():Number {
			return _score;
		}
		//ハイスコア取得
		public function getHighScore():Number {
			return _highScore;
		}
		//スコア設定
		public function setScore(value:Number):void {
			これから書きます!
		}
	}
}

ざっと大枠を書くと上記のようになる。
使うときは

var score : Score = new Score(99999)
score.setScore(3200)
score.setScore(155)

trace( score.getScore() )
trace( score.getHighSocre() )

みたいにして使う。
一度作ればこれでもうハイスコアやカウントストップの計算は一生書かなくて済むようになる。

OOPメンドクサって言う人もいるけど、こういう一生使うメンドイ処理はクラスにして、普通にオーサリングする部分はアンチOOPでダーティに書くとかそういう組み合わせもありだと思うよ。

まず気になるのは変数の宣言のところにある、protected

これなによ!?っていう感じだけど、protectedってのは、「クラスの外部からアクセスできませんよ!!」て意味。
myClass._score とかやってもエラーになる。
クラスの内部でつかう内部処理用の変数や関数には、protected って書いておくわけ。
よくでてくる public ってやつは、誰でも外からも中からもアクセスできる関数・変数。 でスコアの定義や取得は、関数getScore, setScore を使ってやらせる。
なんで変数を直接いじっちゃダメなの!?っていう疑問があるけど、それは

  • ハイスコア直接いじられると困る。
  • スコアセットしたら、自動でハイスコア計算させたい。

そんな理由からです。
OOPでは、「やっちゃいけないことはできなくする」という原則があるので、ハイスコア勝手に操作できないように、highScoreって変数も作らないし、setHighScoreもないわけです。

「やっちゃいけないことはできなくする」ってことは、使うときに致命的なミスをしないですむって利点があるの。

本命の関数 setScore を書いてみる。


public function setScore(value:Number):void {
	if (value > _maxScore) {
		value = _maxScore;
	}
	_score = value;
	if (_score > _highScore) {
		_highScore = _score;
	}
}

こんな感じ、超楽チン。
スコアのセットは、setScoreしか手段がないから、かならずスコア更新、上限チェック、ハイスコアチェックはセットで行われるですよ。
変数がprotectedだから、スコアだけ更新とかハイスコアハックとかはできないのです。
バグよさらば。これがOOPのちょっといいところ。

桁揃え表示用関数を追加


で、一応00003000みたいのも表示できるようにする。

//スコアを文字化 
public function getText(keta:Number):String { 
	var str:String = "";
	//桁数だけ0をくっつける。 
	//たとえば5桁なら00000 
	for(var i:Number = 0; i<keta; i++){ 
		str += "0";
	} 
	str = str + _score; //スコアを足す。000003450とかになる。 
	//後ろから桁数分だけ切り抜く0000「03450」 
	str = str.substr(str.length - keta, keta); 
	return str;
}

こんな感じ。
とりあえず、ハイスコアも文字化したいとか、桁数は指定するより、最大値から自動で計算するほうが楽じゃね?
とか改良の余地はあるけど、とりあえず完成!!
最終更新:2007年05月23日 14:38