mirror of
https://github.com/MapMakersAndProgrammers/TankiOnline2.0DemoClient.git
synced 2025-10-26 01:49:11 -07:00
444 lines
14 KiB
ActionScript
444 lines
14 KiB
ActionScript
package §_-I0§
|
|
{
|
|
import §_-1e§.§_-fx§;
|
|
import §_-8D§.§_-OX§;
|
|
import §_-Ex§.§_-U2§;
|
|
import §_-KA§.§_-jr§;
|
|
import §_-KT§.§_-Ju§;
|
|
import §_-KT§.§_-UT§;
|
|
import §_-OR§.§_-om§;
|
|
import §_-V-§.§_-aY§;
|
|
import §_-aM§.§_-Lm§;
|
|
import §_-az§.§_-gw§;
|
|
import §_-e6§.§_-RE§;
|
|
import §_-e6§.§_-gb§;
|
|
import §_-lS§.§_-h2§;
|
|
import §_-nl§.Matrix3;
|
|
import §_-nl§.Matrix4;
|
|
import §_-nl§.§_-bj§;
|
|
import flash.ui.Keyboard;
|
|
import flash.utils.getTimer;
|
|
|
|
public class §_-bt§ extends §_-Ww§ implements §_-gb§
|
|
{
|
|
private static var parentMatrix:Matrix4 = new Matrix4();
|
|
|
|
private static var matrix:Matrix4 = new Matrix4();
|
|
|
|
private static var maxPositionError:Number = 10;
|
|
|
|
private static var maxAngleError:Number = Math.PI / 180;
|
|
|
|
private static var camSpeedThreshold:Number = 10;
|
|
|
|
private static var fixedPitch:§_-Ju§ = new §_-Ju§("cam_fixedpitch",10 * Math.PI / 180,-1,1);
|
|
|
|
private static var noPitchCorrection:§_-UT§ = new §_-UT§("cam_nopitchcorrection",1,0,1);
|
|
|
|
private static var pitchCorrectionCoeff:§_-Ju§ = new §_-Ju§("cam_pitchcorrectioncoeff",1,0,10);
|
|
|
|
private static var reboundDelay:§_-UT§ = new §_-UT§("cam_rebound",1000,0,2000);
|
|
|
|
private static var elevationAngles:Vector.<Number> = new Vector.<Number>(1,true);
|
|
|
|
private static var rotationMatrix:Matrix3 = new Matrix3();
|
|
|
|
private static var axis:§_-bj§ = new §_-bj§();
|
|
|
|
private static var rayDirection:§_-bj§ = new §_-bj§();
|
|
|
|
private static const MIN_CAMERA_ANGLE:Number = 5 * Math.PI / 180;
|
|
|
|
private static const KEY_CAMERA_UP:uint = Keyboard.PAGE_UP;
|
|
|
|
private static const KEY_CAMERA_DOWN:uint = Keyboard.PAGE_DOWN;
|
|
|
|
private static const HEIGHT_CHANGE_STEP:Number = 50;
|
|
|
|
private static const MIN_HEIGHT:Number = 150;
|
|
|
|
private static const MAX_HEIGHT:Number = 3100;
|
|
|
|
private static const MIN_DISTANCE:Number = 300;
|
|
|
|
private static const COLLISION_OFFSET:Number = 100;
|
|
|
|
private static const targetOffset:§_-bj§ = new §_-bj§(0,0,50);
|
|
|
|
private static var currentPosition:§_-bj§ = new §_-bj§();
|
|
|
|
private static var currentRotation:§_-bj§ = new §_-bj§();
|
|
|
|
private static var rayOrigin:§_-bj§ = new §_-bj§();
|
|
|
|
private static var flatDirection:§_-bj§ = new §_-bj§();
|
|
|
|
private static var positionDelta:§_-bj§ = new §_-bj§();
|
|
|
|
private static var rayHit:§_-jr§ = new §_-jr§();
|
|
|
|
private var collisionDetector:§_-fx§;
|
|
|
|
private var collisionMask:int;
|
|
|
|
private var §_-U1§:Number = 0;
|
|
|
|
private var §_-7h§:Number = 0;
|
|
|
|
private var locked:Boolean;
|
|
|
|
private var position:§_-bj§ = new §_-bj§();
|
|
|
|
private var rotation:§_-bj§ = new §_-bj§();
|
|
|
|
private var targetPosition:§_-bj§ = new §_-bj§();
|
|
|
|
private var targetDirection:§_-bj§ = new §_-bj§();
|
|
|
|
private var §_-Wq§:Number = 0;
|
|
|
|
private var §_-fq§:Number = 0;
|
|
|
|
private var §_-qF§:Number = 0;
|
|
|
|
private var §_-51§:Number = 10000000;
|
|
|
|
private var §_-kz§:int;
|
|
|
|
private var cameraPositionData:CameraPositionData = new CameraPositionData();
|
|
|
|
private var §_-4G§:Number;
|
|
|
|
private var input:§_-Lm§;
|
|
|
|
private var §_-fZ§:§_-U2§;
|
|
|
|
private var §_-LT§:Number = 0;
|
|
|
|
private var §_-mg§:Number = 0;
|
|
|
|
private var §_-R2§:Number = 1000;
|
|
|
|
private var §_-Rb§:Number = 0;
|
|
|
|
private var §_-NW§:Number = 0;
|
|
|
|
private var §_-1J§:Number = 1000;
|
|
|
|
public var smoothing:Number = 40;
|
|
|
|
private var angles:§_-bj§ = new §_-bj§();
|
|
|
|
private var §_-n9§:§_-bj§ = new §_-bj§();
|
|
|
|
private var rotationMatrix:Matrix4 = new Matrix4();
|
|
|
|
private var §_-Ys§:Matrix4 = new Matrix4();
|
|
|
|
private var §_-b4§:§_-bj§ = new §_-bj§();
|
|
|
|
public function §_-bt§(camera:§_-RE§, collisionDetector:§_-fx§, collisionMask:int, input:§_-Lm§)
|
|
{
|
|
super();
|
|
this.camera = camera;
|
|
if(collisionDetector == null)
|
|
{
|
|
throw new ArgumentError("Parameter collisionDetector cannot be null");
|
|
}
|
|
this.collisionDetector = collisionDetector;
|
|
this.collisionMask = collisionMask;
|
|
this.input = input;
|
|
this.§_-Tq§ = 600;
|
|
}
|
|
|
|
public function §_-eA§() : void
|
|
{
|
|
}
|
|
|
|
public function §_-O-§(target:§_-gw§) : void
|
|
{
|
|
if(target == null)
|
|
{
|
|
this.§_-fZ§ = null;
|
|
}
|
|
else
|
|
{
|
|
this.§_-fZ§ = §_-om§(target.getComponentStrict(§_-om§)).§_-dW§;
|
|
}
|
|
}
|
|
|
|
public function update() : void
|
|
{
|
|
if(this.§_-fZ§ == null)
|
|
{
|
|
throw new Error("Target is not set");
|
|
}
|
|
if(camera == null)
|
|
{
|
|
throw new Error("Camera is not set");
|
|
}
|
|
var dt:Number = Number(§_-h2§.timeDeltaSeconds);
|
|
if(dt > 0.1)
|
|
{
|
|
dt = 0.1;
|
|
}
|
|
this.§_-1E§();
|
|
matrix.§_-eP§(targetOffset,this.§_-n9§);
|
|
var distanceChangeDir:int = this.input.§_-OO§(KEY_CAMERA_UP) - this.input.§_-OO§(KEY_CAMERA_DOWN) - this.input.§_-i9§();
|
|
if(distanceChangeDir != 0)
|
|
{
|
|
this.§_-1J§ *= Math.pow(10,distanceChangeDir * 0.02);
|
|
}
|
|
if(this.input.§_-an§())
|
|
{
|
|
this.§_-Rb§ -= this.input.§_-ac§() * 0.01;
|
|
this.§_-NW§ -= this.input.§_-ow§() * 0.01;
|
|
}
|
|
var k:Number = 1;
|
|
if(this.smoothing > 0)
|
|
{
|
|
k = 100 / this.smoothing * dt;
|
|
k = k > 1 ? 1 : k;
|
|
this.§_-LT§ += (this.§_-Rb§ - this.§_-LT§) * k;
|
|
this.§_-mg§ += (this.§_-NW§ - this.§_-mg§) * k;
|
|
}
|
|
else
|
|
{
|
|
this.§_-LT§ = this.§_-Rb§;
|
|
this.§_-mg§ = this.§_-NW§;
|
|
}
|
|
this.rotationMatrix.§_-Wl§(this.§_-LT§,0,this.§_-mg§);
|
|
this.rotationMatrix.§_-oa§(matrix.d,matrix.h,matrix.l);
|
|
matrix.getAxis(3,rayOrigin);
|
|
this.rotationMatrix.§_-Uz§(§_-bj§.Y_AXIS,rayDirection);
|
|
rayDirection.reverse();
|
|
var distance:Number = this.§_-1J§;
|
|
if(this.collisionDetector.raycast(rayOrigin,rayDirection,this.collisionMask,distance,null,rayHit))
|
|
{
|
|
distance = rayHit.t - COLLISION_OFFSET;
|
|
}
|
|
if(distanceChangeDir != 0)
|
|
{
|
|
this.§_-1J§ = distance;
|
|
}
|
|
if(this.smoothing > 0)
|
|
{
|
|
this.§_-R2§ += (distance - this.§_-R2§) * k;
|
|
}
|
|
else
|
|
{
|
|
this.§_-R2§ = distance;
|
|
}
|
|
this.position.x = 0;
|
|
this.position.y = -this.§_-R2§;
|
|
this.position.z = 0;
|
|
this.rotationMatrix.§_-eP§(this.position,currentPosition);
|
|
camera.x = currentPosition.x;
|
|
camera.y = currentPosition.y;
|
|
camera.z = currentPosition.z;
|
|
var dx:Number = this.§_-n9§.x - camera.x;
|
|
var dy:Number = this.§_-n9§.y - camera.y;
|
|
var dz:Number = this.§_-n9§.z - camera.z;
|
|
camera.rotationX = Math.atan2(dz,Math.sqrt(dx * dx + dy * dy)) - 0.5 * Math.PI;
|
|
camera.rotationY = 0;
|
|
camera.rotationZ = -Math.atan2(dx,dy);
|
|
}
|
|
|
|
private function set §_-Tq§(value:Number) : void
|
|
{
|
|
this.§_-U1§ = §_-aY§.clamp(value,MIN_HEIGHT,MAX_HEIGHT);
|
|
var d:Number = this.§_-pq§(this.§_-U1§);
|
|
this.§_-4G§ = Math.atan2(this.§_-U1§,d);
|
|
this.§_-7h§ = Math.sqrt(this.§_-U1§ * this.§_-U1§ + d * d);
|
|
this.§_-kz§ = 0;
|
|
}
|
|
|
|
private function §_-TS§(targetPosition:§_-bj§, targetDirection:§_-bj§, useReboundDelay:Boolean, dt:Number, result:CameraPositionData) : void
|
|
{
|
|
var angle:Number = NaN;
|
|
var now:int = 0;
|
|
var delta:Number = NaN;
|
|
var actualElevation:Number = this.§_-4G§;
|
|
var xyLength:Number = Number(Math.sqrt(targetDirection.x * targetDirection.x + targetDirection.y * targetDirection.y));
|
|
if(xyLength < 0.00001)
|
|
{
|
|
flatDirection.x = 1;
|
|
flatDirection.y = 0;
|
|
}
|
|
else
|
|
{
|
|
flatDirection.x = targetDirection.x / xyLength;
|
|
flatDirection.y = targetDirection.y / xyLength;
|
|
}
|
|
result.extraPitch = 0;
|
|
result.t = 1;
|
|
var minCollisionDistance:Number = this.§_-7h§;
|
|
rayOrigin.copy(targetPosition);
|
|
elevationAngles[0] = actualElevation;
|
|
axis.x = flatDirection.y;
|
|
axis.y = -flatDirection.x;
|
|
flatDirection.reverse();
|
|
for each(angle in elevationAngles)
|
|
{
|
|
this.rotationMatrix.§_-OB§(axis,-angle);
|
|
this.rotationMatrix.§_-Uz§(flatDirection,rayDirection);
|
|
minCollisionDistance = this.§_-LI§(rayOrigin,rayDirection,this.§_-7h§,minCollisionDistance);
|
|
}
|
|
if(useReboundDelay)
|
|
{
|
|
now = int(getTimer());
|
|
if(minCollisionDistance <= this.§_-51§ + 0.001)
|
|
{
|
|
this.§_-51§ = minCollisionDistance;
|
|
this.§_-kz§ = now;
|
|
}
|
|
else if(now - this.§_-kz§ < reboundDelay.value)
|
|
{
|
|
minCollisionDistance = this.§_-51§;
|
|
}
|
|
else
|
|
{
|
|
this.§_-51§ = minCollisionDistance;
|
|
}
|
|
}
|
|
if(minCollisionDistance < this.§_-7h§)
|
|
{
|
|
result.t = minCollisionDistance / this.§_-7h§;
|
|
if(minCollisionDistance < MIN_DISTANCE)
|
|
{
|
|
rayOrigin.§_-LQ§(minCollisionDistance,rayDirection);
|
|
delta = MIN_DISTANCE - minCollisionDistance;
|
|
if(this.collisionDetector.raycast(rayOrigin,§_-bj§.Z_AXIS,this.collisionMask,delta,null,rayHit))
|
|
{
|
|
delta = rayHit.t - 10;
|
|
if(delta < 0)
|
|
{
|
|
delta = 0;
|
|
}
|
|
}
|
|
result.position.copy(rayOrigin).§_-LQ§(delta,§_-bj§.Z_AXIS);
|
|
}
|
|
else
|
|
{
|
|
result.position.copy(rayOrigin).§_-LQ§(minCollisionDistance,rayDirection);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result.position.copy(rayOrigin).§_-LQ§(this.§_-7h§,rayDirection);
|
|
}
|
|
}
|
|
|
|
private function §_-LI§(rayOrigin:§_-bj§, rayDirection:§_-bj§, rayLength:Number, minCollisionDistance:Number) : Number
|
|
{
|
|
var distance:Number = NaN;
|
|
if(this.collisionDetector.raycast(rayOrigin,rayDirection,this.collisionMask,rayLength,null,rayHit))
|
|
{
|
|
distance = Number(rayHit.t);
|
|
if(distance < COLLISION_OFFSET)
|
|
{
|
|
distance = 0;
|
|
}
|
|
else
|
|
{
|
|
distance -= COLLISION_OFFSET;
|
|
}
|
|
if(distance < minCollisionDistance)
|
|
{
|
|
return distance;
|
|
}
|
|
}
|
|
return minCollisionDistance;
|
|
}
|
|
|
|
private function §_-1E§() : void
|
|
{
|
|
this.§_-U6§(this.§_-fZ§.parent,parentMatrix);
|
|
this.§_-U6§(this.§_-fZ§,matrix);
|
|
matrix.append(parentMatrix);
|
|
matrix.getAxis(3,this.targetPosition);
|
|
this.targetDirection.reset(matrix.b,matrix.f,matrix.j);
|
|
}
|
|
|
|
private function §_-U6§(object:§_-OX§, matrix:Matrix4) : void
|
|
{
|
|
matrix.§_-Wl§(object.rotationX,object.rotationY,object.rotationZ);
|
|
matrix.§_-oa§(object.x,object.y,object.z);
|
|
}
|
|
|
|
private function §_-K4§() : void
|
|
{
|
|
var heightChangeDir:int = this.input.§_-OO§(KEY_CAMERA_UP) - this.input.§_-OO§(KEY_CAMERA_DOWN);
|
|
if(heightChangeDir != 0)
|
|
{
|
|
this.§_-Tq§ = this.§_-U1§ + heightChangeDir * HEIGHT_CHANGE_STEP;
|
|
}
|
|
}
|
|
|
|
private function §_-pq§(h:Number) : Number
|
|
{
|
|
var v:Number = 200 - 1750;
|
|
var k:Number = (1300 - 600) / (v * v);
|
|
return -k * (h - 1750) * (h - 1750) + 1300;
|
|
}
|
|
|
|
private function §_-Tu§(positionError:Number) : Number
|
|
{
|
|
return 3 * positionError;
|
|
}
|
|
|
|
private function §_-NP§(angleError:Number, currentSpeed:Number) : Number
|
|
{
|
|
if(angleError < -maxAngleError)
|
|
{
|
|
return 3 * (angleError + maxAngleError);
|
|
}
|
|
if(angleError > maxAngleError)
|
|
{
|
|
return 3 * (angleError - maxAngleError);
|
|
}
|
|
return currentSpeed;
|
|
}
|
|
|
|
private function §each §(value:Number, snapValue:Number, epsilon:Number) : Number
|
|
{
|
|
if(value > snapValue - epsilon && value < snapValue + epsilon)
|
|
{
|
|
return snapValue;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
private function §_-Xv§(cameraPositionData:CameraPositionData) : Number
|
|
{
|
|
var angle:Number = this.§_-4G§ - fixedPitch.value;
|
|
if(angle < 0)
|
|
{
|
|
angle = 0;
|
|
}
|
|
var t:Number = cameraPositionData.t;
|
|
if(t >= 1 || angle < MIN_CAMERA_ANGLE || noPitchCorrection.value == 1)
|
|
{
|
|
return cameraPositionData.extraPitch - angle;
|
|
}
|
|
return cameraPositionData.extraPitch - Math.atan2(t * this.§_-U1§,pitchCorrectionCoeff.value * this.§_-U1§ * (1 / Math.tan(angle) - (1 - t) / Math.tan(this.§_-4G§)));
|
|
}
|
|
}
|
|
}
|
|
|
|
import §_-nl§.§_-bj§;
|
|
|
|
class CameraPositionData
|
|
{
|
|
public var t:Number;
|
|
|
|
public var extraPitch:Number;
|
|
|
|
public var position:§_-bj§ = new §_-bj§();
|
|
|
|
public function CameraPositionData()
|
|
{
|
|
super();
|
|
}
|
|
}
|