Skip to content

Commit ec3b84c

Browse files
committed
airplane exit state, easing functions cleanup
1 parent be6e30c commit ec3b84c

File tree

6 files changed

+101
-5
lines changed

6 files changed

+101
-5
lines changed

src/ts/characters/Character.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import { SeatType } from '../enums/SeatType';
2727
import { GroundImpactData } from './GroundImpactData';
2828
import { ClosestObjectFinder } from '../core/ClosestObjectFinder';
2929
import { Object3D } from 'three';
30+
import { EntityType } from '../enums/EntityType';
31+
import { ExitingAirplane } from './character_states/vehicles/ExitingAirplane';
3032

3133
export class Character extends THREE.Object3D implements IWorldEntity
3234
{
@@ -757,8 +759,19 @@ export class Character extends THREE.Object3D implements IWorldEntity
757759

758760
public exitVehicle(): void
759761
{
760-
this.setState(new ExitingVehicle(this, this.occupyingSeat));
761-
this.stopControllingVehicle();
762+
if (this.controlledObject !== null)
763+
{
764+
if (this.controlledObject.entityType === EntityType.Airplane)
765+
{
766+
this.setState(new ExitingAirplane(this, this.occupyingSeat));
767+
}
768+
else
769+
{
770+
this.setState(new ExitingVehicle(this, this.occupyingSeat));
771+
}
772+
773+
this.stopControllingVehicle();
774+
}
762775
}
763776

764777
public occupySeat(seat: VehicleSeat): void

src/ts/characters/character_states/vehicles/EnteringVehicle.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export class EnteringVehicle extends CharacterStateBase
7070
else
7171
{
7272
let factor = THREE.MathUtils.clamp(this.timer / (this.animationLength - this.animData.end_early), 0, 1);
73-
let sineFactor = 1 - ((Math.cos(factor * Math.PI) * 0.5) + 0.5);
73+
let sineFactor = Utils.easeInOutSine(factor);
7474

7575
let lerpPosition = new THREE.Vector3().lerpVectors(this.startPosition, this.endPosition, sineFactor);
7676
this.character.setPosition(lerpPosition.x, lerpPosition.y, lerpPosition.z);
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import * as THREE from 'three';
2+
import * as Utils from '../../../core/FunctionLibrary';
3+
4+
import
5+
{
6+
CharacterStateBase,
7+
} from '../_stateLibrary';
8+
import { Character } from '../../Character';
9+
import { Side } from '../../../enums/Side';
10+
import { VehicleSeat } from '../../../vehicles/VehicleSeat';
11+
import { IControllable } from '../../../interfaces/IControllable';
12+
import { Idle } from '../Idle';
13+
import { CloseVehicleDoorOutside } from './CloseVehicleDoorOutside';
14+
import { Vehicle } from 'src/ts/vehicles/Vehicle';
15+
import { Falling } from '../Falling';
16+
17+
export class ExitingAirplane extends CharacterStateBase
18+
{
19+
private vehicle: IControllable;
20+
private seat: VehicleSeat;
21+
private startPosition: THREE.Vector3 = new THREE.Vector3();
22+
private endPosition: THREE.Vector3 = new THREE.Vector3();
23+
24+
constructor(character: Character, seat: VehicleSeat)
25+
{
26+
super(character);
27+
28+
this.canFindVehiclesToEnter = false;
29+
this.seat = seat;
30+
this.vehicle = seat.vehicle;
31+
32+
this.seat.door?.open();
33+
34+
this.startPosition.copy(this.character.position);
35+
this.endPosition.copy(this.startPosition);
36+
this.endPosition.y += 1;
37+
38+
this.playAnimation('jump_idle', 0.1);
39+
}
40+
41+
public update(timeStep: number): void
42+
{
43+
super.update(timeStep);
44+
45+
if (this.animationEnded(timeStep))
46+
{
47+
this.character.controlledObject = undefined;
48+
this.character.world.graphicsWorld.attach(this.character);
49+
this.character.resetVelocity();
50+
this.character.resetOrientation();
51+
this.character.setPhysicsEnabled(true);
52+
53+
this.character.characterCapsule.body.velocity.copy((this.vehicle as unknown as Vehicle).rayCastVehicle.chassisBody.velocity);
54+
55+
this.character.setState(new Falling(this.character));
56+
this.character.leaveSeat();
57+
}
58+
else
59+
{
60+
let beginningCutoff = 0.3;
61+
let factor = THREE.MathUtils.clamp(((this.timer / this.animationLength) - beginningCutoff) * (1 / (1 - beginningCutoff)), 0, 1);
62+
let smoothFactor = this.easeOutQuad(factor);
63+
let lerpPosition = new THREE.Vector3().lerpVectors(this.startPosition, this.endPosition, smoothFactor);
64+
this.character.setPosition(lerpPosition.x, lerpPosition.y, lerpPosition.z);
65+
}
66+
}
67+
68+
private easeOutQuad(x: number): number
69+
{
70+
return 1 - (1 - x) * (1 - x);
71+
}
72+
}

src/ts/characters/character_states/vehicles/ExitingVehicle.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export class ExitingVehicle extends CharacterStateBase
8686
else
8787
{
8888
let factor = this.timer / this.animationLength;
89-
let sineFactor = 1 - ((Math.cos(factor * Math.PI) * 0.5) + 0.5);
89+
let sineFactor = Utils.easeInOutSine(factor);
9090
let lerpPosition = new THREE.Vector3().lerpVectors(this.startPosition, this.endPosition, sineFactor);
9191
this.character.setPosition(lerpPosition.x, lerpPosition.y, lerpPosition.z);
9292

src/ts/characters/character_states/vehicles/SwitchingSeats.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Side } from '../../../enums/Side';
99
import { SeatType } from '../../../enums/SeatType';
1010
import { Driving } from './Driving';
1111
import { Sitting } from './Sitting';
12+
import * as Utils from '../../../core/FunctionLibrary';
1213

1314
export class SwitchingSeats extends CharacterStateBase
1415
{
@@ -71,7 +72,7 @@ export class SwitchingSeats extends CharacterStateBase
7172
else
7273
{
7374
let factor = this.timer / this.animationLength;
74-
let sineFactor = 1 - ((Math.cos(factor * Math.PI) * 0.5) + 0.5);
75+
let sineFactor = Utils.easeInOutSine(factor);
7576

7677
let lerpPosition = new THREE.Vector3().lerpVectors(this.startPosition, this.endPosition, sineFactor);
7778
this.character.setPosition(lerpPosition.x, lerpPosition.y, lerpPosition.z);

src/ts/core/FunctionLibrary.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,4 +298,14 @@ export function detectRelativeSide(from: Object3D, to: Object3D): Side
298298
return right.dot(viewVector) > 0 ? Side.Left : Side.Right;
299299
}
300300

301+
export function easeInOutSine(x: number): number
302+
{
303+
return -(Math.cos(Math.PI * x) - 1) / 2;
304+
}
305+
306+
export function easeOutQuad(x: number): number
307+
{
308+
return 1 - (1 - x) * (1 - x);
309+
}
310+
301311
//#endregion

0 commit comments

Comments
 (0)