XNA grafiikka laajennus opas. Paavo Räisänen. www.ohjelmoimaan.net. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.



Samankaltaiset tiedostot
XNA 2D ohjelmoinnin perusteet. Paavo Räisänen.

C# Windows ohjelmointi perusopas

4 Äänet ja musikki. 4.1 Wav-tiedostojen soittaminen SoundEffect-luokka

Peliohjelmointi Windows Phone 8:lle

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

Listarakenne (ArrayList-luokka)

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Java ja grafiikka. Ville Sundberg

1. Miten tehdään peliin toinen maila?

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Alkuun HTML5 peliohjelmoinnissa

FinFamily Installation and importing data ( ) FinFamily Asennus / Installation

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

Pong-peli, vaihe Rajojen tarkistus Yläreunan tarkistus. Muilla kielillä: English Suomi

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

Jypelin käyttöohjeet» Ruutukentän luominen

10 Lock Lock-lause

Web Services tietokantaohjelmoinnin perusteet

Kylänetti projektin sivustojen käyttöohjeita Dokumentin versio 2.10 Historia : 1.0, 1.2, 1.6 Tero Liljamo / Deserthouse, päivitetty 25.8.

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

5 Näppäimistö. 5.1 Näppäimistön eventit

812336A C++ -kielen perusteet,

Choose Finland-Helsinki Valitse Finland-Helsinki

Laskennallisesti Älykkäät Järjestelmät. Sumean kmeans ja kmeans algoritmien vertailu

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

Tomi Karppinen XNA-ohjelmointi Jyväskylän yliopisto Tietotekniikan laitos Jyväskylä

Metodien tekeminen Javalla

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Java-kielen perusteet

Olio-ohjelmointi Javalla

On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)

1. Taustatietoa näppäimistönkuuntelusta

Delegaatit ja tapahtumakäsittelijät

KONEISTUSKOKOONPANON TEKEMINEN NX10-YMPÄRISTÖSSÄ

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Mikä yhteyssuhde on?

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Lab SBS3.FARM_Hyper-V - Navigating a SharePoint site

Harjoitustyö (TKO_2023)

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Jypelin käyttöohjeet» Ruutukentän luominen

2010-luvun kansalaistaito: Windows-puhelimen ohjelmointi. Kai Lindgren, Teollinen tuotanto/metropolia

LUKU 17 MUUTAMIA JAVA FX -SOVELLUKSIA. Tässä dokumentissa esitellään muutamia Java FX -sovelluksia.

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Joomla pikaopas. Yksinkertainen opas, jossa neuvotaan esimerkkisivuston teko Joomla julkaisujärjestelmällä vaihe vaiheelta.

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Tietorakenteet ja algoritmit

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

1 Tehtävän kuvaus ja analysointi

C# olio-ohjelmointi perusopas

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

EDMODO. -oppimisympäristö opettajille ja oppilaille KOONNUT: MIKA KURVINEN KANNUKSEN LUKIO

C# ja.net. Juha Järvensivu 2007

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

C++11 seminaari, kevät Johannes Koskinen

9. Periytyminen Javassa 9.1

Muita kuvankäsittelyohjelmia on mm. Paint Shop Pro, Photoshop Elements, Microsoft Office Picture Manager

Flowcode 6 Omien komponenttien luonti 3D- tilassa Ledi

Rinnakkaisohjelmointi, Syksy 2006

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmoinnin perusteet Y Python

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)

The CCR Model and Production Correspondence

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

9. Periytyminen Javassa 9.1

Javan perusteita. Janne Käki

Olio-ohjelmointi 2. välikoe HYV5SN

Java UI-komponentit (JTable) Juha Järvensivu 2007

Ohjelmoinnin peruskurssi Y1

Olio-ohjelmointi Käyttöliittymä

Voice Over LTE (VoLTE) By Miikka Poikselkä;Harri Holma;Jukka Hongisto

ATLAS-kartan esittely - Peli palveluiden yhteiskehittämisen menetelmistä Päivi Pöyry-Lassila, Aalto-yliopisto

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

You can check above like this: Start->Control Panel->Programs->find if Microsoft Lync or Microsoft Lync Attendeed is listed

Sisältö. 2. Taulukot. Yleistä. Yleistä

Lab A1.FARM_Hyper-V.v3

Windows Phone ohjelmointi perusteet

QT tyylit. Juha Järvensivu 2008

Ohjelmoinnin perusteet Y Python

Operaattorin ylikuormitus ja käyttäjän muunnokset

edocker PUBLISH! -paketinhallinnan käyttöohje 9/2015

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

JUnit ja EasyMock (TilaustenKäsittely)

14. Poikkeukset 14.1

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Transkriptio:

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 kaupallisissa tarkoituksissa. Kuitenkaan omille nettisivuille opasta ei saa liittää. Opetustarkoituksessa materiaali on vapaasti käytettävissä. Verkko-opetuksessa oppaan saa julkaista oppilaille tarkoitetuilla sivuilla.

