torstai 17. huhtikuuta 2014

Välikommentti

Blogi on viettänyt hivenen hiljaiseloa viime aikoina. Tämä on johtunut pääasiassa siitä, että olen käyttänyt vapaa-aikani "Tiedettä ja Skeptiikkaa"-lukiokurssin rakentamiseen. Lyhyehkö englanninkielinen kuvaus kurssista löytyy täältä ja siitä tulee myöhemmin laajempi suomenkielinen juttu Skeptikko-lehteen.

Oppilaani pitävät oppimispäiväkirjaa bloggerissa ja jossain vaiheessa tuli kysymyksiä "Miten bloggaamisella voi tienata?" ja "Kuinka paljon?". Kokeilemallahan se selviää. Jokainen blogia pitänyt on nähnyt asetuksissa kohdan "tulot". Koska tälle blogille tulee useampi sata osumaa viikottain päätin kokeilla minkä verran tulot olisivat ja voisinko jättää opetushommat kokonaan.


Mainoksia ei noin vain saa lisättyä blogiin, vaan siihen tarvitaan lupa Googlelta, eli AdSense-lisenssi. Lupaa pitää erikseen anoa ja blogi analysoidaan hakemuksen yhteydessä. Ensimmäinen anomukseni joulukuussa ei mennyt läpi, mutta anoin lupaa viime kuussa uudelleen ja sain luvan. Nyt kokonaisen kuukauden tienattuani, voin ylpeänä ilmoittaa, että tuloja todellakin on tulossa.







Oppilaat eivät olleet kovinkaan otettuja rahavirroista. :D

Lupaan aktivoitua tämän blogin suhteen lähitulevaisuudessa taas. Vaikka vaihdammekin hivenen suuntaa taas. ;)

maanantai 17. maaliskuuta 2014

Android 4: Palloilun ominaisuuksien rakentelu

Ensiksi aloitetaan uusi projekti. Nimeän omani "Ravistukseksi". Idea on rakentaa ohjelma, joka puhelinta ravistettaessa arpoo pallolle suunnan ja nopeuden. Puhelin värisee ja soittaa pienen äänen pallon osuessa reunaan. Pallon nopeus laitetaan hidastumaan tasaisesti. Tästä samasta jatketaan eteenpäin seuraavalla kerralla ja tätä voi käyttää pohjana useammallekin eri pelille.

Aloitetaan kuten edelliselläkin kerralla. Vedetään ruudulle canvas ja pallo.

Klikataan komponenteista "Screen1" ja valitaan ruudun suunnaksi "portrait", jolloin ruutu ei käänny vaikka puhelinta käännetään. Klikataan "Scrollable" tyhjäksi, jolloin ruutua ei voi vierittää.


Valitaan canvas komponenttivalikosta ja täytetään ruutu asettamalla Width- ja Height-kohtiin "Fill parent".


Pallon valikossa Interval on oletusarvoisesti 100 (ms). Tämä kertoo pallon sijainnin päivitysnopeuden millisekunteina, oletuksena pallon sijainti on siis 10 kertaa sekunnissa. Jos se muutetaan arvoon 10 ms, pallon sijainti päivitetään 100 kertaa sekunnissa ja liike on huomattavasti sulavampaa. Kasvatin pallon koon 10 pikseliin radius-kohdasta.


Lisään ruutuun kiihtyvyysmittarin.


Ruutuun lisätään myös kello.


Kellon idea on toimia ikäänkuin rytmin antavana metronomina. Oletuksena TimerInterval on 1000 (ms) eli yksi sekunti. Muutan sen 100 ms:n, jolloin se antaa signaalin kymmenen kertaa sekunnissa.


Siirrytään "Blocks"-puolelle. Kiihtyvyysmittarinvalikosta löytyy "When accelerometerSensor.Shaking"-palikka. Sen sisälle otetaan pallon valikosta "Set ball.heading" ja "Set ball.speed".


Matematiikka-kategoriasta löytyy kokonaislukuja arpova palikka.Vedetään sellainen sekä suunnan ja nopeuden määräävän palikan perään.


Kuten muistetaan, suunta määrätään asteluvulla. Suunta 0 on oikealle, -180 ja 180 ovat vasemmalle. Laitankokonaisluvun arpovan palikan valitsemaan pallolle jonkun suunnan väliltä -180 ja 180. (Periaatteessa todennäköisyys tarkasti vasemmalle olevalle suunnalle on nyt kaksinkertainen, mutta selkeyden vuoksi käytin ylä- ja alarajana 180.) Nopeus arvotaan välille 20 ja 50.


Laitetaan pallo pomppaamaan reunasta kuten aiemminkin. Pallon valikosta löytyvät "edgereached" ja"Call ball.bounce". Edgereached-palikasta löytyy vielä "Edge" laitettavaksi bounce-palikkaan.


Nyt Blocks-osuuden pitäisi näyttää kutakuinkin tältä.


Kokeillaan kytkeä taas AI companion ja kokeillaan. Pallon pitäisi pomppia villisti ruudulla hidastumatta.




Pallon hidastuminen toteutetaan kellon avulla.


Kellon palikoista löytyy Timer-handle. Kello asetettiin naksumaan kymmenen kertaa sekunnissa, joten nyt tämän palikan sisältö toteutetaan kymmenen kertaa sekunnissa.


Otetaan sen sisään pallon nopeuden määräävä palikka. (punainen varoituskolmio kertoo, että tästä puuttuu jotain)


Matematiikasta löytyy vähennyslasku. 


Vähennyslasku laitetaan pallon nopeuden määräävän palikan kylkeen. Sen sisään laitetaan pallon nopeus ja siitä vähennetään yksi. Nyt Timer-palikka vähentää pallon nopeudesta yhden 10 kertaa sekunnissa. Nopeus arvottiin välille 20-50, joten pallon hidastuminen kestää 2-5 sekuntia. Ohjelmaa kokeilemalla löytyy vika. Pallon nopeus voi mennä myös negatiiviseksi, joten pallo lähtee pysähdyttyään takaisin tulosuuntaansa. Pallo ei pomppaa ja "valuu johonkin kulmaan".
(Jostain syystä pallo ei enää pomppaa, kun nopeus on negatiivinen)


 Pallon hidastuminen toteutetaan jos-lauseella. Ideana on "Jos pallon nopeus on suurempi kuin nolla, vähennä siitä vielä yksi". Kun pallon nopeus on lopulta nolla, siitä ei enää vähennetä mitään.

 Matematiikka-kategoriasta löytyy "on yhtäkuin"-merkki, jonka pudotusvalikosta voi valita myös "suurempi kuin", "pienempi kuin", "erisuuri" yms merkit.

 Liitetään Jos-lausekkeeseen ehdoksi pallon nopeus, "on suurempi kuin" ja nolla. Aiempi pallon nopeuden määräävä lause liitetään "Then" kohtaan.


Koko ohjelma näyttää nyt tältä.


Seuraavaksi lisätään pallon pomputteluun ääni ja värinä. Tähän tarvitaan Media-valikosta "Player" ja "Sound".


Blocks-puolella "Player"-valikosta löytyy värinää ohjaava palikka. 


Liitetään se samaan syssyyn pomppaamisen kanssa. Lisätään vielä matematiikka-kategoriasta löytyvä luku millisekunteihin. Nyt puhelin värähtää lyhyesti aina, kun pallo osuu reunaan.

 Seuraavaksi etsitään sopiva ääni pallon törmäämiselle. Minä käytin tähän freesound.org-palvelua. Muitakin vastaavia löytyy, mutta tämä oli ensimmäinen johon törmäsin. Tämän palvelun etuna on myös hyvin toimiva haku.

https://www.freesound.org/

Klikkaa "Advanced search"

Nyt voit hakea äänen pituuden perusteella. Täällä kuuluu käyttää jenkkityyliin desimaalipistettä desimaalipilkun sijaan. Haen maksimissaan 0,1 sekunnin ääntä, jotta se ehtii soida kokonaan jokaisen törmäyksen yhteydessä. 


Android tukee seuraavia äänitiedostoja:
  • 3GPP (.3gp)
  • MPEG-4 (.mp4, .m4a)
  • ADTS raw AAC (.aac)
  • MPEG-TS (.ts)
  • FLAC (.flac)
  • Ogg (.ogg)
  • Matroska (.mkv)
  • MP3 (.mp3)
  • WAVE (.wav)
Näkyvin puute tässä listassa on androidin kykenemättömyys Audio Interchange File Formatin (.aif) käyttöön. Monet ilmaiseksi saatavissa olevat äänet ovat .aif-tiedostoja, mutta ne pitää muuttaa ensin .wav-muotoon.

Valitsin tähän esimerkkiin "Button click.wav"-äänen, joka on pituudeltaan 16 millisekuntia, eikä ole liian ärsyttävä.


 Freesound-palvelu edellyttää kirjuatumista, mutta sen voi tehdä nopeasti ja sivu muistaa käyttäjän myöhemmin. Kirjautumisen jälkeen äänen saa ladata koneelle.



Designer-puolella valitaan Sound1 ja sen ominaisuuksista intervalliksi 20 ms. Tällöin se soittaa varmasti jokaisen napsahduksen. Klikataan vielä Source ja ladataan ääni App Inventorin palvelimelle.



Äänitiedosto on niin pieni, ettei tässä tarvitse odotella laisinkaan.


Blocks-puolella klikataan Sound1 ja vedetään sen valikosta "Play"-palikka pallon kimpoamista käsittelevään palikkaan. Nyt pallo kimpoaa osuessaan reunaan ja samalla värisyttää puhelinta ja soittaa pienen napsahduksen.


Tämän enempää emme ehtineet kaksoistunnin aikana saada valmiiksi, joten jatkamme tästä seuraavalla kerralla. Annoin oppilaille tehtäväksi ideoida mitä kaikkea pallolla voisi tehdä. Voisiko sitä ohjata jotenkin vai pitäisikö jotain väistää tjms. Katsotaan minkälaisia ideoita tulee.

maanantai 10. maaliskuuta 2014

Android 3: Pallopelin ohjausvaihtoehdot

Tämänkertaisen tunnin aiheena opetella tekemään pieniä pallopelejä. Peleiksi esimerkkejä ei voi vielä sanoa, mutta näiden pohjalta voi pohtia oman pallopelin ohjausta ja pelin ideaa. Aluksi loitetaan uusi projekti


 Nimeän pelin PalloPeliksi.


 Ruutu tehdään pelialustaksi ja tärkein asia tämän onnistumiseksi on estää ruudun vieritys. Tällöin ruudun koko on vain ja ainoastaan ruudun näkyvä osa. Klikataan "Scrollable" pois päältä Screen1:n valinnoista.


 Lisätään ruutuun "Canvas" eli alusta, jossa hahmot, "spritet" liikkuvat. Vedetään ruutuun myös pallo.


Alusta ei ole kummallisen kokoinen, suurennetaan se koko ruudun kokoiseksi asetuksista. Sekä leveys, että korkeus (width ja height) asetetaan "Fill parent", eli täytä näkyvä osa.





Seuraavaksi valitaan komponenteista pallo ja sen ominaisuuksista suurennetaan sen koko 10:ksi


Siirrytään Blocks-sivulle. Pallon valinnoista löytyy "Flung"-palikka. Flung tarkoittaa lennätettyä tai vipattua ja tätä pääsee ohjaamaan nopealla sormen pyyhkäisyllä. Sormi asetetaan siis pallon päälle ja se ikäänkuin nepataan johonkin suuntaan. 


Valitaan pallon palikoista nopeus (speed) ja suunta (heading), jotka vedetään flung-palikan sisään.


 Klikkaamalla flung-palikassa näkyvää speed- ja heading-nappeja, saa näkyviin uusia palikoita. Näistä vedetää pallon suunnan ja nopeuden jatkoksi neppauksen suunta ja nopeus.

 Tällaisenaan ohjelman pallo lässähtää tylsästi reunaan. Tämä voidaan korjata valitsemalla pallon valikosta EdgeReached-palikka. Tämän sisältö toteutetaan, kun pallo osuu reunaan.


Edelleen pallon valikosta otetaan pallon pomppaamista ohjaava palikka, johon kytketään EdgeReached-palikan edge-napin takaa löytyvä get edge. Tähän voitaisiin liittää myös jonkun muun hahmon reuna.


Nyt pallo liikkuu, mutta ainakin omalla puhelimellani kuolettavan h-i-t-a-a-s-t-i. Itsesasiassa niin hitaasti, että luulin ohjelmassa olevan jonkun vian.


Otetaan apuun matematiikkakategoriasta kertolaskupalikka. Laitetaan toiselle puolelle get speed-palikka ja toiselle puolelle jokin kerroin. Kertoimella 10 pallo liikkuu jo hyvinkin liukkaasti.

Pallo saadaan liikkumaan luonnollisemin yhdistämällä pyyhkäisyn nopeus sopivaan kertoimeen.


Tämä rakennetaan uudeksi projektiksi, tällöin ohjaustapa säilyy myöhempää käyttöä varten sellaisenaan. Seuraavaksi kokeillaan ohjata palloa puhelinta/tablettia kallistelemalla. Alkuvalmistelut tehdään kuten aiemminkin, pallo ja canvas vedetään ruudulle ja ruudun vierittäminen estetään valikosta.


Ihan aluksi mennään Designer-sivulle ja estetään ruudun kääntäminen. Tällä tavoin ruutu ei käänny palloa ohjattaessa. Sensoreista löytyvä orientation sensor lisätään Designer-sivulla ruudulle. Alla oleva kuva kertoo mitä roll, pitch ja azimuth tarkoittavat. 

Roll tarkoittaa kierimistä, Pitch pystysuunnassa kallistamista ja Azimuth kompassineulamaista puhelimen kääntämistä. Kuvan lähde: http://tinyurl.com/p36w4d9

 ja etsitään Blocks-sivulla "orientation changed"-palikka. Laitetaan sen sisään pallon nopeutta ja suuntaa ohjaavat palikat. Nopeutta ohjataan kallistuksen määrällä, "Magnitude" ja suuntaa kulmalla "Angle".

Pallo liikkuu taas todella hitaasti, mutta asia voidaan tässäkin tapauksessa korjata käyttämällä kerrointa.


Viimeisenä vielä tylsin tapa ohjata palloa, eli nappien käyttäminen. Taas uusi projekti ja alkuvalmistelut kuten aiemminkin. Vedetään Designer-näytössä ohjelmaan neljä nappia. Vedän myös layout-kategoriasta "HorizontalArrangement"-palikan, jolla saan napit jaoteltua vähän loogisemmin.

Vaihdan nappien tekstit kertomaan mitä ne oikeasti tekevät. Blocks-näytössä otan napin valikoista klikkaus-palikan.


Klikin sisälle vedän pallon valikoista suunnan ja nopeuden. Laitan aluksi jokaiseen nopeudeksi 100, suunnaksi laitetaan kullekin napille kuuluva suunta. Suunta ylöspäin on 90, vasemmalle 180, oikealle 0 ja alas -90.


Ohjaus on todella kökkö, pallo liukuu joko suoraan ylös-alas- tai vasen-oikea-suunnassa. Koska pallon kimpoaminen on vielä mukana, ei ohjauksesta voida tässä vaiheessa vielä oikein puhua.Tästä jatketaan seuraavalla kerralla ottamalla mukaan nopeutta ja suuntaa ohjaavat muuttujat, jolloin liikkeestä tulee luonnollisempaa. Muuttujat voidaan ottaa käyttöön kaikilla ohjaustavoilla. Napeilla ja asentoa vaihtaessa luonnollisuus tulee kiihtymisen kanssa, neppaamisessa pallon liikkeen hidastumisessa.