Skip to content

Commit

Permalink
Merge pull request #102 from PunchWolf/rapanui-multilayer
Browse files Browse the repository at this point in the history
Rapanui multilayer support (RNLayer)
  • Loading branch information
MattiaFortunati committed Dec 10, 2012
2 parents 021e87f + 36f2950 commit be10e0d
Show file tree
Hide file tree
Showing 38 changed files with 6,198 additions and 9 deletions.
40 changes: 40 additions & 0 deletions rapanui-samples/multilayer/rn-multilayer-hud.lua
@@ -0,0 +1,40 @@
-------------------------------------------------------------------------
-- Date: 12/05/2012
-- @Author: Marko Pukari
-- Multilayer is used to create HUD layer which stays stationary.
-- all objects added to he HUD layer will move with the camera movement
--
--------------------------------------------------------------------------

-- variables to make our work easier
local screen = RNFactory.screen
local viewport = screen.viewport
local layers = screen.layers
local mainlayer = layers:get(RNFactory.MAIN_LAYER)

-- create camera and place it to the main layer
local camera = MOAICamera2D.new ()

layers:get(RNLayer.MAIN_LAYER):setCamera(camera)

--create new layer for hud
local hudlayer = layers:createLayerWithPartition(RNLayer.HUD_LAYER,viewport)

--create backgroud
--if you don't give the layer to the create, the image will be added to the mainlayer
local background = RNFactory.createImageFrom("images/background-landscape-hd.png",mainlayer)
local gamegroup = RNGroup:new()

--create new image to the game/mainlayer
local gameobject = RNFactory.createImageFrom("images/tile0.png",mainlayer)
gameobject.x = 100
gameobject.y = 100

--create new image to the hudlayer
local hudobject = RNFactory.createImageFrom("images/tile1.png",hudlayer)
hudobject.x = 200
hudobject.y = 300

--move camera. Hud image stays on the same place while the camera moves acros the
--background. Images on game/mainlayer stays where they where placed
camera:seekLoc(100,100,5)
6 changes: 5 additions & 1 deletion rapanui-sdk/RNFactory.lua
Expand Up @@ -262,6 +262,10 @@ function RNFactory.createPageSwipe(name, params)
end

function RNFactory.createImage(image, params)
return RNFactory.createImageFrom(image,RNFactory.screen.layers:get(RNLayer.MAIN_LAYER),params)
end

function RNFactory.createImageFrom(image, layer, params)

local parentGroup, left, top

Expand Down Expand Up @@ -295,7 +299,7 @@ function RNFactory.createImage(image, params)
o.x = o.originalWidth / 2 + left
o.y = o.originalHeight / 2 + top

RNFactory.screen:addRNObject(o)
RNFactory.screen:addRNObject(o,nil,layer)

