var OperatedCharacterClass = function(ownerStage, args){
	OperatedCharacterClass.base.apply(this, arguments);
	
	//これらの値を（各キャラクターを示す）子クラスから上書きすることで個性を生み出せる
	this.movingVelocity = 200;
	this.jumpPower_tickCountBase = 15;
	this.jumpPower_tickCountAtLeast = 2;
	this.jumpPower_tickCount = 0;
	this.jumpPower = 110;
	this.jumpSound = createAudio("jump12.mp3");
	this.collisionMargin.top = 2;
	this.collisionMargin.left = 10;
	this.collisionMargin.right = 10;
	this.collisionMargin.bottom = 2;
	
	this.isGround = false;
	
}.extend(CharacterClass, {
	className: "OperatedCharacterClass",
	//ここにキャラの動きに対する制御をおこなう処理群(移動、攻撃など)を記述。
	//キャラごとに性質を変えたいのであればそれをthis.xxxインスタンス変数に記述し、拡張クラスでその値を上書きするべきである。
	//従ってこの子クラスからthis.movingSpeedなどをいじるのはふさわしくないと考える。
	
	// 通常左に進むときに呼ばれる。左キーを押している間中tick毎に呼ばれる
	goLeft : function(){
		this.imageState = 0;
		this.movingSpeed.x += ((-this.movingVelocity) - this.movingSpeed.x) / 3;
	},
	
	//通常右に進むときに呼ばれる。
	goRight : function(){
		this.imageState = 0;
		this.movingSpeed.x += (this.movingVelocity - this.movingSpeed.x) / 3;
	},
	
	//通常ジャンプするときに呼ばれる。ジャンプキーを押している間はずっと呼ばれる
	//ジャンプキーを押している時間の長さに応じてジャンプの高さが変化する。
	jump : function(){
		if(this.jumpPower_tickCount == 0 && (this.isGround || this.inWater)){
			//ジャンプの初期化
			this.jumpEnd = OperatedCharacterClass.prototype.jumpEnd;
			this.jumpPower_tickCount = this.jumpPower_tickCountBase;
		}
		if(this.jumpPower_tickCount > 0){
			if(this.jumpPower_tickCount == this.jumpPower_tickCountBase){
				this.jumpSound.load();
				this.jumpSound.play();
			}
			this.jumpPower_tickCount--;
			var p = (this.jumpPower_tickCount / this.jumpPower_tickCountBase);
			if(this.movingSpeed.y <= this.movingVelocity){
				this.movingSpeed.y += -this.jumpPower * p * p;
			}
		}
	},
	objectAttacked : function(obj, obj_x, obj_y, direction)
	{
		if(!obj.isPhantom)
		{
			if((direction & CollideBottom) != 0)
			{
				this.isGround = true;
			}
		}
	},
	jumpEnd: function(){
		//ジャンプキーが押されていない間はこちらが呼び出される。ジャンプ処理がすべて終了した後はnullになる。
		//ジャンプキーをごく短時間押した場合でも、ある一定の高さまではジャンプするようにするため。
		if(this.jumpPower_tickCount < this.jumpPower_tickCountBase - this.jumpPower_tickCountAtLeast){
			this.jumpPower_tickCount = 0;
			this.jumpEnd = null;
		} else{
			this.jump();
		}
	},
	tick : function(){
		OperatedCharacterClass.base.prototype.tick.apply(this);	
	},
	draw : function(x, y){
		this.isGround = false;
		OperatedCharacterClass.base.prototype.draw.apply(this, [x, y]);
	}
});
