public override void Rotate(Data.DirectionX direction) { var nextRot = Rotation; nextRot = Rotation == Data.BlockRotation.Normal ? Data.BlockRotation.Right : Data.BlockRotation.Normal; CheckAndRotate(nextRot, rotCoodinate); }
// 指定した方向にブロックが接触しているか判定する // MEMO: 衝突判定イベントでブロックが接触しているか判定するのではどうしてもずれが生じたため,移動前にこのメソッドで接触していないか確認する public bool IsTouchingInOtherBlock(Data.DirectionX direction) { var distance = DistanceToOtherBlock(direction); // 接触していない if (distance < 0 || distance > Data.BlockInterval.x) { return(false); } return(true); }
// direction方向に接触しているか protected bool IsTouchingIn(Data.DirectionX direction) { foreach (var block in Blocks) { if (block.IsTouchingInOtherBlock(direction)) { return(true); } } return(false); }
public override void Translate(Data.DirectionX direction) { if (IsTouchingIn(direction)) { return; } transform.Translate((int)direction * Data.BlockInterval.x, 0f, 0f); foreach (var block in Blocks) { var pos = block.Position; block.Position = new Data.BlockPosition(pos.x + (int)direction, pos.y); } }
// 指定した方向にある,最も近い他ブロックとの距離を求める // 他ブロック以外のものが指定方向にある場合は負の値を返す. private float DistanceToOtherBlock(Data.DirectionX direction) { var ray = new Ray(this.transform.position, Vector3.right * (int)direction); RaycastHit hit; if (!Physics.Raycast(ray.origin, ray.direction, out hit, Mathf.Infinity)) { return(-1); } // 同じテトリミノを構成するブロックは無視 if (hit.collider.transform.parent == this.transform.parent) { return(-1); } return(hit.distance); }
public override void Rotate(Data.DirectionX direction) { var nextRot = Rotation; // 左向きの状態で右回転をしたとき,Normal状態に戻す if (direction == Data.DirectionX.Right && Rotation == Data.BlockRotation.Left) { nextRot = Data.BlockRotation.Normal; } // 通常状態で左回転をしたとき,Left状態にする else if (direction == Data.DirectionX.Left && Rotation == Data.BlockRotation.Normal) { nextRot = Data.BlockRotation.Left; } else { nextRot += (int)direction; } CheckAndRotate(nextRot, rotCoodinate); }
private void Translate(Data.DirectionX dir) { // 前回と移動方向が異なる場合 if (prevdir != dir) { prevdir = dir; prevtime = Time.time; OnTranslated(dir); return; } // 一定の時間間隔で移動 if (Time.time - prevtime < MinTranslationInterval) { return; } prevtime = Time.time; OnTranslated(dir); }
public abstract void Rotate(Data.DirectionX direction);
public abstract void Translate(Data.DirectionX direction);
public override void Rotate(Data.DirectionX direction) { }