Skip to content

Monogame del 4, [Ladda texturer från disk]

Välkommen till del 4.
Det finns mycket att skriva om vad det gäller texturer och hur dom fungerar och vad dom används till. Texturer har en uppsjö olika användningsområden varav ett är att presentera en bild på skärmen. Texturen eller "bilden" är egentligen en buffer eller en blobba minne bestående av en eller fler pixlar. Vi kan säga att det är en lång array av pixlar. Arrayens längd eller minnets storlek är lika med bilden bredd * höjd. Så är bilden 100 pixlar bred och 100 pixlar hög så kommer arrayen ha en längd på 10000 element. Vardera element i arrayen kan variera, men så länge så säger vi att vardera elemten är av typen Color. Så ska tar vi och expanderar det i ett eget avsnitt om bara färger. Men jag vill komma lite längre i den här serien först.

Nu tar vi och börjar om dagens ämne. att ladda texturer från fil från disk.

Innan vi börjar så behöver vi ha en bild att ladda, lämpligen av formatet .png men .bmp och .jpg fungerar också bra för dagens ändamål. Men .png är filformatet vi kommer använda oss av framöver. Jag bjuder på en bild här om du inte kan hitta något eller rita en egen bild just nu.


Spara filen i samma mapp som din exe fil ligger, som i mitt fall är det i följande mapp,
C:\Users\...\source\repos\GameTutorial\GameTutorial\bin\Windows\AnyCPU\Debug\
Det kan såklart skilja sig ifrån hur det ser ut hos dig, men den sista delen efter GameTutorial\ borde inte skilja sig.

Där sparar vi filen och sedan börjar vi skriva lite kod.

Först så deklarerar vi en variabel högst upp i våran klass så här:
  1.  
  2.         Texture2D enBild;
  3.  


Sen tänkte jag att vi skulle öppna upp en ny funktion som Monogame anropar efter Initialize(). Som ni kanske mins från tidigare inlägg så anropas sedan LoadContent() och det är i den funktionen Monogame vill att vi ska ladda in saker till vårat program. Så vi lägger till den funktionen i vårat program

  1.  
  2.         protected override void LoadContent()
  3.         {
  4.             base.LoadContent();
  5.         }
  6.  


Och med följande kod så laddar vi in bilden som en textur och sparar den i våran textur variabel som vi döpte till enBild.

  1.  
  2.             try
  3.             {
  4.                 using (FileStream fs = new FileStream("bild.png", FileMode.Open))
  5.                 {
  6.                     enBild = Texture2D.FromStream(GraphicsDevice, fs);
  7.                 }
  8.             }
  9.             catch (FileNotFoundException e)
  10.             {
  11.                 throw e;
  12.             }
  13.  


Snabbt förklarat vad varje del i koden gör så kopslar vi in koden i ett "try" block ifall någonting går snett så bakar koden ut ur try blocket och kastar en exception på vad som gick fel.
sedan använder vi oss av ett using statement på filströmmen så vi är säkra på att filströmmen kommer stängas när vi har laddat klart filen eller om något går fel. här anger vi ockås vad filen heter och i vilken mapp den ligger. Nu är ingen mapp anged och då antas filen ligga i samma mapp som den körbara filen. "exe filen".

Inga konstigheter hoppas jag. Det här är ingen kors i C#, utan mer ett utforskande och förklarande av monogame. Så är det oklarheter angånde koden så får ni fråga så ska jag förklara eller kanske ännu bättre googla på det så kommer du säkerligen finna svar snabbare.

Nu är vi iallfall redo att rita bilden och det gör vi på samma sätt som vi gjort tidigare i Draw() mellan spritebatch.begin() och end()...


  1.  
  2.         protected override void Draw(GameTime gameTime)
  3.         {
  4.             GraphicsDevice.Clear(Color.Black);
  5.             spriteBatch.Begin();
  6.            
  7.             spriteBatch.Draw(enBild, new Vector2(100,100), Color.White);
  8.  
  9.             spriteBatch.End();
  10.  
  11.             base.Draw(gameTime);
  12.         }
  13.  



Om allt är i sin ordning så borde ni få upp ett fönster som ser ut så här.

Jag lämnar lite kodsnuttar som ni kan testa och fundera över som vanligt. Tack för den här gången...

  1.  
  2.             spriteBatch.Draw(enBild, new Rectangle(100, 100, 50, 50), Color.White);
  3.  


  1.  
  2.             spriteBatch.Draw(enBild, new Vector2(0, 0), Color.Gray);
  3.  


  1.  
  2.             spriteBatch.Draw(enBild, new Rectangle(100, 100, 50, 50), Color.Yellow);
  3.             spriteBatch.Draw(enBild, new Rectangle(200, 100, 50, 50), Color.Red);
  4.             spriteBatch.Draw(enBild, new Rectangle(100, 200, 50, 50), Color.Green);
  5.             spriteBatch.Draw(enBild, new Rectangle(200, 200, 50, 50), Color.Blue);
  6.  


  1.  
  2.             spriteBatch.Draw(enBild, GraphicsDevice.Viewport.Bounds, Color.White);
  3.  

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

Add Comment

You can use [geshi lang=lang_name [,ln={y|n}]][/geshi] tags to embed source code snippets.
Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options