package fight3D;
import framework.gameMain.Actor;
import framework.model3D.CollisionResult;
import framework.model3D.Object3D;
import framework.physics.Force3D;
import framework.physics.Ground;
import framework.physics.PhysicsUtility;
import framework.physics.Solid3D;
/**
* 飛び道具、弾
* @author 新田直也
*
*/
public class Weapon extends Actor implements Attackable {
private Player owner;
private boolean fCalculatePhysics = false;
boolean fActive = true;
long lifetime;
private long timeLag = 0; // 攻撃が効き始めるまでの時間(発生時間)
public Weapon(WeaponModel m, Player owner, long t) {
super(m);
this.owner = owner;
lifetime = 10000;
timeLag = t;
disappear();
}
public void motion(long interval, Ground ground){
if(doesCalculatePhysics()){
lifetime = lifetime -interval;
if(lifetime <= 0){
disappear();
}
}
super.motion(interval, ground);
}
public void appear(){
fActive = true;
setVisible();
}
public void disappear() {
fActive = false;
setInvisible();
}
//遠距離攻撃の直線運動をするのか落下運動をするのかを判定
public boolean doesCalculatePhysics(){
return fCalculatePhysics;
}
public boolean isAlive(){
return fActive;
}
//攻撃力をかえす
public int getAP() {
// TODO Auto-generated method stub
return owner.character.getPower();
}
//2つの物体があたるときの3次元の形をおしえる
public Object3D getBody() {
// TODO Auto-generated method stub
return body;
}
@Override
public String getPartName() {
// TODO Auto-generated method stub
return null;
}
//誰のWeaponがあたったのか判定する
public Player getOwner() {
// TODO Auto-generated method stub
return owner;
}
//Playerと独立した動きをするのかどうか判定(Weaponでは独立したうごきをする)
public boolean isMovable() {
// TODO Auto-generated method stub
return true;
}
public void onEndAnimation() {
}
public void onEndFall(){
}
//Weaponが地面に当たったときにどういう動きをするか
public void onIntersect(CollisionResult cr, long interval) {
// TODO Auto-generated method stub
if(doesCalculatePhysics()){
Force3D f = PhysicsUtility.calcForce(interval, cr.normal, (Solid3D)body);
((Solid3D)body).move(interval, f, cr.collisionPoint);
}
else{
disappear();
}
}
public Force3D getGravity() {
if (doesCalculatePhysics()) {
return super.getGravity();
}
return Force3D.ZERO;
}
private void setVisible(){
animation.reset();
body.scale(1.0);
}
private void setInvisible(){
body.apply(owner.getPosition(), false);
body.scale(0.01);
}
@Override
public boolean isActivate() {
return (animation.time >= timeLag);
}
}