Difference between revisions of "Gamecamp"
From Ghoulwiki
Ghoulsblade (talk | contribs) |
Ghoulsblade (talk | contribs) |
||
(21 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | http://www.gamecampmunich.de/ | + | == links == |
+ | |||
+ | * example projects : http://schattenkind.net/gamecamp/ | ||
+ | * löve binaries : http://ghoulsblade.schattenkind.net/love2d_0.6.2/ | ||
+ | * löve 0.6 docs : http://web.ics.purdue.edu/~dcfritz/lovewiki/love4.html offline: http://commondatastorage.googleapis.com/loveclub/docs.zip | ||
+ | |||
+ | * http://gamecamp.pastebin.com : workshop 30.05.2010 | ||
+ | |||
+ | * http://ghoulsblade.schattenkind.net/wiki/index.php/Gamecamp | ||
+ | * http://www.gamecampmunich.de/ | ||
* http://www.gamecampmunich.de/sessions/ ! vorschlag eintragen ? | * http://www.gamecampmunich.de/sessions/ ! vorschlag eintragen ? | ||
+ | * http://love2d.org/ -- LÖVE | ||
+ | * http://love2d.org/wiki/Main_Page -- Documentation | ||
+ | * http://www.lua.org/ -- LUA | ||
+ | * http://www.lua.org/manual/5.1/ -- LUA Reference | ||
+ | * http://www.lua.org/pil/ -- LUA guide | ||
+ | * http://gobby.0x539.de/trac/wiki/Download | ||
+ | * gitosis@zwischenwelt.org:gamecamp2010.git | ||
+ | * http://www.lostgarden.com/search/label/free%20game%20graphics | ||
+ | * http://www.lostgarden.com/2007/04/free-game-graphics-tyrian-ships-and.html | ||
+ | * [[Lua Objektorientierung]] | ||
+ | == lua intro == | ||
+ | |||
+ | Lua is a powerful, fast and lightweight scripting language. | ||
+ | small : 17000 lines of C. (linux) Lua interpreter 153K and the Lua library takes 203K. | ||
+ | license : MIT license, no cost, commercial use, no source required | ||
+ | |||
+ | * Crysis & Far Cry, | ||
+ | * World of Warcraft, | ||
+ | * Ragnarok Online, | ||
+ | * Dawn of War, | ||
+ | * Counter Strike 2D, | ||
+ | * Civilization 5. | ||
+ | * Fable II | ||
+ | * Heroes of Might and Magic V | ||
+ | * Aquaria (video game) | ||
+ | * Baldur's Gate | ||
+ | * Civilization V | ||
+ | * Company of Heroes | ||
+ | * Escape from Monkey Island | ||
+ | * Natural Selection 2 | ||
+ | * Painkiller (video game) | ||
+ | * Ragnarok Online | ||
+ | * Runes of Magic | ||
+ | * S.T.A.L.K.E.R.: Shadow of Chernobyl | ||
+ | * Warhammer 40,000: Dawn of War | ||
+ | * World of Warcraft | ||
+ | * [SimCity 4] | ||
+ | * Ryzom | ||
== lua intro == | == lua intro == | ||
− | * | + | * print("hello world",2,3+4,"test",a) -- comment |
− | * local a,b,c = | + | * block comment : <nowiki>--[[....]]</nowiki> |
− | * | + | * local a = 2 |
− | * | + | * if (a == 1) then ... elseif (a == 2) then ... else ... end |
− | * | + | * for i=1,10 do print(i) end |
+ | * local myarr = {1,2,3,4,"text",6,7,"blub"} | ||
+ | * local mymap = { a=5, b=3, c=myarr, d={1,2,3,4}, e={x=0,y=0}, } | ||
+ | * for k,v in ipairs(myarr) do print(k,v) end -- arrays mit numerischen indices sortiert auflisten (ipairs -> int) | ||
+ | * for k,v in pairs(mymap) do print(k,v) end -- pairs ohne i : alle key/values in asso-array/map auflisten, unsortiert | ||
+ | * table.insert(myarr,10) | ||
+ | * mymap["key"] = "wert" | ||
+ | * mymap.key = "wert" | ||
+ | * if (mymap.key == "wert") then ... end | ||
+ | * function MyFun (x) return x+5 end | ||
+ | * function MyFun (x) return x,x+1,x+2 end | ||
+ | * local a,b,c = MyFun(2) -- multiple return values (a=2,b=3,c=4) | ||
+ | * kein int, alles float -> vorsicht bei a/b wird NICHT gerundet. math.floor() benutzen wenn man das will | ||
* for i=1,10,2 do ... end -- -> 1 3 5 7 9 | * for i=1,10,2 do ... end -- -> 1 3 5 7 9 | ||
− | * | + | * while (cond) do ... if (cond) then break end ... end |
− | + | * es gibt kein "continue" | |
− | * kein continue | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
* funktionen sind 1.class variablen (implizite closure) MyFunction(1, function (a,b) return a+b end ) | * funktionen sind 1.class variablen (implizite closure) MyFunction(1, function (a,b) return a+b end ) | ||
− | |||
* stringcat : "hello" .. " " .. "world" | * stringcat : "hello" .. " " .. "world" | ||
+ | |||
+ | === lua objektorientierung === | ||
+ | |||
+ | * klasse und methoden definieren : | ||
+ | ** cMyClass = CreateClass() | ||
+ | ** function cMyClass:blub (a,b,c) print("blub") end -- ist dasselbe wie : | ||
+ | ** function cMyClass.blub (self,a,b,c) print("blub") end -- ist dasselbe wie : | ||
+ | ** cMyClass.blub = function (self,a,b,c) print("blub") end | ||
+ | * aufruf : | ||
+ | ** local myobj = CreateClassInstance(cMyClass) | ||
+ | ** myobj:blub(3,4,5) -- aufruf, ist dasselbe wie | ||
+ | ** myobj.blub(myobj,3,4,5) | ||
+ | * vererbung : | ||
+ | ** cMyDerived = CreateClass(cMyClass) | ||
+ | ** function cMyDerived:boing () print("boing!") end | ||
+ | ** local myd = CreateClassInstance(cMyDerived) | ||
+ | ** myd:blub() | ||
+ | ** myd:boing() | ||
+ | |||
+ | * boilerplate : | ||
+ | ** function CreateClass(base) local p = base and setmetatable({},base._cmeta) or {} p._cmeta = { __index=p } return p end | ||
+ | ** function CreateClassInstance(someclass) return setmetatable({},someclass._cmeta) end | ||
=== lua tables === | === lua tables === | ||
Line 38: | Line 111: | ||
* print(debug.traceback("nachricht")) | * print(debug.traceback("nachricht")) | ||
* assert(wert_der_true_sein_soll,nachricht) | * assert(wert_der_true_sein_soll,nachricht) | ||
− | * dofile(filepath) -- | + | * dofile(filepath) -- (codefile includen) geht unter löve nicht wegen zip, use love.filesystem.load(filepath)() instead |
* for a,b,c in string.gmatch(txt,"(%w+)=(%w+):(%w+)") do print(a,b,c) end -- z.b. map-daten laden.. | * for a,b,c in string.gmatch(txt,"(%w+)=(%w+):(%w+)") do print(a,b,c) end -- z.b. map-daten laden.. | ||
* local startpos,endpos,match1,match2,match3 = string.find(txt,"(%w+)=(%w+):(%w+)") | * local startpos,endpos,match1,match2,match3 = string.find(txt,"(%w+)=(%w+):(%w+)") | ||
Line 46: | Line 119: | ||
* math.random() -- [0;1[ float zwischen 0 und 1 | * math.random() -- [0;1[ float zwischen 0 und 1 | ||
* math.random(n) -- n=int -> returns int in range [1;n] | * math.random(n) -- n=int -> returns int in range [1;n] | ||
− | * math.random(n,m) -- n,m=int -> returns int in range [n;m] | + | * math.random(n,m) -- n,m=int -> returns int in range [n;m] |
== löve 0.6.2 == | == löve 0.6.2 == | ||
+ | |||
+ | * license: zlib ( This is a very liberal license which permits almost anything. ) | ||
+ | * http://love2d.org/docs/ | ||
* features | * features | ||
** audio (mitlerweile ganz gut) | ** audio (mitlerweile ganz gut) | ||
+ | ** particle system | ||
** 2d gfx | ** 2d gfx | ||
− | |||
** input | ** input | ||
** box2 physic (etwas wackelig) | ** box2 physic (etwas wackelig) | ||
− | + | === rest === | |
− | |||
− | |||
− | |||
* anekdoten | * anekdoten | ||
Line 69: | Line 142: | ||
* game als zip (.love) in einem file | * game als zip (.love) in einem file | ||
* man kann standalone exe bauen (binary + zip dran-ge-cat'ed) | * man kann standalone exe bauen (binary + zip dran-ge-cat'ed) | ||
− | * | + | * timestamp : love.timer.getTime() float in sekunden |
− | * | + | * love.filesystem.load(filepath)() -- (codefile includen) wegen zip so statt dofile |
− | |||
== game == | == game == | ||
* sidescroller | * sidescroller | ||
− | * tyrian gfx pack von lostgarden | + | * tyrian gfx pack von lostgarden.com |
* states (menu,game,highscore) | * states (menu,game,highscore) | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== code == | == code == | ||
+ | === skelett und mainloop === | ||
+ | * win/linux : cmd> love VERZEICHNIS_MIT_MAIN_LUA/ZIP | ||
+ | * mac : zip/ordner auf das löve programm drag-droppen ? | ||
+ | |||
+ | ==== main.lua ==== | ||
+ | |||
+ | * function love.load() ... end -- daten laden | ||
+ | * function love.draw() love.graphics.print('Hellö Wörld!', 100, 100) ... end -- sprites zeichnen etc in der frameloop | ||
+ | * function love.update(dt) ... end -- objekte bewegen, gamelogik etc.. | ||
+ | |||
+ | ==== conf.lua ==== | ||
+ | function love.conf(t) | ||
+ | t.screen.width = gScreenW | ||
+ | t.screen.height = gScreenH | ||
+ | t.screen.fullscreen = false | ||
+ | t.screen.vsync = true | ||
+ | t.screen.fsaa = 0 | ||
+ | t.version = 0.6 | ||
+ | t.modules.joystick = false | ||
+ | t.modules.physics = false | ||
+ | t.modules.audio = true | ||
+ | t.modules.keyboard = true | ||
+ | t.modules.event = true | ||
+ | t.modules.image = true | ||
+ | t.modules.graphics = true | ||
+ | t.modules.timer = true | ||
+ | t.modules.mouse = true | ||
+ | t.modules.sound = true | ||
+ | t.console = false | ||
+ | t.title = "GameCampBlub" | ||
+ | t.author = "GameCampBlub Crew" | ||
+ | end | ||
+ | |||
+ | |||
=== sprite malen === | === sprite malen === | ||
− | + | * gfx = love.graphics.newImage("ball.png") | |
− | love.graphics.draw( | + | * love.graphics.draw(gfx, 10, 10) |
=== ton abspielen === | === ton abspielen === | ||
− | sound = love.audio.newSource("pling.wav", "static") | + | * sound = love.audio.newSource("pling.wav", "static") |
− | music = love.audio.newSource("techno.ogg") -- streamed | + | * music = love.audio.newSource("techno.ogg") -- streamed |
− | love.audio.play(sound) | + | * love.audio.play(sound) |
− | love.audio.play(music) | + | * love.audio.play(music) |
+ | |||
+ | === input handling === | ||
+ | |||
+ | * local t = love.timer.getTime() -- globaler timestamp in sekunden als float | ||
+ | * local x,y = love.mouse.getPosition() | ||
+ | * if love.mouse.isDown("r") then print("Mouse button right is pressed") end | ||
+ | * if (love.keyboard.isDown(" ")) then print("space gedrückt") end TODO : doppelt, unten nochmal | ||
+ | * function love.keypressed(k,unicode) if (k == 'escape') then print("escape gedrückt") os.exit(0) end end | ||
+ | * os.exit(0) : programm sofort beenden | ||
=== text ausgeben === | === text ausgeben === | ||
− | love.graphics.setFont("AwesomeFont.ttf", 15) | + | * love.graphics.setFont("AwesomeFont.ttf", 15) -- TODO : gibts den font standardmässig ? falls nein nen anderen =) |
− | love.graphics.print("This is some awesome text", 100, 100) | + | * love.graphics.print("This is some awesome text", 100, 100) |
+ | |||
+ | == bei problemen mit grafikanzeige (eee pc, weisse bilder) == | ||
− | = | + | zum bilderladeen statt |
− | + | * gfx = love.graphics.newImage("ball.png") | |
+ | * gfx = newPaddedImage("ball.png") | ||
− | function love. | + | <pre> |
− | + | function newPaddedImage(filename) | |
− | + | local source = love.image.newImageData(filename) | |
− | + | local w, h = source:getWidth(), source:getHeight() | |
+ | -- Find closest power-of-two. | ||
+ | local wp = math.pow(2, math.ceil(math.log(w)/math.log(2))) | ||
+ | local hp = math.pow(2, math.ceil(math.log(h)/math.log(2))) | ||
+ | |||
+ | local gfx = nil | ||
+ | |||
+ | -- Only pad if needed: | ||
+ | if wp ~= w or hp ~= h then | ||
+ | local padded = love.image.newImageData(wp, hp) | ||
+ | padded:paste(source, 0, 0) | ||
+ | gfx = love.graphics.newImage(padded) | ||
+ | else | ||
+ | gfx = love.graphics.newImage(source) | ||
+ | end | ||
+ | |||
+ | -- originalgroesse in die groessenfunctionen patchen | ||
+ | local sourceW = source:getWidth() | ||
+ | local sourceH = source:getHeight() | ||
+ | |||
+ | return gfx | ||
end | end | ||
+ | </pre> | ||
− | + | == git lan usage == | |
− | + | git pull git://192.168.2.105/home/hagish/dev/gamecamp2010 | |
− | + | git-daemon --verbose --export-all /home/hagish/dev | |
− | + | /usr/lib/git-core/git-daemon | |
− | |||
− | |||
− | |||
− | |||
− |
Latest revision as of 11:17, 28 January 2012
Contents
links
- example projects : http://schattenkind.net/gamecamp/
- löve binaries : http://ghoulsblade.schattenkind.net/love2d_0.6.2/
- löve 0.6 docs : http://web.ics.purdue.edu/~dcfritz/lovewiki/love4.html offline: http://commondatastorage.googleapis.com/loveclub/docs.zip
- http://gamecamp.pastebin.com : workshop 30.05.2010
- http://ghoulsblade.schattenkind.net/wiki/index.php/Gamecamp
- http://www.gamecampmunich.de/
- http://www.gamecampmunich.de/sessions/ ! vorschlag eintragen ?
- http://love2d.org/ -- LÖVE
- http://love2d.org/wiki/Main_Page -- Documentation
- http://www.lua.org/ -- LUA
- http://www.lua.org/manual/5.1/ -- LUA Reference
- http://www.lua.org/pil/ -- LUA guide
- http://gobby.0x539.de/trac/wiki/Download
- gitosis@zwischenwelt.org:gamecamp2010.git
- http://www.lostgarden.com/search/label/free%20game%20graphics
- http://www.lostgarden.com/2007/04/free-game-graphics-tyrian-ships-and.html
- Lua Objektorientierung
lua intro
Lua is a powerful, fast and lightweight scripting language. small : 17000 lines of C. (linux) Lua interpreter 153K and the Lua library takes 203K. license : MIT license, no cost, commercial use, no source required
- Crysis & Far Cry,
- World of Warcraft,
- Ragnarok Online,
- Dawn of War,
- Counter Strike 2D,
- Civilization 5.
- Fable II
- Heroes of Might and Magic V
- Aquaria (video game)
- Baldur's Gate
- Civilization V
- Company of Heroes
- Escape from Monkey Island
- Natural Selection 2
- Painkiller (video game)
- Ragnarok Online
- Runes of Magic
- S.T.A.L.K.E.R.: Shadow of Chernobyl
- Warhammer 40,000: Dawn of War
- World of Warcraft
- [SimCity 4]
- Ryzom
lua intro
- print("hello world",2,3+4,"test",a) -- comment
- block comment : --[[....]]
- local a = 2
- if (a == 1) then ... elseif (a == 2) then ... else ... end
- for i=1,10 do print(i) end
- local myarr = {1,2,3,4,"text",6,7,"blub"}
- local mymap = { a=5, b=3, c=myarr, d={1,2,3,4}, e={x=0,y=0}, }
- for k,v in ipairs(myarr) do print(k,v) end -- arrays mit numerischen indices sortiert auflisten (ipairs -> int)
- for k,v in pairs(mymap) do print(k,v) end -- pairs ohne i : alle key/values in asso-array/map auflisten, unsortiert
- table.insert(myarr,10)
- mymap["key"] = "wert"
- mymap.key = "wert"
- if (mymap.key == "wert") then ... end
- function MyFun (x) return x+5 end
- function MyFun (x) return x,x+1,x+2 end
- local a,b,c = MyFun(2) -- multiple return values (a=2,b=3,c=4)
- kein int, alles float -> vorsicht bei a/b wird NICHT gerundet. math.floor() benutzen wenn man das will
- for i=1,10,2 do ... end -- -> 1 3 5 7 9
- while (cond) do ... if (cond) then break end ... end
- es gibt kein "continue"
- funktionen sind 1.class variablen (implizite closure) MyFunction(1, function (a,b) return a+b end )
- stringcat : "hello" .. " " .. "world"
lua objektorientierung
- klasse und methoden definieren :
- cMyClass = CreateClass()
- function cMyClass:blub (a,b,c) print("blub") end -- ist dasselbe wie :
- function cMyClass.blub (self,a,b,c) print("blub") end -- ist dasselbe wie :
- cMyClass.blub = function (self,a,b,c) print("blub") end
- aufruf :
- local myobj = CreateClassInstance(cMyClass)
- myobj:blub(3,4,5) -- aufruf, ist dasselbe wie
- myobj.blub(myobj,3,4,5)
- vererbung :
- cMyDerived = CreateClass(cMyClass)
- function cMyDerived:boing () print("boing!") end
- local myd = CreateClassInstance(cMyDerived)
- myd:blub()
- myd:boing()
- boilerplate :
- function CreateClass(base) local p = base and setmetatable({},base._cmeta) or {} p._cmeta = { __index=p } return p end
- function CreateClassInstance(someclass) return setmetatable({},someclass._cmeta) end
lua tables
- arrays : starten bei index 1
- arrays : table.insert(mytable,o)
- assoc/map : mytable[name] = value
- set : mytable[o] = true
- key und value any
- löschen = assign nil
utils
- for line in io.lines(filepath) do ... print(line) ... end
- print(debug.traceback("nachricht"))
- assert(wert_der_true_sein_soll,nachricht)
- dofile(filepath) -- (codefile includen) geht unter löve nicht wegen zip, use love.filesystem.load(filepath)() instead
- for a,b,c in string.gmatch(txt,"(%w+)=(%w+):(%w+)") do print(a,b,c) end -- z.b. map-daten laden..
- local startpos,endpos,match1,match2,match3 = string.find(txt,"(%w+)=(%w+):(%w+)")
- table.sort(arr,function (a,b) return a.feld < b.feld end)
- math.max/min/floor/ceil/pi/atan2/
- math.randomseed(os.time()) -- am anfang einmal aufrufen
- math.random() -- [0;1[ float zwischen 0 und 1
- math.random(n) -- n=int -> returns int in range [1;n]
- math.random(n,m) -- n,m=int -> returns int in range [n;m]
löve 0.6.2
- license: zlib ( This is a very liberal license which permits almost anything. )
- http://love2d.org/docs/
- features
- audio (mitlerweile ganz gut)
- particle system
- 2d gfx
- input
- box2 physic (etwas wackelig)
rest
- anekdoten
- ö
- forum: öbey
- seltsame libnamen: AnAL (Animation), LUBE (Network), Pölygamy (State, Helpers), Swingers (gesture)
- binary für win,mac,linux
- game als zip (.love) in einem file
- man kann standalone exe bauen (binary + zip dran-ge-cat'ed)
- timestamp : love.timer.getTime() float in sekunden
- love.filesystem.load(filepath)() -- (codefile includen) wegen zip so statt dofile
game
- sidescroller
- tyrian gfx pack von lostgarden.com
- states (menu,game,highscore)
code
skelett und mainloop
- win/linux : cmd> love VERZEICHNIS_MIT_MAIN_LUA/ZIP
- mac : zip/ordner auf das löve programm drag-droppen ?
main.lua
- function love.load() ... end -- daten laden
- function love.draw() love.graphics.print('Hellö Wörld!', 100, 100) ... end -- sprites zeichnen etc in der frameloop
- function love.update(dt) ... end -- objekte bewegen, gamelogik etc..
conf.lua
function love.conf(t) t.screen.width = gScreenW t.screen.height = gScreenH t.screen.fullscreen = false t.screen.vsync = true t.screen.fsaa = 0 t.version = 0.6 t.modules.joystick = false t.modules.physics = false t.modules.audio = true t.modules.keyboard = true t.modules.event = true t.modules.image = true t.modules.graphics = true t.modules.timer = true t.modules.mouse = true t.modules.sound = true t.console = false t.title = "GameCampBlub" t.author = "GameCampBlub Crew" end
sprite malen
- gfx = love.graphics.newImage("ball.png")
- love.graphics.draw(gfx, 10, 10)
ton abspielen
- sound = love.audio.newSource("pling.wav", "static")
- music = love.audio.newSource("techno.ogg") -- streamed
- love.audio.play(sound)
- love.audio.play(music)
input handling
- local t = love.timer.getTime() -- globaler timestamp in sekunden als float
- local x,y = love.mouse.getPosition()
- if love.mouse.isDown("r") then print("Mouse button right is pressed") end
- if (love.keyboard.isDown(" ")) then print("space gedrückt") end TODO : doppelt, unten nochmal
- function love.keypressed(k,unicode) if (k == 'escape') then print("escape gedrückt") os.exit(0) end end
- os.exit(0) : programm sofort beenden
text ausgeben
- love.graphics.setFont("AwesomeFont.ttf", 15) -- TODO : gibts den font standardmässig ? falls nein nen anderen =)
- love.graphics.print("This is some awesome text", 100, 100)
bei problemen mit grafikanzeige (eee pc, weisse bilder)
zum bilderladeen statt
- gfx = love.graphics.newImage("ball.png")
- gfx = newPaddedImage("ball.png")
function newPaddedImage(filename) local source = love.image.newImageData(filename) local w, h = source:getWidth(), source:getHeight() -- Find closest power-of-two. local wp = math.pow(2, math.ceil(math.log(w)/math.log(2))) local hp = math.pow(2, math.ceil(math.log(h)/math.log(2))) local gfx = nil -- Only pad if needed: if wp ~= w or hp ~= h then local padded = love.image.newImageData(wp, hp) padded:paste(source, 0, 0) gfx = love.graphics.newImage(padded) else gfx = love.graphics.newImage(source) end -- originalgroesse in die groessenfunctionen patchen local sourceW = source:getWidth() local sourceH = source:getHeight() return gfx end
git lan usage
git pull git://192.168.2.105/home/hagish/dev/gamecamp2010 git-daemon --verbose --export-all /home/hagish/dev /usr/lib/git-core/git-daemon