25.12.2012

Oma koodailuprojekti, osa III

Minne nokka näyttää

Nyt kun olin vihdoin saanut sekä kuvioni kierron kuntoon ja sen suunnankin vihdoin selville, perustoimista jäljellä oli liikkuminen. Ensimmäinen yritelmäni oli vallankin jälkikäteen ajateltuna naurettava: jos kulma osoitti johonkin pääilmansuuntaan, kyseinen suunta sai täyden nopeusmuutoksen - jos taas sille välille niin jonkun puolikkaan muutoksen kahteen pääsuuntaan jaettuna. Testatessa se näytti ensin hienolta, mutta hetken päästä huomasin, että "Heeeeei... tämähän nykii kääntyessä ja kaasuttaessa ihan omituisesti". Pienikin poikkeama 3π/2:sta muutti nopeutta aina täysillä johonkin väli-ilmansuuntaan. Hupsis.

Realistisempi nopeusmuutos

Hyvin pienen ruuduntuijottelun jälkeen pääparassani syttyi lamppu: jos vaikka käyttäisin noita hiton trigonometrisia funktioita kertomaan juuri tuon: tunnettu kulma ja nopeus voidaan kääntää kertomaan aiemmin ihmettelemäni Δx ja Δy -arvot... Eli sama temppu, mutta päinvastaiseen suuntaan. Onneksi tuon äkkäämiseen ei mennyt muutamaa minuuttia enempää.

tempspeed = Vector(self.speed.x, self.speed.y)
dy = math.fabs((math.sin(self._angle))*self._acceleration)
dx = math.fabs((math.cos(self._angle))*self._acceleration)

# ...


Toki tuossa pitää vielä tarkastella polygonin suunnan perusteella, ovatko Δx ja Δy positiivisia vai negatiivisia kukin, jotta kiihdytyksen voi asettaa oikein. Pääasia, että se näyttää hyvältä ainakin tällä hetkellä.

Partikkeliefektejä!

Pelkän kuvion "lennättely" tyhjällä ruudulla käy äkkiä tylsäksi. Näpertelin siis Star Control (tai Auts tai  V-Wing tai Wings) -henkisen kaasutteluefektin. Sen tarkemmin moottoripaikkoja miettimättä asetin* ne polygonini alakulmiin. Aina, kun kaasua painetaan, senhetkisiin koordinaatteihin pudotetaan palikat, jotka kuolevat pois muutaman syklin päästä ja elellessään haalistuvat vähitellen. Tekaisin samalla vaivalla testimielessä warppinapin, jota painamalla palikka siirretään keskelle pelialuetta. Aiempaan paikkaan luodaan räjähdyksenomaiseti kahdeksan eri suuntiin lentävää partikkelia. Efekti on hauska, vaikka itse sanonkin. Räjähdyksiin minä tuota meinasin oikeasti käyttää.

*) Teinpä kaukoviisaana sentään sellaisen toteutuksen, että heti halutessani voin nakata ne mihin lystää, niissä lukumäärissä kuin haluan. Noin suunnilleen. Ehkä vältän tyhmyysrefaktorointia tällä tavoin.

Kavereita ruudulle

Mitäpä sitä suurinpiirtein kolmion muotoisella roikaleellaan tekisi 2d-avaruudessa ja varppailisi eestaas, jollei siellä ole seuraa? Tylsistyisi äkkiä, sanon minä. Mahdollisesti typerä ideanikin lienee jo tässä vaiheessa kaikille selvä kuin pläkki. Sekaan heitettäisiin tietenkin asteroideja!
Olin kovin riemastunut, kun sain kahdeksankulmaiset satunnaisepämuodot ruudulle neljässä eri kokoluokassa, pyörimään hiljakseen joko vasta- tai myötäpäivään ja parin iteraation jälkeen myös lentämään omaan suuntaansa. Se oli upeaa.
Pröp pröp pröp
Minä ainakin olin tuosta ylpeä.

