From 08403cbb582480b8be2202874a44a8323ee9df72 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 21 Jan 2019 14:53:06 +0100 Subject: [PATCH] initial commit --- a.out | Bin 0 -> 72088 bytes main.cpp | 290 ++++++++++++++++++++++++++++++++++++++++++++++++ main_backup.cpp | 256 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 546 insertions(+) create mode 100755 a.out create mode 100644 main.cpp create mode 100644 main_backup.cpp diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..2f5166e0523d57a405b48e83840af8ca3d9b65b3 GIT binary patch literal 72088 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace std::chrono; + + +string init(string map){ + map += "################"; + map += "#..............#"; + map += "#####......#####"; + map += "#..............#"; + map += "#..........#####"; + map += "#..............#"; + map += "#####......#####"; + map += "#####......#####"; + map += "#####......#####"; + map += "#####......#####"; + map += "#####......#####"; + map += "#..............#"; + map += "#..............#"; + map += "#####......#####"; + map += "#..............#"; + map += "################"; + return (map); +} + +//#include + +char cInput[5]; +string debugMsg; + +bool bGameLoop = true; +int nScreenWidth; +int nScreenHeight; +string screen; + +float fPlayerX = 8.0f; +float fPlayerY = 8.0f; +float fPlayerA = 0.0f; +float fElapsedTime; +bool bMoveForward; +bool bMoveBackwards; +bool bTurnLeft; +bool bTurnRight; + +void *keyListener(void *tid){ + long id = (long) tid; + initscr(); + noecho(); + //raw(); + //cbreak(); + //nodelay(stdscr, TRUE); + //scrollok(stdscr, TRUE); + //raw(); + int c; + while ((c = getch()) != ERR){ + debugMsg = ""; + debugMsg+=to_string(c); + switch (c) { + case 119: //w + bMoveForward = true; + break; + case 97: //a + bTurnLeft = true; + break; + case 115: //s + bMoveBackwards = true; + break; + case 100: //d + bTurnRight = true; + break; + default: + break; + } + } + endwin(); + pthread_exit(NULL); +} + +void writeStringToScreen(int x, int y, string text){ + int s = (y*nScreenWidth)+x; + for (int i = s; i < s+text.length(); i++){ + screen[i] = text[i-s]; + } +} + +int main(){ + + ///I HAVE TO LOOK INTO THIS MORE + struct termios ttystate; + tcgetattr(STDIN_FILENO, &ttystate); + ttystate.c_lflag &= (~ICANON & ~ECHO); //Not display character + ttystate.c_cc[VMIN] = 1; + tcsetattr(STDIN_FILENO, TCSANOW, &ttystate); + /// + + bool keyStates[1000] = {false}; + int keyTimer[1000] = {0}; + //cInput = {'a','b'}; + //fputs("\e[?25h", stdout); //get cursor back /on signal abort ~ + //setterm(1); + pthread_t pThread[1]; + pthread_create(&pThread[0], NULL, keyListener, 0); + + struct winsize size; + ioctl(STDOUT_FILENO,TIOCGWINSZ,&size); + nScreenWidth = size.ws_col; + nScreenHeight = size.ws_row; + int nFrameRate = 60; + + int nMapHeight = 16; + int nMapWidth = 16; + float fFOV = 3.14159 / 4.0; + float fDepth = 16.0f; + string map = init(map); + system("kbdrate -d 250 -r 10"); + + + using clock = steady_clock; + auto tp1 = clock::now(); + auto tp2 = clock::now(); + + fputs("\e[?25l", stdout); //remove cursor*/ + + float fSpeedFactor = 1.0f; + + /////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////// + ////////BEGINDRAW///// + /////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////// + while(bGameLoop){ + + tp2 = clock::now(); + duration elapsedTime = tp2 - tp1; + tp1 = tp2; + fElapsedTime = elapsedTime.count(); + //dynamic terminal window size (on Window Resize) + ioctl(STDOUT_FILENO,TIOCGWINSZ,&size); + nScreenWidth = size.ws_col; + nScreenHeight = size.ws_row; + screen.clear(); + screen.resize(nScreenWidth*nScreenHeight); + cout << "\x1B[0;0H"; //reset cursor to 0,0 + + //fun part + + //this would be much better as class + if(bMoveForward){ + fPlayerX += fSpeedFactor*sinf(fPlayerA) * 5.0f * fElapsedTime; + fPlayerY += fSpeedFactor*cosf(fPlayerA) * 5.0f * fElapsedTime; + if(map[(int)fPlayerY * nMapWidth + (int)fPlayerX] == '#') + { + fPlayerX -= fSpeedFactor*sinf(fPlayerA) * 5.0f * fElapsedTime; + fPlayerY -= fSpeedFactor*cosf(fPlayerA) * 5.0f * fElapsedTime; + } + bMoveForward = false; + } + if(bMoveBackwards){ + fPlayerX -= fSpeedFactor*sinf(fPlayerA) * 5.0f * fElapsedTime; + fPlayerY -= fSpeedFactor*cosf(fPlayerA) * 5.0f * fElapsedTime; + if(map[(int)fPlayerY * nMapWidth + (int)fPlayerX] == '#') { + fPlayerX += fSpeedFactor*sinf(fPlayerA) * 5.0f * fElapsedTime; + fPlayerY += fSpeedFactor*cosf(fPlayerA) * 5.0f * fElapsedTime; + } + bMoveBackwards = false; + } + if(bTurnLeft){ + fPlayerA -= 0.15f; + bTurnLeft = false; + } + if(bTurnRight){ + fPlayerA += 0.15f; + bTurnRight = false; + } + + //shading part + for (int x = 0; x < nScreenWidth; x++){ + float fRayAngle = (fPlayerA - fFOV / 2.0f) + ((float)x / (float)nScreenWidth) * fFOV; + float fDistanceToWall = 0; + + bool bHitWall = false; + bool bBoundary = false; + + float fEyeX = sinf(fRayAngle); + float fEyeY = cosf(fRayAngle); + + while(!bHitWall && fDistanceToWall < fDepth){ + fDistanceToWall += 0.1f; + + int nTestX = (int)(fPlayerX + fEyeX * fDistanceToWall); + int nTestY = (int)(fPlayerY + fEyeY * fDistanceToWall); + + if(nTestX < 0 || nTestX >= nMapWidth || nTestY < 0 || nTestY >= nMapHeight){ + bHitWall = true; + fDistanceToWall = fDepth; + } else { + if(map[nTestY * nMapWidth + nTestX] == '#') + { + bHitWall = true; + vector> p; //distance, dot + for (int tx = 0; tx < 2; tx++) + for (int ty = 0; ty < 2; ty++) + { + float vy = (float)nTestY + ty - fPlayerY; + float vx = (float)nTestX + tx - fPlayerX; + float d = sqrt(vx*vx + vy*vy); + float dot = (fEyeX * vx / d) + (fEyeY * vy / d); + p.push_back(make_pair(d,dot)); + } + + sort(p.begin(), p.end(), [](const pair &left, const pair &right) { return left.first < right.first; }); + + float fBound = 0.005; + if (acos(p.at(0).second) < fBound) bBoundary = true; + if (acos(p.at(1).second) < fBound) bBoundary = true; + if (acos(p.at(2).second) < fBound) bBoundary = true; + } + + } + } + + int nCeiling = (float)(nScreenHeight / 2.0) - nScreenHeight / ((float)fDistanceToWall); + int nFloor = nScreenHeight - nCeiling; + + short nShade = 32; + + + for(int y = 0; y < nScreenHeight; y++){ + if(y < nCeiling) + screen[y*nScreenWidth+x] = ' '; + if(y > nCeiling && y <= nFloor){ + if (fDistanceToWall <= fDepth / 4.0f) nShade = 77; //very close + else if (fDistanceToWall < fDepth / 3.5f) nShade = 72; + else if (fDistanceToWall < fDepth / 3.0f) nShade = 84; + else if (fDistanceToWall < fDepth / 2.5f) nShade = 73; + else if (fDistanceToWall < fDepth / 2.0f) nShade = 105; + else if (fDistanceToWall < fDepth / 1.5) nShade = 58; + else if (fDistanceToWall < fDepth) nShade = 46; + else nShade = 32; // too far + if(bBoundary) nShade = '-'; + screen[y*nScreenWidth+x] = nShade; + } + else + { + float b = 1.0f - (((float)y - nScreenHeight / 2.0f) / ((float)nScreenHeight / 2.0f)); + if (b < 0.2) nShade = 32; //32 //very close + else if (b < 0.4) nShade = 96; //96 + else if (b < 0.7) nShade = 94; //94 + else if (b < 0.75) nShade = 42; //42 + else nShade = 32; //64 too far + screen[y*nScreenWidth+x] = nShade; + + } + } + } + + //writeStringToScreen(0, 0, "Key pressed: " + to_string(123) + " Key code: " + to_string(cInput)); + //writeStringToScreen(0, nScreenHeight-3, debugMsg); + writeStringToScreen(0, nScreenHeight-2, "Frame rate: " + to_string(1.0f / fElapsedTime) + " "); + writeStringToScreen(0, nScreenHeight-1, "Key pressed: " + debugMsg + " Angle: " + to_string(fPlayerA) + " X: " + to_string(fPlayerX) + " Y: " + to_string(fPlayerY) + " "); + + //string sInput(1, cInput[0]); + + cout << screen; //this is the renderer + //cout << ; + + + tp1 += milliseconds(1000 / nFrameRate); + this_thread::sleep_until(tp1); + + } + return 0; +} diff --git a/main_backup.cpp b/main_backup.cpp new file mode 100644 index 0000000..238dd35 --- /dev/null +++ b/main_backup.cpp @@ -0,0 +1,256 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace std::chrono; + + +//#include +char cInput[5]; +string debugMsg; + +bool bGameLoop = true; +int nScreenWidth; +int nScreenHeight; +string screen; + + + int pressedKeys[10]; + +int khbit() +{ + struct timeval tv; + fd_set fds; + tv.tv_sec = 0; + tv.tv_usec = 0; + FD_ZERO(&fds); + FD_SET(STDIN_FILENO, &fds); + select(STDIN_FILENO+1, &fds, NULL, NULL, &tv); + return FD_ISSET(STDIN_FILENO, &fds); +} +void nonblock(int state) +{ + struct termios ttystate; + tcgetattr(STDIN_FILENO, &ttystate); + + if ( state == 1) + { + ttystate.c_lflag &= (~ICANON & ~ECHO); //Not display character + ttystate.c_cc[VMIN] = 1; + } + else if (state == 0) + { + ttystate.c_lflag |= ICANON; + } + tcsetattr(STDIN_FILENO, TCSANOW, &ttystate); +} +bool keyState(int key) //Use ASCII table +{ + bool pressed; + int i = khbit(); //Alow to read from terminal + if (i != 0) + { + char c = fgetc(stdin); + if (c == (char) key) pressed = true; + else pressed = false; + } else { + //pressed = 0; + } + return pressed; +} + +void *keyListener(void *tid){ + long id = (long) tid; + + //initscr(); + /*noecho(); + raw(); + cbreak(); + + nodelay(stdscr, TRUE); + scrollok(stdscr, TRUE); + */ + //raw(); + + while(bGameLoop){ + nonblock(1); + if(keyState(32)) debugMsg = "yo"; + debugMsg = to_string(keyState(32)); + if(keyState(32)) debugMsg = "yo"; + nonblock(0); + //int c; + //while ((c = getch()) != ERR) + // debugMsg+=to_string(c); + + /*if(getch() == 'a'){ + debugMsg = "wawawa"; + } else { + debugMsg = ""; + }*/ + //cInput[0] = getch(); + /*switch(getch()){ + case 'a': + debugMsg = "wawawa"; + break; + case 'ERR': + debugMsg = "error"; + break; + default: + debugMsg = " "; + break; + } */ + } + //endwin(); + pthread_exit(NULL); +} + + + + +void writeStringToScreen(int x, int y, string text){ + int s = (y*nScreenWidth)+x; + for (int i = s; i < s+text.length(); i++){ + screen[i] = text[i-s]; + } +} + +int main(){ + //cInput = {'a','b'}; + + //fputs("\e[?25h", stdout); //get cursor back /on signal abort ~ + //setterm(1); + pthread_t pThread[1]; + pthread_create(&pThread[0], NULL, keyListener, 0); + + + struct winsize size; + ioctl(STDOUT_FILENO,TIOCGWINSZ,&size); + + nScreenWidth = size.ws_col; + nScreenHeight = size.ws_row; + + + + int nFrameRate = 60; + + float fPlayerX = 8.0f; + float fPlayerY = 8.0f; + float fPlayerA = 0.0f; + + int nMapHeight = 16; + int nMapWidth = 16; + + float fFOV = 3.14159 / 4.0; + float fDepth = 16.0f; + + string map; + map += "################"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "#..............#"; + map += "################"; + + + using clock = steady_clock; + auto tp1 = clock::now(); + auto tp2 = clock::now(); + + + fputs("\e[?25l", stdout); //remove cursor*/ + + while(bGameLoop){ + + tp2 = clock::now(); + duration elapsedTime = tp2 - tp1; + tp1 = tp2; + float fElapsedTime = elapsedTime.count(); + + + //dynamic terminal window size (on Window Resize) + ioctl(STDOUT_FILENO,TIOCGWINSZ,&size); + nScreenWidth = size.ws_col; + nScreenHeight = size.ws_row; + + + screen.clear(); + screen.resize(nScreenWidth*nScreenHeight); + + + cout << "\x1B[0;0H"; //reset cursor to 0,0 + + + for (int x = 0; x < nScreenWidth; x++){ + float fRayAngle = (fPlayerA - fFOV / 2.0f) + ((float)x / (float)nScreenWidth) * fFOV; + float fDistanceToWall = 0; + + bool bHitWall = false; + + float fEyeX = sinf(fRayAngle); + float fEyeY = cosf(fRayAngle); + + while(!bHitWall && fDistanceToWall < fDepth){ + fDistanceToWall += 0.1f; + + int nTestX = (int)(fPlayerX + fEyeX * fDistanceToWall); + int nTestY = (int)(fPlayerY + fEyeY * fDistanceToWall); + + if(nTestX < 0 || nTestX >= nMapWidth || nTestY < 0 || nTestY >= nMapHeight){ + bHitWall = true; + fDistanceToWall = fDepth; + } else { + if(map[nTestY * nMapWidth + nTestX] == '#'){ + bHitWall = true; + } + } + } + + int nCeiling = (float)(nScreenHeight / 2.0) - nScreenHeight / ((float)fDistanceToWall); + int nFloor = nScreenHeight - nCeiling; + + for(int y = 0; y < nScreenHeight; y++){ + if(y < nCeiling) + screen[y*nScreenWidth+x] = ' '; + if(y > nCeiling && y <= nFloor) + screen[y*nScreenWidth+x] = '#'; + else + screen[y*nScreenWidth+x] = ' '; + } + } + + //writeStringToScreen(0, 0, "Key pressed: " + to_string(123) + " Key code: " + to_string(cInput)); + //writeStringToScreen(0, nScreenHeight-3, debugMsg); + writeStringToScreen(0, nScreenHeight-2, "Frame rate: " + to_string(1.0f / fElapsedTime) + " limited to " + to_string(nFrameRate)); + //string sInput(1, cInput[0]); + writeStringToScreen(0, nScreenHeight-1, debugMsg); + + + cout << screen; //this is the renderer + //cout << ; + + tp1 += milliseconds(1000 / nFrameRate); + this_thread::sleep_until(tp1); + + } + + return 0; +}