Close menu
Close menu

Tunnistaudu

Kirjaudu

Etkö ole vielä jäsen?

Liity jäseneksi
Etusivu / Materiaalit / Taidetta ohjelmoimalla / 12. Peliohjelmointia

12. Peliohjelmointia

Kokeile tämän sivun esimerkkejä p5.js ohjelmointiympäristössä, johon pääset tästä linkistä: https://editor.p5js.org/

Tehdään aluksi seuraava ohjelma ja ajetaan se. Lopputulos nähdään konsoli-ikkunassa.

Ohjelmalla tulostettiin a-kirjain eri tavalla. Koska tietokone ymmärtää vain kaksi tilaa: virta kulkee (=1) tai virta ei kulje (=0), niin kaikki merkit on esitettävissä binäärilukuna eli lukujen 0 ja 1 avulla. a-kirjain on siis 7-bittinen binääri-luku: 110 0001. Bitti siis tarkoittaa, joko nollaa tai ykköstä. Mutta mitä kaksi muuta lukua eli 97 ja 61 ovat?

ASCII-TAULUKKO

Alla on p5js-ohjelman tulostamat ASCII-merkit. Huomaa, että kaikki merkit eivät ole tulostuneet, koska osan merkeistä on käyttöjärjestelmä (Windows) varannut omaan käyttönsä. Etsitään sieltä a-kirjain.


Huomataan, että a-kirjainta vastaa luku 97. Mutta mitä ovat ASCII-merkit? Kun tietokone kehitettiin, niin aluksi meillä oli 7-bittinen merkistö, jossa oli ASCII-merkit 0:sta 127:ään. Siinä määritettiin jokaiselle merkille oma numero. Myös tavallisimmat painikkeet kuten Enter (Ascii 13), Esc (Ascii 27), Askelpalautin (Ascii 8), Välilyönti (Ascii 32) määriteltiin Ascii-merkkeinä. Myöhemmin Ascii-merkistöön tehtiin 8-bittinen laajennus, jolloin saatiin käyttöön 256 merkkiä. Suomessa on esimerkiksi käytössä Latin-1 laajennus, jossa on määritelty esimerkiksi ä (Ascii 228), ö (Ascii 246) ja å (Ascii 229) kirjaimet. Koska jokaista kirjainta tai painiketta vastaa kokonaisluku välillä 0…255, niin se voidaan välittää tietokoneelle 8-bittisenä binäärilukuna. Katsotaan seuraavaksi tarkemmin mitä ovat binääriluvut.

Huomio: ASCII-taulukossa on alunperin määritelty myös Backspace (Askelpalautin)= 8, Tab = 9, Enter (Rivinvaihto) = 13, Escape (Peru) = 27, Space (Välilyönti)= 32. Mutta esimerkiksi nuolinäppäimet on myöhemmin määritelty toisella tavalla. Palataan tähän myöhemmin.

8-BITTINEN BINÄÄRILUKU

Bitti tarkoittaa tilaa 0 ja 1. Kun laitamme kahdeksan bittiä peräkkäin saamme yhden tavun. kahdeksalla bitillä voimme esittää luvut 0:sta 255:een. Ajatellaan, että kaikki luvut muodostuvat 2-kantaluvun potensseista oheisen taulukon mukaisesti.

POTENSSI LUKU BINÄÄRILUKU
20 1 0000 0001
21 2 0000 0010
22 4 0000 0100
23 8 0000 1000
24 16 0001 0000
25 32 0010 0000
26 64 0100 0000
27 128 1000 0000

Esimerkiksi binääriluku 0110 0001 tarkoittaa, että luvut 64, 32 ja 1 on käytössä eli näiden lukujen summa on 64+32+1 = 97

Vastaavasti luku 107 on lukujen 0 + 64 + 32 + 0 + 8 + 0 + 2 + 1 -summa, joka on binäärilukuna 0110 1011. Lukua 107 vastaa ASCII-taulukossa kirjain: k eli binääriluvulla 0110 1011 voidaan kertoa tietokoneelle että tämä on kirjain k. Koska ASCII-merkkejä on rajallinen määrä, niin meidän pitää vielä ottaa käyttöön hexa-luvut, joiden avulla voimme määritellä lisää merkkejä.

