witajcie ,ostatnio na forum, zadawałem sporo pytań jak poprawić jakość swojej gry : https://forum.pasja-informatyki.pl/234219/poprawienie-wydajnosci-prostej-konsolowej-gierki-w-c#c234326 . W tamtej grze użyłem dość nietypowego sposobu renderowanie mapy . Teraz jednak stworzyłem prosty prototyp jakiejś tam konsolowej gry , do tego użyłem chyba najbardziej znany i klasyczny sposób generowania mapy i poruszania się . Pod czas użytkownik porusza się obiektem to ekran miga , oczywiście dobrze wiem z czego to wynika (funkcja cls) czyszczenie ekranu wydaje się niezbędne , jednak słyszałem również o tym by zamiast czyścić można ekran nadpisywać wartości zmiennych bądź po prostu czyścić tylko poruszające się obiekty , Jednak nie wiem jak coś takiego zrobić . Będę wdzięczny za wszelkie komentarze mówiące jak przyśpieszyć ten algorytm poruszania się (po prostu by ograniczyć miganie ekranu) Z góry dziękuje :)
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <cstdlib>
using namespace std;
const int map_x = 20; //stale mapy
const int map_y = 20;
int map[20][20];
struct obiects //struktura
{
int x;
int y;
};
void render_map(int map[20][20])
{
for(int i=0; i<map_x; i++)
{
for(int j=0; j<map_y; j++)
{
switch(map[i][j])
{
case 0:{
cout<<'.';
}
break;
case 1:{
cout<<'@';
}
break;
case 2:{
cout<<'M';
}
break;
}
}
cout<<endl;
}
for(int i=0; i<map_x; i++) //zerowanie mapy
{
for(int j=0; j<map_y; j++)
{
map[i][j] = 0;
}
}
}
void obiects_position(int x,int y ,int xx ,int yy) //wysylanie odpowiednich argumentow d render map
{
map[x][y] = 1;
map[xx][yy] = 2;
render_map(map);
}
void win(int x, int y ,int xx ,int yy)
{
if((x==xx)&&(x==yy)&&(y==yy)&&(y==xx)) //kolizja z M
{
system("cls");
cout<<"Brawo !"<<endl;
system("pause");
exit(0);
}
}
void game()
{
obiects player;
player.x = 0;
player.y = 0;
obiects monster;
monster.x = 10;
monster.y = 10;
char z;
obiects_position(player.x, player.y ,monster.x ,monster.y);
while(true)
{
z = getch();
switch(z)
{
case 'w':{
if(player.x==0) player.x=0; //czy gracz nie wyszedl poza mape
else player.x--;
}
break;
case 's':{
if(player.x==19) player.x=19;
else player.x++;
}
break;
case 'a':{
if(player.y==0) player.y=0;
else player.y--;
}
break;
case 'd':{
if(player.y==19) player.y=19;
else player.y++;
}
break;
}
system("cls"); //CZYSZCZENIIEEKRANU
win(player.x,player.y,monster.x,monster.y); //jezeli dotknal M
obiects_position(player.x,player.y,monster.x,monster.y); //generowanie mapy
}
}
int main()
{
game();
return 0;
}