Difference between revisions of "CBump Template"

From GiderosMobile
(added content)
 
(changed old bit operations to new bitwise operators)
Line 22: Line 22:
 
--local map = CBumpTiled.new("tiled/test.lua", world, bg, true)
 
--local map = CBumpTiled.new("tiled/test.lua", world, bg, true)
 
-- where world is the cbump world
 
-- where world is the cbump world
-- bg is a sprite layer (here a background sprite)
+
-- bg is a sprite layer (here a background sprite layer)
-- true is if only foreground is added to cbump collision world
+
-- true if only foreground is added to cbump collision world
  
 
CBumpTiled = Core.class(Sprite)
 
CBumpTiled = Core.class(Sprite)
Line 37: Line 37:
  
 
function CBumpTiled:init(filename, xworld, xlayer, xtop)
 
function CBumpTiled:init(filename, xworld, xlayer, xtop)
require "bit"
 
 
-- Bits on the far end of the 32-bit global tile ID are used for tile flags (flip, rotate)
 
-- 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_HORIZONTALLY_FLAG = 0x80000000;
Line 60: Line 59:
 
if gid ~= 0 then
 
if gid ~= 0 then
 
-- Read flipping flags
 
-- Read flipping flags
flipHor = bit.band(gid, FLIPPED_HORIZONTALLY_FLAG)
+
flipHor = gid & FLIPPED_HORIZONTALLY_FLAG
flipVer = bit.band(gid, FLIPPED_VERTICALLY_FLAG)
+
flipVer = gid & FLIPPED_VERTICALLY_FLAG
flipDia = bit.band(gid, FLIPPED_DIAGONALLY_FLAG)
+
flipDia = gid & FLIPPED_DIAGONALLY_FLAG
 
-- Convert flags to gideros style
 
-- Convert flags to gideros style
 
if(flipHor ~= 0) then flipHor = TileMap.FLIP_HORIZONTAL end
 
if(flipHor ~= 0) then flipHor = TileMap.FLIP_HORIZONTAL end
Line 68: Line 67:
 
if(flipDia ~= 0) then flipDia = TileMap.FLIP_DIAGONAL end
 
if(flipDia ~= 0) then flipDia = TileMap.FLIP_DIAGONAL end
 
-- Clear the flags from gid so other information is healthy
 
-- Clear the flags from gid so other information is healthy
gid = bit.band(
+
gid = gid & ~ (
gid,
+
FLIPPED_HORIZONTALLY_FLAG |
bit.bnot(
+
FLIPPED_VERTICALLY_FLAG |
bit.bor(
+
FLIPPED_DIAGONALLY_FLAG
FLIPPED_HORIZONTALLY_FLAG,
 
FLIPPED_VERTICALLY_FLAG,
 
FLIPPED_DIAGONALLY_FLAG
 
)
 
)
 
 
)
 
)
 
end
 
end
Line 100: Line 94:
 
local ty = math.floor((gid - tileset.firstgid) / tileset.sizex) + 1
 
local ty = math.floor((gid - tileset.firstgid) / tileset.sizex) + 1
 
-- Set the tile with flip info
 
-- Set the tile with flip info
tilemap:setTile(x, y, tx, ty, bit.bor(flipHor, flipVer, flipDia))
+
tilemap:setTile(x, y, tx, ty, (flipHor | flipVer | flipDia))
 
xlayer:addChild(tilemap)
 
xlayer:addChild(tilemap)
 
xlayer:setAlpha(layer.opacity)
 
xlayer:setAlpha(layer.opacity)

Revision as of 09:48, 27 November 2019


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)