Difference between revisions of "Camera Scripts"
Opofefemucu (talk | contribs) |
Wiki.xmoto (talk | contribs) m (Reverted edits by Opofefemucu (Talk) to last revision by GrayFace) |
||
Line 1: | Line 1: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Here are some scripts you can use in your level. | Here are some scripts you can use in your level. | ||
Line 27: | Line 19: | ||
'''Game.CameraMoveAbs(x, y)''' moves the camera to position (x, y) in level coordinates. | '''Game.CameraMoveAbs(x, y)''' moves the camera to position (x, y) in level coordinates. | ||
− | '''Example:''' Game.CameraMoveTo(Game.GetEntityPos( | + | '''Example:''' Game.CameraMoveTo(Game.GetEntityPos("cam1")) -- make camera look at "cam1" sprite |
To use the functions add this script to your Lua file: | To use the functions add this script to your Lua file: | ||
Line 73: | Line 65: | ||
Example: | Example: | ||
function OnLoad() | function OnLoad() | ||
− | StaticCamera(Game.GetEntityPos( | + | StaticCamera(Game.GetEntityPos("cam1")) -- make the camera always look at "cam1" sprite |
return true | return true | ||
end | end | ||
Line 116: | Line 108: | ||
Usage: | Usage: | ||
− | Create sprites in your level at points where you want cameras to be. Name them | + | Create sprites in your level at points where you want cameras to be. Name them "cam1", "cam2", "cam3" and so on. (use Effects -> X-moto -> Other -> Change Id in Inkscape) I suggest using invisible sprites. |
Then call '''UseZoneCamera(cam_count, keep_cams)''' to turn zone cameras on. | Then call '''UseZoneCamera(cam_count, keep_cams)''' to turn zone cameras on. | ||
Line 126: | Line 118: | ||
Example: | Example: | ||
function OnLoad() | function OnLoad() | ||
− | UseZoneCamera(3) -- if you have only 3 cameras: | + | UseZoneCamera(3) -- if you have only 3 cameras: "cam1", "cam2", "cam3" |
return true | return true | ||
end | end | ||
− | You can also make some camera preferable. Change its ''Sprite scale'' value to do so. (in Effects - | + | You can also make some camera preferable. Change its ''Sprite scale'' value to do so. (in Effects -> X-moto -> Entities -> Sprite dialog) Set bigger value to make the camera more 'respected'. The script likes bigger cameras ;) |
Test your level in 1280x1024 resolution to make sure player is always visible. | Test your level in 1280x1024 resolution to make sure player is always visible. | ||
Line 166: | Line 158: | ||
for i = 1, CamCount do | for i = 1, CamCount do | ||
local d = dist(i) | local d = dist(i) | ||
− | if not m or d | + | if not m or d < m then |
m = d | m = d | ||
cam = i | cam = i | ||
Line 176: | Line 168: | ||
for i = 1, CamCount do | for i = 1, CamCount do | ||
− | local name = | + | local name = "cam"..i |
local cam = {Game.GetEntityPos(name)} | local cam = {Game.GetEntityPos(name)} | ||
cam[3] = Game.GetEntityRadius(name) | cam[3] = Game.GetEntityRadius(name) |
Latest revision as of 11:25, 26 November 2010
Here are some scripts you can use in your level.
Extended Camera
This script adds new functions to control camera position.
Game.CameraPos() returns camera position (x, y) relative to player position.
Usage: x, y = Game.CameraPos()
Game.CameraPosAbs() returns camera position (x, y) in level coordinates.
Usage: x, y = Game.CameraPosAbs()
Game.CameraMoveTo(x, y) moves the camera to position (x, y) relative to player.
Example: Game.CameraMoveTo(0, 0) -- return camera to its normal state
Game.CameraMoveAbs(x, y) moves the camera to position (x, y) in level coordinates.
Example: Game.CameraMoveTo(Game.GetEntityPos("cam1")) -- make camera look at "cam1" sprite
To use the functions add this script to your Lua file:
-- ExtendedCamera do local CamX, CamY = 0, 0 function Game.CameraPos() return CamX, CamY end function Game.CameraPosAbs() local x, y = Game.GetPlayerPosition() return x + CamX + 0.6, y + CamY end local Game_CameraMove = Game.CameraMove function Game.CameraMove(x, y, ...) if x ~= 0 and y ~= 0 then CamX = CamX + x CamY = CamY + y return Game_CameraMove(x, y, ...) end end function Game.CameraMoveTo(x, y) return Game.CameraMove(x - CamX, y - CamY) end function Game.CameraMoveAbs(x, y) local px, py = Game.CameraPosAbs() return Game.CameraMove(x - px, y - py) end end -- /ExtendedCamera
Author: GrayFace
Static Camera
This script lets you set the camera to a fixed position. The camera will not follow the player any more.
StaticCamera(x, y) will set the camera to (x, y) coordinates in the level
StaticCamera() (without parameters) will reset the camera, so it will follow the player again
Example:
function OnLoad() StaticCamera(Game.GetEntityPos("cam1")) -- make the camera always look at "cam1" sprite return true end
To use Static Camera add Extended Camera script to your Lua file and then add this script:
-- StaticCamera do local camX, camY local oldTick local function MyTick() local ret = oldTick and oldTick() or true Game.CameraMoveAbs(camX, camY) return ret end function StaticCamera(x, y) if x then if camX == nil then oldTick = Tick Tick = MyTick end camX, camY = x, y Game.CameraMoveAbs(camX, camY) else if camX then Tick = oldTick camX, camY = nil, nil Game.CameraMoveTo(0, 0) end end end end -- /StaticCamera
Author: GrayFace
Zone Camera (sprites based)
This script is based on idea from Cigam_Interesting Effect 03 (Zone Camera) level. It implements it using camera sprites instead of zones.
Usage:
Create sprites in your level at points where you want cameras to be. Name them "cam1", "cam2", "cam3" and so on. (use Effects -> X-moto -> Other -> Change Id in Inkscape) I suggest using invisible sprites.
Then call UseZoneCamera(cam_count, keep_cams) to turn zone cameras on.
cam_count parameter is the number of cameras.
If keep_cams parameter is true, the sprites used as cameras will remain on the level. If it's false or not specified, the sprites will be deleted once zone camera is activated.
Example:
function OnLoad() UseZoneCamera(3) -- if you have only 3 cameras: "cam1", "cam2", "cam3" return true end
You can also make some camera preferable. Change its Sprite scale value to do so. (in Effects -> X-moto -> Entities -> Sprite dialog) Set bigger value to make the camera more 'respected'. The script likes bigger cameras ;)
Test your level in 1280x1024 resolution to make sure player is always visible.
Note: don't use Zone Camera if it doesn't fit your level. It brings certain inconvenience into playing. IMO, it may be good only for rooms-based levels.
To use Zone Camera add Extended Camera script to your Lua file and then add this script:
-- UseZoneCamera function UseZoneCamera(CamCount, keep_sprites) -- const local stick_radius = 0.5 local y_coeff = 0.8 -- /const local Cams = {} local CurCam local CamX, CamY = 0, 0 local abs = math.abs local sqrt = math.sqrt local function ChangeCam() local x, y = Game.GetPlayerPosition() local function dist(cam) local c = Cams[cam] local dx, dy = abs(c[1] - x), abs(c[2] - y)*y_coeff return sqrt(dx*dx + dy*dy)/c[3] end local cam = CurCam local m = cam and (dist(cam) - stick_radius) for i = 1, CamCount do local d = dist(i) if not m or d < m then m = d cam = i end end CurCam = cam Game.CameraMoveAbs(Cams[cam][1], Cams[cam][2]) end for i = 1, CamCount do local name = "cam"..i local cam = {Game.GetEntityPos(name)} cam[3] = Game.GetEntityRadius(name) Cams[i] = cam if not keep_sprites then Game.KillEntity(name) end end ChangeCam() local oldTick = Tick Tick = function() local ret = oldTick and oldTick() or true ChangeCam() return ret end end -- /UseZoneCamera
Author: GrayFace