1: Johdanto Tässä oppaassa neuvotaan, kuinka XNA:lla pystyy piirtämään viivan, ja kuinka tekstuurin pixelien väri voidaan lukea. Oppaan ymmärtäminen vaatii kohtuullista XNA:n tuntemusta. Käytetty XNA versio on XNA 4.0. 2: tekstuurin pixelin värin lukeminen Itse lukuasian ydin on tässä. try -catch on sitä varten, että käyttäjä klikkaa pikseliä tekstuurin ulkopuolella. tekstuuri on tekstuuri, jonka pisteen värin haluat lukea. Texture2D tekstuuri; Color[] taustanvari = new Color[1]; Rectangle pistenelio = new Rectangle(Mouse.GetState().X, Mouse.GetState().Y, 1, 1); try tekstuuri.getdata<color>( 0, pistenelio, taustanvari, 0, 1); catch Saatua dataa luetaan näin: Color[] taustanvari = new Color[1]; Color vari = new Color(0, 65, 255); if (taustanvari[0] == vari) Koko Game1.cs koodi on seuraava. Ohjelma kokonaisuudessaan on ladattavissa paketoituna näiden www.ohjelmoimaan.net sivujen oppaat sivuilta. Klikkailemalla ohjelmassa näyttöä, saat hiiren alla olevista väriarvoista tietoa.

using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace LuePisteVari /// This is the main type for your game public class Game1 : Microsoft.Xna.Framework.Game GraphicsDeviceManager graphics; SpriteBatch spritebatch; Texture2D tekstuuri; SpriteFont pistefontti; Color[] taustanvari = new Color[1]; public Game1() graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; IsMouseVisible = true; #if #endif run. graphics.preferredbackbufferwidth = 1200; graphics.preferredbackbufferheight = 800;!DEBUG graphics.isfullscreen true; /// Allows the game to perform any initialization it needs to before starting to /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.initialize will enumerate through any components /// and initialize them as well. protected override void Initialize() // TODO: Add your initialization logic here base.initialize(); /// LoadContent will be called once per game and is the place to load /// all of your content. protected override void LoadContent() // Create a new SpriteBatch, which can be used to draw textures. spritebatch = new SpriteBatch(GraphicsDevice); tekstuuri = Content.Load<Texture2D>(@"Kuvat/Sprite-0003"); pistefontti = Content.Load<SpriteFont>(@"Fontit\arial");

/// UnloadContent will be called once per game and is the place to unload /// all content. protected override void UnloadContent() // TODO: Unload any non ContentManager content here /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// <param name="gametime">provides a snapshot of timing values.</param> protected override void Update(GameTime gametime) if (Mouse.GetState().LeftButton == ButtonState.Pressed && // If the left button is pressed Mouse.GetState().X > 0 && Mouse.GetState().Y > 0 && // and we are inside the game window (Mouse.GetState().X < GraphicsDevice.PresentationParameters.BackBufferWidth) && (Mouse.GetState().Y < GraphicsDevice.PresentationParameters.BackBufferHeight)) Rectangle pistenelio = new Rectangle(Mouse.GetState().X, Mouse.GetState().Y, 1, 1); try tekstuuri.getdata<color>( 0, pistenelio, taustanvari, 0, 1); catch // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.exit(); // TODO: Add your update logic here base.update(gametime); /// This is called when the game should draw itself. /// <param name="gametime">provides a snapshot of timing values.</param> protected override void Draw(GameTime gametime) GraphicsDevice.Clear(Color.Green); spritebatch.begin(); spritebatch.draw(tekstuuri, Vector2.Zero, null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0); Color vari = new Color(158, 125, 255); Color vari2 = new Color(0, 65, 255); Color vari3 = new Color(0, 125, 255);

Color vari4 = new Color(0, 190, 255); Color vari5 = new Color(0, 255, 0); spritebatch.drawstring(pistefontti, "Väri: " + taustanvari[0], new Vector2(10, 10), Color.DarkBlue, 0, Vector2.Zero, if (taustanvari[0] == vari) spritebatch.drawstring(pistefontti, "Väri on violetti.", if (taustanvari[0] == vari2) spritebatch.drawstring(pistefontti, "Väri on tumman sininen.", if (taustanvari[0] == vari3) spritebatch.drawstring(pistefontti, "Väri on sininen.", if (taustanvari[0] == vari4) spritebatch.drawstring(pistefontti, "Väri on vaalean sininen. ", if (taustanvari[0] == vari5) spritebatch.drawstring(pistefontti, "Väri on vihreä. ", spritebatch.end(); // TODO: Add your drawing code here base.draw(gametime); 3: 2D viivan piirtäminen XNA :lla 2D viivan piirto XNA :lla ei ole ihan yksinkertaista, kun XNA:sta puuttuu tarvittava metodi. Olen tehnyt siihen metodin, jolla piirto käy näppärästi, eikä sinun tarvitse välttämättä ymmärtää siitä paljoakaan. Oikeastaan sen käytön kannalta riittaa, kun osaa syöttää oikeat parametrit.

Metodin määrittely on seuraava: public void ViivanPiirto(int x, int y, int x2, int y2, int paksuus, double tarkkuus, Color vari) x,y,x2,y2 ovat koordinantteja, mistä mihin viiva piiretään. Kohtaan paksuus tulee viivan paksuus, joka useinmiten on 1, mutta voi olla vaikka 100:kin. tarkkuus muuttujaan annetaan tarkkuus millä piirretään. Vinoja viivoja piirrettäessä kannattaa käyttää suurta tarkkuutta, esim. 100, mutta vaaka- ja pystysuoriin viivoihin voi hyvin antaa arvoksi vaikka 1. vari muuttujaan tulee viivan väri. Värin voi määritellä joko: Color vari = Color.Yellow; tai rgb arvoina Color vari = new Color(255, 255, 0); Koko Game1.cs koodi on alla. using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace Viiva /// This is the main type for your game public class Game1 : Microsoft.Xna.Framework.Game GraphicsDeviceManager graphics; SpriteBatch spritebatch; public Game1() graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; IsMouseVisible = true; #if #endif run. graphics.preferredbackbufferwidth = 1000; graphics.preferredbackbufferheight = 800;!DEBUG graphics.isfullscreen true; /// Allows the game to perform any initialization it needs to before starting to /// This is where it can query for any required services and load any non-graphic

/// related content. Calling base.initialize will enumerate through any components /// and initialize them as well. protected override void Initialize() // TODO: Add your initialization logic here base.initialize(); /// LoadContent will be called once per game and is the place to load /// all of your content. protected override void LoadContent() // Create a new SpriteBatch, which can be used to draw textures. spritebatch = new SpriteBatch(GraphicsDevice); // TODO: use this.content to load your game content here /// UnloadContent will be called once per game and is the place to unload /// all content. protected override void UnloadContent() // TODO: Unload any non ContentManager content here /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// <param name="gametime">provides a snapshot of timing values.</param> protected override void Update(GameTime gametime) // TODO: Add your update logic here // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.exit(); base.update(gametime); /// This is called when the game should draw itself. /// <param name="gametime">provides a snapshot of timing values.</param> protected override void Draw(GameTime gametime) GraphicsDevice.Clear(Color.CornflowerBlue); int x = 500; int y = 400; int x2 = 0; int y2 = 0; if (Mouse.GetState().LeftButton == ButtonState.Pressed) x2 = Mouse.GetState().X; y2 = Mouse.GetState().Y; Color vari = Color.Yellow; // tai näin rgb: Color vari = new Color(255,255,0);

ViivanPiirto(x, y, x2, y2, 1, 100, vari); base.draw(gametime); public void ViivanPiirto(int x, int y, int x2, int y2, int paksuus, double tarkkuus, Color vari) //tarkkuus esim. 100 spritebatch.begin(); double i; double x3 = 0; double y3 = 0; tarkkuus = 1 / tarkkuus; Texture2D viiva = new Texture2D(GraphicsDevice, 1, 1, false, SurfaceFormat.Color); Int32[] pixel = 0x0ff0f0f0 ; viiva.setdata<int32>(pixel, 0, viiva.width * viiva.height); if (x!= x2) double k = (double)(y2 - y) / (double)(x2 - x); i = x; if (x2 >= x) while (i < x2) Rectangle nelio = new Rectangle(x + (int)x3, y + (int)y3, paksuus, paksuus); spritebatch.draw(viiva, nelio, vari); i = i + tarkkuus; x3 = x3 + tarkkuus; y3 = k * x3; if (x2 < x) i = x2; while (i < x) Rectangle nelio = new Rectangle(x - (int)x3, y - (int)y3, paksuus, paksuus); spritebatch.draw(viiva, nelio, vari); i = i + tarkkuus; x3 = x3 + tarkkuus; y3 = k * x3; else if (x == x2) if ( y >= y2 ) Rectangle nelio = new Rectangle(x, y2, paksuus, (y + paksuus) - y2); spritebatch.draw(viiva, nelio, vari); if (y < y2)

Rectangle nelio = new Rectangle(x, y, paksuus, (y2 + paksuus) - y); spritebatch.draw(viiva, nelio, vari); spritebatch.end(); Tämä ohjelma piirtää viivan (paksuus, paksuus) kokoisina neliöinä. Kun klikkailet eri puolille näyttöä, ohjelma piirtää viivan alkaen ikkunan keskipisteestä. Sinun on helppo muokata ohjelmasta vaikka sellainen, että voit klikkaamalla antaa sekä alku, että loppupisteet. Yleensähän ne vain annetaan ohjelmassa muuttamalla koodia. Huom. tämä on vain yksi mahdollinen tapa toteuttaa viivan piirto. Esim. vectorien avulla pystyy tekemään korvaavan, mutta tekemäni ratkaisun ei pitäisi olla huono.