Page 1 of 1

Bootstap Script

Posted: Tue Jul 28, 2009 7:52 pm
by peaches
So I've been using Love for 24 hours, and it's great! Coming over from Processing (http://www.processing.org), it's refreshing to find a similar community with a cleaner scripting language and more rich physics and geometry.

My only gripe is how verbose the platform API is (love.blah.blah), so I've been writing a bootstrap script to flatten the namespaces (lua, to the rescue!). Right now, it looks like this:

Code: Select all

default_mod = default_mod or _G

function GetFunctionsFrom(mod, into)
	into = into or default_mod
	for k,v in pairs(mod) do
		if type(v) == "function" then
			into[k:sub(1,1):upper()..k:sub(2,-1)] = v
		end
	end
end

function GetConstantsFrom(mod, into)
	into = into or default_mod
	for k,v in pairs(mod) do
		t = type(v)
		if t == "number" or t == "string" then
			into[k:upper()] = v
		end
	end
end

GetConstantsFrom(love)
GetFunctionsFrom(love.graphics)
GetFunctionsFrom(love.audio)
GetFunctionsFrom(love.physics)

input = {}
GetFunctionsFrom(love.mouse, input)
GetFunctionsFrom(love.keyboard, input)
GetFunctionsFrom(love.joystick, input)
I chose to Pascal-Case things both to avoid naming conflicts, and because it's my preference, coming from a C++ background.

Once run, code is much more economical:

Code: Select all

love.filesystem.require("bootstrap.lua")

function load()
	image = NewImage("icon.png")
	font = NewFont(DEFAULT_FONT, 12)
	SetFont(font)
	SetCaption("Hello, World")
	SetBackgroundColor(155,155,255)
	input.SetVisible(false)
end

function draw()
	SetColor(200,200,255)
	Circle(DRAW_FILL, 0.65*GetWidth(), GetHeight()+400, 750, 75)
	SetColor(255,255,255)
	Drawf("Hello, World!",input.GetX()-50, input.GetY()-35, 100, ALIGN_CENTER)
	Draw(image, input.GetX(), input.GetY())
end
Pointers, anyone?

Again, <3 <3 <3!!! :nyu:

Re: Bootstap Script

Posted: Wed Jul 29, 2009 12:21 am
by JSharpe
It looks nice for small quick scripts. I may use it. Though i couldn't see me using this for a larger project, it would get far too confusing with such minimal information on what functions i'm calling unless i documented each line. I'm also new to LOVE and found the system it uses rather confusing at first, but i got use to it quickly.

Good job with it though :)

Re: Bootstap Script

Posted: Wed Jul 29, 2009 6:17 pm
by peaches
I've added some lua-magic for declaring classes:

Code: Select all

function DeclareClass(class)
	class.__index = class
	class.new = function(self,o)
		o = o or {}
		setmetatable(o,self)
		if class.initialize then
			o:initialize()		
		end
		return o
	end
end
So in app code:

Code: Select all

love.filesystem.require("bootstrap.lua")

Point = { x=0, y=0 }

function Point:initialize()
	print("creating a new point ("..self.x..","..self.y..")")
end

function Point:length()
	return math.sqrt(self.x*self.x + self.y*self.y)
end

DeclareClass(Point)

p = Point:new{x=7}
print(p:Length())
It's not too different from the stuff in the lua reference manual, but I'm having trouble defining DeclareSubclass(sub,base). Any tips?

Re: Bootstap Script

Posted: Wed Jul 29, 2009 6:55 pm
by Robin
For all that (and more) you could just use SECS, the class system by our own bartbes.
Declaring classes is done by replacing

Code: Select all

Point = {}
DeclareClass(Point)
by

Code: Select all

Point = class:new()
And subclassing is done by

Code: Select all

subclass = baseclass:new()

Re: Bootstap Script

Posted: Wed Jul 29, 2009 9:08 pm
by Zorbatron
Yeah, I really wish rude or someone would flatten the name spaces, honestly I don't see why there has to be love.*, I think it should be graphics.*, filesystem.*, ect.

I made a class/deriving engine on my own without referencing anything other than my experience with C++. I'm a freak when it comes to optimizing scripting code, espeically at times like this. Since classes will be used so frequently I feel it is important they are as simple and optimized as possible while offering maximum flexibility.

My class dervice system can have any class derive as many times as it wants! With no added overhead!
It does this by adding my own custom command #IMPORT (args) and #EXPORT which is parsed by what you could call my custom 'preprocessor' all implmented in lua of course.

Since all my classes are inside a folder, with the filename as their actual name, it is easy for my preprocessor parser to determine what class and what function to import. I would explain this more indepth if someone wants me to. But overall, it copies the code for you into deriving classes and refactors the variables as specified by the deriving (sub) class. This is the most efficent way to do it I belive. I have tried other methods, but have not been able to come up with a method that allows instances to be created with no extra overhead (extra tables for each base class).

Re: Bootstap Script

Posted: Thu Jul 30, 2009 12:22 am
by peaches
@Robin - thank you, you're LOVEly! ;) I ended up basically deriving his "basic" version through my own muddling, but I didn't know about the ellipsis (...) vararg syntax for the constructor. Score!

@Zorbatron - Micro-optimization is the meat of my day-job. LOVE is for blissfully indulging in the belief that the script cost is negligible and I can just MAKE COOL STUFF FAST. When one starts worrying about the cost of a table lookup, he's stopped thinking about how FAST that STUFF can be made COOLER.

Re: Bootstap Script

Posted: Thu Jul 30, 2009 12:24 am
by peaches
In fairness, my last reply was a bit hypocritical. The first thing I did with love was read the C++ source and cringe at the use of STL containers. We're only human, teehee.

Re: Bootstap Script

Posted: Thu Jul 30, 2009 3:31 am
by bartbes
@robin: thanks!

well, love isn't optimized, but then again, it's still beta (or pre-alpha, i'd link to the roadmap if i weren't on a psp)

Re: Bootstap Script

Posted: Thu Jul 30, 2009 5:50 am
by Pliskin09
i dont mind how its done. its easy to remember :D

i love graphics (love.graphics), i love keyboard (love.keyboard), i love mouse (love.mouse) etc, i love LÖVE lol :ultraglee: