keskiviikko 23. heinäkuuta 2014

Matopeli ja Pong WeSchemellä

Kokeilin miten saisin Racket-pelini toimimaan selaimessa. En saanut Racketin omaa JavaScript-kääntäjää toimimaan (http://hashcollision.org/whalesong/), mutta pienen työn jälkeen sain portattua Racket-koodini WeScheme-ympäristöön. WeScheme toteuttaa riisutun version Schemestä (http://www.wescheme.org/doc/wescheme.html). Toteuteuksen avulla voi tehdä yksinkertaisia animaatioita sekä pelejä. Hyvää WeScheme:ssä on se, että se mahdollistaa myös koodin katselun hieman Scratch:in tyyliin. Koodin tallentaminen verkkoon vaatii Google-tilin ja käytettävät kuvatiedostot on myös tallennettava verkoon. Ohjelmointiympäristönä WeScheme ei ole kovin kätevä, koska sen antamat virheilmoitukset ovat ajoittain hieman epäselviä (mm. rivinumero saattoi  puuttua kokonaan) eikä debuggaukseen ollut minkäänlaisia työkaluja. Siksi päädyin  tekemään koodin vaatimat muutokset DrRacketissä ja kopioin vasta valmiin tekeleen WeScheme-ikkunaan.
Olisin luullut, että Scheme ja Racket ovat hyvinkin samankaltaisia mutta jouduin koskemaan aika moneen kohtaan koodissani. Tässä pieni lista vaadituista muutoksista:
  • "struct"-määrittelyt piti muuttaa "define-struct" muotoon
  • konstruktorikutsuihin piti lisätä "make-" 
  • kuvatiedosto pitää ladata URL:n kautta (WeScheme rajoitus)
  • lokaalit muuttujat piti määrittellä "define":n sijaan "let":llä tai rekursiivisissa tapauksissa "letrec":llä
  • Scheme oli tarkempi myös boolean arvojen kanssa, Racketissä kaikki muu paitsi "false" on "true"
  • WeSchemessä ei ilmeisesti ole mahdollista käyttää mutaattoreita, ainakaan structeja ei voinut määritellä "#:mutable" eikä näin ollen ollut tarjolla set-funktioitakaan. 
  • WeSchemen big-bang:in "stop-when"-toiminnolle ei voi antaa parametrina pelin viimeisen ruudun piirtofunktiota (toimii DrRacketissa) joten viimeisen ruudun piirtäminen vaati hieman lisää koodia. 
Näiden muutosten jälkeen mato lähti liikkeelle ihan näppärästi mutta Pong hidastui oudosti. Onneksi muuttamalla hieman parametreja sain Pongin pallon taas liikkumaan järkevällä nopeudella mutta mailat jäivät hieman jumittelemaan. Ei siis aivan optimaalista, mutta toimii jotenkin.

Kokeile pelejä klikkaamalla alla olevia kuvia:




Aluksi olin hieman pettynyt, että pelit eivät toimineet mobiililaitteilla (tai siis toimivat mutta matoa tai mailoja ei voinut ohjailla nuolinäppäinten puuttuessa). Sitten löysin Bootstrap-discussion-ryhmästä ohjeita mobiilituen lisäämiseen ja pienen ohjelmointisession jälkeen sain pelit toimimaan myös mobiililaitteissa!!!

Kokeile Matopelin mobiiliversiota klikkaamalla alla olevaa kuvaa (testattu toimivaksi iPadillä sekä Lumialla):