Onkos kukaan täällä toteuttanut omaa pelien kyhäämisen tarkoitettua moduulia tai kirjastoa?
Itse innostuin rakentelemaan aloittelevalle peliohjelmoijalle sopivaa toteutusta. Tämän hetkinen prototyyppi on Hollywoodille, mutta teen varmaankin lopullisen toteutuksen Lua + BlitzMax yhdistelmälle. Tarkoitus olisi, että pelimoduuli hoitaisi pakollisen "kuran" ja pelin tekijälle jäisi vain pelilogiikan toteuttaminen skripteillä.
Toiminta Hollywood prototyypissä:
Pelin tekijä toteuttaa game.load(), game.draw() ja game.update(dt) funktiot.
game.load() - kutsutaan kerran alussa, pelin alustus funktio.
game.draw() - kutsutaan kerta/frame, pelisilmukan piirto funktio.
game.update(dt) - kutsutaan kerta/frame, pelisilmukan päivitys funktio.
Perusajatus on pitää toiminta tilapohjaisena, näin pelistä saadaan helpposelkoinen ja modulaarinen. Perustila, eli tila 0 käsittää peliloopin, mikä siis koostuu game.draw() ja game.update(dt) funktioista.
Tiloja voidaan rekisteröidä halutulla nimellä lisää. Tila koostuu kolmesta eventistä, jotka siis ovat funktioita:
init() - tilan alustus funktio (event)
draw() - tilan piirto funktio (event), suoritetaan peliloopin piirto funktiona tilan ollessa aktiivinen
update(dt) - tilan päivitys funktio (event), suoritetaan peliloopin päivitys funktiona tilan ollessa aktiivinen
Tilan eventtien suoritus järjestys alussa: init() -> draw() -> update(dt)
Tämän jälkeen peliloopissa toistetaan: draw() -> update(dt)
Jos tila ei tarvitse jotain eventtiä, niin sitä ei tarvitse toteuttaa.
Esimerkkinä yksinkertainen kello Hollywoodilla, jossa on kaksi tilaa: kellonajan näyttö ja ohjelman käynnissäoloajan näyttö.
; ; Simple clock in Hollywood ; ; Keys "1" and "2" change states between clock and elapset time state ; @DISPLAY {Width = 240, Height = 100, Borderless = True} ; Include game framework @INCLUDE "game.hws" ; Include game states @INCLUDE "elapset.hws" ; Include elapset time state. ; Setup Function game.load() game.state:register("elapset", elapset) ; register elapset time state delay = 0 time = 0 game:setUpdateRate(60) ; set update rate SetFont(#SANS, 32) clock$ = GetTime(True) EndFunction ; Draw Function game.draw() Cls() TextOut(#CENTER, #CENTER, clock$) EndFunction ; Update Function game.update(dt) ; Update time in seconds. time = time + dt ; Update clock$ string holding time at once per second. delay = delay + dt If delay >= 1 clock$ = GetTime(True) delay = 0 EndIf ; Check keys: "ESC" quits and "2" changes state to elapset time mode. If IsKeyDown("ESC") Then End If IsKeyDown("2") Then game.state:set("elapset") EndFunction ; Go! game:go()
; ; Elapset time state: elapset.hws ; elapset = {} Function elapset.init() ; Calculate time in hours, minutes and seconds. ; Required, so we won't miss the first draw event of a state. h = Int(time / 3600) m = Int((time % 3600) / 60) s = Int((time % 3600) % 60) EndFunction ; Draw Function elapset.draw() Cls() TextOut(#CENTER, #CENTER, PadNum(h, 2) ..":" ..PadNum(m, 2) ..":" ..PadNum(s, 2)) EndFunction ; Update Function elapset.update(dt) ; Update time in seconds. time = time + dt ; Calculate time in hours, minutes and seconds. h = Int(time / 3600) m = Int((time % 3600) / 60) s = Int((time % 3600) % 60) ; Check keys: "ESC" quits and "1" changes state back to default state 0 (display clock). If IsKeyDown("ESC") Then End If IsKeyDown("1") clock$ = GetTime(True) game.state:set(0) EndIf EndFunction
Löytyykö parannus ideoita? Nyt työn alla sprite managerin lisääminen...
Muista lisätä funktio do.it.for.me(1); se on erityisen kätevä ;)
tesmu kirjoitti:
Muista lisätä funktio do.it.for.me(1); se on erityisen kätevä ;)
Ehken nyt kuiteskaan...
Olen jo kohtuullisen tyytyväinen alustavaan toteutukseen ja esimerkiksi tämän tapaisen pelin raapii jo tunnissa kasaan...
Olen hiukan hahmotellut sprite objektin alustavaa toteutusta ja mallissani objektille voi rekisteröidä sprite animaatioita pelitilan mukaan. Lisäksi pelitilalle voi määrittää "actioneja", joilla on tietysti omat animaatio kehyksensä. Näin erillistä sprite manageria ei tarvita, vaan kaikki hoituu lähes automaattisesti pelitilan ja "actionin" mukaan.
No nyt kun olet rakentanut mallin "hollywood-koodilla", niin rakennappa se myös jollain yleiskäyttöisellä mallinnuskielellä kuten UML- tai ER-kaavioilla, niin saataisiin me muita kieliä ymmärtävät jotakin iloa tehdystä mallista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.