• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Kółko i Krzyżyk - zmiana kolejki gracza + dołączenie myszki

0 głosów
358 wizyt
pytanie zadane 28 października 2017 w C i C++ przez Jakub Paściak Nowicjusz (140 p.)
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cmath>
#include <ostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#define RAND_MAX
#include <algorithm>

using namespace std;
using namespace sf;


int main()
{   //pomocne inty/stringi
    string infoend="KONIEC KONIEC KONIEC";

    //dodawanie obiektow
    RenderWindow window(VideoMode(800, 600, 32), "KOLKO I KRZYZYK"); //renderowanie okna
    window.setFramerateLimit(60);

        //nic
    Texture img_nic;
    img_nic.loadFromFile("grafika/nic.png");
    Sprite nic;
    nic.setTexture(img_nic);

        //kolo
    Texture img_kolo;
    img_kolo.loadFromFile("grafika/o.png");
    Sprite kolko;
    kolko.setTexture(img_kolo);

        //krzyzyk
    Texture img_krzyzyk;
    img_krzyzyk.loadFromFile("grafika/x.png");
    Sprite krzyzyk;
    krzyzyk.setTexture(img_krzyzyk);

        //budowanie mapy

    int mapa[3][3]
    {
        {1, 1, 1},
        {1, 1, 1},
        {1, 1, 1}
    }
    
       while (window.isOpen())// otworzenie okba
    {
        Event event;//zdarzenie - wylacznie okna
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }

        //kolejka
        int kolejka=2;

        if( Keyboard::isKeyPressed( Keyboard::V ) )
        {
            kolejka=3;
        }

        //RUCHY // I tu zamiast klawiszy chciałbym zrobic zdarzenie z myszką

        if( Keyboard::isKeyPressed( Keyboard::Q ) )
        {
            mapa[0][0]=kolejka;
        }

        if( Keyboard::isKeyPressed( Keyboard::W ) )
        {
            mapa[0][1]=kolejka;
        }

        if( Keyboard::isKeyPressed( Keyboard::E ) )
        {
            mapa[0][2]=kolejka;
        }

        if( Keyboard::isKeyPressed( Keyboard::A ) )
        {
            mapa[1][0]=kolejka;
        }

        if( Keyboard::isKeyPressed( Keyboard::S ) )
        {
            mapa[1][1]=kolejka;
        }

        if( Keyboard::isKeyPressed( Keyboard::D ) )
        {
            mapa[1][2]=kolejka;
        }

        if( Keyboard::isKeyPressed( Keyboard::Z ) )
        {
            mapa[2][0]=kolejka;
        }

        if( Keyboard::isKeyPressed( Keyboard::X ) )
        {
            mapa[2][1]=kolejka;
        }

        if( Keyboard::isKeyPressed( Keyboard::C ) )
        {
            mapa[2][2]=kolejka;
        }
//ify wygranej
    //na ukos
        if(mapa[0][0]==kolejka && mapa[1][1]==kolejka && mapa[2][2]==kolejka)
        {
               cout<< infoend;
               break;
        }

        if(mapa[0][2]==kolejka && mapa[1][1]==kolejka && mapa[2][0]==kolejka)
        {
               cout<< infoend;
               break;
        }
    //pionowo

        if(mapa[0][0]==kolejka && mapa[0][1]==kolejka && mapa[0][2]==kolejka)
        {
               cout<< infoend;
               break;
        }
        if(mapa[1][0]==kolejka && mapa[1][1]==kolejka && mapa[1][2]==kolejka)
        {
               cout<< infoend;
               break;
        }
        if(mapa[2][0]==kolejka && mapa[2][1]==kolejka && mapa[2][2]==kolejka)
        {
               cout<< infoend;
               break;
        }
    //poziomo
            if(mapa[0][0]==kolejka && mapa[1][0]==kolejka && mapa[2][0]==kolejka)
        {
               cout<< infoend;
               break;
        }
            if(mapa[0][1]==kolejka && mapa[1][1]==kolejka && mapa[2][1]==kolejka)
        {
               cout<< infoend;
               break;
        }
            if(mapa[0][2]==kolejka && mapa[1][2]==kolejka && mapa[2][2]==kolejka)
        {
               cout<< infoend;
               break;
        }

        window.clear();
            //renderowanie mapy
        for(int y=0; y<3; y++){
            for(int x=0; x<3; x++){

            if(mapa[y][x]==1) // rederowanie 'nic'
                {
                    nic.setPosition(x*64+10,y*64+10);
                    window.draw(nic);
                }
            if(mapa[y][x]==2) // renderowanie 'O'
                {
                    kolko.setPosition(x*64+10,y*64+10);
                    window.draw(kolko);
                }
            if(mapa[y][x]==3) // renderoanie 'X'
                {
                    krzyzyk.setPosition(x*64+10,y*64+10);
                    window.draw(krzyzyk);
                }
            } //koniec renderoanie mapy

        } //koniec okna

        window.display();

    }
}