18.12.2012

Oma koodailuprojekti, osa II

Taisin viimeksi sanoakin, etten ole koskaan koettanut tehdä mitään kovin graafista, jollei opiskeluaikojen nelikulmioita tai palloja ruudulle oksentelevaa TurboC++ -tekelettä lasketa mukaan (ei, ei sitä lasketa). Ykkösongelmani iski siis silmille jo tässä vaiheessa. Nelikärkisen polygonini piirtäminen keskelle piirtoaluetta oli simppeliä, mutta sen siirtely...

Mutisen tässä omista oivallusaskeleistani kutakuinkin niin kuin niitä muistan ja missä on olevinaan edes jonkunlaista tolkkua. Laatua en takaa, kuten en yleensäkään ;)

Sijainti, kierto, siirto, piirto

Ensimmäinen yritykseni oli siis kovakoodattuja koordinaattipisteitä käyttävä roipe. Kuvittelin, että siitä olisi hyvä lähteä mutta voi voi, miten väärässä olinkaan. Ehkä vika oli omissa ensimmäisissä kiertometodeissani ja toimivilla olisi toiminutkin, mutta ehkä ei. Alkutilanne piirtyi ruudulle kauniisti, mutta yksikin kiertoliike hajoitti koko muodon ihan miten sattuu.

Nollapisteen kautta

Keksin jostain (ja työkaverin kanssa puhuttuani oletukseni osoittautui oikeanlaiseksi), että jospa kaikkien piirrettävien kuvioiden kulmapisteet asetettaisiin aina (0,0):n suhteen. Tällöin polygonin kierto toimisi aina samalla tavalla, kun ei tarvitsisi arpoa sijainnin kanssa pätkääkään. Ensin siis napataan polygonille kulmat aina samaan paikkaan, sitten niiden arvot siirretään kohdalleen, tässä tapauksessa keskelle piirtoaluetta ja piirretään näkyviin. Yksinkertaista ja varmaan lapsellisen alkeellistakin, mutta kukas tuon olisi minulle käynyt kertomassa?

Kaksiulotteisen koordinaatiston kierto

Minun matemattiset opintoni ovat vuosien takana ja olin ehdottomasti niitä rasittavia kakaroita jo peruskoulussa, jotka julistivat, etteivät ikinä tarvitse matematiikkaa, saati sitten trigonometriaa koulun jälkeen. Näin se taas nähtiin, ettei se ihan noin mene :)
Muutaman omituisen ja hölmön "teen itse"-henkisen yrityksen jälkeen törmäsin affiiniin kuvaukseen ja sehän olikin näppärä ja toteutus kutakuinkin suoraan kirjoitettava. Sille nakataan kunkin piirrettävän polygonin jokaisen kulman koordinaatit vuorollaan ja haluttu kiertokulma (luonnollisesti se on kaikille sama), paluuarvona saadaan uudet koordinaatit.

def rotate(self, angle):
        rotated_points = []
        for point in self._points:
            new_point = self.affine_transform(Vector(point.x, point.y), angle)
            rotated_points.append(new_point)       
        return rotated_points


def affine_transform(self, point, angle):
        temp_x = ((point.x * math.cos(angle)) + (point.y * math.sin(angle)))
        temp_y = ((-point.x * math.sin(angle)) + (point.y * math.cos(angle)))
        return Vector(temp_x, temp_y )



Hah! Seuraavat kannot kaskessani olivatkin tuo kulma (kohelsin asteiden ja radiaanien kanssa, omaa pohjatonta tyhmyyttäni siis). Suurin ja melkoista päänvaivaa aiheuttanut ongelma oli siis polygonini liikuttelu piirtopinnalla. Kääntely toimi, mutta kun koetin saada sitä liikkumaan kolmion kärjen suuntaan, se lähti liitämään kiinteästi toiseen yläkulmaan ja sen ohi. Jos yritin kääntää liikkuvaa kolmiota, se liikkui edelleen oikeaa yläkulmaa kohti, mutta kuin syöksykierteessä... gnaah.

