Tervetuloa ensimmäisen ja ainoan suomalaisen OPL-ohjelmointioppaan pariin oppimaan perusasioita tästä EPOC:ssa ja Symbian OS:ssa toimivasta ohjelmointikielestä.
Jotta voisit aloittaa OPL:llä ohjelmoimisen, sinulla tulee olla ympäristö, jossa voit ajaa koodiasi. Sinulla on kaksi vaihtoehtoa, joista valita: laite itse (esim. Nokia 9300) tai Windowsissa toimiva laitteen emulaattori (SDK:ssa mukana). Windows-emulaattori ei toimi samalla nopeudella kuin puhelin, joten varsinkin pelejä tehdessä voivat tulokset vaihdella emulaattorin ja puhelimen välillä valtavasti.
1. Puhelimeen asentaminen
- lataa viimeisin OPL-ohjelmointipakkaus osoitteesta http://opl-dev.sourceforge.net/opldev.html
- lue ZIP-arkiston readme-tiedosto ja seuraa ohjeita
2. Tietokoneen emulaattorille asentaminen
- hae puhelimen SDK Forum Nokiasta ja asenna se
- lataa viimeisin OPL-ohjelmointipakkaus osoitteesta http://opl-dev.sourceforge.net/opldev.html
- lue ZIP-arkiston readme-tiedosto ja seuraa ohjeita
Nyt ohjelmointiympäristösi on valmiina, joten voit alkaa ohjelmoimaan.
Annan pienen vinkin, jolla voit nopeuttaa emulaattorilla ohjelmoimista: älä kirjoita koodia emulaattorilla, vaan avaa Windowsissa tekstitiedosto ja tallenna se polkuun "C:\Symbian\7.0s\S80_DP2_0\epoc32\wins\c\" tai vastaavaan osoitteeseen omassa SDK:ssasi. Kirjoita tai copy-pasteta tähän tiedostoon koodisi ja avaa se joka kerta emulaattorin OPL-tekstieditorilla painamalla nappeja CTRL, SHIFT ja I yhtä aikaa. Tämä kikka osoittautuu ennen pitkää erittäin hyödylliseksi, sillä et voi copy-pastettaa Windows-ympäristöstä tekstiä puhelimen emulaattorille.
Kääntäjä, jota varmasti käytän yleisesti tekstissä, on "robotti", joka tulkkaa OPL-koodin konekieleksi (...01101011100...), jota laite ymmärtää.
Käytän esimerkeissäni Series 80 v2.0 -käyttöliittymää, joten näyttökaappaukset ovat otettu sen emulaattorissa.
Sanaa tulostaminen käytän, kun koodinpätkä tuo laitteen näytölle jotain materiaalia.
Sanaa proseduuria käytän myös - älä hämäänny siitä - se tarkoittaa yhtä ohjelman perusosasta - PROC-lohkoa (joita voi lähdetiedostossa voi olla useita), joka päättyy ENDP-komentoon.
OPL-ohjelman suorittamisen voi katkaista emulaattorilla näppäinyhdistelmällä CTRL + ESC ja laitteessa yhdistelmällä SHIFT + ESC.
Olkoon ensimmäinen ohjelmamme helppo ja yksinkertainen koodinpätkä, joka näyttää ruudulla tekstin "Hello, world!" (klassinen ohjelmointiesimerkkiohjelma):
PROC HelloWorld:
PRINT "Hello, world!"
PAUSE 40
ENDP
Kääntääksesi ohjelman sinun tulee avata TextEd- tai Program-niminen ohjelma emulaattorilla tai puhelimessa, kirjoittaa ylläoleva koodi tekstikenttään ja painaa "Translate"-nappia (tai näppäinyhdistelmää CTRL + L).
Näyttökaappaus käännetystä ohjelmasta:
Käydään ohjelma läpi.
Nyt näit, miten OPL:n ohjelmointi toimii käytännössä. Tuo koodinpätkä on kuitenkin vasta alku sille, mitä kaikkea OPL:llä voi tehdä. Seuraa siis perässä.
Vaikka sana muuttuja voi kuulostaa tylsältä, on se yksi ohjelmoinnin perusasioista. Muuttuja on osanen, johon voidaan tallentaa tietoa ja sen arvoa voidaan muuttaa.
Jottei tämä kävisi turhan teoreettiseksi, liatkaamme kätemme: teemme yhteenlaskun muuttujien avulla ja tulostamme sen näytölle.
PROC Muuttujat:
LOCAL A%, B%, C%
A% = 10
B% = 8
C% = A% + B%
PRINT C%
PAUSE 40
ENDP
Näyttökaappaus:

