Programmera spel i C++ för nybörjare/Text

Från Wikibooks


Originalkoden finns här:

http://www.sfml-dev.org/tutorials/1.6/graphics-fonts.php

Ibland finns det ett behov av att kunna skriva ut text på skärmen. Man kanske vill visa hur många liv man har kvar, hur många poäng man fått eller något liknande. SFML kan hantera enkla texter men om du vill göra mer avancerade beräkningar på bokstäver och texter rekommenderas standardbiblioteket som fås genom att ange #include<string> överst i main.cpp.

Utförlig text[redigera]

Principerna är ungefär som att lägga in bilder. Först skapar man en tom ttf hållare som man sedan fyller med en valfri ttf-typsnittsfil. Det duger inte med att ha dem i systemet, SFML kräver att de ligger så att programmet hittar dem. Endera i include sökvägen eller i samma mapp som main.cpp filen. För Comic Sans MS får du kopiera in filen comic.ttf från Windows Font-mapp och sedan länka in den i koden:

  sf::Font MyFont; //ladda en tom font
   if (!MyFont.LoadFromFile("comic.ttf", 50)) return EXIT_FAILURE; //

Då kommer vi till det som faktiskt skall skrivas ut på skärmen. Man skapar en tom textremsa i minnet och fyller den sedan med den text som skall visas.

sf::String Hello; //skapa en textremsa som heter Hello
Hello.SetText("Hejsan !\nHur mår du? \nÄr allt bra? \nHör du mig?"); 
	//testa å ä och ö

Därefter tilldelas texten rätt typsnitt:

Hello.SetFont(MyFont);

Efter det kan man lägga till mer funktioner:

    Hello.SetColor(sf::Color(0, 128, 128)); //fyll i färgen, ljusblå
    Hello.SetPosition(100.f, 100.f); //placera ut texten 100 pixels ut i x och y led
    Hello.SetRotation(15.f); //rotera texten 15 grader av 360 motsols
    Hello.SetSize(50.f);//ge texten typstorlek 50

Jag vet att det finns två olika värden för typstorlek nu (standard är 30) men om värdena inte stämmer riktigt med varandra kan man skapa fluffiga, mjuka effekter. Du får experimentera litet.

Enkel text[redigera]

Det finns ett annat sätt att lägga ut text på skärmen. Då låter man helt enkelt SFML sköta sig mer eller mindre själv genom att bara ange text och ange standardfont:

sf::String Bonjour("Salut !\nComment ça va ?", sf::Font::GetDefaultFont(), 30.f);

Sedan kan man smycka ut den litet också:

Bonjour.SetColor(sf::Color(200, 128, 0)); //Ge den mörkgul färg
Bonjour.SetPosition(200.f, 300.f); //placera ut den 200 i x-led och 300 i y-led

Man kan behandla en textremsa litet som en bild. Om man vill rotera den kan man t.ex. ange att den skall rotera motsols om R – tangenten trycks ner:

if (Event.Type == sf::Event::KeyPressed) // En tangent har tryckts ner
if (Event.Key.Code == sf::Key::R)
Bonjour.Rotate(App.GetFrameTime() * 100.f); // Rotera den andra textremsan om R trycks ner

När alla ändringar är gjorda får man rita upp texten, precis som man ritar upp sprites:

App.Draw(Hello); //rita ut textremsa ett
App.Draw(Bonjour); //rita ut textremsa två

Svårare än så är det inte att få fram text på skärmen med hjälp av SFML, då är det bra mycket krångligare att få in kod som användaren skrivit till SFML då >>cin saknas.

//Hela koden
#include <iostream>
#include <SFML\System.hpp>
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>

int main() 
  {  //Början av programkörningen


  sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML text"); // Skapa fönstret vi skall visa text i
   sf::Font MyFont; //ladda en tom font
    if (!MyFont.LoadFromFile("comic.ttf", 50)) return EXIT_FAILURE; //Fyll fonthållaren med comic.ttf, storlek 50
	//Den eftersökta ttf filen måste kunna hittas av VC++.

	sf::String Hello; //skapa en textremsa som heter Hello

	Hello.SetText("Hejsan !\nHur mår du? \nÄr allt bra? \nHör du mig?"); 
	//testa å ä och ö

	Hello.SetFont(MyFont); //tilldela textremsan fonten comic.ttf
	//filen comic.ttf måste ligga i samma bibliotek som main.cpp
	//för att texten skall visas, det duger inte med att den finns
	//i windows font mapp.

    Hello.SetColor(sf::Color(0, 128, 128)); //fyll i färgen, ljusblå
    Hello.SetPosition(100.f, 100.f); //placera ut texten 100 pixels ut i x och y led
    Hello.SetRotation(15.f); //rotera texten 15 grader av 360
    Hello.SetSize(50.f);//ge texten typstorlek 50

	//***************************************************************************
	//Du kan även göra som följande exempel
	//***************************************************************************
	sf::String Bonjour("Salut !\nComment ça va ?", sf::Font::GetDefaultFont(), 30.f);
	//skapa en textremsa med standardfont och storlek 30
	Bonjour.SetColor(sf::Color(200, 128, 0)); //Ge den mörkgul färg
       Bonjour.SetPosition(200.f, 300.f); //placera ut den 200 i x-led och 300 i y-led

	//*****************Starta programkörningen***********************************

       while (App.IsOpened())  // Start spel-loopen
      {  //while 1
        sf::Event Event; 

           while (App.GetEvent(Event)) // Ta hand om händelser 
           { //while 2

             if (Event.Type == sf::Event::Closed) //kryssat på [x] symbolen? stäng programmet
             App.Close(); 

     if (Event.Type == sf::Event::KeyPressed) // En tangent har tryckts ner
    { //if 1
   if (Event.Key.Code == sf::Key::Escape) // ESC tangenten = stäng programmet
    App.Close(); 
   if (Event.Key.Code == sf::Key::R)
   Bonjour.Rotate(App.GetFrameTime() * 100.f); // Rotera den andra textremsan om R trycks ner
 } //slut if 1		 

                           } //slut, while 2

                       


               App.Clear(sf::Color(0, 0, 0)); //rensa allt i fönstret och ersätt med svart färg
              App.Draw(Hello); //rita ut textremsa ett
              App.Draw(Bonjour); //rita ut textremsa 2
               App.Display(); //visa upp ändringarna för användaren

} //slut, while 1

return 0;
} //slut på programkörningen

Siffror till text[redigera]

Ofta vill man kunna skriva ut siffror till text på skärmen. Personligen tycker jag att det är bättre om man har små bilder som motsvarar det som skall visas. Hjärtan för liv, patroner för hur många skott man har kvar, en grön linje som växer för att visa tid osv. Vill du trots allt förvandla siffror och tal till text i C++, text du kan skriva ut på skärmen (för det kan du inte med siffror), kan du använda följande funktion. Glöm inte att lägga till string och sstream i början av main:

string Tal2String(double siffrain)
{    //Förvandlar ett tal till text
       //Detta kräver: #include <sstream> och #include <string> 
      // och: using namespace std; 
std::string s;
std::stringstream out;
out << siffrain;
s = out.str();
return s;
}

Koden är anpassad för ett vanligt, svart konsollfönster som man har för vanlig C++, men den är enkel att ändra så att du kan använda siffror som används i spelet istället.