Game of Ukkels: Japan Kaiki - ukkopeli
Re: ukkopeli
Huomasin etten ole maininnut pelin konsolia.
Listaus pelin ajonaikaisista konsolimuuttujista.
Esikääntäjäni ja CoolBasicin yhteinen käännösaika alkoi venyä niin pitkäksi (5 sekuntia!), että näin parhaaksi pelimekaanikan iteroinnin kannalta toteuttaa jonkinlaisen ajonaikaisen säätöhommelin. Kopioin Quakesta konsolin ja cfg-tiedostototeutuksen.
Moni pelin muuttujista on nyt muuteltavissa ajon aikana, ja ne saa kätevästi tallennettua tiedostoon josta myös lataus pelin alussa tapahtuu. Tämä on helpottanut paljon tekoälyn ja pelin "fiiliksen" säätämistä.
Voisi olla mielenkiintoista toteuttaa esim. valikoista tehtävät käskyt kuten kentän valinta "skriptikielelläni", mutta tämä olisi luultavasti liiallista.
Listaus pelin ajonaikaisista konsolimuuttujista.
Esikääntäjäni ja CoolBasicin yhteinen käännösaika alkoi venyä niin pitkäksi (5 sekuntia!), että näin parhaaksi pelimekaanikan iteroinnin kannalta toteuttaa jonkinlaisen ajonaikaisen säätöhommelin. Kopioin Quakesta konsolin ja cfg-tiedostototeutuksen.
Moni pelin muuttujista on nyt muuteltavissa ajon aikana, ja ne saa kätevästi tallennettua tiedostoon josta myös lataus pelin alussa tapahtuu. Tämä on helpottanut paljon tekoälyn ja pelin "fiiliksen" säätämistä.
Voisi olla mielenkiintoista toteuttaa esim. valikoista tehtävät käskyt kuten kentän valinta "skriptikielelläni", mutta tämä olisi luultavasti liiallista.
Re: ukkopeli
Hyvä idea! Varmasti auttaa nopeaan iterointiin.
Jos tehokkaampaa konsolia kaipaat (oma ikkuna, tab-autocomplete jne.) niin vilkase vaikka NetMatchin Consolea. Saa käyttää: https://github.com/cb-hackers/NetMatch/ ... Console.cb
Jos tehokkaampaa konsolia kaipaat (oma ikkuna, tab-autocomplete jne.) niin vilkase vaikka NetMatchin Consolea. Saa käyttää: https://github.com/cb-hackers/NetMatch/ ... Console.cb
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Re: ukkopeli
Itseasiassa näpistin jo konsolin käyttämän Input-funktion NetMatchin sorsista!valscion wrote:Hyvä idea! Varmasti auttaa nopeaan iterointiin.
Jos tehokkaampaa konsolia kaipaat (oma ikkuna, tab-autocomplete jne.) niin vilkase vaikka NetMatchin Consolea. Saa käyttää: https://github.com/cb-hackers/NetMatch/ ... Console.cb
Olisin tietenkin - köh - maininnut siitä readmessa, tai jossain.
Re: ukkopeli
Mahdetaanko jo piakkoinkin saada jotain testailtavaa projektista? Entä miten on lähdekoodin laita, olisi mielenkiintoista nähdä toteutus pellin alla
Re: ukkopeli
Kiitos mielenkiinnosta! Tuskin ihan piakkoin, haluaisin toteuttaa muutaman kentän, ja kaikki vihollistyypit ennen testiversion julkaisua. Lähdekoodissa ei ole oikeastaan mitään mielenkiintoista, kirjoitan lähes kaiken yhteen tiedostoon ja pidän ratkaisut yksinkertaisina. Kenties pelin valmistuttua voisin julkaista ne, en kuitenkaan kehityksen aikana.MrMonday wrote:Mahdetaanko jo piakkoinkin saada jotain testailtavaa projektista? Entä miten on lähdekoodin laita, olisi mielenkiintoista nähdä toteutus pellin alla
Re: ukkopeli
Game of Ukkels: Japan Kaiki alpha 1. (かいき, kaiki, täydellinen auringonpimennys)
Söin sanani, ja olkaapa hyvät: raakilealphaa tiedossa.
Lataa peli: japankaiki_a1.zip (2.6M)
Pyytäisin palautetta seuraavista osa-alueista:
Osa ääniefekteistä on toistaiseksi lainattu suoraan muista peleistä, mutta esim. pyssyjen äänet ovat jo osittain valmiit.
Tässä vielä nappuloita koskeva ote README.TXT:stä.
Edit: Niin pyssy vaihtuu sitten shiftistä, unohtui mainita aikaisemmin.
P.S. Päivittyikö foorumiohjelmisto juuri äsken? Ainakin nappulat ovat ihan erinäköiset.
Söin sanani, ja olkaapa hyvät: raakilealphaa tiedossa.
Lataa peli: japankaiki_a1.zip (2.6M)
Pyytäisin palautetta seuraavista osa-alueista:
- Liikkuminen
- Tähtääminen & ampuminen
- Törmäykset ja kartoissa navigointi, tuntuuko että jäät jumiin nurkkiin?
Osa ääniefekteistä on toistaiseksi lainattu suoraan muista peleistä, mutta esim. pyssyjen äänet ovat jo osittain valmiit.
Tässä vielä nappuloita koskeva ote README.TXT:stä.
Edit: Niin pyssy vaihtuu sitten shiftistä, unohtui mainita aikaisemmin.
Code: Select all
Valikossa voi valita kaksi asetta Q ja W nappuloilla.
Kenttä aloitetaan numeronäppäimestä.
Näppäimet:
nuolet : liikkuminen
, ja . : sivuaskeleet
- : ampuminen
Enter : lataus
Debug näppäimet:
F1 : näytä debug tekstit
K : tapa pelaaja
muitakin on!
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Hauskan oloinen peli, ja heti valikkomusa iski kuin tuhat volttia. Vakiot kontrollit olivat mielestäni vähän kökö, mutta itse pelin toteutuksesesta ja grafiikoista plussaa. Ensimmäinen mav kuitenki tuli vastaan ekan kuoleman jälkeen.
Solar Eclipse
We're in a simulation, and God is trying to debug us.
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Kiitos! Voisitko lähettää loki.txt sisällön, joko code-tageissa tai vaikka laittaa pastebiniin, että voisin saada hieman ideaa mistä kaatuminen johtuu?MaGetzUb wrote:Hauskan oloinen peli, ja heti valikkomusa iski kuin tuhat volttia. Vakiot kontrollit olivat mielestäni vähän kökö, mutta itse pelin toteutuksesesta ja grafiikoista plussaa. Ensimmäinen mav kuitenki tuli vastaan ekan kuoleman jälkeen.
- Misthema
- Advanced Member
- Posts: 312
- Joined: Mon Aug 27, 2007 8:32 pm
- Location: Turku, Finland
- Contact:
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Hahaa, mahtava peli!
Ohjaus toki tuntui aluksi hankalalta -koska tottumukset- mutta sen hidasteen peittosi helposti. Yllättävän moitteettomasti ukko liikkui kentällä. Taktikointiin vaikutti hyvinkin suuresti pistoolin sijainti ukkelissa (pelasin vain UPS:llä).
Ampumisessa oli tietenkin oman hankaluutensa, koska ukko tuntui kääntyvän tosi nopeasti. Mutta toisaalta luulen, että hitaammalla kääntymisellä muu pelattavuus saattaisi kärsiä. Olisiko kääntymisnopeuteen vaikuttava nappi hyvä idea, vai liikaa?
Overall, mukavan haastava peli nostalgisella tyydytyksellä!
Ohjaus toki tuntui aluksi hankalalta -koska tottumukset- mutta sen hidasteen peittosi helposti. Yllättävän moitteettomasti ukko liikkui kentällä. Taktikointiin vaikutti hyvinkin suuresti pistoolin sijainti ukkelissa (pelasin vain UPS:llä).
Ampumisessa oli tietenkin oman hankaluutensa, koska ukko tuntui kääntyvän tosi nopeasti. Mutta toisaalta luulen, että hitaammalla kääntymisellä muu pelattavuus saattaisi kärsiä. Olisiko kääntymisnopeuteen vaikuttava nappi hyvä idea, vai liikaa?
Overall, mukavan haastava peli nostalgisella tyydytyksellä!
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Ukkelin kääntymisnopeus on tosiaan vielä ongelma. Tällä hetkellä kääntymisessä on lyhyt hitaampi periodi jonka jälkeen liikutaan täydellä nopeudella. Lisäksi vihollista tähdättessä nopeus laskee hieman pienemmäksi. Jos näiden arvojen räpläys kiinnostaa, paina pelin aikana § ja kirjoita cvars. Tämän jälkeen arvon voi asettaa tyyliin player_turn_speed 100.0.
Testailin tarkempaa line of sight-ratkaisua tekemällä useita raycasteja pelaajahahmosta karttaan, ja sen jälkeen piirtämällä kolmioita peitetyille sektoreille, mutta en ole saanut siitä kovinkaan järkevän näköistä ratkaisua.
Testailin tarkempaa line of sight-ratkaisua tekemällä useita raycasteja pelaajahahmosta karttaan, ja sen jälkeen piirtämällä kolmioita peitetyille sektoreille, mutta en ole saanut siitä kovinkaan järkevän näköistä ratkaisua.
- Misthema
- Advanced Member
- Posts: 312
- Joined: Mon Aug 27, 2007 8:32 pm
- Location: Turku, Finland
- Contact:
Re: Game of Ukkels: Japan Kaiki - ukkopeli
No niin! En koskenut muihin, kuin player_turn_speed:iin ja laitoin sen arvoksi 1.0 (oletuksena 2.0), jolloin kääntyminen tähdätessä tuntui jo paremmalta (eikä haitannut kentällä liikkumista).CCE wrote:Ukkelin kääntymisnopeus on tosiaan vielä ongelma. Tällä hetkellä kääntymisessä on lyhyt hitaampi periodi jonka jälkeen liikutaan täydellä nopeudella. Lisäksi vihollista tähdättessä nopeus laskee hieman pienemmäksi. Jos näiden arvojen räpläys kiinnostaa, paina pelin aikana § ja kirjoita cvars. Tämän jälkeen arvon voi asettaa tyyliin player_turn_speed 100.0.
Näyttää, kuin ottaisit alueen "kimmokkeet" lähellä olevista tileistä. Saisitko mitenkään kalkuloitua huoneistojen kulmat etukäteen ja käytettyä niitä? Täällä tarkemmin selitystä siitä, mitä tarkoitan (alempana otsikossa "Ray casting"): http://www.redblobgames.com/articles/visibility/CCE wrote:Testailin tarkempaa line of sight-ratkaisua tekemällä useita raycasteja pelaajahahmosta karttaan, ja sen jälkeen piirtämällä kolmioita peitetyille sektoreille, mutta en ole saanut siitä kovinkaan järkevän näköistä ratkaisua.
Tilejen selaamiseen voisi toimia Marching Squares tai Moore Neighborhood.
Huomasin mahdollisen bugin vihollisten line-of-sight:n kanssa. Tässä kuvassa seisoin paikallani ja alempana oleva vihollinen ampui välissämme olevaa seinämää: http://puu.sh/heRyQ/df18bc1533.jpg
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Erinomaisia linkkejä, keksin heti pari mahdollista toteutustapaa kulmienetsinnälle. Ja kiitos palautteesta kääntymisnopeuden suhteen, taidan hieman hidastaa sitä seuraavaan julkaisuun.
- aloittelijamies
- Newcomer
- Posts: 45
- Joined: Fri Nov 18, 2011 9:55 pm
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Hauskaa pelattavaa ja Amigamaiset musiikit kruunasivat koko pelin!
Olin myös tekemissä jonkin aikaa sitten jotain vähän samanlaista peliä, mutta innostukseni projektia kohtaan hiipui kokonaan.
Itselläkin oli hiukan ongelmia kontrollien kanssa. Vihollisilta perääntyminen oli hankalan oloista, erityisesti kun olen tottunut liikuttamaan pelihahmoa taaskepäin kääntämättä sitä. Kontrolleihin kuitenkin tottui nopeasti. Olisin ehkä kaivannut vaihtoehtoa, jolla ukko olisi saanut vaihdettua,kättään jossa hän pitelee asettaan. Se olisi helpottanut nurkan takana ampumista kanssa. Tämä vaihtoehto saattaa kuitenkin helpottaa peliä liikaa(?)
Varjojen/pimeyden poisto ja vihollisten muuttuminen pilviksi kentän läpäisyn yhteydessä teki koko tilanteesta palkitsevan oloisen, vaikkakin 3 kentässä taustamusiikki jäi looppaamaan rauhallisen voittomusiikin päälle.
Välillä kentän läpäistyä pääsin takaisin päävalikkoon, kun taas välillä kenttä looppasi uudelleen päävalikkkoon siirtymisen sijaan. En ole varma onko tämä tarkoituksellista vai ei.
Jään toki odottomaan lisää päivityksiä projektiltasi!
Olin myös tekemissä jonkin aikaa sitten jotain vähän samanlaista peliä, mutta innostukseni projektia kohtaan hiipui kokonaan.
Itselläkin oli hiukan ongelmia kontrollien kanssa. Vihollisilta perääntyminen oli hankalan oloista, erityisesti kun olen tottunut liikuttamaan pelihahmoa taaskepäin kääntämättä sitä. Kontrolleihin kuitenkin tottui nopeasti. Olisin ehkä kaivannut vaihtoehtoa, jolla ukko olisi saanut vaihdettua,kättään jossa hän pitelee asettaan. Se olisi helpottanut nurkan takana ampumista kanssa. Tämä vaihtoehto saattaa kuitenkin helpottaa peliä liikaa(?)
Varjojen/pimeyden poisto ja vihollisten muuttuminen pilviksi kentän läpäisyn yhteydessä teki koko tilanteesta palkitsevan oloisen, vaikkakin 3 kentässä taustamusiikki jäi looppaamaan rauhallisen voittomusiikin päälle.
Välillä kentän läpäistyä pääsin takaisin päävalikkoon, kun taas välillä kenttä looppasi uudelleen päävalikkkoon siirtymisen sijaan. En ole varma onko tämä tarkoituksellista vai ei.
Jään toki odottomaan lisää päivityksiä projektiltasi!
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Kiitos kommenteista, ja sääli ettei pelisi ottanut valmistuakseen. Korjaan mainitsemasi musiikkibugin ja nopeutan pelaajan peruuttamista, ehkä liikkuminen sitten tuntuu luontevammalta.
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Ensimmäiset Ludvig 14-RPG -singon testiammunnat.
Tekisi melkein mieli tehdä jonkinlainen partikkeliefektieditori. Taidan kuitenkin vastustaa kiusausta toistaiseksi.
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Menukoodaaminen on aika tylsää puuhaa. Yritän kuitenkin lieventää tuskia erottamalla valikkologiikan piirrosta. Oivallinen kuvio tähän on ns. välitön tapa luoda valikko (immediate-mode GUI), joka ei oikeastaan ole mitään kovin ihmeellistä.
Yksinkertainen valikkokoodi näyttää seuraavalta:
Koodin piirtämä valikko, jossa "toka" on valittuna.
Ajatuksena on, että vaihtoehtoja ei kirjoiteta etukäteen käsin esim. taulukkoon, vaan menupiirron funktiokutsut määrittelevät valikon kokonaisuudessaan. Yllä olevassa koodissa funktio menu_option(msg$) piirtää yhden vaihtoehdon ruudulle, ja palauttaa True jos käyttäjä on valinnut kyseisen kohdan ja painanut enter.
Uuden kohdan lisääminen listaan on nyt helppoa: sen kuin lisäämme koodin vielä seuraavan rivin.
menu_begin(level) funktiossa nollataan taustakoodin tarvitsemat globaalimuuttujat, ja menu_end() funktiossa päivitetään valikon tila pelaajan näppäinpainallusten perusteella.
Tässä vielä esimerkkiohjelman koodi kokonaisuudessaan:
Toivottavasti tästä oli apua, ja tulevaisuudessa omatkin valikkosi syntyvät ilman kyyneleitä.
Yksinkertainen valikkokoodi näyttää seuraavalta:
Code: Select all
menu_begin(1)
if menu_option("eka") then addText "eka"
if menu_option("toka") then addText "toka"
if menu_option("kolmas") then addText "kolmas"
menu_end()
Koodin piirtämä valikko, jossa "toka" on valittuna.
Ajatuksena on, että vaihtoehtoja ei kirjoiteta etukäteen käsin esim. taulukkoon, vaan menupiirron funktiokutsut määrittelevät valikon kokonaisuudessaan. Yllä olevassa koodissa funktio menu_option(msg$) piirtää yhden vaihtoehdon ruudulle, ja palauttaa True jos käyttäjä on valinnut kyseisen kohdan ja painanut enter.
Uuden kohdan lisääminen listaan on nyt helppoa: sen kuin lisäämme koodin vielä seuraavan rivin.
Code: Select all
if menu_option("neljäs") then addText "nelone"
Tässä vielä esimerkkiohjelman koodi kokonaisuudessaan:
Code: Select all
SCREEN 200,200
global menu_pos_y, menu_pos_x, menu_count, menu_level
const MAX_MENUS = 20
dim menu_selected(MAX_MENUS)
function menu_begin(y, level)
menu_pos_y = y
menu_pos_x = screenWidth()/2
menu_count = 0
menu_level = level
endFunction
function menu_option_pick(msg$)
id = menu_count
hit = not (id <> menu_selected(menu_level))
h = 40
if hit then
color 255,0,0
else
color 255,255,255
endif
text menu_pos_x - textWidth(msg)/2, menu_pos_y, msg
menu_pos_y = menu_pos_y + h * 1.5
menu_count = menu_count + 1
if hit and keyHit(28) then clearKeys() : return 2
if hit and keyHit(cbKeyLeft) then clearKeys() : return -1
if hit and keyHit(cbKeyRight) then clearKeys() : return 1
return 0
endFunction
function menu_option(msg$)
k = menu_option_pick(msg)
return not (k <> 2)
endFunction
function menu_end()
setWindow str(menu_level)
o = menu_selected(menu_level)
if keyHit(cbKeyUp) then o = o - 1
if keyHit(cbKeyDown) then o = o + 1
if o <= -1 then o = menu_count - 1
o = o mod menu_count
menu_selected(menu_level) = o
endFunction
repeat
menu_begin(30, 1)
if menu_option("eka") then addText "eka"
if menu_option("toka") then addText "toka"
if menu_option("kolmas") then addText "kolmas"
menu_end()
drawScreen
forever
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Pikselintarkka näkyvyys ei taida olla toteutettavissa. Tein version jossa tilekartasta etsitään aluksi kaikki nurkat, ja sitten raycastit tehdään vain kohti ruudulla näkyviä nurkkia. Ongelmia ilmeni kolme:
Ongelmalliset kohdat on ympyröity magentalla.
Lisäksi käytän pelissä ObjectPickiä pelihahmojen näkyvyystarkistuksiin, eli pickaus pitäisi kytkeä pois päältä näille objekteille näkökentän piirron ajaksi.
Tässä testikoodi joka tuottaa ylläolevan kuvan:
Niin, ja CoolBasicin epäkonsistentit koordinaatistot (y-akseli käänteinen joissakin piirto-operaatioissa, copyboxin riippuvuus kameran paikasta) hankaloittavat kehitystä enemmän kuin uskoin.
Tilekartan päälle piirretään useita 64x64 kuvia.
Ajattelin myös piirtää veritahrat erillisiin dynaamisesti luotaviin kuviin. Tilekartan kokoista kuvaa ei varattaisi kerralla, vaan ruudukko pienempiä kuvia jotka luodaan vasta kun niihin piirretään jotain. Tein ihan toimivan prototyypinkin, jota voi testata seuraavalla koodilla:
Tajusin kuitenkin toteutuksen jälkeen, että veritahrakuvat olisi piirrettävä kartan back-kerroksen päälle, mutta kuitenkin objektien alle. Valitettavasti haluamani piirtojärjestys ei siltään CB:llä onnistu, joten joutuisin luultavasti piirtelemään tilekartan back-kerroksen itse käsin. En ole tehnyt nopeusmittauksia, mutta luultavasti kannattaisi luoda iso kuva jossa olisi koko back kerros, ja tämä sitten piirrettäisiin kerralla. Siis ylläolevalle koodille ei ole tarvetta, koska veritahrat voitaisiin piirtää suoraan juuri siihen samaan kuvaan!
Pitäisi varmaan suunnitella kenttiäkin eikä vain kikkailla grafiikoiden kanssa
- Pelkät nurkat eivät riitä, sillä ruudun reunoille jää muuten tyhjiä alueita. Alla oleva kuva valottaa ongelmaa.
- Säteenheittokulmat pitää järjestää. Tämä ei ole suuri ongelma, mutta välttämätön paha joka syö laskenta-aikaa.
- Kolmioiden täyttö on lukittunakin hidasta. Tästä ei pääse mihinkään.
Ongelmalliset kohdat on ympyröity magentalla.
Lisäksi käytän pelissä ObjectPickiä pelihahmojen näkyvyystarkistuksiin, eli pickaus pitäisi kytkeä pois päältä näille objekteille näkökentän piirron ajaksi.
Tässä testikoodi joka tuottaa ylläolevan kuvan:
Code: Select all
// #define TIC __timerstart = timer()
// #define TOC (timer() - __timerstart)
dim mapCorners(0,0)
dim mapLocal(1,1) 'for temp use
const CORNER_NW = 0
const CORNER_NE = 1
const CORNER_SE = 2
const CORNER_SW = 3
function find_map_corners(map, tilesize)
mapw = mapWidth()
maph = mapHeight()
mapx = objectX(map)
mapy = objectY(map)
reDim mapCorners(mapw, maph)
for ty=1 to maph
for tx=1 to mapw
mapLocal(0,0) = getMap2(2, tx-1, ty-1)
mapLocal(1,0) = getMap2(2, tx , ty-1)
mapLocal(0,1) = getMap2(2, tx-1, ty)
mapLocal(1,1) = getMap2(2, tx , ty)
' 0,0 1,0
' 0,1 1,1
corner = true
' A A
' B B
if (mapLocal(0,0) = mapLocal(1,0)) and (mapLocal(0,1) = mapLocal(1,1)) then corner = false
' A B
' A B
if mapLocal(0,0) = mapLocal(0,1) and mapLocal(1,0) = mapLocal(1,1) then corner = false
mapCorners(tx-1, ty-1) = corner
next tx
next ty
endFunction
const MAX_CORNER_COUNT = 150
'global losCornerCount // done at runtime
dim losCornerAngles(MAX_CORNER_COUNT) as float
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'Aja tämä ohjelma painamalla F5.
'Lopeta ohjelma painamalla ESC.
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
SCREEN 640,480
'frameLimit 40 'rajoita nopeutta
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1
ukko = LoadObject ("Media\guy.bmp",72)
'setupCollision ukko, kartta, 1, 4, 2
dummy = makeObject()
objectPickable kartta, ON
translateObject kartta, 16, 0
__timerstart = timer()
find_map_corners(kartta, 32)
setWindow " took " + (timer() - __timerstart) + " ms"
corner_max = 0
draw_triangles = true
repeat
if keyHit(cbKeySpace) then draw_triangles = not draw_triangles
'Ukon ohjaus
If LeftKey() Then TurnObject ukko,5
If RightKey() Then TurnObject ukko,-5
If UpKey() Then MoveObject ukko,2*2
If DownKey() Then MoveObject ukko,-2*2
updateGame
CloneCameraPosition ukko
drawGame
color 255,255,255
drawToWorld ON,ON,ON
mapw = mapWidth()
maph = mapHeight()
mapx = objectX(kartta)
mapy = objectY(kartta)
map_bound_x = max(0, ((cameraX()-320) - (-objectSizeX(kartta)/2.0 + objectX(kartta)))/32)
map_bound_y = max(0, ((-cameraY()-240) - (-objectSizeY(kartta)/2.0 - objectY(kartta)))/32)
' piirtoa varten ei flipata kameran y:tä, kiitos vaan zerppa
map_bound_y2 = max(0, ((cameraY()+240) - (-objectSizeY(kartta)/2.0 + objectY(kartta)))/32)
map_bound_x_end = min(mapw-1, map_bound_x + roundUp(640/32.0))
map_bound_y_end = min(maph-1, map_bound_y + roundUp(480/32.0))
setWindow map_bound_x + ", " + map_bound_y
box map_bound_x, map_bound_y ,10, 10, 1
' static corners
'const MAX_CORNER_COUNT = 150
'dim losCornerAngles(MAX_CORNER_COUNT)
color cbwhite
corner_count = 0
for ty=map_bound_y to map_bound_y_end
for tx=map_bound_x to map_bound_x_end
if mapCorners(tx, ty) then
sx = (tx)*32 - objectSizeX(kartta)/2.0 + objectX(kartta)
sy = (ty)*32 - objectSizeY(kartta)/2.0 + objectY(kartta)
'sy2 = (ty)*32 - objectSizeY(kartta)/2.0 - objectY(kartta)
ang# = getAngle(objectX(ukko), -objectY(ukko), sx, sy)
losCornerAngles(corner_count) = ang
corner_count = corner_count + 1
box sx,sy,4,4,1
if corner_count >= MAX_CORNER_COUNT then
exit
endif
endif
next tx
if corner_count >= MAX_CORNER_COUNT then
exit
endif
next ty
' dynamic corners
last_hit = -1 'always hit ON first
for x=0 to 20 '640/32
xx = map_bound_x + x
yy = map_bound_y + 1
hit = getMap2(2, xx, yy)
if (last_hit <> hit) or x=20 then
xx=xx-1 'the last tile is the corner
sx = (xx)*32 - objectSizeX(kartta)/2.0 + objectX(kartta)
sy = (map_bound_y2-1)*32 - objectSizeY(kartta)/2.0 + objectY(kartta)
color cbred
box sx, sy+8, 8, 8, 1
last_hit = hit
ang# = getAngle(objectX(ukko), -objectY(ukko), sx, sy)
losCornerAngles(corner_count) = ang
corner_count = corner_count + 1
endif
next x
iters = 0
repeat
sorted = true
for i = 0 to corner_count-1-1
if losCornerAngles(i) > losCornerAngles(i+1) then
temppi# = losCornerAngles(i)
losCornerAngles(i) = losCornerAngles(i+1)
losCornerAngles(i+1) = temppi
sorted = false
iters + 1
endif
next i
until sorted
corner_max = max(corner_count, corner_max)
steps = 30
a# = 360.0/float(steps)
cloneObjectPosition dummy, ukko
ox = objectX(dummy)
oy = objectY(dummy)
px = 0
py = 0
px2 = 0
py2 = 0
lock(SCREEN())
for i = 0 to corner_count
ang# = losCornerAngles(i mod corner_count)
dist# = 9999999.0
rotateObject dummy, ang
objectPick dummy
px = pickedX()
py = pickedY()
if i > 0 then
color 255,255,255
if draw_triangles then drawtri(ox, oy, px, py, px2, py2)
color 0,255,0
line ox, oy, px, py
color 255,255,0
'circle px-4,py-4,16,1
endif
px2 = px
py2 = py
next i
unlock(SCREEN())
drawToWorld OFF,OFF,OFF
color 255,0,0
text 0,0,"FPS: " + FPS()
text 0,12,"corner count: " + corner_count
text 0,12*2,"corner max: " + corner_max
text 0,12*3,"sort iters: " + iters
text 0,12*4,"space: toggle fill"
for i = 0 to corner_count-1
text 200,12*i,i+": " + losCornerAngles(i)
next i
drawScreen
forever
function drawtri(x1,y1,x2,y2,x3,y3) 'by atomimalli
'line x1,y1,x2,y2
'line x2,y2,x3,y3
'line x3,y3,x1,y1
If y2<y1 Then 'jos p2 on ylempänä kuin p1 vaihdetaan niiden paikkaa
tmp=y1
y1=y2
y2=tmp
tmp=x1
x1=x2
x2=tmp
EndIf
If y3<y1 Then 'jos p3 on ylempänä kuin p1 vaihdetaan niiden paikkaa
tmp=y1
y1=y3
y3=tmp
tmp=x1
x1=x3
x3=tmp
endif
if y3<y2 Then 'jos p3 on ylempänä kuin p2 vaihdetaan niiden paikkaa
tmp=y2
y2=y3
y3=tmp
tmp=x2
x2=x3
x3=tmp
endif
'pisteet ovat nyt järjestyksessä
'ylhäältä alas p1(x1,y1), p2(x2,y2), p3(x3,y3)
dy1=y2-y1'pystysuora matka p1:sta p2:seen
dx1=x2-x1'vaakasuora matka p1:sta p2:seen
dy2=y3-y1'pystysuora matka p1:sta p3:meen
dx2=x3-x1'vaakasuora matka p1:sta p3:meen
If dy1 Then 'jos kolmion yläosa on pidempi kuin 0
'käydään läpi kaikki vaakaviivat kolmion yläosassa(p1-p2)
for i = y1 To y2
'lasketaan seuraava x-koordinaatti p1:stä p2:seen
ax=x1+((i-y1)*dx1)/dy1
'lasketaan seuraava x-koordinaatti p1:stä p3:meen
bx=x1+((i-y1)*dx2)/dy2
Line ax,i,bx,i 'piirretään viiva kolmion reunojen välille
Next i
endif
dy1=y3-y2'pystysuora matka p2:sta p3:meen
dx1=x3-x2'vaakasuora matka p2:sta p3:meen
If dy1 Then 'jos kolmion alaosa on pidempi kuin 0
'käydään läpi kaikki vaakaviivat kolmion alaosassa(p2-p3)
For i = y2 To y3
'lasketaan seuraava x-koordinaatti p2:stä p3:meen
ax=x2+((i-y2)*dx1)/dy1
'lasketaan seuraava x-koordinaatti p1:stä p3:meen
bx=x1+((i-y1)*dx2)/dy2
Line ax,i,bx,i 'piirretään viiva kolmion reunojen välille
next i
endif
endFunction
Tilekartan päälle piirretään useita 64x64 kuvia.
Ajattelin myös piirtää veritahrat erillisiin dynaamisesti luotaviin kuviin. Tilekartan kokoista kuvaa ei varattaisi kerralla, vaan ruudukko pienempiä kuvia jotka luodaan vasta kun niihin piirretään jotain. Tein ihan toimivan prototyypinkin, jota voi testata seuraavalla koodilla:
Code: Select all
SCREEN 1280, 800
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1
ukko = LoadObject ("Media\guy.bmp",72)
img = loadImage("media\map.bmp")
'setupCollision ukko, kartta, 1, 4, 2
dim map_tile_images(0,0)
const SECTOR_SIZE = 64
global map_tile_images_tiles_x, map_tile_images_tiles_y
global map_tile_images_tilemap
function tileImages_init(map)
tilesize = 32
map_tile_images_tilemap = map
for y = 0 to map_tile_images_tiles_x - 1
for x = 0 to map_tile_images_tiles_y - 1
'if map_tile_images(x,y) <> 0 then
'deleteImage map_tile_images(x,y)
'endif
next x
next y
pix_w = objectSizeX(map)
pix_h = objectSizeY(map)
tiles_x = int(pix_w / SECTOR_SIZE) + 1
tiles_y = int(pix_h / SECTOR_SIZE) + 1
addText "" + tiles_x
addText "" + tiles_y
map_tile_images_tiles_x = tiles_x
map_tile_images_tiles_y = tiles_y
reDim map_tile_images(tiles_x - 1, tiles_y - 1)
for y = 0 to map_tile_images_tiles_y - 1
for x = 0 to map_tile_images_tiles_x - 1
'map_tile_images(x,y) = makeImage(SECTOR_SIZE, SECTOR_SIZE)
next x
next y
endFunction
function tileImages_debug_draw()
mx = objectSizeX(map_tile_images_tilemap)/2
my = objectSizeY(map_tile_images_tilemap)/2
drawToWorld ON, ON, ON
for y = 0 to map_tile_images_tiles_y - 1
for x = 0 to map_tile_images_tiles_x - 1
xx = x * SECTOR_SIZE - mx
yy = -y * SECTOR_SIZE + my
yy2 = y * SECTOR_SIZE - my
if map_tile_images(x,y) <> 0
color 0, 255, 0
drawImage map_tile_images(x,y), xx, yy2
else
color 255,0,0
endif
box xx, yy, SECTOR_SIZE, SECTOR_SIZE, 0
text xx,yy, x + "," + y
text xx,yy-12, "" + map_tile_images(x,y)
next x
next y
endFunction
function tileImages_draw_image(img,target_x,target_y)
mx = objectSizeX(map_tile_images_tilemap)/2
my = objectSizeY(map_tile_images_tilemap)/2
'color 0,255,255
'box rel_x, rel_y, 8 , 8, 1
'color 255,255,0
'text 50,0,txi + "," + tyi + " : " + rel_x + ", " + rel_y
img_w = roundUp(imagewidth(img)/float(SECTOR_SIZE)) + 1 'TODO calculate offset not just add one
img_h = roundUp(imageheight(img)/float(SECTOR_SIZE)) + 1
for iy = 0 to img_h-1
for ix = 0 to img_w-1
x_offset = ix*SECTOR_SIZE
y_offset = iy*SECTOR_SIZE
tx = target_x + x_offset + mx
ty = target_y + y_offset + my
txi = roundDown(tx/SECTOR_SIZE)
tyi = roundDown(ty/SECTOR_SIZE)
rel_x = tx mod SECTOR_SIZE
rel_y = ty mod SECTOR_SIZE
if txi >= 0 and txi < map_tile_images_tiles_x then
if tyi >= 0 and tyi < map_tile_images_tiles_y then
text 50, 20, "ok!"
tile = map_tile_images(txi,tyi)
if not tile then
tile = makeImage(SECTOR_SIZE, SECTOR_SIZE)
map_tile_images(txi,tyi) = tile
endif
drawToImage tile
drawImage img, rel_x - x_offset, rel_y - y_offset
'box rel_x, rel_y, 8 , 8, 1
drawToScreen
endif
endif
next ix
next iy
endFunction
tileImages_init(kartta)
addText "click with mouse to draw map"
repeat
'Ukon ohjaus
If LeftKey() Then translateCamera -10, 0
If RightKey() Then translateCamera 10, 0
If UpKey() then translateCamera 0, 10
If DownKey() then translateCamera 0, -10
updateGame
'cloneCameraPosition ukko
mous_x = mouseWX()
mous_y = -mouseWY()
drawGame
drawToWorld OFF,OFF,OFF
if mouseHit(1) then tileImages_draw_image(img,mous_x, mous_y)
drawToWorld ON,ON,ON
tileImages_debug_draw()
'drawImage img, mous_x, mous_y
drawScreen
forever
Pitäisi varmaan suunnitella kenttiäkin eikä vain kikkailla grafiikoiden kanssa
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Tarvitsin pelin menuun pyörivän pääkallon.
Latasin Blendswapista ilmaisen pääkallomallin, ja piirrutin siitä Blender-skriptillä kuvasarjan.
Sitten yhdistin kuvasarjan ImageMagickin montage-työkalulla CoolBasicin ymmärtämäksi filminauhaksi.
Latasin Blendswapista ilmaisen pääkallomallin, ja piirrutin siitä Blender-skriptillä kuvasarjan.
Sitten yhdistin kuvasarjan ImageMagickin montage-työkalulla CoolBasicin ymmärtämäksi filminauhaksi.
Code: Select all
E:\temp\sprite>montage.exe -mode concatenate -tile x1 spriteA1.png spriteA2.png spriteA3.png spriteA4.png spriteA5.png spriteA6.png spriteA7.png spriteA8.png spriteA9.png spriteAA.png spriteAB.png spriteAC.png out.png
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Pääkalloanimaatiosta tulee aina tyylipisteitä.
Re: Game of Ukkels: Japan Kaiki - ukkopeli
Viivyttelen yhä kenttien tekemistä, mutta korjasin parit bugit ja lisäsin asevalikkoon päheet animaatiot:
Kiitos malleista Dysposinille.
Kiitos malleista Dysposinille.