Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Hollywood: Pelimoduuli

jalski [28.08.2011 15:52:20]

#

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...

tesmu [30.08.2011 19:00:45]

#

Muista lisätä funktio do.it.for.me(1); se on erityisen kätevä ;)

jalski [30.08.2011 21:48:14]

#

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.

tepokas [31.08.2011 11:34:27]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta