====== BreakOut klooni ====== Breakout-peli on vanha klassikko, voit katsoa vaikkapa [[http://atari.com/arcade#!/arcade/superbreakout/play]] tai [[http://www.gamesgames.com/games/breakout]], jollet tiedä, mistä puhutaan. {{ :image_8.png?200 |}} ===== Pelikenttä ===== Aloita uusi projekti, nimeä se vaikka nimellä Arkanoid. Valitse GameObject -> Create Other -> Cube ja anne sille nimeksi "Pelikenttä". Muuta skaala (30,30,1) ja väriksi vihreä. Siirrä Main Camera (0,0,-30). Lisää Point Light (0,0,-10) ja muuta sen arvo Range 100. Talleta Scene. Luodaan pelille reunat. Luo Cube kohtaan (0,15,0) ja Scale (30,1,1) ja anna sille nimeksi RajaYlä. Muuta Pelikantän Z-koordinaatiksi 1.1. Klikkaa hiiren oikealla RajaYlä -> Duplicate ja nimeä kopio RajaVasen. Muuta sijainniksi (-15.5, -0.5, 0) ja Scaleksi (1,32,1) Kopioi RajaVasen, nimeä kopio RajaOikea ja muuta X-koordinaatiksi 15.5. Talleta ja kokeile peliä. ===== Pelaaja ===== Luo kuutio kohtaan (0, -15, 0) koolla (4, 1, 1). Anna nimeksi maila. Muuta maila punaiseksi. Luo skripti Pelaaja: #pragma strict function Start () { } function Update () { if(Input.GetKey("left")) { transform.Translate(-20*Time.deltaTime, 0, 0); } if(Input.GetKey("right")) { transform.Translate(20*Time.deltaTime, 0, 0); } } Liitä skripti mailaan ja kokeile toimivuus. Lisätään seuraavaksi mailan ohjaus hiirellä: #pragma strict function Start () { Screen.lockCursor = true; } function Update () { if(Input.GetKey("left")) { transform.Translate(-20*Time.deltaTime, 0, 0); } if(Input.GetKey("right")) { transform.Translate(20*Time.deltaTime, 0, 0); } var h = 30.0 * Time.deltaTime * Input.GetAxis("Mouse X"); transform.Translate(h, 0, 0); } Testaa toimivuus. ===== Pallo ===== Luo Sphere kohtaan (0, -7, 0) ja vaihda nimeksi Pallo. Muuta sen väriksi keltainen. Valitse Pallo -> Add Component -> PalloSkripti koodilla: #pragma strict var BeepSound : AudioClip; static var launchtimer: float; static var xspeed : float; static var yspeed : float; static var collflag : boolean; function Start () { launchtimer = 2.0; xspeed = 8.0; yspeed = 8.0; collflag = true; } function Update () { transform.position.z = 0; launchtimer -= Time.deltaTime; if(launchtimer <= 0.0) { transform.Translate(Vector3(xspeed, yspeed, 0) * Time.deltaTime); launchtimer = 0.0; } } function OnTriggerEnter(other: Collider) { audio.PlayOneShot(BeepSound); } Tarvittavan äänitiedoston voit etsiä netistä tai ladata {{:aani.mp3|tästä}}. Valitse Pallo -> Add Component -> Audio -> Audio Source ja liitä äskeinen ääni Palloon. Talleta ja kokeile peliä. Valitse "Play on Awake" pois, niin ääni ei kuulu pelin alussa. ===== Törmäykset ===== Luo skripti Seinä #pragma strict function OnTriggerEnter(other: Collider) { PalloOhjaus.xspeed = -PalloOhjaus.xspeed; PalloOhjaus.collflag = true; } Yhdistä skripti RajaVasen ja RajaOikea olioihin. Lisätään vielä liipaisimet ja jäykän kappaleen ominaisuudet: Valitse Pallo -> Add Component -> Physics -> Rigidbody. Poista valinta "Use gravity" (käytä painovoimaa). Valitse RajaVasen ja siitä kohta "IsTrigger". Tee sama RajaOikea:lle. Talleta ja kokeile peliä. Tee YläSeinä skripti: #pragma strict function OnTriggerEnter(other: Collider) { PalloOhjaus.yspeed = -PalloOhjaus.yspeed; PalloOhjaus.collflag = true; } Talleta skripti ja liitä se RajaYlä:än. Aktivoi "IsTrigger" valinta RajaYlä:ssä. Tehdään seuraavaksi pallon tippumisen estävä skripti. Lisää Game object -> Create empty ja anna sille nimeksi RajaAla. Muuta paikaksi (0, -17, 0) ja kooksi (35,1,1) Luo skripti PalloAlkuun #pragma strict function OnTriggerEnter(other: Collider) { other.transform.position = Vector3(0, -7, 0); PalloOhjaus.xspeed = 8.0; PalloOhjaus.yspeed = -8.0; PalloOhjaus.launchtimer = 1.0; } Liitä skripti RajaAla:an. Lisää mailaan "IsTrigger" ominaisuus. Lisää pelaaja-skriptin loppuun function OnTriggerEnter(other: Collider) { PalloOhjaus.yspeed = -PalloOhjaus.yspeed; PalloOhjaus.collflag = true; } Talleta ja kokeile! Yleensä palloa voi ohjailla, sen voi lisätä muuttamalla äsken lisättyä koodia: function OnTriggerEnter(other: Collider) { PalloOhjaus.yspeed = -PalloOhjaus.yspeed; if (other.collider.gameObject.transform.position.x > gameObject.transform.position.x) { PalloOhjaus.xspeed = Mathf.Abs(PalloOhjaus.yspeed); } else { PalloOhjaus.xspeed = -Mathf.Abs(PalloOhjaus.yspeed); } PalloOhjaus.collflag = true; } ===== Tiilet ===== Miten saamme tehtyä nätisti tarpeeksi (120!) tiiltä peliin? Koodilla! Luo tyhjä peliobjekti GameObject -> Create Empty ja anna sille nimeksi TiiltenTekijä. Luo skripti TiiltenTekijä ja liitä se äsken luotuun objektiin. #pragma strict function Start () { for (var y = 0; y < 8; y++) { for (var x = 0; x < 15; x++) { var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = Vector3 (x*2 - 14, y - 1, 0); cube.transform.localScale = Vector3 (1.9, 0.9, 1); //cube.AddComponent("TiiliSkripti"); cube.collider.isTrigger = true; cube.renderer.material.color = Color(0.2 + y*0.08, 0.3, 1.0); } } } Talleta ja kokeile peliä! Muutetaan pelin valaistusta. Siirrä valon tyypiksi Directional (inspektorista) ja Intensity arvoon 0.63. Tiilten pitäisi näyttää nyt paremmilta. Muuta äskeistä skriptiä seuraavasti: #pragma strict function Start () { for (var y = 0; y < 8; y++) { for (var x = 0; x < 15; x++) { var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = Vector3 (x*2 - 14, y - 1, 0); cube.transform.localScale = Vector3 (1.9, 0.9, 1); //cube.AddComponent("TiiliSkripti"); cube.collider.isTrigger = true; //cube.renderer.material.color = Color(0.2 + y*0.08, 0.3, 1.0); if (y < 2) cube.renderer.material.color = Color.yellow; else if (y < 4) cube.renderer.material.color = Color.cyan; else if (y < 6) cube.renderer.material.color = Color.blue; else cube.renderer.material.color = Color.red; } } } Väreistä tulee hieman kirkkaampia :-) ===== Pelattava versio ===== Kirjoitetaan skripti, joka poistaa tiilen ja laittaa pallon pomppaamaan törmäyksestä tiileen. Luo JavaScript, anna sille nimeksi TiiliSkripti ja kirjoita: #pragma strict function OnTriggerEnter(other: Collider) { if(PalloOhjaus.collflag == true) { PalloOhjaus.yspeed = -PalloOhjaus.yspeed; PalloOhjaus.collflag = false; Destroy(gameObject); } } Poista kommentti-merkit (%%//%%) TiilenTekijä-skriptistä rivin 11 alusta. Talleta ja kokeile! ===== Pisteet ===== Lisää GameObject -> Create Empty ja anna sille nimeksi Pisteet. Luo skripti Pisteet: #pragma strict static var score: int; static var lives: int; function Start () { score = 0; lives = 3; } function Update () { } function OnGUI() { GUI.Box(Rect(10,10,90,30), "Score: " + score); GUI.Box(Rect(Screen.width - 100,10,90,30), "Lives: "+lives); } Mieti, miten saat pelin pisteet toimimaan oikein? (Ja toteuta se) ===== Valmis koodi ===== {{:arkanoid.zip|Valmis projekti zip-pakettina}} ==== Pong-pelin paketti ==== {{:pong.zip|Pong-peli zip-pakettina}}