Can someone help me with this console app please?
This is a bit complicated to explain, you need to see the program first to see the problem, so here it is:
Code:
#include <iostream>
#include <windows.h>
using namespace std;
#define STAR '%'
#define S_HEIGHT 25
#define S_WIDTH 80
// Global Vars
char Screen[S_WIDTH][S_HEIGHT];
int X, Y;
// Global specific Vars: FPS
int StartingTime;
int Time;
int Fps;
// Global Functions
void EreaseScreen();
bool FPS(int fps);
bool InitVariables();
void PrintScreen();
bool PutCharInScreen();
int FullScreen();
void MoveStar();
int RealX() { return (X + (S_WIDTH / 2)); }
int RealY() { return (Y + (S_HEIGHT / 2)); }
// Cursor
BOOL ShowScreenCursor (BOOL Show)
{
CONSOLE_CURSOR_INFO cci = {0};
BOOL StatusCCI = FALSE;
if (Show) // show screen cursor
{
cci.dwSize = 30;
cci.bVisible = TRUE;
StatusCCI = SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci);
}
else // hide screen cursor
{
cci.dwSize = 100;
cci.bVisible = FALSE;
StatusCCI = SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci);
}
return StatusCCI;
}
// Main
int main()
{
ShowScreenCursor(false);
// Going fullscreen...
FullScreen();
InitVariables();
while (1)
{
if (FPS(Fps)) // Time to move star...
{
StartingTime = GetTickCount();
system("cls");
EreaseScreen();
MoveStar();
if (PutCharInScreen())
PrintScreen();
}
}
return 0;
}
// Global functions definitions
void EreaseScreen()
{
for (int i = 0; i < S_HEIGHT; i++)
for (int j = 0; j < S_WIDTH; j++)
Screen[j][i] = '\0';
}
bool FPS(int fps)
{
Time = GetTickCount() - StartingTime;
if (Time > fps)
return true;
else
return false;
}
bool InitVariables()
{
// Global Vars
X = 0;
Y = -10;
EreaseScreen();
Screen[RealX()][RealY()] = STAR;
// Global specific Vars: FPS
Fps = 500;
StartingTime = GetTickCount();
Time = 0;
return true;
}
void PrintScreen()
{
for (int i = 0; i < S_HEIGHT; i++)
{
for (int j = 0; j < S_WIDTH; j++)
cout << Screen[j][i];
cout << endl;
}
}
bool PutCharInScreen()
{
if (RealX() > S_WIDTH || RealX() < 0)
{
cout << "ERROR" << endl;
return false;
}
if (RealY() > S_HEIGHT || RealY() < 0)
{
cout << "ERROR" << endl;
return false;
}
Screen[RealX()][RealY()] = STAR;
return true;
}
int FullScreen()
{
keybd_event(VK_MENU,0x38,0,0);
keybd_event(VK_RETURN,0x1c,0,0);
keybd_event(VK_RETURN,0x1c,KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU,0x38,KEYEVENTF_KEYUP,0);
return 0;
}
void MoveStar()
{
if (Y <= 0 && X >= 0)
{
X++;
Y++;
}
if (Y >= 0 && X >= 0)
{
X--;
Y++;
}
if (Y >= 0 && X <= 0)
{
X--;
Y--;
}
if (Y <= 0 && X <= 0)
{
X++;
Y--;
}
}
Now, if you run the program, you will see the 'STAR' kinda jumps up and goes down every time it moves, if you get out of full screen you will see that effect gets much bigger, I think the problem is that when the 'STAR' moves, the vertical scrolling bar moves, and goes back to its original position very fast, thus it seems the 'STAR' moves.
Can anyone tell me how to stop the vertical scrolling bar from moving? Thanks in advance and sorry for the long post.
not sure whether ur still checkig the thread but ...
i see what you mean and thr is no way around that im afraid .. er well with ur current coding that is ^^ try this tho.. instead of using seperate subs, erasescreen (which will print then shift up) printstar and printscreen use a combined sub that does it all at once... its alot neater (less subs required) and will work perfectly seeming to have no vscrol jump (just invisible ^^) heres an example:
Code:
void DrawScreen()
{
for (int i = 0; i < S_HEIGHT; i++)
{
for (int j = 0; j < S_WIDTH; j++)
{
if(j==RealX() && i==RealY())
{
Screen[j][i] = STAR; //star sub
}
else
{
Screen[j][i] = '\0'; //erase sub
}
cout << Screen[j][i]; //print screen sub
}
}
}
ive tried this implementation with your current coding and it works great.. altho i cant see what ur trying to do with the move star bit... so i tested it with a slight mod.. a bouncing star ^^ hope this helps tho