Nyt tuli vastaan vähän monimutkaisempaa koodia, mutta ei se mitään, käymme taas tutulla tavalla sen läpi.
%-loppuiset muuttujat ovat siis lukuarvojen -32768 - 32767 tallentamista varten. Mutta mitä, jos halutaan tallentaa muuttujiin vaikkapa suurempia numeroita tai jopa kirjaimista muodostuvia nimiä? Siihen käytetään sitten erilaista loppumerkkiä kuin %. Alla on taulukko kaikista OPL:n muuttujatyypeistä.
| Muuttuja | Haarukka | Loppumerkki | Muuta |
|---|---|---|---|
| Pieni luku | -32768 - 32767 | % | Kokonaisluku |
| Suuri luku | -2147483647 - 2147483648 | & | Kokonaisluku |
| Liukuluku | 2,2250738585072015E-308 - 1,7976931348623157E+308 | Ei mitään | Desimaaliluku |
| Kirjainjono | Kaikki kirjaimet, numerot ja erikoismerkit | $ | Voi pitää sisällään vain 255:ttä kirjainta enimmillään. |
Mutta jos liukuluku voi ajaa saman asian kuin pienikin luku, niin miksei voisi käyttää joka kerta liukulukuja? No sen vuoksi, kun liukuluku vie paljon enemmän muistia kuin pieni luku. Esimerkiksi jos haluat tallentaa muuttujaan ikäarvoja, käytä pieniä lukuja. Tutkikaamme tätä käytännössä, joten tehdään ohjelma, joka tulostaa erilaisia muuttuja-arvoja näytölle. Seuraa ohjelma numero 2½.
PROC Muuttujat2:
LOCAL TalonIka%, TalonHinta&, TalonKorkeus, TalonNimi$(8)
TalonIka% = 38
TalonHinta& = 69900
TalonKorkeus = 5.5
TalonNimi$ = "Honkanen"
PRINT "Talon ikä:",TalonIka%,"v"
PRINT "Talon hinta:",TalonHinta&,"euroa"
PRINT "Talon korkeus:",TalonKorkeus,"m"
PRINT "Talon nimi:",TalonNimi$
PAUSE 40
ENDP
Näyttökaappaus:

Tässäpä tulikin asiaa melko lailla.
Nyt olemme käyttäneet kaikkia OPL:n muuttujatyyppejä. Äkkiä voin tässä mainita, että jos haluat muuttaa muuttujan arvoa, niin senkun vain kirjoitat esimerkiksi uuden tuollaisen rivin, jolla määritellään muuttuja. Voit muuttaa muuttujan arvoa niin monta kertaa kuin haluat.
Elintärkeä osa käyttövalmista ohjelmaa on interaktiivisuus eli vuorovaikutteisuus. Minkälainen olisi esimerkiksi peli, jossa käyttäjä ei voisi tehdä mitään painamalla näppäimiä tai liikuttelemalla hiirtä? Peli vain menisi eteenpäin omaa tahtiaan tai junnaisi paikoillaan, ja käyttäjä menettäisi mielenkiintonsa melko nopeasti.
Aloitetaan siis tekemään ohjelmaa, jossa käyttäjä saa itse syöttää talonsa tiedot ohjelmaan. Lopuksi ohjelma tulostaa tiedot näytölle.
PROC Interaktiivisuus:
LOCAL TalonIka%, TalonHinta&, Talonkorkeus, TalonNimi$(50)
PRINT "Talon ikä:",
INPUT TalonIka%
PRINT "Talon hinta:",
INPUT TalonHinta&
PRINT "Talon korkeus:",
INPUT TalonKorkeus
PRINT "Talon nimi:",
INPUT TalonNimi$
CLS
PRINT "Talon ikä:",TalonIka%,"v"
PRINT "Talon hinta:",TalonHinta&,"euroa"
PRINT "Talon korkeus:",TalonKorkeus,"m"
PRINT "Talon nimi:",TalonNimi$
GET
ENDP
Näyttökaappaus omista arvoistani:

Taas uusia komentoja näkyy olevan koodissa.
Huomautan, että INPUT ei valitettavasti toimi S60-puhelimissa lainkaan.
Olemme näin saaneet jo hyvät perusainekset interaktiivisten ohjelmien tekoon, mutta entä grafiikat? Mennään eteen päin.
Yksi nykyajan ohjelmien peruspilareista on grafiikka. En osaa nimetä mitään Windows-ohjelmaa, jossa ei olisi käytetty vähintään yhtä kuvaa. Kuvat ovat siis melko tärkeitä ohjelman palasia, vaikka ne eivät olekaan pakollisia.
Lataan seuraavalla koodinpätkällä 640 x 200 pikselin kokoisen kuvan S80 v2.0 -emulaattorin näytölle. Kuva on MBM-formaatissa eli EPOC:n ja Symbianin omassa kuvatyypissä. Voit ladata sen tästä. Seuraavassa on nopea ohje, miten muunnetaan BMP:stä MBM-tiedostoja BMCONV-nimisellä komentoriviohjelmalla.
PROC KuvanLataus:
LOCAL Kuva%
Kuva% = gLOADBIT("C:\Kuva.mbm")
gUSE 1
gAT 0,0
gCOPY Kuva%,0,0,640,200,0
gCLOSE Kuva%
GET
ENDP
Näyttökaappaus:

