Arsenaali Kontrollilaitteet Tietokonepeleissä käytettäviä kontrollilaitteita on valtava määrä Kaikilla alustoilla, joilla pelejä pelataan on jokin vakio kontrolleri PC: Hiiri ja näppäimistö Konsolit: Controller Pad (nimitykset vaihtelee valmistajan mukaan) Lähteet: Core Techniques and Algorithms in Game Programming, MSDN, www.xbox.com, www.playstation.com 2 Useimpiin alustoihin saa hankittua vakiolaitteiden lisäksi erikoisempia kontrollilaitteita joita kuitenkin tuetaan useissa erikoistuneemmissa peleissä Joystick (mm. lentopelit) Ratti ja polkimet (mm. autopelit) Markkinat ovat täynnä myös paljon erikoisempia laitteita Tanssimatto Polkupyörä Onkivapa Eyetoy Näppäimistöt konsoleille (ei vättämättä tehty pelit mielessä) Nintendon Zapper (mm. Duck hunt) 3 4
Näppäimistö Näppäimistöön saadaan määriteltyä todella suuri määrä toiminnallisuutta Yli sata nappulaa + kombinaatiot Hyvä peleihin joissa pelaajalla on hallittavanaan paljon toiminnallisuutta Hidas oppia (etenkin lasten) Näppäimistön tilan esittämiseen on monia eri tapoja alustasta riippuen esim.: Win32 metodit GetKeyState() ja GetAsyncKeyState() kertoo yhden näppäimen tilan kerrallaan Win32 metodi GetKeyboardState() palauttaa osoittimen 256 tavun taulukkoon joka kertoo kaikkien näppäinten tilan 5 6 Kontrollit voidaan koodata selvittämällä jokaisen nappulan tila yksitellen seuraavasti if ( ( GetKeyState( VK_RCONTROL ) & 0x80 ) && ( GetKeyState( VK_NUMPAD8 ) & 0x80 ) ) { g_camera.jump(); if ( GetKeyState( VK_RIGHT ) & 0x80 ) { g_camera.strafe( -0.1f ); Ei välttämättä hyvä tapa toteuttaa, sillä jokainen GetKeyState() metodi tarvitsee oman systeemikutsun GetKeyboardState( kb_state ); if ( ( kb_state[ VK_RCONTROL ] & 0x80 ) && ( kb_state[ VK_NUMPAD8 ] & 0x80 ) ) { g_camera.jump( 1.0f );... Parempi tapa, sillä tarvitaan vain yksi systeemikutsu (usein nopeampaa) Näppäimistöltä saadun datan käsittelyn voi tehdä synkronisesti tai asynkronisesti Synkroninen: ohjelma odottaa käyttäjän syötettä näppäimistöltä ja toimii vasta kun syöte on saatu Yksinkertainen toteuttaa Ei kuluta turhaan laskentatehoa jos mitään ei tarvitse tehdä ennen kuin syöte on saatu Toimii hyvin menuissa, ei-reaaliaikasovelluksissa ja erikoisemmissa peleissä (esim. The Incredible Machine) Asynkroninen: kysytään jatkuvasti nappuloiden tilaa ja jatketaan ohjelman suorittamista vaikka mitään nappulaa ei olisi paineettukaan 7 8
Hyvä ratkaisu pelejä varten Ei järkevää esim. Menuissa Peleissä usein järkevää tehdä eri tilanteisiin erityyppiset toteutukset Menuissa synkronista ja pelissä asynkronista Pelissä saattaa ilmetä tilanteita joissa koko ohjelma on hyvä saada staattiseen tilaan odottamaan jotain komentoa Pelin keskeyttäminen (pelaaja saattaa haluta tehdä jotain muuta tietokoneellaan kesken pelin) Uuden tason pelaamisen aloittaminen (pelaaja saattaa haluta valmistautua tulevaan koitokseen) Hiiri Osotinlaite palauttaa 2D koordinaatin sekä yhden tai useamman nappulan tilan Hiireltä saatu 2D koordinaatti esitetään usein muutoksena edellisestä tilanteesta Nappuloiden tilat voidaan käsitellä samaan tapaan kuin näppäimistön nappuloiden tilat Hiiren käyttö on huomattavasti helpompi oppia kuin näppäimistön Hyvä tapa hoitaa kriittisiä toimintoja Yksittäin varsin rajallinen (ellei käytä innovatiivista suunnittelua kuten esim. Doom 3:ssa) 9 10 Joystick Joystick palauttaa tiedon tikun asennosta ja mahdollisten nappuloiden tilasta Vanhat tikut palauttivat vain arvoja 1 ja 0 sen mukaan mihin sitä väänsi (9 arvoa: C, N, W, S, E, NW, NE, SW, SE) Nykyään lähes kaikki tikut palauttavat arvoja joltain min-max väliltä (suuntiakin saattaa olla enemmän, esim. tikun varren kierto) Joystickin käyttö on hyvin intuitiivista Joystickin nappeja voidaan käsitellä samaan tapaan kuin näppäimisön nappeja Joystickin vastekäyrä on vakiona usein lineaarinen Useissa peleissä saattaa ilmetä tarvetta muuttaa joystickin vastekäyrää jonkin funktion F(x) mukaan F(x) -100-50 100 50-100 100 11 12
F(x) -100-50 100 50-100 100 Joystickeissa saattaa olla enemmänkin analogisia säätimiä Vastekäyrä samanlainen kuin edellä, skaala saattaa olla erilainen Käsittelyn voi hoitaa samaan tapaan kuin itse tikullekin Joissain joystickeissa Force Feedback valmius Ohjaimessa moottoreita joita ohjaillaan ohjelmistollisesti Parantaa hyvin käytettynä pelikokemusta Ideana tehdä valmiita efektejä joita suoritetaan ohjelmassa halutuissa tilanteissa Ohjelmoiminen riippuu paljon API:sta (DirectInput, SDL) -100-50 50 100 13 14 Game Pad Tyypillinen Padi (Xbox, PlayStation): 2 analogista ohjainta 1 digitaalinen ohjain Nappuloita Ohjaimia käsitellään samalla tavalla kuin joystickin tikkua Mahdollisia ongelmia: kontrolli toimii kahdella eri ohjaimella samanaikaisesti Nappuloita voi käsitellä samaan tapaan kuin näppäimistön nappuloita Xbox:n ohjaimessa on analogisia nappuloita joilla 256 eri tasoa Voidaan käsitellä samaan tyyliin kuin analogisia suuntohjaimia Kontrollilaite abstraktio Kontrollilaitteet vaikuttavat paljon pelin pelattavuuteen Erilaisten kontrollilaitteiden tukeminen parantaa pelikokemusta Pelaajan olisi hyvä pystyä customoimaan kontrolleja Kooditasolla saattaa olla työlästä toteuttaa toiminnallisuus kaikille kontrollilaitteille erikseen Järkevä suunnittelu vähentää työmäärää huomattavasti Tehdään kooditasolla geneerinen kontrolleri luokka Sisältää funktiot kaikkien pelin toimintojen ohjaamiseen Kantaluokasta periytetään jokaista laitetta varten oma luokkansa jota pelissä käytetään 15 16
1. Periytetyt luokat hakevat kontrollilaitteelta tiedon annetusta syötteestä 2. Käsitellään saatu syöte (mihin toimintoon mikäkin nappula on mapatty, lasketaan vastekäyrän muutos jne.) 3. Kutsutaan kantaluokan metodeja käsitellyn syötteen perusteella Esimerkki: hiiri luokan Update() metodi void Update() { // Haetaan syöte POINT mousepos; GetCursorPos( &mousepos );... //Käsitellään syötettä axis.x = ( direction.y * m_up.z ) - ( direction.z * m_up.y ); axis.y = ( direction.z * m_up.x ) - ( direction.x * m_up.z ); axis.z = ( direction.x * m_up.y ) - ( direction.y * m_up.x );... // Kutsutaan kantaluokan metodeja Rotate( y_rotation, axis ); Rotate( -y_direction, D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); 17 18