Unity ja UNET -moninpeliprojekti
|
|
- Aarne Pakarinen
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 Unity ja UNET -moninpeliprojekti Joni Lähdesluoma Opinnäytetyö Elokuu 2015 Tietotekniikka Ohjelmistotekniikka
2 TIIVISTELMÄ Tampereen ammattikorkeakoulu Tietotekniikka Ohjelmistotekniikka Lähdesluoma Joni Unity ja UNET -moninpeliprojekti Opinnäytetyö 39 sivua, joista liitteitä 9 sivua Marraskuu 2015 Työn tarkoituksena oli tutustua Unityn uusiin moninpelityökaluihin ja luoda toimiva prototyyppi neljän hengen verkkopelistä näitä työkaluja hyödyntäen. Ensin tarkastellaan Unityn tarjoamia palveluita liittyen moninpelien tekoon ja puhutaan hieman Asset Storesta. Tämän jälkeen käydään läpi Unityn uudet moninpeli työkalut ja API nimeltä UNET. Tämä työ käy läpi UNETin tuomat uudet Unity-komponentit ja APIn luokat ja kuinka niitä käytetään moninpelin teossa. Lopuksi tutustutaan prototyypin tärkeimpiin kohtiin ja kuinka ne toimivat. Asiasanat: Unity, pelinkehitys, moninpeli, verkkopeli
3 ABSTRACT Tampereen ammattikorkeakoulu Tampere University of Applied Sciences Degree programme in ICT Engineering Software Engineering Lähdesluoma Joni Unity and UNET in multiplayer game project Bachelor's thesis 39 pages, appendices 9 pages November 2015 The purpose of this thesis was to learn to use Unity s new networking tools and services by creating a simple multiplayer game prototype. We will first take a look at some of Unity s services related to making multiplayer games as well as talk a little about Asset Store. Then we will talk about Unity s new networking tools and API called Unity Networking or UNET for short. This thesis goes through the most important new components and classes required for simple multiplayer games as well as talks about their use. In the end we will go through the most important parts of the game prototype and take a look at how they work. Key words: Unity, development, multiplayer, games
4 4 SISÄLLYS 1 JOHDANTO MONINPELI UNITY-PELIMOOTTORI Asset Store -kauppapaikka Internetpalvelut UNET-työkalut Uudet komponentit ja luokat NetworkIdentity-komponentti NetworkBehaviour-komponentti NetworkManager-komponentti NetworkTransform-komponentti NetworkServer-komponentti NetworkClient-komponentti NetworkAnimator-komponentti Matalan tason LLAPI-rajapinta Korkean tason HLAPI-rajapinta Isäntä ja asiakas Pelaajat ja auktoriteetti Etäproseduurikutsut (RPC) Pelitilanteen synkronointi Multiplayer Lobby -järjestelmä Multiplayer Lobby Manager -komponentti Multiplayer Lobby Player ja Game Player PELIPROJEKTI Aula Peli Pelaajan liikkuminen Ampuminen Törmäyksen tunnistus POHDINTA LÄHTEET LIITTEET Liite 1. Pelaajan liikkuminen Liite 2. Ampuminen Liite 3. Ammuksen törmäyksen tunnistus Liite 4. Pelaajan elämän hallinta... 39
5 5 1 JOHDANTO Tässä työssä käydään läpi Unityn UNET-tekniikan toimintaa ja sen tuomia uusia komponentteja. Luvussa 2 tutustutaan lyhyesti Unityn viimeaikaisiin uudistuksiin sekä sen erilaisiin palveluihin. Luvussa 3 käydään läpi UNET, sen toiminta ja sen tuomat uudistukset sekä puhutaan lyhyesti Unityn Multiplayer palvelusta. Tämän lisäksi tarkastellaan paremmin UNETin korkean tason APIa ja sen käyttöä moninpeleissä. Luvussa 4 käydään läpi lyhyesti moninpeliprototyypin tärkeimmät osat ja luodaan katsaus sen koodiin ja komponentteihin. Yksi vaikeimmista asioista toteuttaa Unitylla on ollut moninpeli. Vanha API vaati paljon koodia ja suuren määrän tietoa verkkopelien toteutuksesta. UNET tuo mukanaan täysin uuden APIn ja uusia komponentteja joilla moninpelin luominen on huomattavasti helpompaa eikä vaadi aiempaa kokemusta verkkopelien teosta.
6 6 2 MONINPELI Moninpeli on pelityyppi, jossa kaksi tai useampi pelaaja pelaavat samanaikaisesti samassa pelissä. Tämä voi tapahtua verkon yli tai samalla laitteella. Pelistä riippuen pelaajat voivat pelata toisiaan vastaan tai yrittää saavuttaa yhteisen tavoitteen. Ensimmäiset moninpelit toimivat vertaisverkko-mallin mukaisesti. Jokainen pelaaja toimi sekä palvelimena ja asiakkaana ja jakoi tietoa kaikille muille pelaajille. Tässä mallissa on kuitenkin lukuisia ongelmia. Pelitilanteen pitäminen identtisenä kaikkien pelaajien kesken on erittäin hankalaa ja pienikin muutos saa aikaan sen, että pelitilanne ei ole enää identtinen. Koska kaikki pelaajat ovat samanarvoisia vertaisverkossa, oikean pelitilanteen löytäminen on mahdotonta ja pelin pelaamisesta tulee myös mahdotonta. Näiden ongelmien korjaamiseksi siirryttiin käyttämään palvelin/asiakas yhteyttä, jossa kaikki pelaajat ovat asiakkaita ja keskustelevat vain palvelimen kanssa. Kaikki peliin liittyvät toimet tehtiin palvelimella ja asiakkaat lähettivät tälle vain näppäinten ja hiiren painallukset. Palvelin laski näiden pohjalta uuden pelitilanteen ja lähetti sen tiedot kaikille asiakkaille. Tämä järjestelmä toimi hyvin, kunhan latenssi asiakkaan ja palvelimen välillä pysyi pienenä. Tämä korjaamiseksi alettiin asiakkaat eivät voineet enää vain lähettää näppäinten painalluksia, vaan niiden täytyi suorittaa osaa pelin koodista paikallisesti. Näin asiakkaat voitiin ohjelmoida ennustamaan pelaajan liikkeitä näppäinten painallusten ja aikaisempien liikkeiden mukaan. Tämä pienensi latenssin vaikutusta, koska asiakkaan ei tarvinnut enää odottaa näppäimen painalluksen lähettämistä palvelimelle ja palvelimen vastausta.
7 7 Asiakkaan ennustamisen tueksi tarvittiin vielä tapa korjata tilanteet joissa asiakas on väärässä. Asiakas kirjoittaa käyttäjän näppäinten painallukset ja niiden tapahtuma-ajan puskuriin ja käyttää näitä komentoja ennustaessaan tulevan pelitilanteen. Alkutilanteena ennustukselle asiakas käyttää viimeisintä palvelimelta tullutta tietoa pelitilanteesta. Ristiriitatilanteessa asiakas ottaa palvelimelta tulleen uuden tiedon ja poistaa puskurissa olevat tiedot, jotka ovat vanhempia kuin palvelimelta tullut tieto. Tämän jälkeen asiakas laskee pelitilanteet palvelimen pelitilanteesta taaksepäin viimeisimpään suoritettuun pelitilanteeseen. Näin vältytään tilanteelta, jossa pelaaja tuntuu hypähtävän, kun pelitilanne muuttuu äkisti väärästä ennustuksesta palvelimen oikeaan pelitilanteeseen. (Gaffer on Games)
8 8 3 UNITY-PELIMOOTTORI Unity on Unity Technologiesin kehittämä pelimoottori, jonka ensimmäinen versio julkaistiin vuonna Viimeisin versio kirjoitushetkellä on Työssä käytettiin versiota 5.2.2f1. Unity julkaisi 2D-pelien tekoon tarkoitetut työkalut 4.3 päivityksessä, mikä mahdollisti 2D-pelien tekemisen natiiveilla työkaluilla. Tätä ennen 2D-pelien tekeminen oli hankalaa ilman Asset Storesta ostettuja työkaluja. (Unity uutissivut) Unity 5 julkaisun yhteydessä Unity poisti rajoitukset ilmaisen version käyttäjiltä, mikä antoi ennen maksullisen lisenssin takana olleet työkalut kaikkien käyttöön. Unity 5 tarjosi myös uusia työkaluja ja 64-bittisen version ohjelmasta. (Unityn blogi) 5.1 versio toi mukanaan uuden verkkopelityökalut nimeltään UNET. (Unityn blogi) 3.1 Asset Store -kauppapaikka Unity Asset Store on kauppapaikka, josta on mahdollista hankkia ilmaista tai maksullista sisältöä omiin projekteihin. Kaupasta löytyy valmiita 3D-malleja, animaatioita, tekstuureja, skriptejä, ääniä ja kokonaisia lisäosia Unity Editoriin. Tässä projektissa on käytetty pohjana Unity Technologies julkaisemaa Network Game Lobby (beta) -pakettia, joka tarjoaa yksinkertaisen lobby-järjestelmäesimerkin. Tämä paketti käyttää hyväkseen uusia UNET-työkaluja. (Unity Asset Store) Lobby eli aula on useissa verkkopeleissä esiintyvä tila, johon pelaajat liittyvät ennen kuin varsinainen peli alkaa. Usein tämä on vain eräänlainen valikko, jossa pelaaja voi tarkastella pelaajakohtaisia asetuksia ja nähdä tulevan pelin asetukset.
9 9 3.2 Internetpalvelut Pelien kannalta ehkä tärkein Unityn tarjoama palvelu on matchmaking-palvelu, joka mahdollistaa pelaajien ja pelien löytämisen ilman IP-osoitteen syöttämistä. Verkkoliikenne ohjataan välityspalvelimen kautta, mikä välttää ongelmia palomuurien ja osoitteenmuutosten eli NAT-tekniikan kanssa. Välityspalvelin on Unityn tarjoama pilvipalvelu, joka toimii läheisesti matchmaking-palvelun kanssa. (Unity Manual) Nämä palvelut erottavat Unityn sen tärkeimmästä kilpailijasta, Unreal Engine 4 -pelimoottorista. UE4 ei tarjoa valmista matchmaking-ratkaisua, osoitteenmuuntajan läpäisyä tai lobby-järjestelmää vaan nämä on käyttäjän tehtävä itse.
10 10 4 UNET-työkalut UNET eli Unity Networking on Unity:n tarjoama kokoelma työkaluja ja palveluita verkkopelien tekemiseen. Se julkaistiin Unity 5.1 version yhteydessä. UNET on täysin uusi ratkaisu, joka korvaa vanhan verkkoratkaisun. UNET voidaan jakaa karkeasti korkeaan ja matalaan tasoon, sen mukaan kuinka lähellä laitteistoa työskennellään. (Unity Manual) 4.1 Uudet komponentit ja luokat UNET toi mukanaan suuren määrän uusia komponentteja ja luokkia. Tässä työssä keskityttiin vain korkean tason APIn luokkiin ja komponentteihin NetworkIdentity-komponentti NetworkIdentity on komponentti, joka on UNETin selkäranka. Se hallitsee objektin verkkoidentiteettiä ja tiedottaa itsestään verkkojärjestelmälle. Nämä objektit täytyy luoda palvelimelle käyttäen NetworkServer.Spawn()-funktiota. Tämän jälkeen ne saavat NetworkInstanceId-tunnisteen ja ne voidaan luoda asiakkaissa, jotka ovat yhteydessä palvelimeen. Näyttämöllä eli pelialueella valmiina olevat objektit ovat valmiiksi sekä palvelimella että asiakkailla. Tämän vuoksi kaikki objektit joilla on NetworkIdentity-komponentti otetaan pois käytöstä. Kun asiakas ottaa yhteyttä palvelimeen, palvelin lähettää tiedot objekteista, jotka pitää ottaa käyttöön ja mitkä niiden uusimmat tiedot ovat. Tämä varmistaa että asiakkaat eivät aseta objekteja vääriin paikkoihin tai että ne eivät luo objekteja jotka on jo tuhottu. Jokainen NetworkIdentity-komponentti sisältää seuranta-tietoa, kuten SceneID, NetworkID ja AssetID, joiden avulla samaa elementtiä käyttävät objektit tunnistetaan toisistaan. Alla oleva kuva näyttää mitä tietoja objektista saadaan ajon aikana. (Unity Manual)
11 11 KUVA 1. NetworkIdentity-komponentin tiedot ajon aikana NetworkBehaviour-komponentti NetworkBehaviour on termi skripteille, jotka perivät NetworkBehaviour-luokan ja toimivat NetworkIdentity-komponentin kanssa. Nämä skriptit voivat käyttää UNETin korkean tason APIn funktioita. NetworkBehaviour-skriptit mahdollistavat muuttujien synkroinoinnin palvelimelta asiakkaille, erilliset palvelin- ja asiakasfunktiot sekä kutsujen lähettämisen palvelimelta asiakkaille ja toisin päin. (Unity Manual) NetworkManager-komponentti NetworkManager-komponenttia käytetään pelitilanteen hallitsemiseen verkkopelissä. Tämä komponentti tarjoaa oman käyttöliittymän editorissa, joten sitä voi periaatteessa käyttää täysin ilman koodausta. Se on rakennettu käyttäen UNETin korkea tason APIa ja se voidaan korvata omalla skriptillä. Sen tarkoitus on tarjota helppokäyttöinen ratkaisu moninpelin hallintaan. NetworkManager on suunniteltu niin, että sen toimintaa voi muuttaa käyttäen luokan virtuaalifunktioita. Näin on myös tässä työssä käytetyssä Network Lobby Manager -komponentissa. (Unity Manual)
12 12 KUVA 2. NetworkManager-komponentti NetworkTransform-komponentti NetworkTransform-komponenttia käytetään liikkeen synkronoimisessa muille pelaajille. Tämä komponentti ottaa huomioon objektin auktoriteetin. Jos objektilla on paikallinen auktoritetti, engl. local authority, sen sijainti synkronoidaan palvelimelle ja sen kautta muille pelaajille. Muussa tapauksessa objektin sijainti synkronoidaan palvelimelta asiakkaille. Tämä komponentti vaatii että objektilla on NetworkIdentity-komponentti. (Unity Manual) KUVA 3. NetworkTransform komponentti NetworkServer-komponentti NetworkServer on UNETin korkean tason APIn luokka, jonka tehtävänä on hallita yhteyksiä usealta asiakkaalta samaan aikaan. (Unity Manual)
13 NetworkClient-komponentti NetworkClient on korkean tason APIn luokka, joka hallitsee yhteyttä palvelimeen. Sitä voidaan käyttää lähettämään ja vastaanottamaan viestejä palvelimelta. Se auttaa myös hallitsemaan spawnattuja objekteja sekä reitittämään etäproseduurikutsuja. (Unity Manual) NetworkAnimator-komponentti NetworkAnimator komponentti synkronoi animaatiot verkon yli. Se ottaa vastaan Animator-komponentin ja pitää tämän ajamat animaatiot synkronoituna verkon yli. (Unity Manual) KUVA 3. Animator- ja Network Animator -komponentit. 4.2 Matalan tason LLAPI-rajapinta Matala taso käyttää Transport Layer APIa, joka toimii käyttöjärjestelmän sokettipohjaisen verkon päällä. Se on tarkoitettu edistyneempiin verkkopeleihin, jotka tarvitsevat yksilöllisempiä ratkaisuja. Tässä työssä ei käytetty suoraan Transport Layer APIa, vaan korkea taso valittiin sen helppokäyttöisyyden ja yksinkertaisuuden vuoksi. (Unity Manual)
14 Korkean tason HLAPI-rajapinta Korkea taso eli High Level API on rakennettu matalan tason päälle ja se automatisoi monia sen tehtäviä. HLPAI on auktoritatiivinen palvelinjärjestelmä. Palvelimella on täysi määräysvalta ja asiakkaat ovat niin sanottuja tyhmiä asiakkaita (dumb client). Ne lähettävät tietoa palvelimelle, joka päättää mitä tiedon pohjalta tapahtuu ja lähettää ratkaisunsa takaisin asiakkaille. (Unity Manual) KUVA 4. HLAPI muodostuu useasta eri tasosta (Unity Manual) Isäntä ja asiakas UNET järjestelmässä peleillä on yksi palvelin ja monta asiakasta. Yksi asiakkaista toimii myös palvelimena, joten erillistä palvelinsovellusta ei tarvita. KUVA 5. UNET-verkon toiminta (Unity Manual)
15 15 Palvelimena toimivaa asiakasta kutsutaan isännäksi. Isäntä eroaa etäasiakkaista siten, että se keskustelee palvelimen kanssa suoraan funktiokutsuilla, kun taas etäasiakkaat viestittävät normaalisti verkon yli. Tämä järjestelmä on suunniteltu siten, että isäntä ja etäasiakas jakavat saman koodin, jotta pelinkehittäjän ei tarvitse ajatella kuin yhtä asiakastyyppiä. (Unity Manual) Pelaajat ja auktoriteetti Pelaajan ja pelattavan olion (esim. pelihahmo) välillä on liitos, joka merkitsee olion pelaajan omaksi. Muut pelaajat eivät voi suorittaa komentoja tälle oliolle. Kaikki keskustelu tapahtuu olion ja palvelimen välillä. Tästä oliosta käytetään termiä local player ja sillä on ominaisuus islocalplayer, jolle asetetaan arvo true. (Unity Manual) KUVA 6. Kaksi asiakasta ja niiden local player oliot (Unity Manual)
16 Etäproseduurikutsut (RPC) UNET käyttää kahdentyyppisiä etäproseduurikutsuja: Command-kutsua, jossa asiakas kutsuu ja palvelin suorittaa palvelun ja ClientRpc-kutsua, jossa palvelin kutsuu ja asiakas suorittaa palvelun. Alla oleva kuva ilmentää mihin suuntaan etäkutsut kulkevat. KUVA 7. Etäkutsujen kulkusuunta. (Unity Manual) Command-kutsut lähetetään asiakkaan omistamalta pelaaja-objektilta palvelimella olevalle asiakkaan pelaaja-objektille. Turvallisuussyistä asiakas voi lähettää kutsun vain omistamaansa objektia vastaavalle objektille. Tämä estää muiden omistamien objektien hallitsemisen. Funktion muuttamiseksi Command-kutsuksi sitä ennen lisätään [Command]-atribuutti ja siihen lisätään Cmd-etuliite. Huomaa, että tämä koodi suoritetaan palvelimella. Alla on selvyydeksi esimerkkikoodi. (Unity Manual)
17 17 KUVA 8. Koodiesimerkki Command-kutsusta (Unity Manual) Kuvan 8 esimerkissä käytetään Command-kutsua luomaan ammus, jos pelaaja painaa välilyötiä. Tämä Command-funktio ottaa vastaan panoksen eliniän, jonka jälkeen panos luodaan valmiin elementin mukaan. Panos asetetaan tuhoutumaan eliniän kuluttua. Lopuksi panos luodaan käyttäen Network.Spawn()-funktiota. Tämä lähettää käskyn asiakkaille luoda sama panos samaan paikkaan. Näin asiakas näyttää saman tilanteen kuin palvelinkin. ClientRpc-kutsut lähetetään palvelimella olevalta objektilta. Niitä pystyy lähettämään mikä tahansa palvelimella oleva objekti, jolla on NetworkIdentity-komponentti ja joka on luotu käyttäen Network.Spawn()-funktiota. Koska palvelimella on täysi määräysvalta (auktoritatiivinen järjestelmä) ClientRpc-kutsuihin ei sisälly turvallisuusriskiä.
18 18 Funktio muutetaan ClientRpc-kutsuksi lisäämällä sitä ennen [ClientRpc]-atribuutti ja lisäämällä Rpc-etuliite. Alla oleva esimerkkikoodi näyttää kuinka tämä tapahtuu käytännössä. (Unity Manual) KUVA 9. ClientRpc esimerkkikoodi (Unity Manual) Kuvassa 9 oleva TakeDamage()-funktio tarkistaa aluksi onko skriptin suorittaja palvelin. Vain palvelin voi suorittaa ClientRpc-kutsuja. Jos skriptin suorittaja ei ole palvelin, funktion suoritus lopetetaan. Tarkistuksen jälkeen vähennetään health-muuttujan arvosta vahingon määrä ja RpcDamage()-funktio saa tämän vahinkoarvon argumenttina. RpcDamage()-funktio tulostaa vahinkoarvon konsoliin Pelitilanteen synkronointi Synkronointi tapahtuu palvelimelta etäasiakkaille. Isäntä ei tarvitse sitä, koska se toimii paikallisena asiakkaana ja palvelimena ja jakaa datan tämän kanssa. Ainoa poikkeus on SyncVar-koukut, jotka suoritetaan myös paikallisen asiakkaan puolella.
19 19 SyncVar:it ovat NetworkBehaviour-skriptin jäsenmuuttujia, jotka synkronoidaan palvelimelta asiakkaalle. Kun objekti luodaan Network.Spawn()-funktiolla tai pelaaja liittyy jo käynnissä olevaan peliin, tälle lähetetään uusin tieto SyncVar muuttujista, jotka kyseinen objekti voi nähdä. Jäsenmuuttuja muutetaan SyncVar-muuttujaksi lisäämällä sitä ennen [SyncVar]-atribuutti. Alla tästä esimerkki. (Unity Manual) KUVA 10. SyncVar-muuttujan esimerkkikoodi. (Unity Manual) SyncVar-muuttujat voivat olla tyypiltään perustyyppejä sekä Unityn omia tietotyyppejä ja käyttäjän luomia struct-tietotyyppejä. Yhdessä skriptissä voi olla 32 SyncVarmuuttujaa mukaan lukien SyncList listat. (Unity Manual) SyncList toimii kuten SyncVar-muuttuja, mutta on nimensä mukaisesti lista. Ne eivät tarvitse erillistä [SyncVar]-atribuuttia, vaan ovat omia luokkiaan. Jokaisella perustyypillä on oma luokkansa. SyncListString on lista String-tyyppisiä arvoja SyncListFloat on lista liukulukuja SyncListInt on lista kokonaislukuja SyncListUInt on lista positiivisia kokonaislukuja SyncListBool on lista bool-arvoja
20 20 Näiden lisäksi on olemassa SyncListStruct, joka antaa käyttäjälle mahdollisuuden luoda omia tietuita. Tämä tietue voi sisältää vain perustyyppejä sekä Unityn omia tietotyyppejä. (Unity Manual) SyncList listat sisältävät SyncListChanged-delegaatin Callback, joka tiedottaa asiakkaita, kun listan sisältöä muutetaan. Alla oleva esimerkki näyttää miten sitä käytetään. (Unity Manual) KUVA 11. Callback-delegaatin käyttö. (Unity Manual) 4.4 Multiplayer Lobby -järjestelmä Useassa moninpelissä on eräänlainen aula, johon pelaajat liittyvät ennen varsinaisen pelin pelaamista. Tässä aulassa pelaajat voivat mahdollisesti muokata asetuksia ja lopulta asettaa itsensä valmiiksi. Peli alkaa kun kaikki pelaajat ovat valmiina. (Unity Manual)
21 Multiplayer Lobby Manager -komponentti MultiplayerLobbyManager on muokattu versio NetworkManager komponentista, joka luo aulan johon pelaajat liittyvät ennen pelin alkamista. Se antaa kehittäjän valita seuraavat asetukset aulalle: Pelaajien maksimimäärän Alkaako peli kun kaikki ovat valmiina Pystyykö peliin liittymään kun se on jo käynnissä Montako pelaajaa samalla laitteella voi olla Mitä asetuksia pelaaja voi mukauttaa. Esim. pelaajan nimi. Tällä komponentilla on kahdenlaisia pelaajaobjekteja: LobbyPlayer ja GamePlayer. (Unity Manual) Multiplayer Lobby Player ja Game Player LobbyPlayer-objekti luodaan kun pelaaja liittyy palvelimelle tai samalle laitteelle lisätään uusi pelaaja. Se sisältää tiedon siitä onko pelaaja valmis ja mahdolliset pelaajakohtaiset asetukset pelaaja tekee aulassa. GamePlayer-objekti luodaan kun varsinainen peli alkaa ja on se objekti, jota pelaaja ohjaa pelin aikana. Se tuhotaan kun peli on päättynyt ja pelaaja palaa takaisin aulaan. (Unity Manual)
22 22 5 PELIPROJEKTI KUVA 12. Kuva pelitilanteesta. Peliprojektin tavoitteena oli oppia käyttämään tässä työssä esiteltyä teoriaa käytännössä luomalla hyvin yksinkertainen, mutta toimiva prototyyppi. Toteutin projektin yksin ja siihen kului noin kolme viikkoa. Suurin osa tästä ajasta kului UNETin APIn opiskeluun ja tietojen testaamiseen käytännössä. Projektin tarkoitus ei ole olla kaupallinen peli, vaan se toimi eräänlaisena oppimisen työkaluna. Projektin alussa yritin tehdä oman ratkaisun asiakkaan pelitilanteen ennustukseen ja latenssin hallintaan. Tämä osoittautui kuitenkin erittäin monimutkaiseksi ja aikaa vieväksi työksi ja lopulta oma ratkaisu ei tuottanut toivottua lopputulosta. Tämän vuoksi jouduin siirtymään käyttämään Unityn tarjoamaa ratkaisua, joka on rakennettu HHLAPIjärjestelmän sisään eikä vaadi erillistä koodia toimiakseen. Tätä opinnäytetyötä kirjoittaessa asiaan liittyvän teorian tunteminen on kuitenkin syventynyt ja oman ratkaisun toteuttaminen tuntuu paljon helpommalta kuin aikaisemmin.
23 Aula Projekti käyttää pohjanaan Asset Storesta ladattavaa Network Game Lobby (beta) -pakettia, joka tarjoaa yksinkertaisen drag&drop peliaularatkaisun. Tämä on rakennettu käyttäen Network Lobby Manager -komponenttia, mutta siihen on lisätty valmis UI. Ajan säästämiseksi valittiin tämä ratkaisu. KUVA 13. NetworkLobbyManager-komponentti. Kuvassa 13 on Unityn tarjoaman NetworkLobbyManager-komponentin perusversio. Se tarvitsee toimiakseen kaksi Scene-objektia: yhden aulalle ja toisen itse pelille. Sceneobjekti eli näyttämö on Unityssa se alue, johon kaikki peliobjektit luodaan. Käytännössä se on siis pelialue. NetworkLobbyManager-komponentti tarvitsee myös objektin, joka sisältää Network Lobby Player komponentin ja toisen objektin, joka kuvaa pelihahmoa itse pelissä, johon aulasta siirrytään. Jotta peliobjekteja voidaan luoda pelissä, ne täytyy lisätä Registered Spawnable Prefabs listaan. Tämä komponentti mahdollistaa myös eritasoisten verkkojen simuloimisen testausta varten.
24 24 KUVA 14. Projektissa käytetty Lobby Manager. Kuvan 14 Lobby Manager komponentti on laajennettu versio kuvan 13 komponentista. Siihen on lisätty graafinen käyttöliittymä ja sen toiminta. Min Player muuttuja määrittelee vähimmäismäärän pelaajia, jotta pelin pelaaminen onnistuu.
25 25 KUVA 15. Kuva peliaulasta Aulasta on mahdollista luoda peli isäntänä (Play and Host), luoda pelkkä serveri (Dedicated Server) tai käyttää Unityn tarjoamaa Matchmaking-palvelua joko luomaan pelin tai etsimään valmiita pelejä verkosta. Matchmaking-palvelua käyttö vaatii Unity Multiplayer-konfiguraation tekemistä netissä. Koska Matchmaking-palvelu on vielä testivaiheessa, palvelu on ilmainen tietyin rajoituksin. KUVA 16. Unity Multiplayer-palvelun konfiguraatio
26 Peli Peli on 2-4 hengen 2D-peli, jossa pelaajat yrittävät ampua toiset pelaajat ja jäädä viimeiseksi henkiin. Peli loppuu kun joku pelaajista on voittanut 5 kierrosta. Tämän jälkeen kaikki pelaajat palaavat aulaan. Pelin grafiikka koostuu spriteistä, eli pienistä kuvista ja kuvakokoelmista. Esimerkiksi pelaaja hahmossa on käytetty monta spriteä jotka yhdessä luovat sulavat animaatiot. Nämä spritet on lisenssoitu CC0 lisenssin alle. CC0 on yleisesti käytetty lisenssi public domain eli vapaastu yleiseen käyttöön asetetuille teoksille. Äänet jätettiin pelistä pois koska UNET ei vaikuta äänien lisäämiseen ja työ keskittyi juuri UNET-moninpelin tekemiseen Pelaajan liikkuminen Pelaajan liikkuminen toteutettiin käyttäen Unityn omaa 2D-fysiikkamoottoria. Tämä mahdollisti painovoiman ja törmäyksentunnistuksen hyödyntämisen ilman erillistä koodia. Hyppimisen rajoittamiseksi pelaajan jalkojen alle tehdään törmäystunnistus käyttäen Physics2D.OverlapCircle() funktiota, joka palauttaa true-arvon, jos se löytää jonkin Collider2D komponenteista. Tätä rajoitettiin vielä niin, että törmäys tarkistetaan vain Ground-tasolta, jotta pelaaja ei voi hypätä toisen pelaajan tai ammuksen päältä.
27 27 // Update is called once per frame private void Update () if (!islocalplayer) return; //Store the value of the input axis m_movementinput = Input.GetAxis(m_MovementAxis); private void FixedUpdate() if (!islocalplayer) return; Move(); private void Move() // Check to see if there is ground under the player grounded = Physics2D.OverlapCircle(groundCheck.position, groundradius, whatisground); // Update player velocity body.velocity = new Vector2(m_MovementInput * maxspeed, body.velocity.y); // Check if we need to flip the sprite if (m_movementinput > 0 &&!facingright) Flip(); else if (m_movementinput < 0 && facingright) Flip(); // If we are grounded and want to jump, jump if (grounded && Input.GetButtonDown("Jump")) body.addforce(new Vector2(0, jumpforce)); KUVA 17. Pelaajan liikkuminen koodissa.
28 Ampuminen Pelaajalla ampumisesta tehtii hyvin yksinkertainen prototyyppiä varten. Pelaaja voi ampua niin kauan kun hänellä on ammuksia. Ammutun panoksen luomiseen käytettiin Command-kutsua nimeltä CmdFire(). Tämä funktio luo panoksen palvelimella, joka antaa tästä tiedon asiakkaille, jotta nämä luovat siitä oman versionsa. // Update is called once per frame [ClientCallback] private void Update () if (!islocalplayer) return; if(input.getbuttondown("fire")) if(m_ammo > 0) //Fire bullet Fire(); private void Fire() m_fired = true; Vector3 direction = Vector3.right * transform.localscale.x; CmdFire(m_Rigidbody2D.velocity, m_firespeed, direction, m_barreltransform.position, Quaternion.identity); m_ammo -= 1; [Command] private void CmdFire(Vector3 rigidbodyvelocity, float launchforce, Vector3 shootingdirection, Vector3 position, Quaternion rotation) //Instantiate the bullet and store a reference as Rigidbody2D Rigidbody2D bulletinstance = Instantiate(m_Bullet, position, rotation) as Rigidbody2D; //Create a velocity for the bullet Vector3 velocity = rigidbodyvelocity + (launchforce * shootingdirection); velocity.y = 0; //Set the bullet's velocity to this velocity bulletinstance.velocity = velocity; NetworkServer.Spawn(bulletInstance.gameObject); if(transform.localscale.x < 0) Vector3 thescale = bulletinstance.transform.localscale; thescale.x *= -1; bulletinstance.transform.localscale = thescale; KUVA 18. Ammunta koodi.
29 Törmäyksen tunnistus [ServerCallback] private void OnTriggerEnter2D(Collider2D other) Rigidbody2D targetrigidbody2d = other.getcomponent<rigidbody2d>(); if(targetrigidbody2d) //Check if the rigidbody2d has PlayerHealth component. PlayerHealth targethealth = targetrigidbody2d.getcomponent<playerhealth>(); if(targethealth) targethealth.damage(m_maxdamage); if(!networkclient.active) PhysicForces(); // Destroy the bullet on clients NetworkServer.Destroy(gameObject); //called on client when the Network destroy that object (it was destroyed on server) public override void OnNetworkDestroy() base.onnetworkdestroy(); void PhysicForces() Rigidbody2D targetrigidbody2d = GetComponent<Rigidbody2D>(); if(targetrigidbody2d targetrigidbody2d.getcomponent<networkidentity>().hasauthority) targetrigidbody2d.addforce(vector2.right * bulletspeed); KUVA 19. Ammuksen törmäyksen tunnistus Panoksen ja pelaajan törmäyksen tunnistus tapahtuu palvelimella. Tähän käytettiin Trigger-tyyppistä Collider-komponenttia. Trigger-asetus saa aikaan sen, että törmäys ei vaikuta fysiikkaan mitenkään, mutta se silti rekisteröidään. Panoksen osuessa pelaajaan tämän elämästä poistetaan panoksen aiheuttama vahinko ja panos tuhotaan. Tämä koodi suoritetaan vain palvelimella. Käytännössä pelaaja kuolee yhdestä panoksesta sillä panoksen aiheuttama vahinko on enemmän kuin pelaajan elämä. Pelaajalle annettiin elämä ja panokselle vahinkoarvot jatkokehitystä ajatellen. Myöhemmin peliin voi lisätä esimerkiksi kilven, joka antaa pelaajan selvitä yhdestä panoksesta tuplaamalla tämän elämän.
30 30 6 POHDINTA Nykyaikaiset pelimoottorit mahdollistavat pelien kehityksen hyvin pienellä joukolla. Yhden hengen tekemät hyvälaatuiset pelitkään eivät ole mahdottomuus. Tästä hyvänä esimerkkinä on kaupunginrakennuspeli Banished. Pelin kehittäminen vaatii edelleen paljon taitoa ja työtä, mutta työkaluja saatetaan amatöörien käsiin todella kovalla vauhdilla. Unity on varsin helppokäyttöinen ja Unity Technologies panostaa paljon sen käytön opetukseen. Unityn omassa manuaalissa asiat on selitetty yksinkertaisesti ja kommentoitujen esimerkkien kanssa. Lisäksi he pitävät lähes viikottain Live Training stream -lähetyksen, jossa käydään kädestä pitäen läpi jokin Unityn ominaisuus tai projektin toteutus. Uudet moninpelityökalut on suunniteltu hyvin ja niiden käytöstä on tehty erittäin yksinkertaista. Yksinkertaisimmissa tapauksissa koodia ei tarvitse kirjoittaa juuri ollenkaan. Itse en koskenut matalan tason APIin, mutta HLAPI tarjoaa hyvät työkalut suurimmalle osalle peleistä ja se automatisoi monia asioita, joita ei normaalisti edes huomaa, kuten pelaajan sijainnin interpolointia. Kaiken kaikkiaan Unity on onnistunut luomaan hyvän alustan niin pienille kuin suurillekin pelinkehittäjille.
31 31 LÄHTEET Gaffer on Games. What every programmer needs to know about game networking, luettu Unity Asset Store. Network Game Lobby (beta), luettu Unityn blogi. Unity 5 Launch, luettu Unityn blogi. Unity 5.1 is here!, luettu Unity Manual. Multiplayer and Networking, luettu Unity uutissivut. Unity Releases 2D Tools with 4.3 Update, luettu
32 32 LIITTEET Liite 1. Pelaajan liikkuminen 1(3) using UnityEngine; using UnityEngine.Networking; public class PlayerMovement : NetworkBehaviour public int m_playernumber = 1; // Used to identify which player belongs to which player. This is set by this player's manager. public float m_speed = 12f; // How fast the player moves public Rigidbody2D m_rigidbody2d; // Reference used to move the character public Transform groundcheck; // Location for the ground checking. public LayerMask whatisground; // Used to dictate which layers are detected as ground. private float groundradius = 0.2f; // How large the overlap circle for ground checking is. private string m_movementaxis; private float m_movementinput; private float jumpforce = 700f; jumping. private bool grounded = false; checking. private float maxspeed = 6f; at. private Rigidbody2D body; [SerializeField] private bool facingright; sprite. // Name of the input axis for moving // Current value of the movement input // The force that is applied to the rigidbody when // Is the player touching a ground. Used for jump // The maximum speed the player is allowed to move // Reference to the Rigidbody2D component. // Current facing so we know when to flip the private void Awake() m_rigidbody2d = GetComponent<Rigidbody2D>(); // Use this for initialization private void Start () m_movementaxis = "Horizontal"; body = GetComponent<Rigidbody2D>(); facingright = true; // Update is called once per frame private void Update () if (!islocalplayer) return; //Store the value of the input axis m_movementinput = Input.GetAxis(m_MovementAxis);
33 33 2(3) private void FixedUpdate() if (!islocalplayer) return; Move(); private void Move() // Check to see if there is ground under the player grounded = Physics2D.OverlapCircle(groundCheck.position, groundradius, whatisground); // Update player velocity body.velocity = new Vector2(m_MovementInput * maxspeed, body.velocity.y); // Check if we need to flip if (m_movementinput > 0 &&!facingright) Flip(); else if (m_movementinput < 0 && facingright) Flip(); if (grounded && Input.GetButtonDown("Jump")) body.addforce(new Vector2(0, jumpforce)); private void Flip() Debug.Log("Flipped"); //Flip code here facingright =!facingright; Vector3 thescale = transform.localscale; thescale.x *= -1; transform.localscale = thescale; public void SetDefaults() m_rigidbody2d.velocity = Vector3.zero; m_rigidbody2d.angularvelocity = 0f; m_rigidbody2d.freezerotation = true; m_rigidbody2d.rotation = 0; m_movementinput = 0f;
34 34 3(3) //Freeze the rigidbody when the control is disabled to avoid drifting protected RigidbodyConstraints2D m_originalconstraints; void OnDisable() m_originalconstraints = RigidbodyConstraints2D.FreezeRotation; m_rigidbody2d.constraints = RigidbodyConstraints2D.FreezeAll; void OnEnable() m_rigidbody2d.constraints = m_originalconstraints;
35 35 Liite 2. Ampuminen 1(2) using UnityEngine; using UnityEngine.UI; using UnityEngine.Networking; public class PlayerShooting : NetworkBehaviour public int m_playernumber = 1; public Rigidbody2D m_bullet; public Transform m_barreltransform; are spawned public AudioSource m_shootingaudio; shooting sounds public AudioClip m_fireclip; // Used to identify the different players. // Prefab of the Bullet. // A child of the character where the bullets // Reference to the audio source used to play // Clip that plays when player fires private string m_firebutton; private Rigidbody2D m_rigidbody2d; private float m_firespeed; private bool m_fired; private int m_ammo; // The input axis used for firing // Reference to the rigidbody2d component // The speed the bullet moves at // Whether or not the gun has been fired. // How much ammo the player has private void Awake() m_rigidbody2d = GetComponent<Rigidbody2D>(); // Use this for initialization void Start () m_firebutton = "Fire"; m_ammo = 3; m_firespeed = 20f; // Update is called once per frame [ClientCallback] private void Update () if (!islocalplayer) return; if(input.getbuttondown("fire")) if(m_ammo > 0) //Fire bullet Fire();
36 private void Fire() m_fired = true; Vector3 direction = Vector3.right * transform.localscale.x; CmdFire(m_Rigidbody2D.velocity, m_firespeed, direction, m_barreltransform.position, Quaternion.identity); m_ammo -= 1; [Command] private void CmdFire(Vector3 rigidbodyvelocity, float launchforce, Vector3 shootingdirection, Vector3 position, Quaternion rotation) //Instantiate the bullet and store a reference as Rigidbody2D Rigidbody2D bulletinstance = Instantiate(m_Bullet, position, rotation) as Rigidbody2D; 36 2(2) //Create a velocity for the bullet Vector3 velocity = rigidbodyvelocity + (launchforce * shootingdirection); velocity.y = 0; //Set the bullet's velocity to this velocity bulletinstance.velocity = velocity; NetworkServer.Spawn(bulletInstance.gameObject); if(transform.localscale.x < 0) Vector3 thescale = bulletinstance.transform.localscale; thescale.x *= -1; bulletinstance.transform.localscale = thescale;
37 37 Liite 3. Ammuksen törmäyksen tunnistus 1(2) using UnityEngine; using System.Collections; using UnityEngine.Networking; public class BulletScript : NetworkBehaviour public ParticleSystem m_bulletparticles; public float m_maxdamage; public float m_maxlifetime = 2f; alive. public float bulletspeed = 100f; // Reference to the particle bullet trail // The amount of damage done by the bullet // The amount of time the bullet stays // The speed of the bullet private int m_playermask; by the bullets // Layer mask so only players are affected // Use this for initialization private void Start () if(isserver) // Destroy bullet after lifetime is over. Destroy(gameObject, m_maxlifetime); GetComponent<Collider2D>().enabled = false; StartCoroutine(EnableCollision()); // Set the value of the layer mask. m_playermask = LayerMask.GetMask("Players"); // Create a delay to avoid collider registering collision when spawned close to the shooting player. IEnumerator EnableCollision() yield return new WaitForSeconds(0.1f); GetComponent<Collider2D>().enabled = true; // Triggers are handled only by the server [ServerCallback] private void OnTriggerEnter2D(Collider2D other) Rigidbody2D targetrigidbody2d = other.getcomponent<rigidbody2d>(); //Check to see if the target has a Rigidbody2D component if(targetrigidbody2d) //Check if the rigidbody2d has PlayerHealth component. PlayerHealth targethealth = targetrigidbody2d.getcomponent<playerhealth>(); if(targethealth) targethealth.damage(m_maxdamage);
38 38 if(!networkclient.active) PhysicForces(); 2(2) // Destroy the bullet on clients NetworkServer.Destroy(gameObject); //called on client when the Network destroy that object (it was destroyed on server) public override void OnNetworkDestroy() base.onnetworkdestroy(); void PhysicForces() //Find the rigidbody2d Rigidbody2D targetrigidbody2d = GetComponent<Rigidbody2D>(); if(targetrigidbody2d targetrigidbody2d.getcomponent<networkidentity>().hasauthority) targetrigidbody2d.addforce(vector2.right * bulletspeed);
39 39 Liite 4. Pelaajan elämän hallinta 1(2) using UnityEngine; using UnityEngine.UI; using UnityEngine.Networking; public class PlayerHealth : NetworkBehaviour public float m_startinghealth = 100f; starts with. public GameObject m_playerrenderers; need to be disabled when the player is dead. public PlayerSetup m_setup; public PlayerManager m_manager; when dying. // The amount of health each player // References to all the Gameobjects that //Associated manager, to disable control [SyncVar(hook = "OnCurrentHealthChanged")] private float m_currenthealth; // How much health the player has. [SyncVar] private bool m_zerohealthhappened; // Has the player been reduced to below 0 health? private BoxCollider2D m_collider; // Disabled when the player is dead so it doesn't collide with anything. private void Awake() m_collider = GetComponent<BoxCollider2D>(); //This is called when the player takes damage public void Damage(float amount) //Reduce current health by the amount of damage done m_currenthealth -= amount; //If the current health is at or below zero and it has not yet been registered, call OnZeroHealth if (m_currenthealth <= 0f &&!m_zerohealthhappened) OnZeroHealth(); private void SetHealthUI() //Show Health UI void OnCurrentHealthChanged(float value) m_currenthealth = value; // Change the UI elements appropriately. SetHealthUI();
40 40 2(2) void OnZeroHealth() // Set the flag so that this function is only called once m_zerohealthhappened = true; RpcOnZeroHealth(); private void InternalOnZeroHealth() // Disable the collider and all the appropriate child gameobjects so the character doesn't interact or show up when it's dead. SetPlayerActive(false); [ClientRpc] private void RpcOnZeroHealth() InternalOnZeroHealth(); private void SetPlayerActive(bool active) m_collider.enabled = active; m_playerrenderers.setactive(active); //m_healthcanvas.setactive(active); if (active) m_manager.enablecontrol(); else m_manager.disablecontrol(); m_setup.activatecrown(active); public void SetDefaults() m_currenthealth = m_startinghealth; m_zerohealthhappened = false; SetPlayerActive(true);
Justus Pousi. Unity-moninpeli HLAPI-rajapinnalla
Justus Pousi Unity-moninpeli HLAPI-rajapinnalla Unity-moninpeli HLAPI-rajapinnalla Justus Pousi Opinnäytetyö Syksy 2016 Tietojenkäsittelyn koulutusohjelma Oulun ammattikorkeakoulu TIIVISTELMÄ Oulun ammattikorkeakoulu
XNA grafiikka laajennus opas. Paavo Räisänen. www.ohjelmoimaan.net. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.
XNA grafiikka laajennus opas Paavo Räisänen www.ohjelmoimaan.net Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa. Tätä opasta saa vapaasti kopioida, tulostaa ja levittää ei
KONEISTUSKOKOONPANON TEKEMINEN NX10-YMPÄRISTÖSSÄ
KONEISTUSKOKOONPANON TEKEMINEN NX10-YMPÄRISTÖSSÄ https://community.plm.automation.siemens.com/t5/tech-tips- Knowledge-Base-NX/How-to-simulate-any-G-code-file-in-NX- CAM/ta-p/3340 Koneistusympäristön määrittely
1. SIT. The handler and dog stop with the dog sitting at heel. When the dog is sitting, the handler cues the dog to heel forward.
START START SIT 1. SIT. The handler and dog stop with the dog sitting at heel. When the dog is sitting, the handler cues the dog to heel forward. This is a static exercise. SIT STAND 2. SIT STAND. The
C++11 seminaari, kevät Johannes Koskinen
C++11 seminaari, kevät 2012 Johannes Koskinen Sisältö Mikä onkaan ongelma? Standardidraftin luku 29: Atomiset tyypit Muistimalli Rinnakkaisuus On multicore systems, when a thread writes a value to memory,
Jussi Klemola 3D- KEITTIÖSUUNNITTELUOHJELMAN KÄYTTÖÖNOTTO
Jussi Klemola 3D- KEITTIÖSUUNNITTELUOHJELMAN KÄYTTÖÖNOTTO Opinnäytetyö KESKI-POHJANMAAN AMMATTIKORKEAKOULU Puutekniikan koulutusohjelma Toukokuu 2009 TIIVISTELMÄ OPINNÄYTETYÖSTÄ Yksikkö Aika Ylivieska
anna minun kertoa let me tell you
anna minun kertoa let me tell you anna minun kertoa I OSA 1. Anna minun kertoa sinulle mitä oli. Tiedän että osaan. Kykenen siihen. Teen nyt niin. Minulla on oikeus. Sanani voivat olla puutteellisia mutta
Ohjelmointikielet ja -paradigmat 5op. Markus Norrena
Ohjelmointikielet ja -paradigmat 5op Markus Norrena Kotitehtävä 6, toteuttakaa alla olevan luokka ja attribuutit (muuttujat) Kotitehtävä 6, toteuttakaa alla olevan luokka ja attribuutit (muuttujat) Huom!
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Taulukon edut Taulukon haitat Taulukon haittojen välttäminen Dynaamisesti linkattu lista Linkatun listan solmun määrittelytavat Lineaarisen listan toteutus dynaamisesti linkattuna
FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL
FinFamily PostgreSQL 1 Sisällys / Contents FinFamily PostgreSQL... 1 1. Asenna PostgreSQL tietokanta / Install PostgreSQL database... 3 1.1. PostgreSQL tietokannasta / About the PostgreSQL database...
Efficiency change over time
Efficiency change over time Heikki Tikanmäki Optimointiopin seminaari 14.11.2007 Contents Introduction (11.1) Window analysis (11.2) Example, application, analysis Malmquist index (11.3) Dealing with panel
On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)
On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31) Juha Kahkonen Click here if your download doesn"t start automatically On instrument costs
Jypelin käyttöohjeet» Ruutukentän luominen
Jypelin käyttöohjeet» Ruutukentän luominen Pelissä kentän (Level) voi luoda tekstitiedostoon "piirretyn" mallin mukaisesti. Tällöin puhutaan, että tehdään ns. ruutukenttä, sillä tekstitiedostossa jokainen
On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)
On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31) Juha Kahkonen Click here if your download doesn"t start automatically On instrument costs
1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä
OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 811122P (5 op.) 12.12.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan
Ohjelmointikielet ja -paradigmat 5op. Markus Norrena
Ohjelmointikielet ja -paradigmat 5op Markus Norrena Ko#tehtävä 4 Viimeistele "alkeellinen kuvagalleria". Käytännössä kaksi sivua Yksi jolla voi ladata kuvia palvelimelle (file upload) Toinen jolla ladattuja
812336A C++ -kielen perusteet, 21.8.2010
812336A C++ -kielen perusteet, 21.8.2010 1. Vastaa lyhyesti seuraaviin kysymyksiin (1p kaikista): a) Mitä tarkoittaa funktion ylikuormittaminen (overloading)? b) Mitä tarkoittaa jäsenfunktion ylimääritys
The CCR Model and Production Correspondence
The CCR Model and Production Correspondence Tim Schöneberg The 19th of September Agenda Introduction Definitions Production Possiblity Set CCR Model and the Dual Problem Input excesses and output shortfalls
On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)
On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31) Juha Kahkonen Click here if your download doesn"t start automatically On instrument costs
Esimerkkinä http://wordpress.com/ - ilmainen blogi-julkaisujärjestelmä. WordPress:stä on myös palvelimelle asennettava versio (WordPress.
BLOGIN LUOMINEN Esimerkkinä http://wordpress.com/ - ilmainen blogi-julkaisujärjestelmä. WordPress:stä on myös palvelimelle asennettava versio (WordPress.org) Myös http://blogspot.com on ilmainen ja helppokäyttöinen
ATLAS-kartan esittely - Peli palveluiden yhteiskehittämisen menetelmistä Päivi Pöyry-Lassila, Aalto-yliopisto
ATLAS-kartan esittely - Peli palveluiden yhteiskehittämisen menetelmistä Päivi Pöyry-Lassila, Aalto-yliopisto Serve Research Brunch 24.10.2013 Esityksen sisältö ATLAS-hanke lyhyesti ATLAS-kartan kehittäminen:
Julkaisun laji Opinnäytetyö. Sivumäärä 43
OPINNÄYTETYÖN KUVAILULEHTI Tekijä(t) SUKUNIMI, Etunimi ISOVIITA, Ilari LEHTONEN, Joni PELTOKANGAS, Johanna Työn nimi Julkaisun laji Opinnäytetyö Sivumäärä 43 Luottamuksellisuus ( ) saakka Päivämäärä 12.08.2010
IOS%PELIN!LUOMINEN!UNITY% PELIMOOTTORILLA!
IOS%PELINLUOMINENUNITY% PELIMOOTTORILLA TuomoStamblewski Opinnäytetyö Huhtikuu2014 Ohjelmistotekniikankoulutusohjelma Tekniikanjaliikenteenala KUVAILULEHTI* Tekijä(t) Stamblewski,Tuomo Julkaisunlaji Opinnäytetyö
Tapahtumapohjainen ohjelmointi. Juha Järvensivu juha.jarvensivu@tut.fi 2007
Tapahtumapohjainen ohjelmointi Juha Järvensivu juha.jarvensivu@tut.fi 2007 Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit
Olio-ohjelmointi Javalla
1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi
Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi
Muilla kielillä: English Suomi Pong-peli, vaihe 7 Tässä vaiheessa lisäämme peliin pistelaskun. Pong-pelissä pelaaja saa pisteen kun pallo ohittaa toisen pelaajan mailan. 1. Aliohjelmakutsu laskureita varten
Racket ohjelmointia II. Tiina Partanen 2015
Racket ohjelmointia II Tiina Partanen 2015 Sisältö 1) Peli I Yksinkertainen peli, jossa kerätään kohteita ja väistellään vaaroja Pitkälle viety koodi, johon täydennetään vain puuttuvat palat Ei tarvita
KODU. Lumijoen peruskoulu
KODU Lumijoen peruskoulu Sisällysluettelo 1. Aloitus... 2 1.1 Pelin tallennuspaikka... 2 1.2 Kodu Game lab... 3 2 Maan luominen... 4 2.1. Seinän tekeminen... 5 2.2. Vesialueen tekeminen peliin... 6 2.3.
UML ja luokkien väliset suhteet
UML ja luokkien väliset suhteet -Luokan kuvaaminen UML-tekniikalla -Yhteyssuhde ja koostumussuhde 1 Luokan kuvaaminen UML-tekniikalla : Luokka - attribuutti1 : tietotyyppi # attribuutti2 : tietotyyppi
Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:
Linux-harjoitus 6 Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä: http://www.mysql.com/, MySQL-tietokantaohjelman kotisivu. http://www.mysql.com/doc/en/index.html,
Bootstrap / HTDP2 / Realm of Racket. Vertailu
Bootstrap / HTDP2 / Realm of Racket Vertailu Bootstrap http://www.bootstrapworld.org/ Tarkoitettu yläkoululaisille (12-15v) Ohjelmointi on integroitu matematiikan opetukseen Materiaalina tuntisuunnitelmat
Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:
Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int
Verkkopelimaailman generointi Unity 2D:llä
Verkkopelimaailman generointi Unity 2D:llä Ammattikorkeakoulun opinnäytetyö Tietojenkäsittelyn koulutusohjelma Hämeenlinna, kevät 2017 Juho Puoliväli TIIVISTELMÄ Tietojenkäsittelyn koulutusohjelma Visamäki,
Choose Finland-Helsinki Valitse Finland-Helsinki
Write down the Temporary Application ID. If you do not manage to complete the form you can continue where you stopped with this ID no. Muista Temporary Application ID. Jos et onnistu täyttää lomake loppuun
Capacity Utilization
Capacity Utilization Tim Schöneberg 28th November Agenda Introduction Fixed and variable input ressources Technical capacity utilization Price based capacity utilization measure Long run and short run
Gap-filling methods for CH 4 data
Gap-filling methods for CH 4 data Sigrid Dengel University of Helsinki Outline - Ecosystems known for CH 4 emissions; - Why is gap-filling of CH 4 data not as easy and straight forward as CO 2 ; - Gap-filling
MUSEOT KULTTUURIPALVELUINA
Elina Arola MUSEOT KULTTUURIPALVELUINA Tutkimuskohteena Mikkelin museot Opinnäytetyö Kulttuuripalvelujen koulutusohjelma Marraskuu 2005 KUVAILULEHTI Opinnäytetyön päivämäärä 25.11.2005 Tekijä(t) Elina
VAIHDETTAVIEN HAHMOJEN LUONTI MONINPELIIN
Miika Montonen VAIHDETTAVIEN HAHMOJEN LUONTI MONINPELIIN Opinnäytetyö Tietojenkäsittely 2017 Tekijä/Tekijät Miika Montonen Opinnäytetyön nimi Vaihdettavien hahmojen luonti multipeliin Toimeksiantaja Tutkinto
Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?
Muilla kielillä: English Suomi Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia? Kun kaksi fysiikkaoliota törmää toisiinsa, syntyy törmäystapahtuma. Nämä tapahtumat voidaan ottaa kiinni
FinFamily Installation and importing data (11.1.2016) FinFamily Asennus / Installation
FinFamily Asennus / Installation 1 Sisällys / Contents FinFamily Asennus / Installation... 1 1. Asennus ja tietojen tuonti / Installation and importing data... 4 1.1. Asenna Java / Install Java... 4 1.2.
Hankkeiden vaikuttavuus: Työkaluja hankesuunnittelun tueksi
Ideasta projektiksi - kumppanuushankkeen suunnittelun lähtökohdat Hankkeiden vaikuttavuus: Työkaluja hankesuunnittelun tueksi Erasmus+ -ohjelman hakuneuvonta ammatillisen koulutuksen kumppanuushanketta
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.
Mainosankkuri.fi-palvelun käyttöohjeita
Mainosankkuri.fi-palvelun käyttöohjeita Sisällys 1. Johdanto... 1 2. Sisäänkirjautuminen... 1 3. Palvelussa navigointi... 2 4. Laitteet... 2 5. Sisällönhallinta... 4 6. Soittolistat... 7 7. Aikataulut...
Uusi Ajatus Löytyy Luonnosta 4 (käsikirja) (Finnish Edition)
Uusi Ajatus Löytyy Luonnosta 4 (käsikirja) (Finnish Edition) Esko Jalkanen Click here if your download doesn"t start automatically Uusi Ajatus Löytyy Luonnosta 4 (käsikirja) (Finnish Edition) Esko Jalkanen
Network to Get Work. Tehtäviä opiskelijoille Assignments for students. www.laurea.fi
Network to Get Work Tehtäviä opiskelijoille Assignments for students www.laurea.fi Ohje henkilöstölle Instructions for Staff Seuraavassa on esitetty joukko tehtäviä, joista voit valita opiskelijaryhmällesi
Käytettävyys ja käyttäjätutkimus. Yhteisöt ja kommunikaatiosuunnittelu 2012 / Tero Köpsi
Käytettävyys ja käyttäjätutkimus Yhteisöt ja kommunikaatiosuunnittelu 2012 / Tero Köpsi Teron luennot Ke 15.2 miniluento Ti 28.2 viikkotehtävän anto (T,M) To 1.3 Tero paikalla (tehtävien tekoa) Ti 6.3
Security server v6 installation requirements
CSC Security server v6 installation requirements Security server version 6.x. Version 0.2 Pekka Muhonen 2/10/2015 Date Version Description 18.12.2014 0.1 Initial version 10.02.2015 0.2 Major changes Contents
Apuja ohjelmointiin» Yleisiä virheitä
Apuja ohjelmointiin» Yleisiä virheitä Ohjelmaa kirjoittaessasi saattaa Visual Studio ilmoittaa monenlaisista virheistä "punakynällä". Usein tämä johtuu vain siitä, että virheitä näytetään vaikket olisi
Rämpytysralli. Pelikehys sisältää GameObject luokan, Scene luokan, SceneManager luokan, InputListener luokan, StaticImage luokan
Materiaalit on lisensoitu Creative Commons BY NC SA lisenssillä, eli materiaalin levittäminen ja muokkaaminen on sallittu, kunhan tekijöiden nimet säilyvät mukana ja jatkoversiot julkaistaan samalla linsenssillä.
1. Taustatietoa näppäimistönkuuntelusta
Muilla kielillä: English Suomi Pong-peli, vaihe 5 Tämä on Pong-pelin tutoriaalin osa 5/7. Tämän vaiheen aikana Lisäämme peliin näppäimet Laitetaan mailat liikkumaan pelaajien ohjaamina Näin ohjelmaamme
API:Hack Tournee 2014
apisuomi API:Hack Tournee 2014 #apihackfinland Twitter: @ApiSuomi API:Suomi - Suomen metarajapinta apisuomi Apisuomi kerää vertailutietoa ja arvosteluja rajapinnoista madaltaen avoimen datan uudelleenkäytön
DXL Library ja DXL-kielen olemus. Pekka Mäkinen Pekka.Makinen@softqa.fi SoftQA Oy http/www.softqa.fi/
DXL Library ja DXL-kielen olemus Pekka Mäkinen Pekka.Makinen@softqa.fi SoftQA Oy http/www.softqa.fi/ DOORS extension Language DXL on DOORSin laajennuskieli, jolla voidaan kehittää lisätoiminnallisuutta.
Security server v6 installation requirements
CSC Security server v6 installation requirements Security server version 6.4-0-201505291153 Pekka Muhonen 8/12/2015 Date Version Description 18.12.2014 0.1 Initial version 10.02.2015 0.2 Major changes
Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana
Muilla kielillä: English Suomi Pong-peli, vaihe 3 Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Jaetaan ohjelma pienempiin palasiin (aliohjelmiin) Lisätään peliin maila (jota ei voi vielä
15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien
Selainpelien pelimoottorit
Selainpelien pelimoottorit Teemu Salminen Helsinki 28.10.2017 Seminaaritutkielma Helsingin yliopisto Tietojenkäsittelytiede ! 1 HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta
Action Request System
Action Request System Manu Karjalainen Ohjelmistotuotantovälineet seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 25.10.2000 Action Request System (ARS) Manu Karjalainen Ohjelmistotuotantovälineet
Results on the new polydrug use questions in the Finnish TDI data
Results on the new polydrug use questions in the Finnish TDI data Multi-drug use, polydrug use and problematic polydrug use Martta Forsell, Finnish Focal Point 28/09/2015 Martta Forsell 1 28/09/2015 Esityksen
1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä
OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 81122P (4 ov.) 30.5.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä
Travel Getting Around
- Location Olen eksyksissä. Not knowing where you are Voisitko näyttää kartalta missä sen on? Asking for a specific location on a map Mistä täällä on? Asking for a specific...wc?...pankki / rahanvaihtopiste?...hotelli?...huoltoasema?...sairaala?...apteekki?...tavaratalo?...ruokakauppa?...bussipysäkki?
JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?
JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,
Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto
Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
Tech Conference 28.-29.5.2015. Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI
Tech Conference 28.-29.5.2015 Visual Studio 2015, C#6,.NET4.6 Heikki Raatikainen #TechConfFI Yleistä Avoimuus Open Source ja tuki yleisesti käytetyille ei-ms työkaluille Kaikki alustat tuettuna:.net 5
KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikka / Ohjelmistotekniikka. Mika Uurainen UNITY MOBIILIPELIEN KEHITYKSESSÄ
KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikka / Ohjelmistotekniikka Mika Uurainen UNITY MOBIILIPELIEN KEHITYKSESSÄ Opinnäytetyö 2013 TIIVISTELMÄ KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikka Uurainen
LYTH-CONS CONSISTENCY TRANSMITTER
LYTH-CONS CONSISTENCY TRANSMITTER LYTH-INSTRUMENT OY has generate new consistency transmitter with blade-system to meet high technical requirements in Pulp&Paper industries. Insurmountable advantages are
LANSEERAUS LÄHESTYY AIKATAULU OMINAISUUDET. Sähköinen jäsenkortti. Yksinkertainen tapa lähettää viestejä jäsenille
tiedote 2 / 9.3.2017 LANSEERAUS LÄHESTYY AIKATAULU 4.3. ebirdie-jäsenkortti esiteltiin Golfliiton 60-vuotisjuhlaseminaarissa 17.3. ebirdie tulee kaikkien ladattavaksi Golfmessuilla 17.3. klo 12:00 alkaen
JWT 2016 luento 11. to 21.4.2016 klo 14-15. Aulikki Hyrskykari. PinniB 1097. Aulikki Hyrskykari
JWT 2016 luento 11 to 21.4.2016 klo 14-15 Aulikki Hyrskykari PinniB 1097 1 Viime luennolla o AJAX ja JSON, harjoitustyön tehtävänanto, vierailuluento avoimesta datasta Tänään o APIt rajapinnoista yleisesti
Delegaatit ja tapahtumakäsittelijät
14 Delegaatit ja tapahtumakäsittelijät Toinen käyttökelpoinen keksintö C#-kielessä ovat delegaatit. Periaatteessa ne palvelevat samaa tarkoitusta kuin C++:n funktio-osoittimet. Delegaatit ovat kuitenkin
Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana
Muilla kielillä: English Suomi Pong-peli, vaihe 2 Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana Laitetaan pallo liikkeelle Tehdään kentälle reunat Vaihdetaan kentän taustaväri Zoomataan
Osa 7: Hahmojen ohjelmointi ja hienosäätö
1 Osa 7: Hahmojen ohjelmointi ja hienosäätö Tässä luvussa käymme läpi perusohjelmoinnin alkeita. - Ensimmäisenä koduhahmon ohjelmointia. 1. Program -osiossa tapahtuu itse se koodin kirjoitus, missä määrätään
Ohjelmointi 2 / 2010 Välikoe / 26.3
Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään
TIE-20200 Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely
Lyhyt UML-opas UML -pikaesittely UML, Unified Modeling Language Standardoitu, yleiskäyttöinen mallinnuskieli, jota ylläpitää/hallitsee (Object Management Group) OMG Historiaa: 90-luvulla oli paljon kilpailevia
Aloita oman blogisi luominen (järjestelmä lupaa sen tapahtuvan sekunneissa ;-))
BLOGIN LUOMINEN Esimerkkinä http://wordpress.com/ - ilmainen blogi-julkaisujärjestelmä. WordPress:stä on myös palvelimelle asennettava versio (WordPress.org) Avaa http://wordpress.com/ -sivu. Aloita oman
Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:
1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri
Älysopimusten kehittäminen. Sopimus suuntautunut ohjelmointi
Älysopimusten kehittäminen Sopimus suuntautunut ohjelmointi There are currently 5,000 blockchain developers. By 2020, we project a global need for over 500,000 - ConsenSys Älysopimus alustat q Ethereum
Returns to Scale II. S ysteemianalyysin. Laboratorio. Esitelmä 8 Timo Salminen. Teknillinen korkeakoulu
Returns to Scale II Contents Most Productive Scale Size Further Considerations Relaxation of the Convexity Condition Useful Reminder Theorem 5.5 A DMU found to be efficient with a CCR model will also be
Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen
Pedacode Pikaopas Java-kehitysympäristön pystyttäminen Pikaoppaan sisältö Pikaoppaassa kuvataan, miten Windowstyöasemalle asennetaan Java-ohjelmoinnissa tarvittavat työkalut, minkälaisia konfigurointeja
SIMULINK S-funktiot. SIMULINK S-funktiot
S-funktio on ohjelmointikielellä (Matlab, C, Fortran) laadittu oma algoritmi tai dynaamisen järjestelmän kuvaus, jota voidaan käyttää Simulink-malleissa kuin mitä tahansa valmista lohkoa. S-funktion rakenne
TIE-20200 Ohjelmistojen suunnittelu
TIE-20200 Ohjelmistojen suunnittelu Luento 1: Virtuaalifunktiot, Template method 1 Yleistä asiaa Muistakaa harkkatyöilmoittautuminen 23 ryhmää (mm. lihansyöjäkirahvi), vajaita ryhmiäkin on 44 henkeä vielä
KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma / Ohjelmistotekniikka. Elina Salo 3D MALLINNUS PELEIHIN JA MALLIEN KÄYTTÖ UNITY3D:SSÄ
KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma / Ohjelmistotekniikka Elina Salo 3D MALLINNUS PELEIHIN JA MALLIEN KÄYTTÖ UNITY3D:SSÄ Opinnäytetyö 2015 TIIVISTELMÄ KYMENLAAKSON AMMATTIKORKEAKOULU
Samuli Jylhä MOBIILIPELIOHJELMOINTI JA KÄYTTÖLIITTYMÄN TOTEUTUS UNITYLLÄ
Samuli Jylhä MOBIILIPELIOHJELMOINTI JA KÄYTTÖLIITTYMÄN TOTEUTUS UNITYLLÄ MOBIILIPELIOHJELMOINTI JA KÄYTTÖLIITTYMÄN TOTEUTUS UNITYLLÄ Samuli Jylhä Opinnäytetyö Kevät 2018 Tietotekniikan tutkinto-ohjelma
Anna Siikaniemi. BITSBOARD sovelluksen käyttöopas
Anna Siikaniemi BITSBOARD sovelluksen käyttöopas Innovative Investments Limited:n kehittämästä Bitsboard sovelluksesta löytyy Appstoresta neljä versiota; ilmaiset Bitsboard Preschool, Bitsboard, Bitsboard
Harjoitus 3: Flash-komponenttiarkkitehtuuri (18.3.2016)
Harjoitus 3: Flash-komponenttiarkkitehtuuri (18.3.2016) Tietokoneavusteinen opetus -kurssilla opetetaan Adobe Flash CS6:n käyttämistä neljänä kertana: 11.3.2016, 15.3.2016, 18.3.2016 ja 1.4.2016. Harjoituskerroilla
1. Liikkuvat määreet
1. Liikkuvat määreet Väitelauseen perussanajärjestys: SPOTPA (subj. + pred. + obj. + tapa + paikka + aika) Suora sanajärjestys = subjekti on ennen predikaattia tekijä tekeminen Alasääntö 1: Liikkuvat määreet
LINUX-HARJOITUS, MYSQL
LINUX-HARJOITUS, MYSQL Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä: http://www.mysql.com/, MySQL-tietokantaohjelman kotisivu. http://www.mysql.com/doc/en/index.html,
Javan asennus ja ohjeita ongelmatilanteisiin
Javan asennus ja ohjeita ongelmatilanteisiin Javaa tarvitaan Fivaldin Sovellusikkunan alaisiin sovelluksiin, jotka käyttävät Oracle Forms -tekniikkaa. Visma Fivaldin osalta suosittelemme aina käyttämään
Information on preparing Presentation
Information on preparing Presentation Seminar on big data management Lecturer: Spring 2017 20.1.2017 1 Agenda Hints and tips on giving a good presentation Watch two videos and discussion 22.1.2017 2 Goals
18. Abstraktit tietotyypit 18.1
18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
2010-luvun kansalaistaito: Windows-puhelimen ohjelmointi. Kai Lindgren, Teollinen tuotanto/metropolia
2010-luvun kansalaistaito: Windows-puhelimen ohjelmointi Kai Lindgren, Teollinen tuotanto/metropolia Paikka: Metropolia Ammattikorkeakoulu, Helsinki, Bulevardi 31. Sali Engel (P317) Ohjelma 9.00 9.15 Tervetuloa!
T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010
12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi
Palomuurit. Palomuuri. Teoriaa. Pakettitason palomuuri. Sovellustason palomuuri
Palomuuri Teoriaa Palomuurin tehtävä on estää ei-toivottua liikennettä paikalliseen verkkoon tai verkosta. Yleensä tämä tarkoittaa, että estetään liikennettä Internetistä paikallisverkkoon tai kotikoneelle.
Innovative and responsible public procurement Urban Agenda kumppanuusryhmä. public-procurement
Innovative and responsible public procurement Urban Agenda kumppanuusryhmä https://ec.europa.eu/futurium/en/ public-procurement Julkiset hankinnat liittyvät moneen Konsortio Lähtökohdat ja tavoitteet Every
Ampumahiihto. Hiihto. Pelihahmon piirtäminen. Jos tahdot animoida hiihtämisen, Peli muodostuu kahdesta erilaisesta osasta: ensin
Ampumahiihto 1 Peli muodostuu kahdesta erilaisesta osasta: ensin hiihdetään ammuntapaikalle rämpyttämällä nuolinäppäimiä ja sen jälkeen yritetään ampua maalitaulut mahdollisimman nopeasti aikasakot välttäen.
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3
15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet
Digitaalisten pelit hyvinvoinnin edistämisessä
Digitaalisten pelit hyvinvoinnin edistämisessä Jukka Vahlo CCR / Up Your Game -pelitutkimusverkosto PELIT JA PELILLISYYS Digitaaliset pelit erotellaan viihdepeleihin sekä hyötypeleihin. Viihdepeleillä
Automaatiojärjestelmän hankinnassa huomioitavat tietoturva-asiat
Automaatiojärjestelmän hankinnassa huomioitavat tietoturva-asiat Teollisuusautomaation tietoturvaseminaari Purchasing Manager, Hydro Lead Buyer, Industrial Control Systems 1 Agenda / esityksen tavoite
Pelisuunnittelua tulevaisuudessa. Karoliina Korppoo / Colossal Order
Pelisuunnittelua tulevaisuudessa Karoliina Korppoo / Colossal Order Puhuja Karoliina Korppoo Game Designer Lead designer projektissa Cities: Skylines Medianomi, Tampereen Ammattikorkeakoulu Filosofian
Green Growth Sessio - Millaisilla kansainvälistymismalleilla kasvumarkkinoille?
Green Growth Sessio - Millaisilla kansainvälistymismalleilla kasvumarkkinoille? 10.10.01 Tuomo Suortti Ohjelman päällikkö Riina Antikainen Ohjelman koordinaattori 10/11/01 Tilaisuuden teema Kansainvälistymiseen