Miten lasken, mihin suuntaan polygonini katsoo?

Typeränä virheenä numero 74 olin unohtanut paikalleen kovakoodatut "piirrä tuo keskelle kuvaruutua"-arvot ja toisena jäätyneenä käpynä oli aina sama kulma. Olin jostain saanut aikaan kuvion kiertokulman (eli mihin sen "nokka" osoittaa) laskentaan toteutuksen, joka oli vähän väärä. Laskin nimittäin jotain eri kylkien pituuksien ja niiden välisten kulmien perusteella - muuten kai ihan hienoa toimintaa, muttei se tässä auttanut.

Pienen googlettelun ja kevyen pään pöytään hakkaamisen perusteella ratkaisu olikin helpompi kuin mitä sopisi olettaa. Tai ainakin näin tyhmälle. Kun tiedetään kärkipisteen koordinaatit ja keskipisteen koordinaatit, voidaan niiden x- ja y-suuntaisten välimatkojen (Δx, Δy) perusteella laskea arctanilla koko roskan kulma radiaaneina.

Kai se jotain selventää, vaikka vähän epäilenkin :p


def calculate_angle(self, center, nose):
        dx = center.x - nose.x
        dy = center.y - nose.y       
        radian_angle = math.atan2(dy, dx)
        return radian_angle


Nerokkaan yksinkertaista, sanon minä. Tähän väliin näyttää tosin siltä, että kukaan ei jaksa lukea tästä enää enempää yhdellä istumalla, joten jatkan taas seuraavalla rundilla.

11.12.2012

Koodailuprojektin taustaa

Taustaa

Kaipa "kaikki" missään määrin ohjelmointia edes kokeilleet ovat miettineet, että oman pelin tekeminen olisi hienoa. Joskus aikanaan räpelsin jotain sekavia tekstiviritelmiä senaikaisen 486:n mukana tulleella QuickBasicilla, muttei niistä syntynyt ikinä mitään sen mainittavampaa. Suurin kanto kaskessani on tuossa vaiheessa ollut se, etten vaan osannut mitään mutten myöskään keksinyt etsiä mitään Basic-ohjekirjaa hyödyllisempää lähdettä, josta opetella.
Jostain kummallisesta syystä, varmaankin laiskuudestani, johtuen en myöskään ruvennut kikkailemaan pelien tekemistä myöskään sen jälkeen, kun olin opiskellut ohjelmointia ja jopa oppinutkin jotain. Ajoittain mielessä kävi kyllä, että pitäisi tehdä jotain. Jos ei muuta niin ihan vaan huvin vuoksi.

Python - Pygame

Työkaveri vinkkasi joskus Ruby-pohjaisesta Shoooes-palikasta, jota meinasin kokeillakin, mutten taas vaihteeksi saanut mitään oleellista aikaan. Sitten sekin jäi monen muun "hei kokeillaas tätä"-tyyppisen testin kanssa nurkkaan pölyttymään. Törmäsin joskus vuosi, puolitoista sitten rss-feedeissäni Pygame-kirjastoon Pythonille. Perinteitä kunnioittaen testailin jotain pientä oman aikani kunnes sekin vain jäi hyvien (lue: toteuttamiskelpoisten) ideoiden puutteen takia.

for idea in ideas:

Kun tyystin oman idiksen toteuttaminen ei ole se helpoin, mitäs sitten? Jäljitellään muita eli kiivetään niiden jättiläisten hartioille huitomaan. Työkaverini oli ruvennut sörkkimään jotain Roguelikeä kasaan joten se siitä tähän väliin (vaikken ollutkaan miettinyt mitään perusfantasiateemaa). Lapsuudessani pelasin kovasti epätoivoisen vaikeaa Xenon II: Megablastia ja myöhemmin loistavaa Tyriania.
Xenon II: Megablast

