Page 1 of 3

Wrapper instead of porting Love2D

Posted: Thu Feb 02, 2012 3:57 pm
by SiENcE
Hi,

as you may noticed, i wrote an wrapper for Codea (App to code on iPad with similar API) called LoveCodify. This way you can run Codea scripts in Love2D (so you can also develop on pc).

Now i stumbled across Corona SDK and Moai. Both support mostly mobile devices and expose a Lua API for the user like Love2D. (i know there are much more similar frameworks out there (luaplayer aso.))

What about writing a lua wrapper script to run Love2D scripts with corona or moai? This way love2D don't has to be ported (and supported) to all different mobile platforms.

What you think about?

cheers

Re: Wrapper instead of porting Love2D

Posted: Thu Feb 02, 2012 4:12 pm
by kikito
1. It looks like quite a lot of work
2. Moai is opensource and royalty-free, so that one would be my preference.

Re: Wrapper instead of porting Love2D

Posted: Thu Feb 02, 2012 4:21 pm
by SiENcE
kikito wrote:1. It looks like quite a lot of work
2. Moai is opensource and royalty-free, so that one would be my preference.
I wrote the basics of lovecodify in 2 days and not everything has to be wrapped. Stubs should mostly do it.

Re: Wrapper instead of porting Love2D

Posted: Thu Feb 02, 2012 4:44 pm
by coffee
1. Moai for opensource and royalty-free
2. CoronaSDK if need do Closed/commercial projects
Would be nice see LOVE in iOS however.

Re: Wrapper instead of porting Love2D

Posted: Fri Feb 03, 2012 3:53 pm
by SiENcE
Here is a first working sample to run Love2D lua scripts with Moai SDK.

But there is one big problem and i don't have a solution yet!

To create an Object you have to create a texture using MOAIGfxQuad2D and afterwards you have use the texture to make an Object calling MOAIProp2D. Then you insert the object into the drawing layer.

In Moai SDK the draw operation is only an update operation. So it only updates the location of an existing object in the drawing layer.

So only one cloud is updated, just because we have only one cloud object.

Bad Idea 1:
Calling MOAIProp2D in the draw method is bad, just because everytime "love.graphics.draw" is called, an additional object is instantiated.

Idea 2
Maybe we have todo a list, to remember and check the instantiated object in the draw operation.

Any other ideas or solutions?

Moai file : "main.lua"

Code: Select all

print ( "hello, moai here is love!" )

require ("moai_love2d_wrapper")
require ("main1")

SCREEN_UNITS_X = 800
SCREEN_UNITS_Y = 600
SCREEN_WIDTH = SCREEN_UNITS_X
SCREEN_HEIGHT = SCREEN_UNITS_Y

MOAISim.openWindow ( "moai_love2d_wrapper_test", SCREEN_WIDTH, SCREEN_HEIGHT )

viewport = MOAIViewport.new ()
viewport:setScale ( SCREEN_UNITS_X, SCREEN_UNITS_Y )
viewport:setSize ( SCREEN_WIDTH, SCREEN_HEIGHT )

layer = MOAILayer2D.new ()
layer:setViewport ( viewport )
MOAISim.pushRenderPass ( layer )

love.load()

--==============================================================
-- game loop
--==============================================================
mainThread = MOAIThread.new ()

gameOver = false

mainThread:run ( 
	function ()

		local frames = 0

		while not gameOver do
		
			coroutine.yield ()
			frames = frames + 1
			
			-- call Love2D callbacks
			love.update( MOAISim.framesToTime (frames) )
			love.draw()
--			love.keypressed(k)
		end
		
	end 
)
wrapper for love2d : "moai_love2d_wrapper.lua"

Code: Select all

love = {}
love.graphics = {}
function love.graphics.newImage(file)
    local tex = MOAITexture.new ()
    tex:load ( file )
    local xtex, ytex = tex:getSize ()
	
	local gfxQuad = MOAIGfxQuad2D.new ()
	gfxQuad:setTexture ( tex )
	gfxQuad:setRect ( xtex/2*-1, ytex/2*-1, xtex/2, ytex/2 )
--	return gfxQuad

	local prop = MOAIProp2D.new ()
	prop:setDeck ( gfxQuad )
	prop:setLoc ( -1000, -1000 )	--hack to place the gfx ouside the screen
	layer:insertProp ( prop )
	return prop
end

function love.graphics.draw( prop, x, y, r, sx, sy, ox, oy )
	prop:setLoc ( x-400, y-300 )
	prop:forceUpdate ()
end

function love.graphics.setBackgroundColor() end
function love.graphics.setColor() end
function love.graphics.newImageFont() end
function love.graphics.quad() end
function love.graphics.setFont() end
function love.graphics.print() end

