CBump Template
From GiderosMobile
Here you will find various resources to help you create games and apps in Gideros Studio.
note: You may have to provide your own assets (fonts, gfx, …).
Description
This section deals with various ways to use CBump.
Using CBump and TILED (handles collisions)
-- usage
--local map = CBumpTiled.new("tiled/test.lua", world, bg, true)
-- where world is the cbump world
-- bg is a sprite layer (here a background sprite layer)
-- true if only foreground is added to cbump collision world
CBumpTiled = Core.class(Sprite)
local function gid2tileset(map, gid)
for i = 1, #map.tilesets do
local tileset = map.tilesets[i]
if tileset.firstgid <= gid and gid <= tileset.lastgid then
return tileset
end
end
end
function CBumpTiled:init(filename, xworld, xlayer, xtop)
-- Bits on the far end of the 32-bit global tile ID are used for tile flags (flip, rotate)
local FLIPPED_HORIZONTALLY_FLAG = 0x80000000;
local FLIPPED_VERTICALLY_FLAG = 0x40000000;
local FLIPPED_DIAGONALLY_FLAG = 0x20000000;
local map = loadfile(filename)()
for i = 1, #map.tilesets do
local tileset = map.tilesets[i]
tileset.sizex = math.floor((tileset.imagewidth - tileset.margin + tileset.spacing) / (tileset.tilewidth + tileset.spacing))
tileset.sizey = math.floor((tileset.imageheight - tileset.margin + tileset.spacing) / (tileset.tileheight + tileset.spacing))
tileset.lastgid = tileset.firstgid + (tileset.sizex * tileset.sizey) - 1
tileset.texture = Texture.new(tileset.image, false, {transparentColor = tonumber(tileset.transparentcolor)})
end
for i = 1, #map.layers do
if map.layers[i].type == "tilelayer" then
local layer = map.layers[i]
local tilemaps = {}
for y = 1, layer.height do
for x = 1, layer.width do
local i = x + (y - 1) * layer.width
local gid = layer.data[i]
if gid ~= 0 then
-- Read flipping flags
flipHor = gid & FLIPPED_HORIZONTALLY_FLAG
flipVer = gid & FLIPPED_VERTICALLY_FLAG
flipDia = gid & FLIPPED_DIAGONALLY_FLAG
-- Convert flags to gideros style
if(flipHor ~= 0) then flipHor = TileMap.FLIP_HORIZONTAL end
if(flipVer ~= 0) then flipVer = TileMap.FLIP_VERTICAL end
if(flipDia ~= 0) then flipDia = TileMap.FLIP_DIAGONAL end
-- Clear the flags from gid so other information is healthy
gid = gid & ~ (
FLIPPED_HORIZONTALLY_FLAG |
FLIPPED_VERTICALLY_FLAG |
FLIPPED_DIAGONALLY_FLAG
)
end
local tileset = gid2tileset(map, gid)
if tileset then
local tilemap = nil
tilemap = TileMap.new(
layer.width,
layer.height,
tileset.texture,
tileset.tilewidth,
tileset.tileheight,
tileset.spacing,
tileset.spacing,
tileset.margin,
tileset.margin,
map.tilewidth,
map.tileheight
)
tilemaps[tileset] = tilemap
local tx = (gid - tileset.firstgid) % tileset.sizex + 1
local ty = math.floor((gid - tileset.firstgid) / tileset.sizex) + 1
-- Set the tile with flip info
tilemap:setTile(x, y, tx, ty, (flipHor | flipVer | flipDia))
xlayer:addChild(tilemap)
xlayer:setAlpha(layer.opacity)
if xtop then
if layer.id == 1 then
xworld:add(
tilemap,
(x - 1) * tileset.tilewidth * xlayer:getScaleX(),
(y - 1) * tileset.tileheight * xlayer:getScaleY(),
tileset.tilewidth * xlayer:getScaleX(),
tileset.tileheight * xlayer:getScaleY()
)
end
else
xworld:add(
tilemap,
(x - 1) * tileset.tilewidth * xlayer:getScaleX(),
(y - 1) * tileset.tileheight * xlayer:getScaleY(),
tileset.tilewidth * xlayer:getScaleX(),
tileset.tileheight * xlayer:getScaleY()
)
end
end
end
end
end
end
end
Usage
This is an example of how to set up CBump and TILED.
-- cbump
local cbump = require "cbump"
local world = cbump.newWorld() -- default is 64
-- camera
local camera = Sprite.new()
local bg = Sprite.new()
bg:setColorTransform(255/255, 0/255, 0/255, 255/255)
local fg = Sprite.new()
camera:setScale(1)
camera:addChild(bg)
camera:addChild(fg)
stage:addChild(camera)
-- tiled
local map = CBumpTiled.new("tiled/test.lua", world, bg, true)