if parentGroup ~= nil then
parentGroup:insert(o)
Expand Down
84 changes: 84 additions & 0 deletions rapanui-sdk/RNLayer.lua
@@ -0,0 +1,84 @@
--[[
--
-- RapaNui
--
-- by Ymobe ltd (http://ymobe.co.uk)
--
-- LICENSE:
--
-- RapaNui uses the Common Public Attribution License Version 1.0 (CPAL) http://www.opensource.org/licenses/cpal_1.0.
-- CPAL is an Open Source Initiative approved
-- license based on the Mozilla Public License, with the added requirement that you attribute
-- Moai (http://getmoai.com/) and RapaNui in the credits of your program.
]]

-- Author: niom
-- Date: 11/25/12

RNLayer = {
LAYER_WITH_SAME_NAME_EXISTS = "layer with same name already exists",
MAIN_LAYER = "mainlayer"
}

function RNLayer:new()
local layers = {}
setmetatable(layers,self)
self.__index = self
return layers
end

function RNLayer:createLayer(name,viewport)
local layer = MOAILayer2D.new()
local index = table.getn(self) + 1

if self:get(name) then
return nil, RNLayer.LAYER_WITH_SAME_NAME_EXISTS
end

self[index] = {}
self[index].layer = layer
self[index].name = name
layer:setViewport(viewport)
MOAISim.pushRenderPass(layer)

return layer
end

function RNLayer:get(name)
for i,container in pairs(self) do
if container.name == name then
return container.layer
end
end
end

function RNLayer:createLayerWithPartition(name,viewport)
local layer = self:createLayer(name,viewport)
local partition = MOAIPartition.new()
layer:setPartition(partition)
return layer,partition
end

function RNLayer:remove(layer)
for i, container in pairs(self) do
if container.layer == layer then
self:clearContainer(container)
table.remove(self, i)
end
end
end

function RNLayer:removeAll()
while table.getn(self) > 0 do
self:clearContainer(self[1])
table.remove(self, 1)
end
end

function RNLayer:clearContainer(container)
container.layer:clear()
container.layer = nil
container.name = nil
end

return RNLayer
27 changes: 20 additions & 7 deletions rapanui-sdk/RNScreen.lua
Expand Up @@ -27,6 +27,7 @@ function RNScreen:new(o)
spriteIndex = 0,
viewport = nil,
layer = nil,
layers = nil,
visible = true
}

Expand All @@ -52,24 +53,31 @@ function RNScreen:initWith(width, height, screenWidth, screenHeight)
self.viewport:setSize(screenWidth, screenHeight)
self.viewport:setScale(width, -height)
self.viewport:setOffset(-1, 1)
self.layer = MOAILayer2D.new()
self.layers = RNLayer:new()
self.layer,self.mainPartition = self.layers:createLayerWithPartition(RNLayer.MAIN_LAYER,self.viewport)
self.layer:setViewport(self.viewport)

self.mainPartition = MOAIPartition.new()
self.layer:setPartition(self.mainPartition)

MOAISim.pushRenderPass(self.layer)
end

function RNScreen:addRNObject(object, mode)
--[[
layer parameter can be either partition or layer since
both MOAIObjects have the insertProp function.
--]]
function RNScreen:addRNObject(object, mode, layer)
if object == nil then
return
end
if layer == nil then
layer = self.mainPartition
end
object:setLocatingMode(mode)
self.mainPartition:insertProp(object:getProp())
layer:insertProp(object:getProp())
object:setParentScene(self)
object:updateLocation()
Expand All @@ -82,8 +90,13 @@ function RNScreen:addRNObject(object, mode)
object:getProp().RNObject = object
end
function RNScreen:removeRNObject(object)
self.layer:removeProp(object:getProp())
function RNScreen:removeRNObject(object, layer)
if(layer == nil) then
layer = self.layers:get(RNLayer.MAIN_LAYER)
end
layer:removeProp(object:getProp())
-- local id = object.idInScreen
-- local len = table.getn(self.sprites)
-- local ind = id
Expand Down
2 changes: 1 addition & 1 deletion rapanui-sdk/rapanui.lua
Expand Up @@ -23,7 +23,7 @@ RNButton = require("rapanui-sdk/RNButton")
RNEvent = require("rapanui-sdk/RNEvent")
RNScreen = require("rapanui-sdk/RNScreen")
RNWrappedEventListener = require("rapanui-sdk/RNWrappedEventListener")

RNLayer = require("rapanui-sdk/RNLayer")

-- Touch Listeners requires

Expand Down
13 changes: 13 additions & 0 deletions rapanui-test/RNFactory-hooks.lua
@@ -0,0 +1,13 @@
-- Author: Marko Pukari
-- Date: 12/2/12

function suite_setup()
require("RNFactory")
end

function suite_teardown()
end

function test_ok()
assert_true(true)
end
102 changes: 102 additions & 0 deletions rapanui-test/RNFactoryTest.lua
@@ -0,0 +1,102 @@
-- Author: Marko Pukari
-- Date: 12/2/12

package.path = package.path .. ";../?.lua;lunatest/?.lua;mockobjects/?.lua;../rapanui-sdk/?.lua"
require('lunatest')
require('lunahamcrest')
require('MockRNLayer')
require('MockRNScreen')
require('MockRNGroup')
require('MockMOAISim')
require('MockRNInputManager')
require('MockConstants')
require('MockRNObject')
require('MockLayer')

lunatest.suite("RNFactory-hooks")


RNLayer = createMockRNLayer(MockConstants.MAIN_LAYER)
RNGroup = createMockRNGroup()
RNScreen = createMockRNScreen()
MOAISim = createMockMOAISim()
RNInputManager = createMockRNInputManager()
RNObject = createRNObject()

MOAIEnvironment = {
screenWidth = MockConstants.SCREENWIDTH,
screenHeight = MockConstants.SCREENHEIGHT
}

config = {
stretch = {}
}
function init()
RNObject:reset()
end

--RNFactory default creation
function testRNScreenIsCreatedWhenRNFactoryIsCreated()
assert_that(RNScreen.newCalled,is(greater_than(0)))
end

function testThatRNGroupIsCreateWhenRNFactoryIsCreated()
assert_that(RNGroup.newCalled,is(greater_than(0)))
end

function testThatCreateRNFactoryOpensNewMOAISimWindow()
assert_that(MOAISim.openWindowCalled,is(greater_than(0)))
end

function testThatRNScreenInitWithIsCalled()
assert_that(RNScreen.initWithCalled,is(greater_than(0)))
local params = RNScreen.initWithParams
end

function testThatSetGlobalRNScreenIsCalled()
assert_that(MockRNInputManager.setGlobalRNScreenCalled,is(greater_than(0)))
end

--RNFactory:createImage()

function testThatCreateImageCreatesNewObject()
init()
RNFactory.createImage("img")
assert_that(RNObject.newCalled,is(greater_than(0)))
end

function testThatCreateImageInitsTheCreatedObject()
init()
RNFactory.createImage("img")
assert_that(RNObject.initWithImage2Called,is(greater_than(0)))
end

function testThatCreateImageAddsObjectToTheScreen()
init()
RNFactory.createImage("img")
assert_that(RNScreen.addRNObjectCalled,is(greater_than(0)))
end

function testThatCreateImageAddsObjectToTheMainGroup()
init()
RNFactory.createImage("img")
assert_that(RNGroup.insertCalled,is(greater_than(0)))
end

function testThatCreateImageReturnsProperDeckAndRNObject()
init()
local rnobject,deck = RNFactory.createImage("img")
assert_not_nil(rnobject)
assert_not_nil(deck)
assert_true(rnobject == RNObject)
end

function testThatCreateImageFromReturnsProperDeckAndRNObject()
init()
local rnobject,deck = RNFactory.createImageFrom("img")
assert_not_nil(rnobject)
assert_not_nil(deck)
assert_true(rnobject == RNObject)
end

lunatest.run()

0 comments on commit be10e0d

Please sign in to comment.