HEXALUVUT

HEXALUKU BINÄÄRILUKU DESIMAALILUKU
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
A 1010 10
B 1011 11
C 1100 12
D 1101 13
E 1110 14
F 1111 15

Hexa-luvussa on 16 numeroa eli nollasta viiteentoista. Koska 9 on isoin luku, jonka voi esittää vielä numerolla, niin sen jälkeen meidän täytyy käyttää kirjaimia A, B, C, D, E ja F ilmaisemaan numeroita 10, 11, 12, 13, 14 ja 15. Yksi hexa-luku vastaa neljää bitillä. Kahdella hexa-luvulla voidaan esittää 8-bittiä. Esimerkiksi binääriluku 0110 0001 voidaan esittää kahdella hexaluvulla 6 (= 0110) ja 1 (=0001) eli desimaalilukua 97 vastaa hexa-luku 61. Vastaavasti luku 107 on binäärilukuna 0 + 64 + 32 + 0 + 8 + 0 + 2 + 1 -> 0110 1011, missä luku 0110 on hexalukuna 6 ja 1011 on hexalukuna B eli yksitoista. Siis lukua 107 vastaa siis hexa-luku 6B.

Koska ASCII-merkkejä on rajallinen määrä (256), niin siksi käyttöön on otettu unicode-merkit. UTF-8 määrittelyssä on on käytössä 1-4 hexatavua. Neljällä hexa-luvulla saadaan jo 16·16·16·16 =65 536 merkkiä esitettyä. Kun palataan aikaisempaan esimerkkiin, niin ASCII-merkkiä a vastaa hexa-luku 61, joilloin a-kirjaimen unicode-merkki on \u0061. Vastaavasti ASCII-merkkiä k vastaa hexa-luku 6B, niin k-kirjaimen unicode-merkki on \u006B.

Yhteenvetona esimerkiksi k-kirjaimen voi tulostaa p5js-ohjelmassa neljällä eri tavalla: Yksittäisenä merkkinä, ASCII-merkkinä, merkkijonona tai unicode-merkkinä hexa-luvun avulla.

Näppäinkomennot

Tutustutaan näpääinkomentoihin.

Näppäin  Koodi
(keyCode)
Komento (keyCode) ASCII (key) 
Askelpalautin 8 BACKSPACE char(8)
Tabulaattori 9 TAB
Rivinvaihto 13 ENTER char(13)
Vaihto 16 SHIFT
Ctrl 17 CONTROL
Alt 18 ALT
Esc 27 ESCAPE
Välilyönti 32 char(32)
PageUp 33
PageDown 34
End 35
Home 36
37 LEFT_ARROW
38 UP_ARROW
39 RIGHT_ARROW
40 DOWN_ARROW
Insert 45
Delete 46 DELETE

Esimerkki, jossa ympyrää ohjataan nuolinäppäimillä, koko kasvaa Enteristä ja koko pienenee Esc:stä.

var x=300;    // Määritellään muuttuja x ja annetaan sille alkuarvo 300
var y=300;    // Määritellään muuttuja y ja annetaan sille alkuarvo 300
var d = 40;   // Määritellään muuttuja d ja annetaan sille alkuarvo 40 (=halkaisja)

function setup() {
  createCanvas(600, 600);   // Ikkunan koko on 600 x 600
  fill(255,0,0);            // Täyttöväri punainen
}