A więc tak. Zacznę od tego, że nie wiem jak zrobić aby po kolejce gracza 'O' zmieniała się na gracza 'X'.  Testowo zrobiłem to w taki sposób, że przytrzymując klawisz 'V' zmienia się kolejka z gracza 'O' na 'X'.

Innym moim problem jest brak obsługi myszki. I tu pytanie jak mogę 'wykryć' kliknięcie na danym polu...

Jest ktoś kto może mi poradzić? :)

* tak wiem, że kod jest jaki jest ale się staram.

 

komentarz 28 października 2017 przez Eryk Andrzejewski Mędrzec (157,040 p.)

Co do myszki to odsyłam do dokumentacji SFML lub tego: https://forum.pasja-informatyki.pl/297916/c-kolko-i-krzyzyk-zmiana-kolejki-gracza-dolaczenie-myszki

A resztę może jutro przejrzę i spróbuję coś podpowiedzieć. smiley

2
komentarz 29 października 2017 przez Jakub Paściak Nowicjusz (140 p.)

Dałeś link do tego tematu. smiley  W dokumentacji szukałem ale i tak nie mogłem znaleźć rozwiązania mojego problemu :/

 

komentarz 29 października 2017 przez Eryk Andrzejewski Mędrzec (157,040 p.)

Ups, wybacz, późny wieczór zrobił swoje. laugh

Chodziło mi oczywiście o to: http://szymonsiarkiewicz.pl/poradniki/sfml-kurs-podstawowy/klawiatura-mysz-i-joystick/

komentarz 29 października 2017 przez Eryk Andrzejewski Mędrzec (157,040 p.)

Mam nadzieję, że mnie Szymon nie zje za podawanie linka do projektu, który jak dobrze pamiętam sam uznał za przestarzały.

W każdym razie tutaj, w kodzie menu masz wsparcie dla myszki. Zobacz jak działa ten kod: https://github.com/sheadovas/Kurs_SFML/blob/master/Lekcja%203%20cz.1/Game.cpp

Konkretnie mówię o kodzie w stylu:

else if(tekst[0].getGlobalBounds().contains(mouse) &&
event.type == Event::MouseButtonReleased && event.key.code == Mouse::Left)

i tak dalej. wink

komentarz 29 października 2017 przez Jakub Paściak Nowicjusz (140 p.)
Nadal nie wiem jak mogę podłączyć to pod mój kod. Jestem głupi albo głupi.
Jak mogę wykryć kliknięcie da danym Sprajt'cie. Lub w określonej lokalizacji w dwuwymiarowym int'cie.
komentarz 29 października 2017 przez Jakub Paściak Nowicjusz (140 p.)
dodatkowo dodam, ze umiem kozystac z internetu i sam trafilem na te poradniki.. i glownie chodzi o to ze nie umiem polaczyc tego co tam jest z moim kodem.
komentarz 29 października 2017 przez Eryk Andrzejewski Mędrzec (157,040 p.)

Wybacz, ale na forum przewija się... dużo użytkowników i niektórzy (zazwyczaj większość) z Internetu korzystać najwyraźniej nie umieją. Ty umiesz - bardzo mnie to cieszy. smiley

Nie ma co się denerwować. Popatrz:

Vector2f mouse(Mouse::getPosition(window));

Czyli mouse to obiekt klasy sf::Vector2f (możemy w tej klasie przechowywać np. pozycję elementu). Jako konstruktor do tego obiektu jest przekazywane to co zwróci funkcja sf::Mouse::getPosition() z parametrem window.

Jak mówi dokumentacja:

static Vector2i sf::Mouse::getPosition(const Window & relativeTo)

Get the current position of the mouse in window coordinates.

This function returns the current position of the mouse cursor, relative to the given window.

Funkcja ta zwraca więc pozycję kursora myszy względem okna (a nie całego ekranu) - czyli jeśli ustawisz kursor w lewym górnym roku okna, koordynaty będą wynosiły po 0.

Patrzymy dalej:

