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

Gra wyścigowa C++, SFML

Object Storage Arubacloud
0 głosów
663 wizyt
pytanie zadane 6 września 2017 w C i C++ przez Filip Kowalski Początkujący (260 p.)

Witam, ostatnio zabrałem się za twożenię gry wyścigowej w C++ w bibliotece SFML, jednak mam pewne problemy opisany poniżej
1. Freezowanie się gry po kliknięciu przycisku Play i Settings
w menu głównym, przycisk Exit działa doskonale (pokazane w dołączonym filmiku)
2. Zaprogramowanie kamery tak aby poruszała się za graczem, miałem już pewien koncept ale
występuje w nim błąd opisany w komętarzu w pliku Game.cpp
3. Obsłużenie kolizji z płotkami na torze, mógłbym to zrobić nakładając na każdy element kwadrat ale było by to męczące i niezbyt efektywne szczególnie przy zakrętach czy można by je obsłużyć jakoś prościej np. używając innej biblioteki graficznej jeśli tak to jakiej i jak miałoby to wyglądać
4. Dlaczego Massangebox'y nie wyświetlają się normalnie tylko po języku przypominającym Chiński
Code:
https://code.nastoletni.pl/nu1X8/bd717c19
Pliki potrzebne do uruchomienia gry:
https://drive.google.com/open…
PS. Tak wiem że używanie usingnamespace jest złe

1
komentarz 7 września 2017 przez Knayder Nałogowiec (37,640 p.)

To przeczytaj kod błędu i spróbuj zrozumieć.
Odziedziczona metoda z klasy sf::Transformable jest niedostępna.
Pierwsze co powinno ci się nasunąć na myśl, to fakt że jet prywatna. Sprawdzasz jak dziedziczysz sf::Transformable w swojej klasie i proszę, mamy błąd.
 

class Player : public Drawable, Transformable

Powinno być:
 

class Player : public Drawable, public Transformable

 

komentarz 7 września 2017 przez Filip Kowalski Początkujący (260 p.)
Dzięki błąd już nie występuje, wiem że popełniam bardzo podstawowe błędy a to dlatego że wciąż się uczę. A w sprawie kolizji to czy istnieje funkcja która np. nakłada na obiekt dużo figur dzięki czemu można bardzo dokładnie obsłużyć kolizje?
komentarz 7 września 2017 przez Filip Kowalski Początkujący (260 p.)
Niestety zwykły bounding box tu się nie nada ponieważ płotki na torze wyścigowym chce stworzyć jako jeden obiekt a wtedy byłby to po prostu kwadrat, a nawet gdybym podzielił to na mniejsze części to obsłużenie zakrętów byłoby bardzo trudne i nie efektywne
komentarz 7 września 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
czlowieku, jescze raz przeczytaj dwa linki

2 odpowiedzi

0 głosów
odpowiedź 7 września 2017 przez Knayder Nałogowiec (37,640 p.)
Nie, tylko podstawowe sprawdzanie czy nachodzą na siebie prostokąty.
Musisz sam to napisać, albo użyć jakiegoś silnika, np. Box2D
komentarz 7 września 2017 przez Filip Kowalski Początkujący (260 p.)
Dzięki za naprowadzenie, na pewno Box2D się nada do obsłużenia kolizji itp. mam nadzieje że artykuł z cpp0x i kilka pobocznych pomoże mi wystarczająco zrozumieć ten silnik.
0 głosów
odpowiedź 11 września 2017 przez Filip Kowalski Początkujący (260 p.)
Witam, chciałbym wznowić temat ponieważ po wciśnięciu przyciska Play okno gry mi się freezuje(nie działa żaden Event który utworzyłem a podświetlenie napisu które zastosowałem nawet po odjechaniu myszką po prostu się zawiesza na jednym napisie ). Szukałem rozwiązania w internecie niestety nie znalazłem. Bardzo zależy mi na rozwiązaniu tego problemu ponieważ co to za gra której się nie da uruchomić.

Uaktualniony code: https://code.nastoletni.pl/sBuO7/db91e258
komentarz 11 września 2017 przez Knayder Nałogowiec (37,640 p.)
Ale jak cel ci przyświeca w używaniu tego mutexa O_o
https://pl.wikipedia.org/wiki/Problem_wzajemnego_wykluczania
komentarz 11 września 2017 przez Filip Kowalski Początkujący (260 p.)
Otóż zastosowałem go ponieważ chciałem uzyskać efekt pauzy gry poprzez wykonywanie tylko jednej funkcji (w tym przypadku pause()) wtedy metoda update() ani settings() nie jest wykonywana dzięki temu gra się nie aktualizuje ani nie można sterować graczem, w std z tego co wiem też istnieje taka funkcja dlatego dodałem osobny namespace do mutexa. Tutaj masz dokumentacje sf::Mutex  https://www.sfml-dev.org/tutorials/2.4/system-thread.php
komentarz 11 września 2017 przez Knayder Nałogowiec (37,640 p.)
Chyba trochę nie kumasz jak to działa.
Mutexa jak zablokujesz, to kiedy inny fragment kodu, w innym wątku dojdzie znowu do metody lock(), to będzie czekał aż nie zostanie odblokowany.
Z jednym wątkiem nie podziałasz.
Musisz to inaczej rozkminić.
komentarz 12 września 2017 przez Filip Kowalski Początkujący (260 p.)

Na pewno tak to działa? Nie wiem jak to w std wygląda ale wiem z dokumentacji sfml, że działa to w ten sposób że metoda następująca po mutex.lock() wykonuje się do tego czasu aż nie zakończy działania wtedy zostanie wywołany mutex.unlock() a wszystko oprócz tej metody się nie wykonuje 

przynajmniej tak jest napisane w dokumentacji sfml 

they protect a piece of code by allowing only certain threads to access it while blocking the others.

https://www.sfml-dev.org/tutorials/2.4/system-thread.php

PS. Zauważyłem że funkcja mutex.lock() jest wstawiona w złym miejscu i uruchamia zaraz po uruchomieniu metody game(). Poprawka: https://code.nastoletni.pl/eprQh/36115bfb

Niestety to nadal nie rozwiązuje problemu :(

komentarz 12 września 2017 przez Knayder Nałogowiec (37,640 p.)
Nie chciałbym być niemiły, ale kompletnie nie ogarniasz co piszesz.
Poczytaj trochę o zasięgu zmiennych.
W każdym przejściu pętli w Game(), tworzysz kompletnie nowy obiekt mutexa oraz innych zdefiniowanych w pętli obiektów.

Podobne pytania

–8 głosów
2 odpowiedzi 283 wizyt
pytanie zadane 27 października 2018 w C i C++ przez xDziku Nowicjusz (160 p.)
0 głosów
1 odpowiedź 244 wizyt
pytanie zadane 28 marca 2018 w Python przez Okto Nowicjusz (120 p.)
0 głosów
1 odpowiedź 223 wizyt
pytanie zadane 27 sierpnia 2017 w C i C++ przez Artur Koniec Gaduła (3,670 p.)

92,556 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...