witam,
jestem w trakcie pisania prostego roguelika'a i napotkałem problem. wiadomo że chciałoby się zobaczyć co nasza postać zebrała w czasie wędrówek po labiryntach i tu zaczyna się mój problem. na początku wyświetlałem zawartość ekwipunku na ekranie obok planszy za pomocą gotoxy ale kiedy postać schodzi niżej i plansza się przesuwa zapis ucieka z ekranu. chciałbym zbudować coś na zasadzie nieruchomego bloku który byłby widoczny zawsze w w tym samym miejscu ekranu bez względu na pozycję planszy ewentualnie wywoływać jakimś klawiszem nowy ekran gdzie będzie można obejrzeć zasoby i wrócić do poprzedniego (oczywiście z uwzględnieniem progresu w grze:)). bardzo proszę o pomoc i wskazówki.
Umieszczam kod gdybym coś niejasno wytłumaczył:
//#include "stdafx"
#include "windows.h"
#include "iostream.h"
#include "conio.h"
#include "process.h"
//----------------------------------------------------------------
#define MAX_X 20
#define MAX_Y 37
char PlayerASCII = 0x01; // ASCII Man
char DuckASCII = 0x44; // ASCII Duck
char VerticalWallASCII = 0xBA; // Vertical wall piece
char HorizontalWallASCII = 0xCD; // Horizontal wall piece
char TopRightCornerASCII = 0xBB; // Top right wall piece
char TopLeftCornerASCII = 0xC9; // Top left wall piece
char BotLeftCornerASCII = 0xC8; // Bottom right wall piece
char BotRightCornerASCII = 0xBC; // Bottom left wall piece
char FloorTileASCII = 0x2E; // Floor tile
//----------------------------------------------------------------
HANDLE DDTxDefaultConsoleHandle=NULL;
void set(void)
{
DDTxDefaultConsoleHandle=GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT tRozmiar={0,0,200,70}; COORD tWymiary={200,71};
SetConsoleWindowInfo(DDTxDefaultConsoleHandle,true ,&tRozmiar);
SetConsoleScreenBufferSize(DDTxDefaultConsoleHandle,tWymiary);
}
void gotoxy(int x, int y) {
HANDLE hConsoleOutput;
COORD dwCursorPosition;
cout.flush();
dwCursorPosition.X = x;
dwCursorPosition.Y = y;
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleOutput,dwCursorPosition);
}
int wherey()
{
CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
return info.dwCursorPosition.Y;
}
class Ludzik{
private:
int energia;
int skarby;
int pos_x;
int pos_y;
public:
Ludzik(int x,int y){
pos_x=x;
pos_y=y;
energia=1;
skarby=0;
}
void SkarbyPlus(){ skarby++; }
void EnergiaPlus(){ energia++; }
void EnergiaMinus(){ energia--; }
void IdzWPrawo(){ pos_x++; }
void IdzWLewo(){ pos_x--; }
void IdzWGore(){ pos_y--; }
void IdzWDol(){ pos_y++; }
int ZwrocEnergie(){return energia;}
int Y(){return pos_y;}
int X(){return pos_x;}
void Info(){
cout<<"Pozycja: ("<<pos_x<<","<<pos_y<<") Skarby:"<<skarby<<" Energia:"<<energia;
}
bool moznaWPrawo(char p[MAX_Y][MAX_X]);
bool moznaWLewo(char p[MAX_Y][MAX_X]);
bool moznaWGore(char p[MAX_Y][MAX_X]);
bool moznaWDol(char p[MAX_Y][MAX_X]);
};
bool Ludzik::moznaWPrawo(char p[MAX_Y][MAX_X]){
if(pos_x+1==MAX_X){
return false;
}
if(p[pos_y][pos_x+1]=='#'){
return false;
}
return true;
}
bool Ludzik::moznaWGore(char p[MAX_Y][MAX_X]){
if(pos_y-1==MAX_Y){
return false;
}
if(p[pos_y-1][pos_x]=='#'){
return false;
}
return true;
}
bool Ludzik::moznaWDol(char p[MAX_Y][MAX_X]){
if(pos_y+1==MAX_Y){
return false;
}
if(p[pos_y+1][pos_x]=='#'){
return false;
}
return true;
}
bool Ludzik::moznaWLewo(char p[MAX_Y][MAX_X]){
if(pos_x-1==MAX_X){
return false;
}
if(p[pos_y][pos_x-1]=='#'){
return false;
}
return true;
}
//----------------------------------------------------------------
void clrscr(){
system("cls");
}
//----------------------------------------------------------------
bool wczytajPlansze(char *nazwaPliku,char *p){
FILE *plik = fopen(nazwaPliku,"r");
if(plik==NULL) return false;
char znaczek;
while(!feof(plik)){
znaczek = fgetc(plik);
if(znaczek!='\n') *(p++) = znaczek;
}
fclose(plik);
return true;
}
//----------------------------------------------------------------
void wyswietlPlansze(char p[MAX_Y][MAX_X],Ludzik *m){
clrscr();
for(int i=0;i<MAX_Y;i++){
for(int j=0;j<MAX_X;j++) printf("%c",p[i][j]);
printf("\n");
}
}
//----------------------------------------------------------------
Ludzik* poszukajLudzika(char p[MAX_Y][MAX_X]){
for(int i=0;i<MAX_Y;i++) for(int j=0;j<MAX_X;j++){
if(p[i][j]=='L'){
Ludzik *stworek = new Ludzik(j,i);
return stworek;
}
}
return NULL;
}
//----------------------------------------------------------------
int main(int argc, char* argv[]){
set();
char mapa[MAX_Y][MAX_X]={{' '}};
Ludzik *mietek;
if(wczytajPlansze("labirynt1.txt",*mapa)==false){
cout<<"Brak pliku z planszą lub uszkodzony plik.";
getch();
return 1;
}
mietek = poszukajLudzika(mapa);
if(mietek==NULL){
cout<<"Wadliwa plansza - brakuje ludzika.";
getch();
return 2;
}
int kierunek;
int i=1;
wyswietlPlansze(mapa,mietek);
while(true){
gotoxy(25,3);
mietek->Info();
gotoxy(mietek->X(),mietek->Y());
//wyswietlPlansze(mapa,mietek);
if(mietek->ZwrocEnergie()<=0){
gotoxy(25,2);
printf("Zginales");
gotoxy(25,3);
printf("Game over !!!");
break;}
kierunek=_getch();
if(kierunek==113) break;
else if(kierunek==111){
wczytajPlansze("labirynt1.txt",*mapa);
mietek = poszukajLudzika(mapa);
}
else if(kierunek==77){
if(mietek->moznaWPrawo(mapa)==true){
mapa[mietek->Y()][mietek->X()]=' ';
mietek->IdzWPrawo();
if(mapa[mietek->Y()][mietek->X()]=='*') mietek->SkarbyPlus();
else if(mapa[mietek->Y()][mietek->X()]=='J') mietek->EnergiaPlus();
// else if(mapa[mietek->Y()][mietek->X()]=='%') mietek->EnergiaMinus();
mapa[mietek->Y()][mietek->X()]='L';
gotoxy(mietek->X()-1,mietek->Y());
cout<<" ";
gotoxy(mietek->X(),mietek->Y());
cout<<"L";
gotoxy(mietek->X()+1,mietek->Y());
}
}
else if(kierunek==75){
if(mietek->moznaWLewo(mapa)==true){
mapa[mietek->Y()][mietek->X()]=' ';
mietek->IdzWLewo();
if(mapa[mietek->Y()][mietek->X()]=='*') mietek->SkarbyPlus();
else if(mapa[mietek->Y()][mietek->X()]=='J') mietek->EnergiaPlus();
else if(mapa[mietek->Y()][mietek->X()]=='%') mietek->EnergiaMinus();
mapa[mietek->Y()][mietek->X()]='L';
gotoxy(mietek->X()+1,mietek->Y());
cout<<" ";
gotoxy(mietek->X(),mietek->Y());
cout<<"L";
gotoxy(mietek->X()-1,mietek->Y());
}
}
else if(kierunek==72){
if(mietek->moznaWGore(mapa)==true){
mapa[mietek->Y()][mietek->X()]=' ';
mietek->IdzWGore();
if(mapa[mietek->Y()][mietek->X()]=='*') mietek->SkarbyPlus();
else if(mapa[mietek->Y()][mietek->X()]=='J') mietek->EnergiaPlus();
else if(mapa[mietek->Y()][mietek->X()]=='%') mietek->EnergiaMinus();
mapa[mietek->Y()][mietek->X()]='L';
gotoxy(mietek->X(),mietek->Y()+1);
cout<<" ";
gotoxy(mietek->X(),mietek->Y());
cout<<"L";
gotoxy(mietek->X(),mietek->Y()-1);
}
}
else if(kierunek==80){
if(mietek->moznaWDol(mapa)==true){
mapa[mietek->Y()][mietek->X()]=' ';
mietek->IdzWDol();
if(mapa[mietek->Y()][mietek->X()]=='*') mietek->SkarbyPlus();
else if(mapa[mietek->Y()][mietek->X()]=='J') mietek->EnergiaPlus();
else if(mapa[mietek->Y()][mietek->X()]=='%') mietek->EnergiaMinus();
//mapa[mietek->Y()][mietek->X()]='L';
gotoxy(mietek->X(),mietek->Y()-1);
cout<<" ";
gotoxy(mietek->X(),mietek->Y());
cout<<"L";
gotoxy(mietek->X(),mietek->Y()+1);
}
}
}
gotoxy(25,4);
printf("Do zobaczenia !!!");
getch();
return 0;
}