Witam
Dzisiaj dalej zajmiemy się klasom pole. Od razu otwórzmy plik pole.cpp i wpiszmy poniższy kod
#include "pole.h"
using namespace sf;
Pole::Pole(int w,int h, int mX, int mY, bool sp,bool st,bool i)
{
//przypisanie podstawowych zmiennych
width=w;
height=h;
marginX=mX;
marginY=mY;
marginX=mX;
marginY=mY;
ship=sp;
shot=st;
IA=i;
//rysowanie pustego pola
shape.setSize(Vector2f(size_,size_));
shape.setFillColor(Color(0,128,255));
shape.setOutlineThickness(1);
shape.setOutlineColor(Color::Black);
shape.setPosition(marginX+width*(size_+1),marginY+height*(size_+1));
}
Pole::~Pole()
{
}
void Pole::setPosition(int x,int y,int mx,int my)
{
//Zmiana pozycji pola
width=x;
height=y;
marginX=mx;
marginY=my;
shape.setPosition(marginX+width*(size_+1),marginY+height*(size_+1));
}
bool Pole::getShip()
{
//zwracanie wartości ship
return ship;
}
bool Pole::getShot()
{
//zwracanie wartości shoy
return shot;
}
void Pole::update()
{
if(shot&&ship) //sprawdzenie czy nie zestrzelono statku i wywołanie funkcji wyświetlających graficzny odpowiednik
{
drawShip();
drawHit();
}
else if(ship==true&&IA==false) //sprawdzenie czy gracz nie zaznaczył na danym polu swojego statku i wyświetlenie odpowiedniej informacji
drawShip();
else if(shot==true) //sprawdzenie czy gracz nie spudłował naciskając dane pole i wyświetlenie informacji
drawShot();
}
void Pole::draw(sf::RenderTarget &target, sf::RenderStates states)const //funkcja umożliwiająca rysowanie i transformowanie obiektu
{
states.transform *= getTransform();
//narysowanie wszystkich obiektów które chcemy narysować rysując obiekt naszej klasy
target.draw(shape);
target.draw(circle);
target.draw(cross[0]);
target.draw(cross[1]);
}
void Pole::drawShip() //funkcja odpowiada za narysowanie naszego statku
{
circle.setRadius(size_/4);
circle.setOrigin(size_/4,size_/4);
circle.setPosition(marginX+size_/2+width*(size_+1),marginY+size_/2+height*(size_+1));
circle.setOutlineThickness(size_/8);
circle.setOutlineColor(Color::Red);
circle.setFillColor(Color(0,128,255));
}
void Pole::drawShot() //funkcja odpowiada za narysowanie niecelnego strzału
{
for(int i=0;i<2;i++)
{
cross[i].setSize(Vector2f(5,size_));
cross[i].setOrigin(3,size_/2);
cross[i].setFillColor(Color::Red);
cross[i].setPosition(marginX+size_/2+width*(size_+1),marginY+size_/2+height*(size_+1));
}
cross[0].setRotation(45);
cross[1].setRotation(135);
}
void Pole::drawHit() //funkcja odpowiada za narysowanie naszego trafienia
{
circle.setFillColor(Color::Red);
}
void Pole::setShot(bool s) //funkcja ustawia wartość shot
{
shot=s;
}
void Pole::setShip(bool s) //funkcja ustawia wartość shot
{
ship=s;
}
bool Pole::getBounds(Vector2f &m) //funkcja zwraca prawdę jeżeli mysz znajduje się w obrębie pola
{
return shape.getGlobalBounds().contains(m);
}
void Pole::setIA(bool i) //funkcja ustawia wartość IA
{
IA=i;
}
Teraz w funkcji main stworzymy zwykłe okno z podstawową mechaniką
#include"pole.h"
int main()
{
Pole p(0,0,20,20); //tworzymy obiekt klasy Pole
p.setShip(1);
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window"); //tworzymy okno aplikacji
while (window.isOpen())
{
p.update(); //aktualizujemy informacje na temat naszego obiektu
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed) //naciśnięcie przycisku zamknij
window.close();
}
window.clear(sf::Color::White);
window.draw(p); //narysowanie naszego obiektu
window.display();
}
return 1;
}
I wtedy naszym oczom ukarze się widok naszego pola
#include"pole.h"
int main()
{
Pole p(0,0,20,20); //tworzymy obiekt klasy Pole
p.setShip(1);
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window"); //tworzymy okno aplikacji
while (window.isOpen())
{
p.update(); //aktualizujemy informacje na temat naszego obiektu
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed) //naciśnięcie przycisku zamknij
window.close();
}
window.clear(sf::Color::White);
window.draw(p); //narysowanie naszego obiektu
window.display();
}
return 1;
}
I wtedy naszym oczom ukarze się widok naszego pola
Możemy również pobawić się funkcjami setShip(), setShot() aby uzyskać takie efekty:
nasz statek
zbity statek
pudło
(dodatkowo zmieniłem rozmiar pola żeby było lepiej widać)
Podsumowanie
Dziś wreszcie skończyliśmy klasę pole i zobaczyliśmy efekt naszej pracy jednak do ukończenia projektu jeszcze długa droga. Kod całej aplikacji możecie znaleźć na moim profilu github. Jak zwykle zachęcam do zadawania pytań i zgłaszania propozycji w komentarzach.