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

Lagi podczas poruszania się w konsoli

Object Storage Arubacloud
0 głosów
247 wizyt
pytanie zadane 29 września 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
if (lvl==1){for(int y=0;y<10;y++){cout << Map[y] <<endl;}}
        if (lvl==2){for(int y=9;y<20;y++){cout << Map[y] <<endl;}}
        cout <<"HP: "<< hp << "/100" << " Ammo: "<< ammo<< "/100" << " Keys: " <<klucz<<endl;
        for (int y = 0; y < 21; y++)
		{
			for (int x = 0; x < 21; x++)
			{
				switch (Map[y][x]) //sterowanie i kolizje ponizej \/
				{
                case '#':Map[y][x] = 219;
				case 'O':
				{
					if (GetAsyncKeyState(VK_UP) != 0)
					{
						int y2 = (y - 1);
						switch (Map[y2][x])
						{
							case ' ':
							{
								Map[y][x] = ' ';
								y -= 1;
								Map[y2][x] = 'O';
							}break;
                            case 'k':{klucz++;Map[y][x] = ' ';y -= 1;Map[y2][x] = 'O'; }kolizja_k();break; case '|': kolizja_kk();break;
						}
					}
					if (GetAsyncKeyState(VK_DOWN) != 0)
					{
						int y2 = (y + 1);
						switch (Map[y2][x])
						{
						case ' ':
						{
							Map[y][x] = ' ';
							y += 1;
							Map[y2][x] = 'O';
						}break;
						case 'k': {klucz++;Map[y][x] = ' ';y += 1;Map[y2][x] = 'O'; }kolizja_k();break; case '|': kolizja_kk();break;
						}
					}
					if (GetAsyncKeyState(VK_LEFT) != 0)
					{
						int x2 = (x - 1);
						switch (Map[y][x2])
						{
						case ' ':
						{
							Map[y][x] = ' ';
							x -= 1;
							Map[y][x2] = 'O';
						}break;
						case 'k':{klucz++;Map[y][x] = ' ';x -= 1;Map[y][x2] = 'O';}kolizja_k();break; case '|': kolizja_kk();break;
						}
					}if (GetAsyncKeyState(VK_RIGHT) != 0)
					{
						int x2 = (x + 1);
						switch (Map[y][x2])
						{
						case ' ':
						{
							Map[y][x] = ' ';
							x += 1;
							Map[y][x2] = 'O';
						}break;
						case 'k':{klucz++;Map[y][x] = ' ';x += 1;Map[y][x2] = 'O';}kolizja_k();break; case '|': kolizja_kk();break;
						}
					}

				}break;

				}
			}
		}
		Sleep(gamespeed);

Dodam tyko, że kod powyżej jest zamknięty w pętli "for".

Problem jest z poruszaniem, mianowicie zacina. Gdy raz nacisnę klawisz, postać (O) przeskakuje czasami o 2 miejsca. 

Zmienna char Map przechowuje wszystkie pod-poziomy danego poziomu. Zastosowałem to z przyczyn praktycznych - inaczej dla kazdego z pod-poziomow musialbym kopiowac caly skrypt poruszania :/.

1 odpowiedź

+1 głos
odpowiedź 29 września 2015 przez Rogargol Pasjonat (16,600 p.)
wybrane 29 września 2015 przez C☺ndzi
 
Najlepsza
Jakbys dal caly kod, to moglbym sobie to skompilowac i sprawdzic co i jak, bo tak troche trudno mi "sie wczuc"
komentarz 29 września 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)

A w co tu sie wczuwac? :P 
 