love.audio = {}
function love.audio.play() end
function love.audio.newSource() end

love.filesystem = {}
function love.filesystem.load() end
love2d sample "Passing Clouds Demo" : "main1.lua" <- take this from the love2d samples

Code: Select all

-------------------------------------------------
-- LOVE: Passing Clouds Demo								
-- Website: http://love.sourceforge.net			
-- Licence: ZLIB/libpng									
-- Copyright (c) 2006-2009 LOVE Development Team
-------------------------------------------------

function love.load()
	
	-- The amazing music.
	music = love.audio.newSource("prondisk.xm")
	
	-- The various images used.
	body = love.graphics.newImage("body.png")
	ear = love.graphics.newImage("ear.png")
	face = love.graphics.newImage("face.png")
	logo = love.graphics.newImage("love.png")
	cloud = love.graphics.newImage("cloud_plain.png")

	-- Set the background color to soothing pink.
	love.graphics.setBackgroundColor(0xff, 0xf1, 0xf7)
	
	-- Spawn some clouds.
	for i=1,5 do
		spawn_cloud(math.random(-100, 900), math.random(-100, 700), 80 + math.random(0, 50))
	end
	
	love.graphics.setColor(255, 255, 255, 200)
	
	love.audio.play(music, 0)
	
end

function love.update(dt)
	try_spawn_cloud(dt)
	
	nekochan:update(dt)
	
	-- Update clouds.
	for k, c in ipairs(clouds) do
		c.x = c.x + c.s * dt
	end
	
end

function love.draw()

	love.graphics.draw(logo, 400, 380, 0, 1, 1, 128, 64)
	
	for k, c in ipairs(clouds) do
		love.graphics.draw(cloud, c.x, c.y)
	end
	
	nekochan:render()
	
end

function love.keypressed(k)
	if k == "r" then
		love.filesystem.load("main.lua")()
	end
end


nekochan = {
	x = 400, 
	y = 250, 
	a = 0
}

function nekochan:update(dt)
		self.a = self.a + 10 * dt	
end

function nekochan:render()
	love.graphics.draw(body, self.x, self.y, 0, 1, 1, 64, 64)
	love.graphics.draw(face, self.x, self.y + math.sin(self.a/5) * 3, 0, 1, 1, 64, 64)
	local r = 1 + math.sin(self.a*math.pi/20)
	for i = 1,10 do
		love.graphics.draw(ear, self.x, self.y, (i * math.pi*2/10) + self.a/10, 1, 1, 16, 64+10*r)
	end
	
end

-- Holds the passing clouds.
clouds = {}

cloud_buffer = 0
cloud_interval = 1

-- Inserts a new cloud.
function try_spawn_cloud(dt)

	cloud_buffer = cloud_buffer + dt
	
	if cloud_buffer > cloud_interval then
		cloud_buffer = 0
		spawn_cloud(-512, math.random(-50, 500), 80 + math.random(0, 50))
	end
		
end

function spawn_cloud(xpos, ypos, speed)
	table.insert(clouds, { x = xpos, y = ypos, s = speed } )
end

Re: Wrapper instead of porting Love2D

Posted: Fri Feb 03, 2012 4:16 pm
by bartbes
Perhaps you should create them on draw and cache them, so if in frame 0 there are X draw calls on the same image, X sprites are created, then if there are X draw calls on that image in frame 1, it re-uses those objects, and it should add/remove on demand. Not quite sure about how efficient it would be, but it would work.
You wouldn't even have to remove directly, but wait a few frames and put it outside of the drawing area in the mean time.

Re: Wrapper instead of porting Love2D

Posted: Fri Feb 03, 2012 4:20 pm
by SiENcE
Yes thats exactly my Idea 2. I'm fiddling with it, but i cant get it working.

Re: Wrapper instead of porting Love2D

Posted: Tue Feb 07, 2012 10:39 am
by molul
I'm really interested in this wrapper since yesterday that I knew about Moai. If it eventually worked, would it mean that Love2D games could be ported to iOS and Android?

Re: Wrapper instead of porting Love2D

Posted: Tue Feb 07, 2012 12:58 pm
by kikito
Is there a more convenient place to get the source code of this than in the forum post? A github project would be very nice. Other people would be able to send you changes via pull requests.

Re: Wrapper instead of porting Love2D

Posted: Tue Feb 07, 2012 3:25 pm
by SiENcE
kikito wrote:Is there a more convenient place to get the source code of this than in the forum post? A github project would be very nice. Other people would be able to send you changes via pull requests.
If someone helps to find a sollution for the above mention problem, yes, i will do a github and work further on it. If not, i tend to choose a different mobile lua engine.