//! zinc
library Camera {
struct Cam {
method left() {
AdjustCameraField(CAMERA_FIELD_ROTATION, -(ROTATE_SPEED * TIMEOUT), TIMEOUT);
}
method right() {
AdjustCameraField(CAMERA_FIELD_ROTATION, (ROTATE_SPEED * TIMEOUT), TIMEOUT);
}
method up() {
if (GetCameraField(CAMERA_FIELD_TARGET_DISTANCE) <= ZOOM_MIN) {
SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, ZOOM_MIN, 1.);
}
else {
AdjustCameraField(CAMERA_FIELD_TARGET_DISTANCE, -(ZOOM_SPEED * TIMEOUT), TIMEOUT);
}
}
method down() {
if (GetCameraField(CAMERA_FIELD_TARGET_DISTANCE) >= ZOOM_MAX) {
SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, ZOOM_MAX, 1.);
}
else {
AdjustCameraField(CAMERA_FIELD_TARGET_DISTANCE, (ZOOM_SPEED * TIMEOUT), TIMEOUT);
}
}
}
camerasetup Camera;
function refreshCamera(player whichPlayer) {
if (GetLocalPlayer() == whichPlayer) {
if (whichPlayer == Player(0)) {
CameraSetupSetField(Camera, CAMERA_FIELD_ROTATION, 0., 0.);
}
else {
CameraSetupSetField(Camera, CAMERA_FIELD_ROTATION, 180., 0.);
}
CameraSetupApply(Camera, true, true);
}
}
function initCameras() {
FogEnable(false);
FogMaskEnable(false);
EnableOcclusion(false);
EnableUserControl(true);
EnableWorldFogBoundary(true);
// CameraSetSmoothingFactor(3.0);
Camera = CreateCameraSetup();
CameraSetupSetDestPosition(Camera, Board.centerX, Board.centerY, 0.);
CameraSetupSetField(Camera, CAMERA_FIELD_ZOFFSET, 0., 0.);
CameraSetupSetField(Camera, CAMERA_FIELD_ANGLE_OF_ATTACK, 295., 0.);
CameraSetupSetField(Camera, CAMERA_FIELD_TARGET_DISTANCE, 2100., 0.);
CameraSetupSetField(Camera, CAMERA_FIELD_ROLL, 0., 0.);
CameraSetupSetField(Camera, CAMERA_FIELD_FARZ, 10000., 0.);
CameraSetupSetField(Camera, CAMERA_FIELD_FIELD_OF_VIEW, 70., 0.);
refreshCamera(Player(0));
refreshCamera(Player(1));
SetCameraTargetController(CreateUnit(NEUTRAL, DUMMY, Board.centerX, Board.centerY, 0.), 0., 0., false);
}
constant integer UP
= 0
, DOWN
= 1
, LEFT
= 2
, RIGHT
= 3;
private /* Key Event Callbacks */ {
timer Tim = CreateTimer();
integer TotalPressed = 0;
boolean Pressed[2][4];
function Expire() {
integer a;
for(a = 0; a < 2; a += 1) {
if (GetLocalPlayer() == Player(a)) {
if (Pressed[a][UP]) {
Cam(a).up();
}
if (Pressed[a][DOWN]) {
Cam(a).down();
}
if (Pressed[a][LEFT]) {
Cam(a).left();
}
if (Pressed[a][RIGHT]) {
Cam(a).right();
}
}
}
}
//! textmacro Camera_KeyPress takes Key, KEY
function key$Key$Down() -> boolean {
TotalPressed += 1;
Pressed[GetPlayerId(GetTriggerPlayer())][$KEY$] = true;
if (TotalPressed == 1) {
TimerStart(Tim, TIMEOUT, true, function Expire);
}
return false;
}
function key$Key$Up() -> boolean {
TotalPressed -= 1;
Pressed[GetPlayerId(GetTriggerPlayer())][$KEY$] = false;
if (TotalPressed == 0) {
PauseTimer(Tim);
}
return false;
}
//! endtextmacro
//! runtextmacro Camera_KeyPress("Up", "UP");
//! runtextmacro Camera_KeyPress("Down", "DOWN");
//! runtextmacro Camera_KeyPress("Left", "LEFT");
//! runtextmacro Camera_KeyPress("Right", "RIGHT");
function createTriggers() {
trigger t;
//! textmacro Camera_Events takes Key, KEY
t = CreateTrigger();
TriggerRegisterPlayerEvent(t, Player(0), EVENT_PLAYER_ARROW_$KEY$_DOWN);
TriggerRegisterPlayerEvent(t, Player(1), EVENT_PLAYER_ARROW_$KEY$_DOWN);
TriggerAddCondition
(t
, Filter
(function key$Key$Down));
t = CreateTrigger();
TriggerRegisterPlayerEvent(t, Player(0), EVENT_PLAYER_ARROW_$KEY$_UP);
TriggerRegisterPlayerEvent(t, Player(1), EVENT_PLAYER_ARROW_$KEY$_UP);
TriggerAddCondition
(t
, Filter
(function key$Key$Up));
//! endtextmacro
//! runtextmacro Camera_Events("Up", "UP");
//! runtextmacro Camera_Events("Down", "DOWN");
//! runtextmacro Camera_Events("Left", "LEFT");
//! runtextmacro Camera_Events("Right", "RIGHT");
}
}
function onInit() {
initCameras();
createTriggers();
}
}
//! endzinc