void game()
{
    system("cls");
    //level1start();
    char Map[21][11] =
        {
        "##########",
        "#        |",
        "#     ####",
        "#        #",
        "#        #",
        "#        #",
        "#        #",
        "#       L#",
        "#O     k #",
        "##########",
          "O        #",
        "####     #",
        "#        #",
        "#        #",
        "#        #",
        "#        #",
        "#       L#",
        "##########"

        };
    for (;stopgame==false;)
    { system("cls");

        if (lvl==1){for(int y=0;y<10;y++){cout << Map[y] <<endl;}}
        if (lvl==2){for(int y=9;y<20;y++){cout << Map[y] <<endl;}}
        //cout <<"HP: "<< hp << "/100" << " Ammo: "<< ammo<< "/100" << " Keys: " <<klucz<<endl;
        for (int y = 0; y < 21; y++)
		{
			for (int x = 0; x < 21; x++)
			{
				switch (Map[y][x]) //sterowanie i kolizje ponizej \/
				{
                case '#':Map[y][x] = 219;
				case 'O':
				{
					if (GetAsyncKeyState(VK_UP) != 0)
					{
						int y2 = (y - 1);
						switch (Map[y2][x])
						{
							case ' ':
							{
								Map[y][x] = ' ';
								y -= 1;
								Map[y2][x] = 'O';
							}break;
                            //case 'k':{klucz++;Map[y][x] = ' ';y -= 1;Map[y2][x] = 'O'; }kolizja_k();break; case '|': kolizja_kk();break;
						}
					}
					if (GetAsyncKeyState(VK_DOWN) != 0)
					{
						int y2 = (y + 1);
						switch (Map[y2][x])
						{
						case ' ':
						{
							Map[y][x] = ' ';
							y += 1;
							Map[y2][x] = 'O';
						}break;
						//case 'k': {klucz++;Map[y][x] = ' ';y += 1;Map[y2][x] = 'O'; }kolizja_k();break; case '|': kolizja_kk();break;
						}
					}
					if (GetAsyncKeyState(VK_LEFT) != 0)
					{
						int x2 = (x - 1);
						switch (Map[y][x2])
						{
						case ' ':
						{
							Map[y][x] = ' ';
							x -= 1;
							Map[y][x2] = 'O';
						}break;
						//case 'k':{klucz++;Map[y][x] = ' ';x -= 1;Map[y][x2] = 'O';}kolizja_k();break; case '|': kolizja_kk();break;
						}
					}if (GetAsyncKeyState(VK_RIGHT) != 0)
					{
						int x2 = (x + 1);
						switch (Map[y][x2])
						{
						case ' ':
						{
							Map[y][x] = ' ';
							x += 1;
							Map[y][x2] = 'O';
						}break;
						//case 'k':{klucz++;Map[y][x] = ' ';x += 1;Map[y][x2] = 'O';}kolizja_k();break; case '|': kolizja_kk();break;
						}
					}

				}break;

				}
			}
		}
		Sleep(160);
    }
}

 

komentarz 29 września 2015 przez Rogargol Pasjonat (16,600 p.)
Dziwnie to rozwiazales.

Wydaje mi sie, ze problem polega na tym (o ile dobrze zrozumialem jaki mchanizm chciales zastosowac), ze w momencie jak np masz O na pozycji 10,10 i nacisniesz klawisz w dol, to O przestawia sie na pozycje 11,10 a Twoja petla sprawdzajaca leci przez nastepne pola i dochodzac do 11,10 znowu widzi ze jest O, a nie jestes w stanie puscic klawisza tak szybko, wiec nadal klawisz w dol jest wcisniety i kolejny raz przesunie O w dol.

Moim zdaniem powinienes przechowywac pozycje tego "ludzika" w innych zmiennych i nakladac go na plansze i pozniej nim bezposrednio sterowac. To chyba najbardziej intuicyjne rozwiazanie w takich prostych gierkach.
komentarz 29 września 2015 przez Rogargol Pasjonat (16,600 p.)

Jesli upierasz sie jednak przy takim rozwiazaniu to zastosuj zmienna pomocnicza i np przed tymi forami sprawdzajacymi plansze zrob:

char klawisz;
if(kbhit())
   klawisz=getch();

