webForumDet fria alternativet

Smilie-spel

1 svar · 284 visningar · startad av RLD

RLDMedlem sedan apr. 20021 inlägg
#1

Jag har börjat programera ett spel där man ska försöka akta sig för fyrkanter. Roligt väll? :o) Du kan testa hur det funkar genom att ladda ned exe filen.

Det finns dock två problem med spelet, det fungerar och så. Det ena är att COORDsen inte uppdateras automatiskt, det andra är att när man klickar på upp eller ned så flyttar smilien två steg..

Hoppas någon kan hjälpa mig..

#include <iostream.h>
#include <stdlib.h>
#include <windows.h>

#define SCREEN_WIDTH  400
#define SCREEN_HEIGHT 15
#define START_X        0
#define START_Y

#define PLAYER 1
#define FYRKANT '#'

void DrawMaze(CHAR_INFO screenBuffer[], int playerX, int playerY,int positionX);
void Delay(DWORD nTimeMs);

bool MovePlayer(CHAR_INFO screenBuffer[], COORD &playerPos);

int main()
{
int position=0;
int positionX=0;
 	CHAR_INFO screenBuffer[SCREEN_WIDTH * SCREEN_HEIGHT] = {0};	
	COORD bufferSize = {SCREEN_WIDTH , SCREEN_HEIGHT};
	COORD playerPos = {START_X, START_Y};

	srand( GetTickCount() );

	for(int y = 0; y < bufferSize.Y; y++)
	{

		for(int x = 0; x < bufferSize.X; x++)
		{
			if(!(rand() % 40))
			{
				screenBuffer[x + y * SCREEN_WIDTH].Char.AsciiChar = FYRKANT;
				screenBuffer[x + y * SCREEN_WIDTH].Attributes = FOREGROUND_BLUE;
			}
		}
	}

    cout << "Get ready\n";
    Delay(400);
    cout << "set\n";
    Delay(400);
    cout << "Go!";
    Delay(400);

  DrawMaze(screenBuffer, playerPos.X+position, playerPos.Y,positionX);
	for(position=0;position<400;position++)
	{
       positionX = position;
       if(screenBuffer[playerPos.X+position + playerPos.Y * SCREEN_WIDTH].Char.AsciiChar == FYRKANT){
           system("cls");
           cout << "You are dead\nPress any key to exit";
           cin.get();
           exit(0);
       }
 		if(MovePlayer(screenBuffer, playerPos))
		{
          DrawMaze(screenBuffer, playerPos.X+position, playerPos.Y,positionX);
        }
   	}
}

void DrawMaze(CHAR_INFO screenBuffer[], int playerX, int playerY,int y)
{

	SMALL_RECT drawRect = {0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1}; 
	COORD bufferSize = {SCREEN_WIDTH , SCREEN_HEIGHT};
	COORD zeroZero = {y,0};
	HANDLE hOutput;
	
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

	screenBuffer[playerX + playerY * SCREEN_WIDTH].Char.AsciiChar = PLAYER;
	screenBuffer[playerX + playerY * SCREEN_WIDTH].Attributes = FOREGROUND_RED;

	WriteConsoleOutput(hOutput, screenBuffer, bufferSize, zeroZero, &drawRect);
}

bool MovePlayer(CHAR_INFO screenBuffer[], COORD &playerPos)
{													
	INPUT_RECORD InputRecord;
	COORD oldPosition = playerPos;
	DWORD Events=0;
	HANDLE hInput;
	bool bPlayerMoved = false;

	hInput = GetStdHandle(STD_INPUT_HANDLE);

	ReadConsoleInput(hInput, &InputRecord, 1, &Events);
													
	if(InputRecord.EventType == KEY_EVENT)
	{
     if(InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_UP)
		{
			if(playerPos.Y > 0)
			{
				playerPos.Y--;
				bPlayerMoved = true;
			}
		}	

		else if(InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_DOWN)
		{							
			if(playerPos.Y < (SCREEN_HEIGHT - 1) )
			{
				playerPos.Y++;
				bPlayerMoved = true;
			}
		}
		else if(InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
		{												

          exit(0);
		}
      return true;
	}	
	
	FlushConsoleInputBuffer(hInput);

	if(bPlayerMoved)
	{
		if(screenBuffer[playerPos.X + playerPos.Y * SCREEN_WIDTH].Char.AsciiChar != FYRKANT)
		{
 			screenBuffer[oldPosition.X + oldPosition.Y * SCREEN_WIDTH].Char.AsciiChar = ' ';
			screenBuffer[oldPosition.X + oldPosition.Y * SCREEN_WIDTH].Attributes = 0;
		}
		return true;
	}

	return false;
}

void Delay(DWORD nTimeMs){
        MSG msg;
        DWORD endTick;
        endTick = GetTickCount() + nTimeMs;
        while(GetTickCount() < endTick)

            {
                 if(PeekMessage(&msg, NULL, 0, 0, TRUE))

                     {
                          TranslateMessage(&msg);
                          DispatchMessage(&msg);
                     }
           }
                return;
   }
Denniz PoPMedlem sedan aug. 2002207 inlägg
#2

Antagligen avänder du Win2k eller WinXP. Det är därför den flyttar 2 steg i taget. Win9x registrerar endast att man har tryckt på en tangent, WinNT registrerar även när man släpper en tangent.

Nu har jag ingen kod så jag kan tyvärr inte säga mera. Dock så skall jag se om jag kan hitta något som tar upp detta.

EDIT: http://www.gametutorials.com/download/C++/Maze_Cpp.zip

Denna länk förklarar lite snabbt vad jag sa.

129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)