Siinä mielessä klassishenkisen shoot'em upin pysty- tai sivuskrollaavana kiinnosti kovasti sekin. Noissa ensimmäinen esiinnoussut kysymysmerkki oli tasojen kanssa tuunaaminen, joten jätin idikset edelleen korvan taakse kaiken muun saastan sekaan.

Tyrian
Hiekkalaatikkoilu sekä tietyntyyppinen avoimuus, valinnanvapaus ja yleinen satunnaisuus (= kaikki ei aina tapahdu samalla tavalla ja samassa järjestyksessä) on aina kutkuttanut. Totaalinen vaihtoehdottomuus ja eritoten (tiukat) aikarajat kiehuttavat kerrasta toiseen. Ei sillä, että tuosta olisi helpointa lähteä liikkeelle, mutta jostain on aloitettava.

Kiepsis

Rupesinpa sitten lähestymään asiaa toisesta päästä eli aiemmasta top-downista bottom-upiin, vaikken ehkä ihan tietoisesti vaan ennemminkin puolivahingossa. Näppäilin siis ihan uteliaisuuttani ympäriinsä ja katselin, mitä kaikkea tuolla Pygamella voi tehdä ja miten se tehdään. Parilla hassulla koordinaattipisteellä ja kevyellä päänrapsuttelulla pygame.draw.Polygon(...) toi kiehtovia tuloksia piirtopinnalle. "Hei, tuotahan voisi vaikka liikutella noiden näppäineventtien perusteella! Mites sen tekiskään..."

Mitä juoninkaan? Siitä kerron teille ensi viikolla.
Olen ilkeä tiiseri, tiedän. Hähä.

4.12.2012

Henk. koht. vaurioita

Tyhmästä päästä kärsii koko ruumis.

Mitä niillä nivelillä...


Särjin siis lautasen käsiini ja päädyin tikattavaksi. Tietysti pahimmat vauriot otin oikeaan peukalooni, joten rakenteluprojekti on kuivatelakalla hetken tai toisenkin. Kas kun tikkien poiston jälkeen alkaa olemaan vuosiloma kiireineen kohdalla, joten rakenteluaika on muutenkin kortilla tuohon aikaan. Saapa nähdä, miten tässä käy.


28.11.2012

Sisätiloissa

Peruspaloja

Jatkoin edelliskerran aikaansaannoksiani ja kasailin kuskin ja radistin työpisteitä sen, minkä uskalsin. Ukkojen penkit jätin liimaamatta kiinni, jotta saan roimittua uuden kerroksen pohjamaalia peittämään paljaat läiskät ja myöhemmin valkean maalipinnan sisätiloihin. Tässä vaiheessa voin vielä sörkkiä yksityiskohtia (kuten radiot, mittarit, kädensijat ja yleistä kulumaa ja sotkua) kuntoon, niiden jälkeen isken sekä tuolit että seuraavan pääkalikan ammusräkkeineen paikoilleen. Sen jälkeen lisätään vaan uupuvia palasia ja yksityiskohtia paikoilleen eikä varmaan mene kovinkaan kauaa kunnes sisätilat ovat juuri niin valmiita kun ne tulevat ikinä olemaankaan.

Ahdasta tulee

Pommeja täyteen koko romu

22.11.2012

Kalusteita

Innolla sisustamaan

Päätin, että pistän valtaosan miehistön tiloista ensin kasaan ja roimin siihen päälle valkoisen sisätilamaalin. Lopuksi sitten pääosa sisäkalusteista eli ammusräkit murkuloineen ja muine oleellisine romuineen. Taas päästään jännäämään, olenko onnistunut arpomaan rakennus-maalausjärjestyksen fiksusti vai meneekö metsään. Ajoittain ongelmat ovat omiani eli kukaan muu ei edes huomaa niitä, mutta jos itse tiedän, että jokin on vinossa, jää se kaivelemaan.