pozniej sprawdzaj sobie zawartosc zmiennej klawisz, a jak sie okaze ze np jest wcisniety klawisz w dol, to zeruj zawartosc zmiennej od razu, zeby przy nastepnej kolejce petla juz nie widziala klawisza jako wcisniety. Rozumiesz?

komentarz 29 września 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)

Troche zejde z tematu, ale ten kod odpowiedzialny za poruszanie jest troche malo przejrzysty i w dodatku skopiowany z neta, probowalem cos robic same ale nie dzialalo. Gdybys mogl rzucic okiem na ten kod i powiedziec, dlaczego nie dziala?
Program ktory mial go uzywac dawno usunalem, ale wygladal +- tak:

poruszanie=getch();
switch (poruszanie)
{
case (nr ascii odpowiedzialny za dana strzalke): 
{skrypt poruszania}

case ....
}

komentarz 29 września 2015 przez Rogargol Pasjonat (16,600 p.)
No schemat jest dobry, tylko bez uzycia funkcji kbhit() tak jak to podalem wyzej, program bedzie sie zatrzymywal czekajac na nacisniecie klawisza, wiec np nic nie bedzie sie moglo poruszac po planszy do czasu jak nie nacisniesz klawisza.

Nie wiem za bardzo jak sie odniesc do tego co teraz wstawiles, bo to standardowy zamysl i nie wiem co Ci w takim zalozeniu nie dzialalo.
komentarz 29 września 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
Ale ze mnie cymbał, kilka dni kombinowalem nad sterowaniem (tym moim) a ja kuźwa nie dałem nawiasów...

A co do tego if (kbhit) to nie rozumiem jak to działa. Masz może jakiś przykład programu?
komentarz 29 września 2015 przez Rogargol Pasjonat (16,600 p.)
kbhit() zwraca wartosc true w momencie jesli nacisniety jest klawisz, wiec jesli wstawisz to w ifa, to instrukcje w if wykonaja sie tylko jesli jest wcisniety klawisz.

Funkcja getch() czeka na nacisniecie klawisza i zwraca jego kod. Jesli wstawisz ja sama, np w srodku petli to program zatrzyma sie i bedzie czekal na to, az ktos wdusi klawisz. A petla juz nie bedzie dalej dzialac. Nie bedziesz mogl np w miedzyczasie czegos wyswietlac, poruszac itp. Jesli natomiast zrobisz tak jak dalem Ci przyklad, to getch() bedzie uruchamiane tylko jesli kbhit pokaze ze klawisz jest wduszony, a jesli nie, to program po prostu bedzie szedl dalej. Mam nadzieje ze jakos to wytlumaczylem :P

PS w Twoim przypadku moze sie okazac ze nie potrzebujesz tak kombinowac i wystarczy Ci samo getch(), ale jak chcialbys zrobic np weża to juz bedzie konieczne uzycie czegos takiego.
komentarz 29 września 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
Dzięki wielkie z tym kbhit(), ale nie wiem jak nakładać tego ludzika na tablicę.
komentarz 29 września 2015 przez Rogargol Pasjonat (16,600 p.)
Nie nakladaj na tablice. Po prostu wyrysowuj go w odpowiednim miejscu. Poszperaj za funkcja gotoxy ktora pozwoli Ci ustawic kursor na odpowiednim miejscu ekranu. A tablice bedziesz sprawdzal pod katem tego co na niej sie znajduje w miejscu gdzie jest ludzik.

Podobne pytania

+1 głos
6 odpowiedzi 2,255 wizyt
pytanie zadane 19 marca 2016 w Nasze projekty przez TheFeniks Gaduła (4,690 p.)
+4 głosów
5 odpowiedzi 7,734 wizyt
pytanie zadane 9 lipca 2015 w C i C++ przez amb00 Bywalec (2,000 p.)
0 głosów
4 odpowiedzi 552 wizyt
pytanie zadane 16 października 2015 w C i C++ przez Linker Bywalec (2,690 p.)

92,555 zapytań

141,403 odpowiedzi

319,555 komentarzy

61,940 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!

...