Newbie questions?

General discussion about LÖVE, Lua, game development, puns, and unicorns.
Grubby
Prole
Posts: 35
Joined: Sat Jun 01, 2013 2:46 am

Newbie questions?

Post by Grubby » Wed Dec 04, 2013 11:36 pm

Been a while since I posted, and I'm not sure if my post belongs here, but for the last 6 months I've been learning lua and created a pure lua simulation of running a restaurant. Tis all numerical and the only user intervention is clamped to changing the data tables by hand before the simulation runs.

Anyone remember Pizza Tycoon or Restaurant empire? In about 300+ years, I expect my simulation to be very similar, except I'm focusing on re-playability, financial reality, and absolute micro-management. Note I didn't use the word 'game' at all.

Having said that, I'm trying (as a newbie) to roll my simulation into a game-like form using the love2d/lua combo. Unfortunately, I'm still having a tough time wrapping my head around some of the love2d concepts. To keep things brief, I'll just ask a few stupid questions:

1 - What are the rules when using someone elses code? Would giving credit where credit is due be good enough? I mention this cuz "randomlua.lua" is the CORE pseudo-random number generator in my sim. <-- Mostly cuz I've read RND generation within lua isn't exactly stable across platforms.

2 - Is there no way to snag/copy a piece of the on-screen data (Sorta like a screen snapshot) but within a defined rectangle? Leads into question 3.

3 - What is the preferred way to create vertical scrolling text? I want a small box on my display to constantly push data (String) upward on a regular basis. The first thought I had was to snag/copy a section of the screnn, and just copy it back minus about 12 pixels, then print out the new data. Love2d seemingly can't do that? I ended up having to create a table, shove the strings there, and use table.remove/table.insert to control what was drawn on the screen every frame. This seems very weird to me. Surely, there is a way to simulate what a simple console device does in love2d? Right?

4 - Does 'screenshot = love.graphics.newScreenshot( )' even work? For some reason, I'm not able to see any results. And yes, I followed the wiki page instructions to make raw data into a drawable image. No errors and no visual results. Have I missed something?

Any suggestions appreciated...

Thanks

bekey
Party member
Posts: 255
Joined: Tue Sep 03, 2013 6:27 pm

[]

Post by bekey » Thu Dec 05, 2013 12:20 am

-snip-
Last edited by bekey on Fri Jan 24, 2014 1:55 am, edited 1 time in total.

User avatar
Hexenhammer
Party member
Posts: 175
Joined: Sun Feb 17, 2013 8:19 am

Re: Newbie questions?

Post by Hexenhammer » Thu Dec 05, 2013 7:39 am

Grubby wrote: 1 - What are the rules when using someone elses code? Would giving credit where credit is due be good enough?
That depends on the license of the code in question. Source code is subject to copyright law just like literature. Usually the source code itself contains a license statement right at the top of the file. If not, then the license is included in the source package. If there is no license to be found, you have a problem, because you cannot legally use the code.. Of course, you could simply ignore the law based on the probably correct assumption that the author intended his or her source code to be freely useable by everyone.

>I mention this cuz "randomlua.lua" is the CORE pseudo-random number generator in my sim. <-- Mostly cuz I've read RND generation within lua isn't exactly stable across platforms.

The soon to be released next version of LÖVE (0.9.0) will ship with a better PRNG which should return identical results on all platforms.

Grubby
Prole
Posts: 35
Joined: Sat Jun 01, 2013 2:46 am

Re: Newbie questions?

Post by Grubby » Mon Dec 09, 2013 10:44 pm

Thanks for the replies. An Oops on my part was that I was reading a rather old version of the Downloadable wiki. It never mentioned 'screenshot' worked only for 0.9.0. And yup, no error from love2d when using the screenshot function with the windows build of 0.8.0. As for using someone else's code, I don't like the idea, but there ARE some things so basic to computers (usable GUI) it just doesn't make sense to re-invent the wheel. Especially if it's just the plan for the wheel. I can carve the actual wheel myself.

Anyone mind if I ask a few more dumb questions? :)

Not sure why I'm asking this, but I thought I read somewhere that improper declaration of variables (style) can impact memory usage within Lua? Any truth to that? If so, any place I can read up on optimizing lua code or maybe some lessons on proper style? Again, the notion of programming style as an issue seems weird to me. Back in my C days, it really only mattered if I expected someone else to read and understand the code. Tab key? Whats that?

Currently, my love.load() function is getting way too huge to manage. Now that I'm incorporating some of my simulations data tables, I'm having a tough time trying to alter/test the love2d specific things I want. Gots to be a better way. Can I use 'require' to set up just my simulation data tables? Or would it be worth the time this early to just code some kind of 'table' loading mechanism from a file? As a dumb idea for testing, I actually have all my recipe and ingredient tables stored in an OpenOffice spreadsheet. Oh yes, I mean the actual lua version of the tables so that I can change and export them back into love.load() with little need for formatting. See, I told you I was daft. Does any of this stuff even need to be in love.load()? So what exactly would be the best way to handle this?. I'd rather not code some kind of file system thingy just yet.

