poniedziałek, 31 października 2016

Kończymy klasę pole

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;
    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

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.

Brak komentarzy:

Prześlij komentarz