Programmera spel i C++ för nybörjare/Sprites och spelpjäser 2
Sprites och spelpjäser 2
[redigera]Enkel AI
[redigera]Baserat på VC++ 2010 express, Win 7 och SFML 1.6, du bör ha gjort installationerna för ett fungerande SFML-fönster i ditt projekt innan du börjar.
Om du såg i del 1 hur man gör för att få in en spelare i spelet, är det inte svårt att få in ännu en spelare. Försök att hitta en bild på en pojke och en bild på en ko/tjur, båda 32x32 pixels.
Använd funktionerna för att läsa in grafik från föregående del. När du startar programmet bör du få upp samma vy som förut, men med en person som du kan gå med när du trycker ner tangenterna och en ko som står alldeles stilla. Anta att vi vill kunna ta oss med pojken över spelplanen utan att kon/tjuren kommer ikapp? Då måste vi skapa en enkel AI (artificiell intelligens) så att kon förstår att den skall jaga pojken.
Spelarnas X och Y koordinater
[redigera]För att veta vart kon skall gå måste vi jämföra kons position med personens position. Det finns två funktioner för det. Sprite.GetPosition().x; och Sprite.GetPosition().y; Sprite är namnet på spelpjäsen och den koordinat man får passar in på punkten för det övre vänstra hörnet. Så, om vi kallar personen för Sprite och kofiguren för ko1 kan vi ange variablerna:
float SpriteX=0.0, ko1X = 0.0; //X positioner för pojke och ko float SpriteY=0.0, ko1Y = 0.0; //Y positioner för pojke och ko
Och sedan, i själva spel loopen fyller vi i koden:
SpriteX= Sprite.GetPosition().x; // Pojkens xposition, kan användas som AI ko1X= ko1.GetPosition().x; // kons xposition, kan användas som AI SpriteY= Sprite.GetPosition().y; // Pojkens yposition, kan användas som AI ko1Y= ko1.GetPosition().y; // kons yposition, kan användas som AI if (ko1X <= SpriteX) //pojken har sprungit förbi kon ko1.Move( 50 * ElapsedTime, 0); if (ko1X > SpriteX) //pojken har inte sprungit förbi kon ko1.Move( -50 * ElapsedTime, 0); if (ko1Y > SpriteY ) //kon är nedanför pojken ko1.Move(0, -50 * ElapsedTime); if (ko1Y <= SpriteY ) //kon är ovanför pojken ko1.Move(0, 50 * ElapsedTime);
När personen rör sig över spelplanen följer kon efter i motsatt riktning men med halva hastigheten (den går att ställa in). Om du stannar med personen, kommer kon att hinna ikapp. Vad händer då?
Här är hela den omarbetade koden från moment 1.
#include <iostream> #include <SFML\System.hpp> #include <SFML\Graphics.hpp> #include <SFML\Window.hpp> int main() { //Början av programkörningen float SpriteX=0.0, ko1X = 0.0; //X positioner för pojke och ko float SpriteY=0.0, ko1Y = 0.0; //Y positioner för pojke och ko sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML grafiktest"); // Skapa fönstret vi skall visa färgerna i float ElapsedTime = App.GetFrameTime(); //Skapar en konstant för att hålla hastigheten likvärdig på olika datorer sf::Image Image; //skapa en tom bildhållare som heter Image if (!Image.LoadFromFile("boy.png")) return EXIT_FAILURE; //fyll den tomma bildhållaren med bilden boy.png //bilden är en 32x32 .png jag hittade ute på Internet med en googlesökning sf::Sprite Sprite(Image); //Skapar den grafiska spelpjäsen Sprite med grafiken från Image Sprite.SetPosition(200.f, 100.f); //Placera ut bilden /*Skapa en ko-----------------------------------------------------------------*/ sf::Image kobild; //skapa en tom bildhållare som heter Image if (!kobild.LoadFromFile("cow.png")) return EXIT_FAILURE; //fyll den tomma bildhållaren med bilden boy.png sf::Sprite ko1(kobild); //Skapar den grafiska spelpjäsen Sprite med grafiken från Image ko1.SetPosition(400.f, 100.f); //Placera ut bilden på kon //bilden är en 32x32 .png jag hittade ute på // Internet med en googlesökning kobild.CreateMaskFromColor(sf::Color(192,248,0)); //Min kobild hade en färgruta av den här färgen som jag gör transperent här /* slut på skapa ko */ 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(); } //slut if 1 } //slut, while 2 ElapsedTime = App.GetFrameTime(); //för att få en konstant hastighet på olika datorer if (App.GetInput().IsKeyDown(sf::Key::Left)) Sprite.Move(-100 * ElapsedTime, 0); //pojke //Om man trycker ner vänster piltangent går figuren 100 "steg" // längre åt vänster än vad den var tidigare. if (App.GetInput().IsKeyDown(sf::Key::Right)) Sprite.Move( 100 * ElapsedTime, 0); if (App.GetInput().IsKeyDown(sf::Key::Up)) Sprite.Move(0, -100 * ElapsedTime); if (App.GetInput().IsKeyDown(sf::Key::Down)) Sprite.Move(0, 100 * ElapsedTime); SpriteX= Sprite.GetPosition().x; // Pojkens xposition, kan användas som AI ko1X= ko1.GetPosition().x; // kons xposition, kan användas som AI SpriteY= Sprite.GetPosition().y; // Pojkens yposition, kan användas som AI ko1Y= ko1.GetPosition().y; // kons yposition, kan användas som AI if (ko1X <= SpriteX) //pojken har sprungit förbi kon ko1.Move( 50 * ElapsedTime, 0); if (ko1X > SpriteX) //pojken har inte sprungit förbi kon ko1.Move( -50 * ElapsedTime, 0); if (ko1Y > SpriteY ) //kon är nedanför pojken ko1.Move(0, -50 * ElapsedTime); if (ko1Y <= SpriteY ) //kon är ovanför pojken ko1.Move(0, 50 * ElapsedTime); App.Clear(sf::Color(0, 255, 0)); //rensa allt i fönstret och ersätt med grönfärg App.Draw(Sprite); //Rita upp figuren på den yta spelaren ser App.Draw(ko1); //Rita upp kon på den yta spelaren ser App.Display(); //visa upp ändringarna för användaren } //slut, while 1 return 0; } //slut på programkörningen