Tällä kertaa menikin vaikeaksi - mukaan tuli jopa viisi uutta komentoa. Miten näistä saisi selvän?
Alla on avustuskuva gCOPY-komentoa varten. Haluamme seuraavasti kopioida kuvasta alueen, joka alkaa pikseleistä 120 x ja 20 y ja loppuu pikseleihin 463 x ja 153 y. Kuvassa on siis tuo alue laatikoituna. Tee tästä gCOPY-komento. Vastaus on kuvan alla.

Vastaus on: gCOPY Kuva%,120,20,463,153,0. Jos tiesit tämän, olet etevä. Näytölle kopioituna tuo alue näyttäisi tältä (kun gAT-komennon arvot olisivat 0,0):

Sinulla voi mennä kuvan lataamisen oppimiseen jonkin aikaa, niin kuin minullakin meni, mutta lopuksi se luonnistuu, kun on muutaman kymmentä kertaa kirjoittanut sen koodiin.
Viides ohjelmamme käy läpi ehtolauseet - tekoälyn perustan. Ehtolauseet tekevät mahdolliseksi sen, että käyttäjällä on ohjelmassa valintoja. Käyttäjä voi esimerkiksi haluta mennä joko pelaamaan tai ohjeisiin pelin päävalikossa. Tällöin ehtolauseet tulevat esiin.
Tekoäly toimii siis tekokoodilla kirjoitettuna tällä tavalla:
JOS KäyttäjänPainallus = Peli
AloitaPeli:
MUTTA JOS KäyttäjänPainallus = Ohje
Ohje:
MUUTOIN
KysyPainallustaUudestaan:
Tehdään tästä OPL:n kielinen ohjelma, joka kysyy mielipidettäsi Coca-Colasta ja Pepsistä.
PROC Ehtolauseet:
LOCAL Painallus%
PRINT "Pidätkö enemmän Pepsistä vai Coca-Colasta?"
PRINT "Paina 1, jos pidät Pepsistä enemmän ja 2, jos Coca-Colasta."
PRINT ""
Painallus% = GET
IF Painallus% = 49
PRINT "Pepsi on siis mieleesi enemmän."
ELSEIF Painallus% = 50
PRINT "Coca-Cola. Hyvä valinta."
ELSE
PRINT "Ei valittavissa."
ENDIF
GET
ENDP
Näyttökaappaus omasta Coca-Cola-myötäisestä valinnastani:

Näin olemme tehneet yksinkertaisen ehtolauseohjelman. Se toimii kuin junan vessa. Käydään koodi läpi yksityiskohtaisesti.
Tässä olivat ohjeeni tältä erää. Pääset varmasti alkuun näillä ohjeilla ja ehkä saat jonkinlaisia ideoita niistä. Mikäli tällä oppaalla on jonkinnäköistä suosiota, kirjoitan mielelläni lisää aiheesta. Alla on satunnaisia OPL:een liittyviä asioita.
| Näppäin | SHIFT + näppäin | Koodi (näppäin) | Koodi (SHIFT + näppäin) |
|---|---|---|---|
| Enter | (ei mitään) | 13 | (ei mitään) |
| Esc | (ei mitään) | 27 | (ei mitään) |
| Space | (ei mitään) | 32 | (ei mitään) |
| Backspace | (ei mitään) | 8 | (ei mitään) |
| 0 | = | 48 | 61 |
| 1 | ! | 49 | 33 |
| 2 | " | 50 | 34 |
| 3 | # | 51 | 35 |
| 4 | ¤ | 52 | 164 |
| 5 | % | 53 | 37 |
| 6 | & | 54 | 38 |
| 7 | / | 55 | 47 |
| 8 | ( | 56 | 40 |
| 9 | ) | 57 | 41 |
| . | : | 46 | 58 |
| , | ; | 44 | 59 |
| - | _ | 45 | 95 |
| + | ? | 43 | 63 |
| * | (ei mitään) | 42 | (ei mitään) |
| a | A | 97 | 65 |
| b | B | 98 | 66 |
| c | C | 99 | 67 |
| d | D | 100 | 68 |
| e | E | 101 | 69 |
| f | F | 102 | 70 |
| g | G | 103 | 71 |
| h | H | 104 | 72 |
| i | I | 105 | 73 |
| j | J | 106 | 74 |
| k | K | 107 | 75 |
| l | L | 108 | 76 |
| m | M | 109 | 77 |
| n | N | 110 | 78 |
| o | O | 111 | 79 |
| p | P | 112 | 80 |
| q | Q | 113 | 81 |
| r | R | 114 | 82 |
| s | S | 115 | 83 |
| t | T | 116 | 84 |
| u | U | 117 | 85 |
| v | V | 118 | 86 |
| w | W | 119 | 87 |
| x | X | 120 | 88 |
| y | Y | 121 | 89 |
| z | Z | 122 | 90 |
| å | Å | 229 | 197 |
| ä | Ä | 228 | 196 |
| ö | Ö | 246 | 214 |
Lisää näppäinkoodeja voit itse löytää alla olevalla koodinpätkällä (painamalla Esciä pääset pois ohjelman suorituksesta).
PROC NappainKoodit:
LOCAL Painallus%
DO
Painallus% = GET
PRINT Painallus%
UNTIL Painallus% = 27
ENDP