Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void gameController::mainloop()
- {
- //FPS counter
- loopTimer.start();
- opengl->begindraw();
- //opengl->drawAxis();
- //opengl->drawCube(0,0,0);
- //logic moving the snake
- if (frames == FRAMES_PER_STEP) //if new step started
- {
- //do move
- playerPos[X_] += direction[X_]; //move the snake head
- playerPos[Y_] += direction[Y_];
- playerPos[Z_] += direction[Z_];
- playerSnake->move(direction); //move the tail
- frames = 0;
- arrowPressed = false;
- }
- if(playerPos[X_] == fruitPos[X_] && //if the fruit hit
- playerPos[Y_] == fruitPos[Y_] &&
- playerPos[Z_] == fruitPos[Z_])
- {
- playerSnake->add(); //add body cell
- spawnFruit(10,0,10);
- }
- //drawing the snake here
- if(!fixCamera) //follow the snake head by the camera or set camera to the def points
- opengl->setCameraCellDelta(
- playerPos[X_], playerPos[Y_], playerPos[Z_],
- direction[X_] * (float)frames/FRAMES_PER_STEP,
- direction[Y_] * (float)frames/FRAMES_PER_STEP,
- direction[Z_] * (float)frames/FRAMES_PER_STEP,
- direction[X_], direction[Y_], direction[Z_]
- );
- opengl->drawCubeCellsDelta( //snake head
- playerPos[X_],
- playerPos[Y_],
- playerPos[Z_],
- direction[X_] * (float)frames/FRAMES_PER_STEP * ((animooted)?1.0f:0),//animate if enabled
- direction[Y_] * (float)frames/FRAMES_PER_STEP * ((animooted)?1.0f:0),
- direction[Z_] * (float)frames/FRAMES_PER_STEP * ((animooted)?1.0f:0)
- );
- //draw snake body
- txyz prev = { playerPos[X_], playerPos[Y_], playerPos[Z_]};
- const snakeCell *next = playerSnake->getHead()->next;
- if (playerPos[X_] > 30)
- {
- playerPos[X_]-=58;
- }
- else if (playerPos[X_] < -30)
- {
- playerPos[X_]+=58;
- }
- else if (playerPos[Y_] > 30)
- {
- playerPos[Y_]-=58;
- }
- else if (playerPos[Y_] < -30)
- {
- playerPos[Y_]+=58;
- }
- else if (playerPos[Z_] > 30)
- {
- playerPos[Z_]-=58;
- }
- else if (playerPos[Z_] < -30)
- {
- playerPos[Z_]+=58;
- };
- //go through the linked list
- while(next)
- {
- prev[X_] -= next->move.x;
- prev[Y_] -= next->move.y;
- prev[Z_] -= next->move.z;
- //draw each body part
- opengl->drawCubeCellsDelta(
- prev[X_],
- prev[Y_],
- prev[Z_],
- next->move.x*(float)frames/FRAMES_PER_STEP * ((animooted)?1.0f:0), //animate if enabled
- next->move.y*(float)frames/FRAMES_PER_STEP * ((animooted)?1.0f:0),
- next->move.z*(float)frames/FRAMES_PER_STEP * ((animooted)?1.0f:0)
- );
- next = playerSnake->getNext(next);
- //Where we can fail
- if (playerPos[X_] == prev[X_] &&
- playerPos[Y_] == prev[Y_] &&
- playerPos[Z_] == prev[Z_])
- {
- if (failFlag == false)
- {
- std::cout << "\nYou failed. Total Score: " << score-1;
- opengl->DisableOpenGL();
- failFlag = true;
- }
- //window->quit();
- }
- }
- //draw the fruit
- if(fruitPos[X_] != 100)
- {
- opengl->drawCubeCells(fruitPos[X_], fruitPos[Y_], fruitPos[Z_]);
- }
- frames++;
- //loadBand(2000);
- opengl->enddraw();
- //wait until fixed frame time is reached
- float fps = (float)loopTimer.getTicksRate().QuadPart/loopTimer.getTime().QuadPart;
- if(fps > fixedFPS)
- {
- waiter(long(loopTimer.getTicksRate().QuadPart/fixedFPS - loopTimer.getTime().QuadPart));
- }
- //fps = (float)loopTimer.getTicksRate().QuadPart/loopTimer.getTime().QuadPart;
- //std::cout<<fps<<std::endl;
- loopTimer.reset();
- }
- int power(int val, unsigned int P)
- {
- int r = val;
- while (--P)
- r *= val;
- return r;
- }
- void gameController::spawnFruit(int xr, int yr, int zr)
- {
- //throw fruit randomly
- std::cout << "\rScore " << score;
- int xdel = (xr!=0)?(int)rand()%xr:0;
- int ydel = (yr!=0)?(int)rand()%yr:0;
- int zdel = (zr!=0)?(int)rand()%zr:0;
- /*int xt = -(int)xr/2 + xdel;
- int yt = -(int)yr/2 + ydel;
- int zt = -(int)zr/2 + zdel;*/
- //fruitPos[X_] = -(int)xr/2 + xdel;
- //fruitPos[Y_] = -(int)yr/2 + ydel;
- //fruitPos[Z_] = -(int)zr/2 + zdel;
- fruitPos[X_] = power(-1, (int)rand()) * xdel;
- fruitPos[Y_] = power(-1, (int)rand()) * ydel;
- fruitPos[Z_] = power(-1, (int)rand()) * zdel;
- score++;
- }
- }
Add Comment
Please, Sign In to add comment