Wpis z mikrobloga

#naukaprogramowania
#programowanie
#informatyka
#cpp
Próbuję zrobić dwa punkty poruszające się po mapie w c++. Tak długo jak był tylko jeden wszystko grało i świat był kolorowy. Jak tylko dodałem drugi, czas na ruch wymaga dwóch kliknięć zamiast jednego. Ponadto drugi punkt znika co każde kliknięcie i się pojawia przy kolejnym. Wie ktoś jak zrobić aby działało? Używam mapy w notatniku, w komentarzu dam te kilka znaczków aby sobie skopiować. Tu link do kodu na ideone
https://ideone.com/wSiOPS
  • 15
@randomm13: problem masz w kolejności "algorytmu", że nie oddzielasz logiki pobierania klawiszy, aktualizacji modelu świata oraz rysowania po sobie "razem", a robisz to naprzemiennie przez co masz wrażenie "przemienności" co drugą klatkę.

To jest tzw. "główna pętla gry":
* https://pl.wikipedia.org/wiki/Programowanie_gier#Pętla_gry
* Google :: główna pętla gry
* https://4programmers.net/Forum/Algorytmy/229560-glowna_petla_gry_komputerowej
* http://math.uni.lodz.pl/~radmat/tippgk/Wyklad02.pdf
@patrolez: z tego co widzę to tutaj jest problem opisany do nieco bardziej zaawansowanych problemów tego typu, w sposób który nie jest dla mnie jasny. Co zalecasz aby zrobić z tym moim? Nie mam za bardzo jak to podzielić bo ten moduł sterowania to tak naprawdę cała gra.
@randomm13: zacznij od napisania nowej funkcji main(), w stylu, który jest pokazany w powyższych linkach, napisz prototypy/definicje funkcji (żeby były puste) - w ten sposób uzyskasz poprawny szkielet "głównej pętli gry", a potem spróbuj poprzenosić i zmienić twój kod, aby działał z tak przygotowanym szkieletem "głównej pętli gry".

No i możesz rozważyć wymianę funkcji "getch()" na operację nieblokującą, a ilość FPS ograniczyć przez sleep() lub lepiej przez std::thread::sleep_until.

Google
@randomm13: twoja aplikacja z blokującym getch() robi wrażenie dobrze działającej w momencie jednego getch() na pętlę właśnie przez to, że naśladuje "główną pętlę gry", ale w momencie zrobienia kopiuj wklej dla drugiego gracza uzyskujesz tą nieprzyjemną do opanowania przemienność.

Ewentualnie przerób program tak, aby logika głównej pętli gry wymieniała "gracza" (kolejny gracz używa tego samego sterowania, ale steruje innym znacznikiem), który ma mieć kontrolę co "główną pętlę gry" i wtedy getch()
@patrolez: > Ewentualnie przerób program tak, aby logika głównej pętli gry wymieniała "gracza"
Mógłbyś podać przykład takiej funkcji? Nie jestem w stanie stworzyć czegoś takiego sam w głowie aby było użyteczne.

No i możesz rozważyć wymianę funkcji "getch()" na operację nieblokującą, a ilość FPS ograniczyć przez sleep() lub lepiej przez std::thread::sleep_until

Jeśli wymienię po prostu na sleep until funkcję getch to powinno zadziałać? Na ile powinienem ustawić sleep aby to miało
@randomm13: napiszę jeszcze inaczej jakie masz możliwości:

1. gdy gra turowa typu "hot-seat":
* główna pętla gry może mieć nadal getch()
* kolejni gracze zmieniają się co iterację głównej pętli gry
* każdy gracz używa tego samego sterowania, a logika aplikacji wybiera następnego gracza - w następnej pętli
* nie musisz mieć żadnego sleep, bo operacja getch() blokuje pętlę i oczekuje na przycisk z klawiatury

2. gdy gra real-time z
@patrolez: Moim oryginalnym planem jest stworzenie upośledzonej wersji gry achtung die curve. Udało mi się napisać już węża, na tym kodzie co podałem próbuję po prostu stworzyć drugiego gracza, a potem użyć tego na tym programie z wężem. Jedyną opcją jest real time. Niestety, kiedy zamieniam getch na sleep, wyskakuje mi ten błąd.
@randomm13: funkcje getch() oraz sleep() to nie są funkcje, które robią to samo.
getch() oczekuje na przycisk z klawiatury, sleep() usypia program na czas określony w parametrze wywołania.

Musisz poszukać rozwiązania przez takie zapytanie: Google :: non-blocking "getch", czyli na co można wymienić getch(), aby pętla gry się nie blokowała, ale żeby uzyskać w programie informację o wciśniętym klawiszu.
@patrolez: Ok od 2h próbuję zrobić aby działało to z tego linku https://stackoverflow.com/questions/11472043/non-blocking-getch/11472140 . Efekt za każdym razem jest inny, próbowałem chyba wszystkiego, jestem już na etapie przenoszenia zmiennych powyżej maina, nic nie daje rezultatu. Posiedzę pewnie jakoś do rana i jak mi się uda to poinformuję aby nikt się nie kłopotał z odpowiadaniem
randomm13 - @patrolez: Ok od 2h próbuję zrobić aby działało to z tego linku https://s...

źródło: comment_1589150783vTv4FWujcEnmvcVlCwMum1.jpg

Pobierz
@randomm13: teraz dostrzegłem, że masz problem z zagadnieniem "czym jest funkcja?" - w sumie bez tego obrazka ciężko to było zidentyfikować :P

Moje propozycje dla ciebie do poczytania i praktyki/ćwiczenia/eksperymentowania:
1) https://pl.wikibooks.org/wiki/C/Funkcje <- najlepsza wg mnie pozycja
2) http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-pierwsze-starcie/291 <- dopełnienie informacji z 1)
3) http://shebang.pl/kursy/programowanie-cpp/r7-funkcje/ <- ostateczna ewentualność
@patrolez: robię po prostu to co każe mi konsola. Płakało, że nie jest zadeklarowane, to zadeklarowałem. Nie podobała jej się konstrukcja, to przekonstruowałem. To, że to wygląda jakby ktoś to losowo złożył ze sobą, nie jest moją winą, tylko obrazem bezsilności. Jeśli to ma zastąpić getch() to dlaczego nie da się tego zastosować w ten ani żaden inny sposób którego żądał compiler?