function draw() {
  background(255,255,0);          // Tyhjennä tausta ja väritä se keltaiseksi
  if (keyIsPressed==true) {       // Jos näppäin on pohjassa
   if (keyCode == UP_ARROW) {     // Jos nuoli ylös on painettu, niin 
     y--;                         // silloin vähennä laskuria y yhdellä
   }                              // Lopeta jos ehto
   if (keyCode == DOWN_ARROW) {   // Jos nuoli alas on painettu, niin
     y++;                         // silloin kasvata laskuria y yhdellä
   }                              // Lopeta jos ehto
   if (keyCode == RIGHT_ARROW) {  // Jos nuoli oikealle on painettu, niin 
     x++;                         // kasvata laskuria x yhdellä
   }                              // Lopeta jos ehto
   if (keyCode == LEFT_ARROW) {   // Jos nuoli vasemmalle on painettu, niin 
     x--;                         // vähennä laskuria x  yhdellä
   }                              // Lopeta jos ehto
    if (keyCode == ENTER) {       // Jos Enter painiketta on painettu, niin
     d++;                         // kasvata laskuria d yhdellä
   }                              // Lopeta jos ehto
    if (keyCode == BACKSPACE) {   // Jos askelpalautinta on painettu, niin 
     d--;                         // vähennä laskuria yhdellä
   }                              // Lopeta jos ehto
  }                               // Lopeta ulompi jos ehto (KeyIsPressed)
  ellipse(x,y,d,d);               // Piirrä ympyrä, jonka halkaisija on d paikkaan (x,y)
}

Ohjelma toimii myös pelkillä numeroilla.

var x=300;
var y=300;
var d = 40;
function setup() {
  createCanvas(600, 600);
  fill(255,0,0);
}

function draw() {
  background(255,255,0);
  if (keyIsPressed==true) {
   if (keyCode == 38) {
     y--;
   }
   if (keyCode == 40) {
     y++;
   }
   if (keyCode == 39) {
     x++;
   }
   if (keyCode == 37) {
     x--;
   }
    if (keyCode == 13) {
     d++;
   } 
    if (keyCode == 8) {
     d--;
   } 
  }
  ellipse(x,y,d,d);
}

Kaikki ASCII-merkit toimivat parhaiten key-komennolla. Lisäksi askelpalautin, rivinvaihto ja välilyönti toimivat myös merkkinä kun käyttää char(luku)-komentoa. Mutta ohjausrakenteissa (esimerkiksi nuolinäpääimet) yleensä kannattaa käyttää keyCode-komentoa ja ainoastaan tulostettavissa kirjaimissa (esimerkiksi: a,b,c,…) key-komentoa. Eli esimerkiksi 37 on ASCII-taulukossa %-merkki, joka on määritelty key-komennolla. Vastaavasti numero 37 on keyCode-taulukossa määritelty nuoli vasemalle. Ainoastaan numerot 8, 13 ja ja 32 toimivat sekä key, että KeyCode-komenolla. Tästä alla esimerkki.

var x=300;            // Määritellään muuttuja x ja annetaan sille alkuarvo 300
var y=300;            // Määritellään muuttuja y ja annetaan sille alkuarvo 300
var d = 40;           // Määritellään muuttuja d ja annetaan sille alkuarvo 40
function setup() {
  createCanvas(600, 600);  // Ikkunan koko on 600 x 600
  fill(255,0,0);           // Punainen täyttöväri
}

function draw() {
  background(255,255,0);      // Tyhjennä tausta ja väritä se keltaiseksi
  if (keyIsPressed==true) {   // Jos painike on pohjassa
   if (key == 'w') {          // Jos näppäin w on pohjassa, niin 
     y--;                     // silloin  vähennä laskuria y yhdellä
   }                          // Lopeta jos ehto
   if (key == 's') {          // Jos näppäin s on pohjassa, niin 
     y++;                     // silloin kasvata laskuria y yhdellä
   }                          // Lopeta jos ehto
   if (key == 'd') {          // Jos näppäin d on pohjassa, niin
     x++;                     // silloin kasvata laskuria x yhdellä
   }                          // Lopeta jos ehto
   if (key == 'a') {          // Jos näppäin a on pohjassa, niin 
     x--;                     // silloin vähennä laskuria x yhdellä
   }                          // Lopeta jos ehto
    if (key == char(13)) {    // Jos char(13) = Enter on pohjassa, niin 
     d++;                     // kasvata laskuria d yhdellä
   }                          // Lopeta jos lause
    if (key == char(8)) {     // Jos char(8) = Asekelpalautin on pohjassa, niin
     d--;                     // vähennä laskuria d yhdellä
   }                          // Lopeta jos lause
  }                           // Lopeta ulompi jos lause (KeyIsPressed)
  ellipse(x,y,d,d);           // Piirrä ympyrä, jonka halkaisija on d paikkaan (x,y)
}