Telakoneisto

Telapyörien, jousitusroippeiden ja vastaavien kanssa ei huvittanut säätää juuri nyt, joten jääköön se myöhemmäksi. Tämä vekotin tehdään pääsääntöisesti kovasta ytimestä kohti ulkokuorta ja sen ohi. Eikä tuossa ulkopinnassa mitään kovin kummallista ole tehtävänäkään, väripinta näyttää olevan tummanvihreä matkustajien passinmyöntäjävästä riippumatta.

15.11.2012

Pohjalta pääsee vain ylöspäin

Itseäni niskasta paroni von Münchhausenin lailla roikottaen kaivoin eilisiltana kaapista maalausromppeet. Kompuran, ruiskuttimen ja harmaan primerin (73.601). Kahden kierroksen ja noin vuorokauden mittaisen kuivattelutauon jälkeen tilanne on se, että palaset on pääsääntöisesti nyt pohjamaalattu. Ehkä rakenteluinto pääsee täyteen mittaansa tässä lähipäivinä. Kyllä se siitä, kun aloitan vihdoin kunnolla.

Ongelmointia

Pohjamaalin kanssa olen joko kämmännyt niin, että ohenninta on käytetty ihan liian vähän tai sitten jokin on päässyt kuivahtamaan vähäsen purkkiin. Vika ilmenee siten, että ruiskutin räkii vähän ja tukkeutuu satunnaisesti. Olisi kai pitänyt noudattaa pirkkaniksiä ja suodattaa säiliöön lisättävä maalilitku aina sukkahousujen läpi tai jotain. Niitäkin pitäisi vaan olla jossain valmiina, minä noita lähde iltayhdeksältä mistään ostelemaan...

Runkoa sun muuta

Palasia osa n
Synkin vaihtoehto on tietysti se perinteinen ja ehkä ihan oletettavakin. En vaan osaa niin mitään. Vaan ei se mitään, ei osaa moni muukaan ;)

1.11.2012

Projekti III/12 - M-10 Achilles

Uusille urille


Olen tunnetusti saksalaisen sotakaluston suuri ystävä. Kyseessä on fakta, jonka kuka tahansa huomannee ihan noita aiempia tekeleitäni katsellessa. Jos kovin tarkkaan miettii, mallailu-urani alkuvaiheessa kyhäsin jonkun neukkujen Polikarpov-koneen ja muutama vuosi sitten yhden T-34/85:n. Muuten en ainakaan muista poikenneeni Wehrmachtin polulta, jos tosimaailman esineistöä listataan.

Taidan olla itse asiassa ottamassa ensimmäisiä askeleitani länsiliittoutuneiden puolelle. Kaikkea kummallista sitä tuleekin tehtyä. Paketti tarjoilee vaihtoehdoiksi joko britti-imperiumia tai puolalaisia. Tällä hetkellä mielialani johdattelee saari-ihmisten suuntaan, mutta ehtiihän tätä vielä arpoa. Maalipinta on ainakin ohjeen esimerkeissä sama: tummanvihreä runko.

Ovatpa mälsiä.

Ja käsiksi

Aski auki ja osia ihmettelemään! Tietysti kaikki oli pakattu piljoonaan pussiin, joten ihan ensin roskaamaan kuin pieni sika.

Boksi ja kaunis salamaheijastus

Ohje ja pussiosat


Boksista löytyi vajaa tusina valurankaa, rungonpalat, hassu pätkä narua ja häkellyttävän kapeat lakutelat. Eiköhän tähän saada aikalailla aikaa uppoamaan, vallankin kun sisätiloja näkyy mallinnetun aika hyvin. Ehkä saan arvottua jonkunlaisen järkevän rakennus- ja maalausjärjestyksen arvottua kasaan tällä kertaa.
Suvaitsen kuitenkin epäillä :)


Osat ilmakylvyssä

23.10.2012

Valmista: Projekti II/12

