Camera Scripts

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


This page was last modified on 26 November 2010, at 11:25. This page has been accessed 2,793 times.

  

Copyright © 2006