Sounds? I'm planning on that, but far into the future. Doesn't mean I can't start coding something now. At least to test and play around with love2d. I envision no more then 16 to 24 possible sounds. Some of these would be small to really small for GUI use like menus or command buttons. But some of these will be used to create ambience like a crowded restaurant. <- This last thing I expect to loop continuously and possibly change in volume as the number of customers in the restaurant increases. Now I know my question is opinion based or perhaps common sense related, but how big would/should I go for sound data I want as static? How large would a sound bit need to be for the streaming option to make more sense? Also, where exactly in the love2d wiki does it point out how to constantly loop a sound over and over?

Licensing? Yah, Right... Lets just assume that within the next year or so my simulation reaches distributable maturity. I would want it to be open-source, usable by most, forked by most. I DO NOT want it used as a base for a commercial endeavour. I would NOT want it used by greedy commercial entities that will go unnamed. And above all, no fusking on-line activation [had to throw that in there ;)] or any sort of Internet related code would be allowed to co-exist with the code base. Anything out there that covers that?

Any suggestions or comments appreciated.

Thanks,

User avatar
slime
Solid Snayke
Posts: 2887
Joined: Mon Aug 23, 2010 6:45 am
Location: Nova Scotia, Canada
Contact:

Re: Newbie questions?

Post by slime » Mon Dec 09, 2013 11:00 pm

bekey wrote: As for the [wiki]love.graphics.newScreenshot[/wiki], not having 0.9 would probably cause an error, but just to make sure I'll say it: It's only available in 0.9 which you probably have anyway.
It's available in earlier versions. 0.9.0 changed its functionality slightly to default to being always opaque, and added an optional parameter to toggle that.

User avatar
gim
Prole
Posts: 10
Joined: Sat Dec 07, 2013 7:09 pm

Re: Newbie questions?

Post by gim » Mon Dec 09, 2013 11:11 pm