if(tekst[0].getGlobalBounds().contains(mouse) && event.type == Event::MouseButtonReleased && event.key.code == Mouse::Left)

Element tablicy tekst[0] to obiekt klasy sf::Text. Klasa ta udostępnia metodę getGlobalBounds()

Co mówi dokumentacja w tej sprawie?

Get the global bounding rectangle of the entity.

The returned rectangle is in global coordinates, which means that it takes into account the transformations (translation, rotation, scale, ...) that are applied to the entity. In other words, this function returns the bounds of the text in the global 2D world's coordinate system.

Ta metoda zwraca "granice" elementu w postaci obiektu sf::FloatRect (czyli aliasu na sf::Rect<float>).

Klasa sf::Rect posiada metodę contains(). Co o niej mówi dokumentacja?

Check if a point is inside the rectangle's area.

Czyli ta metoda sprawdza, czy punkt przekazany jako jej parametr (w tym kodzie jest to obiekt klasy sf::Vector2f - mouse, który przechowuje aktualne koordynaty kursora myszki) należy do podanego obszaru. Jeśli należy - zwraca true, jeśli nie - zwraca false.

Zauważ, że klasy sf::Sprite, sf::Shape i tak dalej, podobnie jak klasa sf::Text, również zawierają metodę getGlobalBounds().

Podany przeze mnie wcześniej if sprawdza też, czy lewy przycisk myszy został puszczony.

Czyli po powyższej analizie można dojść do wniosków:

  1. Aktualne koordynaty kursora myszki pobieramy metodą statyczną sf::Mouse::getPosition(), do której jako parametr przekazujemy nasze okno.
  2. Aby otrzymać "prostokąt", na jakim leży nasz obiekt (np. tekst czy sprite), używamy metody getGlobalBounds()
  3. Żeby sprawdzić, czy punkt (nasze koordynaty) leży na jakimś naszym obiekcie (np. napisie, czy spricie), używamy metody contain().

Teraz rozumiesz?

 

 

komentarz 29 października 2017 przez Eryk Andrzejewski Mędrzec (157,040 p.)
edycja 29 października 2017 przez Eryk Andrzejewski

A co do tego, że nie wiesz jak to wstawić w twój kod - musiałbyś jednoznacznie identyfikować każde kółko, każdy krzyżyk i każde... nic.

Dlatego sugeruję Ci utworzyć dwuwymiarową tablicę sprajtów, zamiast tylko po jednym dla każdego z nich. W zagnieżdżonej pętli for mógłbyś sprawdzać, czy oby kursor myszki nie znajduje się aktualnie na obszarze danego sprajta (np. tego z drugiej kolumny i trzeciego wiersza) i jeśli tak, to mógłbyś podjąć jakąś akcję.

Przykładowo:

std::array<std::array<sf::Sprite, 3>, 3> sprites;

// ...

for (int y = 0; y < sprites.size(); ++y)
{
    for (int x = 0; x < sprites[y].size(); ++x)
    {
        if (sprite[x][y].getGlobalBounds().contains(sf::Mouse::getPosition(window)))
        {
             // To oznacza, że użytkownik najechał na sprajta sprite[x][y]
             // Jeśli chcesz to możesz też sprawdzić, czy czasami nie kliknął na niego
        }
    }
}

P.S.

Oczywiście zamiast std::array możesz użyć zwykłej tablicy - jak wolisz.

 

komentarz 29 października 2017 przez Jakub Paściak Nowicjusz (140 p.)
edycja 29 października 2017 przez Jakub Paściak

Jestem na to za głupi.. ale za tydzień, bo tylko na weekendzie mam czas programować.. napiszę od zera całą grę oczywiście biorąc pod uwagę wasze rady. Dzięki wam wink

komentarz 29 października 2017 przez Eryk Andrzejewski Mędrzec (157,040 p.)

Nie jesteś za głupi laugh

Powiedz tylko czego konkretnie nie rozumiesz, może to ja Ci nagmatwałem trochę niepotrzebnie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 137 wizyt
pytanie zadane 30 stycznia 2016 w C i C++ przez Patryk L Obywatel (1,810 p.)
+6 głosów
1 odpowiedź 365 wizyt
pytanie zadane 28 lipca 2018 w Nasze projekty przez C☺ndzi Stary wyjadacz (12,200 p.)
0 głosów
0 odpowiedzi 251 wizyt
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

64,043 zapytań

110,434 odpowiedzi

231,279 komentarzy

47,815 pasjonatów

Przeglądających: 179
Pasjonatów: 2 Gości: 177

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...