Funkin/source/funkin/play/event/ZoomCameraSongEvent.hx

171 lines
4.3 KiB
Haxe
Raw Normal View History

2023-06-02 14:35:28 -04:00
package funkin.play.event;
import flixel.tweens.FlxTween;
import flixel.FlxCamera;
import flixel.tweens.FlxEase;
// Data from the chart
import funkin.data.song.SongData;
import funkin.data.song.SongData.SongEventData;
// Data from the event schema
2023-06-02 14:35:28 -04:00
import funkin.play.event.SongEvent;
import funkin.data.event.SongEventSchema;
import funkin.data.event.SongEventSchema.SongEventFieldType;
2023-06-02 14:35:28 -04:00
/**
* This class represents a handler for camera zoom events.
*
2023-06-02 14:35:28 -04:00
* Example: Zoom to 1.3x:
* ```
* {
* 'e': 'ZoomCamera',
* 'v': 1.3
* }
* ```
*
* Example: Zoom to 1.3x
2023-06-02 14:35:28 -04:00
* ```
* {
* 'e': 'FocusCamera',
* 'v': {
* 'char': 2,
* 'y': -10,
* }
* }
* ```
*
2023-06-02 14:35:28 -04:00
* Example: Focus on (100, 100):
* ```
* {
* 'e': 'FocusCamera',
* 'v': {
* 'char': -1,
* 'x': 100,
* 'y': 100,
* }
* }
* ```
*/
class ZoomCameraSongEvent extends SongEvent
{
public function new()
{
super('ZoomCamera');
}
static final DEFAULT_ZOOM:Float = 1.0;
static final DEFAULT_DURATION:Float = 4.0;
static final DEFAULT_MODE:String = 'direct';
static final DEFAULT_EASE:String = 'linear';
2023-06-02 14:35:28 -04:00
public override function handleEvent(data:SongEventData):Void
{
// Does nothing if there is no PlayState camera or stage.
if (PlayState.instance == null || PlayState.instance.currentStage == null) return;
// Does nothing if we are minimal mode.
2024-03-14 00:27:09 -04:00
if (PlayState.instance.isMinimalMode) return;
2023-06-02 14:35:28 -04:00
var zoom:Float = data.getFloat('zoom') ?? DEFAULT_ZOOM;
2023-06-02 14:35:28 -04:00
var duration:Float = data.getFloat('duration') ?? DEFAULT_DURATION;
var mode:String = data.getString('mode') ?? DEFAULT_MODE;
var isDirectMode:Bool = mode == 'direct';
2023-06-02 14:35:28 -04:00
var ease:String = data.getString('ease') ?? DEFAULT_EASE;
2023-06-02 14:35:28 -04:00
// If it's a string, check the value.
switch (ease)
{
case 'INSTANT':
PlayState.instance.tweenCameraZoom(zoom, 0, isDirectMode);
2023-06-02 14:35:28 -04:00
default:
var durSeconds = Conductor.instance.stepLengthMs * duration / 1000;
2023-06-02 14:35:28 -04:00
var easeFunction:Null<Float->Float> = Reflect.field(FlxEase, ease);
if (easeFunction == null)
{
trace('Invalid ease function: $ease');
return;
}
PlayState.instance.tweenCameraZoom(zoom, durSeconds, isDirectMode, easeFunction);
2023-06-02 14:35:28 -04:00
}
}
public override function getTitle():String
{
return 'Zoom Camera';
}
/**
* ```
* {
* 'zoom': FLOAT, // Target zoom level.
* 'duration': FLOAT, // Optional duration in steps.
* 'mode': ENUM, // Whether to set additive zoom or direct zoom.
* 'ease': ENUM, // Optional easing function.
2023-06-02 14:35:28 -04:00
* }
* @return SongEventSchema
*/
public override function getEventSchema():SongEventSchema
{
return new SongEventSchema([
2023-06-02 14:35:28 -04:00
{
name: 'zoom',
title: 'Zoom Level',
defaultValue: 1.0,
step: 0.1,
2024-01-26 20:51:36 -05:00
type: SongEventFieldType.FLOAT,
units: 'x'
2023-06-02 14:35:28 -04:00
},
{
name: 'duration',
2024-01-26 20:51:36 -05:00
title: 'Duration',
2023-06-02 14:35:28 -04:00
defaultValue: 4.0,
step: 0.5,
type: SongEventFieldType.FLOAT,
2024-01-26 20:51:36 -05:00
units: 'steps'
2023-06-02 14:35:28 -04:00
},
{
name: 'mode',
title: 'Mode',
defaultValue: 'direct',
type: SongEventFieldType.ENUM,
keys: ['Additive' => 'additive', 'Direct' => 'direct']
},
2023-06-02 14:35:28 -04:00
{
name: 'ease',
title: 'Easing Type',
defaultValue: 'linear',
type: SongEventFieldType.ENUM,
keys: [
'Linear' => 'linear',
'Instant' => 'INSTANT',
'Quad In' => 'quadIn',
'Quad Out' => 'quadOut',
'Quad In/Out' => 'quadInOut',
'Cube In' => 'cubeIn',
'Cube Out' => 'cubeOut',
'Cube In/Out' => 'cubeInOut',
'Quart In' => 'quartIn',
'Quart Out' => 'quartOut',
'Quart In/Out' => 'quartInOut',
'Quint In' => 'quintIn',
'Quint Out' => 'quintOut',
'Quint In/Out' => 'quintInOut',
'Smooth Step In' => 'smoothStepIn',
'Smooth Step Out' => 'smoothStepOut',
'Smooth Step In/Out' => 'smoothStepInOut',
'Sine In' => 'sineIn',
'Sine Out' => 'sineOut',
'Sine In/Out' => 'sineInOut',
'Elastic In' => 'elasticIn',
'Elastic Out' => 'elasticOut',
'Elastic In/Out' => 'elasticInOut',
]
}
]);
2023-06-02 14:35:28 -04:00
}
}