Myönnän ihan avoimesti, että tämänvuotinen projisointi minkään rakentelun ja maalailun saralla on ollut aika hidasta. Siitäkin huolimatta jo toinen saksalainen kissa on valmis! Kaunista, upeaa, mahtavaa!

Viimeinen pyrähdys

Edelliskerralla mainostamani ylimääräiset telakengät maalasin, sotkin ja siistin ennen kun löin ne kylkiin kiinni. Paikkoja niille oli kuusi, mutta palikoita neljä settiä. Ajattelin ihan vaan vaihtelun vuoksi antaa vasemmalle kyljelle kaikille kolmelle slotille täytettä ja jättää oikealle puolelle vain yhden kenkäparin. Tyhjiin paikkoihin tulevat tapit laitoin kiinni sellaisenaan, tietysti, täysiä varten leikkasin L-tapeista ylimääräiset pois ja tökkäsin vain yläpuolella näkyvät osat paikalleen. Jos tuota kävisi siis väijymässä alhaalta, näkisi, etteivät tapit tule alakautta läpi niin kuin niiden pitäisi.

Sotkua

Kauniiksi lopuksi sotkin vaunua kuralla, kun se oli olevinaan tämän tekeleen ideakin. Ketjuihin, takakannelle ja taistelutilan katolle tuhrasin taannoin ostamaani Tamiya Weathering Master -setin "Mud" -tuotetta. Kaipa se nyt näyttää siltä, että vaunun päällä on kävelty kakkaisin saappain? 88PaK43:n suuhidastimen sotkin taas Vallejon 73116 "Carbon Black":lla. Tuon pudun käyttämistä joudun kyllä harjoittelemaan, tuntuu jotenkin oudolta materiaalilta ainakin kun sitä vertaa noihin Tamiyan miesmeikkeihin.
Viimeisenä räpelsin sekä ketjuja että alarunkoa Tamiyan Weathering Stickillä ("Mud"). Ehken tällä kertaa innostunut ihan kamalasti liikaa?

SdKfz 173 Ausf. G1 Early Production

Kuvat, kuten aina ennenkin, kertovat enemmän kuin tuhat sanaa:

Siinä yksityiskohta putken suusta









Olisin toki voinut vaihtaa ihan toisen linssin tuohon kameraan mutta ajattelin kokeilla, millaista jälkeä tuolla saa aikaan näin illan hämyssä ja sähkövalossa. Tulipahan kokeiltua.
Kuka muu tahansa kuin Lasse, joka tietää, mistä taustaläpyskä on, saa pisteen.

Tulossa

Seuraavaksi brittien tai polakkien suuntaan, mutta edelleen mudassa ja ties missä möyrien. Ehkä jo ensi viikolla. "Melkein FiFo"-työjonostani ulos popataankin siis joululahjuksena saatu Italerin M-10 Achilles.

18.10.2012

Ruostumisyritysvalmistelu

Lassen aiempi kommentointi jäi mieleeni ja päätin, että otan hänen mainitsemansa värisotkun kokeiltavakseni. Suunnilleen, koska värivalikoimassani on sellaisia värejä, joita siellä on - eivätkä ne ole ihan samoja. Mutta ovatpa samaan suuntaan, kai niilläkin pärjää.
Tästä tullee rumaa

Nuo vaunun takakylkiin tulevat irralliset telakengät eivät siis ole mutaisia ja muuten vaan paakkuisia, vaan siinä jo hyvän aikaa roikkuneita. Näin siis pohjalle tulee Flat Aluminium -pohja, jota sitten tuhritaan oikein etovasti Flat Brownin ja itsestoketun oranssin (kas kun en ole tarvinnut erillistä oranssia koskaan, joudun sotkemaan noista Vallejon Game Coloreista (Bloody Red + Bald Moon Yellow) oman sävyni). Minusta se on ainakin ihan hyvä ajatus, muutakin mieltä saa olla, jos uskaltaa.