Grubby wrote: 1 - What are the rules when using someone elses code? Would giving credit where credit is due be good enough? I mention this cuz "randomlua.lua" is the CORE pseudo-random number generator in my sim. <-- Mostly cuz I've read RND generation within lua isn't exactly stable across platforms.
If you're using luajit OR LÖVE 0.9 (which by default will use luajit) OR LÖVE 0.8 compiled with luajit, RNG WILL be stable.
Grubby wrote: 2 - Is there no way to snag/copy a piece of the on-screen data (Sorta like a screen snapshot) but within a defined rectangle? Leads into question 3.
That would be reaaaly slow. (Writing == fast, reading == slow). You could ofc do that on canvas, but what bekey has written is easier, and probably more sensible way to do it (i.e. think if you'd like to change font size dynamically).
"We must have perseverance and above all confidence in ourselves. We must believe that we are gifted for something, and that this thing, at whatever cost, must be attained." - Marie Skłodowska-Curie

User avatar
Robin
The Omniscient
Posts: 6506
Joined: Fri Feb 20, 2009 4:29 pm
Location: The Netherlands
Contact:

Re: Newbie questions?

Post by Robin » Tue Dec 10, 2013 8:20 am

Grubby wrote:Not sure why I'm asking this, but I thought I read somewhere that improper declaration of variables (style) can impact memory usage within Lua? Any truth to that? If so, any place I can read up on optimizing lua code or maybe some lessons on proper style? Again, the notion of programming style as an issue seems weird to me. Back in my C days, it really only mattered if I expected someone else to read and understand the code. Tab key? Whats that?
What? I've never heard of that. Maybe what you're referring to is the fact that locals are faster to access than globals, but that never matters in practice.
Help us help you: attach a .love.

Bereb
Prole
Posts: 4
Joined: Tue Nov 12, 2013 8:54 am

Re: Newbie questions?

Post by Bereb » Tue Dec 10, 2013 8:54 am

locals are faster to access than globals, but that never matters in practice
Nevertheless you do gain some signifiant time when you declare all your variables, even internal or user functions, as local from the start. It's because local variables are accessed directly, unlike global variables which are stored in a table.

So, in Löve, don't put all your variables in the 'love.load()' function or declare them rather as local at the top of your script, apart from any function.
Last edited by Bereb on Tue Dec 10, 2013 9:11 am, edited 1 time in total.

User avatar
Plu
Inner party member
Posts: 722
Joined: Fri Mar 15, 2013 9:36 pm

Re: Newbie questions?

Post by Plu » Tue Dec 10, 2013 9:08 am

Robin wrote:
Grubby wrote:Not sure why I'm asking this, but I thought I read somewhere that improper declaration of variables (style) can impact memory usage within Lua? Any truth to that? If so, any place I can read up on optimizing lua code or maybe some lessons on proper style? Again, the notion of programming style as an issue seems weird to me. Back in my C days, it really only mattered if I expected someone else to read and understand the code. Tab key? Whats that?
What? I've never heard of that. Maybe what you're referring to is the fact that locals are faster to access than globals, but that never matters in practice.
It could refer to declaring them as globals in functions and then never using them again; they'll linger in memory for no good reason, chewing up memory. But again, that's little more than making sure you declare them as local.

User avatar
Hexenhammer
Party member
Posts: 175
Joined: Sun Feb 17, 2013 8:19 am

Re: Newbie questions?

Post by Hexenhammer » Tue Dec 10, 2013 11:22 am

Grubby wrote: Not sure why I'm asking this, but I thought I read somewhere that improper declaration of variables (style) can impact memory usage within Lua?
Lua variables are global by default, limit their life time by making them local. Intuitively the keyword for that is "local" ^^

Code: Select all

fatassGlobal = "I am"
local slimLocal = "I am"
any place I can read up on optimizing lua code
Optimal coding style depends on the implementation used. Vanilla Lua and LuaJIT demand different coding styles for optimal performance. If you care about performance LuaJIT is the only option though. Optimizing for LuaJIT is fortunately easier than optimizing for Lua because LuaJIT does all the trivial stuff itself. Just use traditional Lua module style i.e. everything is stuffed into a local table, that gives LuaJIT the locality it needs. Note that LuaJIT's author stresses the importance of making performance-critical things local. Not just because it cuts a dereference but because it allows LuaJIT to make more assumptions. Note that you do not want too many local variables being live at once though, that degrades LuaJIT's performance. I.e. good style for LuaJIT:

Code: Select all

local MyModule = {}

MyModule.myVariable = 23 -- module variable

function MyModule.Foo(x)
  local fooStuff -- variable local to function
  ...
end

function MyModule.Bar(x)
  return MyModule.Foo(x) - MyModule.myVariable
end

return MyModule
In contrast, the vanilla Lua guys recommend this for optimal performance (see Programming in Lua class notes by Fabio Mascarenhas):

Code: Select all

local myVariable = 23 -- module variable

local function Foo(x)
  local fooStuff -- variable local to function
  ...
end

local function Bar(x)
  return Foo(x) - myVariable
end

return { Foo = Foo, Bar = Bar }
Note that standard Lua style is to write all identifies (variable names, function names, module names, ..) like this "mydamnmodule" i.e. all lowercase without separators. Personally I cannot read that and find it unsuitable for larger projects and thus refuse to do it. However, I thought I should mention that because you might want to OBEY the norm ;)
or maybe some lessons on proper style?
Read the book of Lua's primary architect i.e. "Programming in Lua" by Roberto Ierusalimschy and follow that style. That is the closest thing to "proper" I can think of. Personally, I never cared much about being "proper" :P
Currently, my love.load() function is getting way too huge to manage.
Only thing I would put in love.load() would be a call to "Game.Init()". Game.Init() being the function which initializes the game by initializing all its subsystems which require initialization. E.g

Code: Select all

-- main.lua

function love.load()
  Game.Init()
end

Code: Select all

-- Game.lua

function Game.Init()

   MapGenerator.Init()

   Actors.Init()

   Orgasmator.Init()

end
I actually have all my recipe and ingredient tables stored in an OpenOffice spreadsheet. Oh yes, I mean the actual lua version of the tables so that I can change and export them back into love.load() with little need for formatting. See, I told you I was daft. Does any of this stuff even need to be in love.load()? So what exactly would be the best way to handle this?. I'd rather not code some kind of file system thingy just yet.
Why do you keep the tables in a spreadsheet? Export them to Lua once and then work with the Lua tables. If you need to keep the values in a spreadsheet for some reason you have no alternative to writing a loader. Not familiar with OO.org but usually all spreadsheet apps can export CSV and you can write a CSV -> Lua table loader in a few lines of code.

Oh, and you do not need to code a file system thingy. LÖVE comes with its own file system which you should use if you want to stay compatible.
Licensing? Yah, Right... Lets just assume that within the next year or so my simulation reaches distributable maturity. I would want it to be open-source, usable by most, forked by most. I DO NOT want it used as a base for a commercial endeavour. I would NOT want it used by greedy commercial entities that will go unnamed. And above all, no fusking on-line activation [had to throw that in there ;)] or any sort of Internet related code would be allowed to co-exist with the code base. Anything out there that covers that?
The GPL will keep commercial interests away from your game.

Post Reply

Who is online

Users browsing this forum: No registered users and 5 guests