示例#1
0
文件: Core.cpp 项目: ekersale/Nibler
void	Core::addPart()
{
  t_pos	tail;
  t_pos	tmp;

  tail.x = (this->_width / 2 - this->_snakeSize);
  tail.y = (this->_height / 2);
  tmp.x = tail.x - 1;
  if (checkWall(tmp) == true)
    {
      tmp.x = tail.x + 1;
      if (checkWall(tmp) == true)
	{
	  tmp.x = tail.x;
	  tmp.y = tail.y - 1;
	  if (checkWall(tmp) == false)
	    {
	      tmp.y = tail.y + 1;
	      if (checkWall(tmp) == false)
		this->_lib->gameOver(this->_score);
	      else
		tail.y = tmp.y;
	    }
	  else
	    tail.y = tmp.y;
	}
      else
	tail.x = tmp.x;
    }
  else
    tail.x = tmp.x;
  _snakeSize++;
this->_snake.push_back(tail);
}
示例#2
0
文件: Core.cpp 项目: ekersale/Nibler
bool	Core::isDead(const t_pos head)
{
  if (checkWall(head) != true)
    {
      this->_isRunning = false;
      return (true);
    }
  if (biteHimself(head) == true)
    {
      this->_isRunning = false;
      return (true);
    }
  return (false);
}
示例#3
0
void checkWall(float *eye, QuadBuffer *q, int i, int *pos, int *index, int *processed) {
  float x[2], y[2];
  float a[2], b[2];
  int j;

  processed[i] = 1;
  if(shorten(x, y, q->quads + i, 0.01))
    for(j = 0; j < q->current; j++)
      if(processed[j] == 0) {
	shorten(a, b, q->quads + j, 0.01);

	if(occlusiontest(x, y, eye, a, b))
	  checkWall(eye, q, j, pos, index, processed);
      }
  index[*pos] = i;
  (*pos)++; 
}
示例#4
0
void Game::timerEvent(QTimerEvent*)
{
	// check to see if any addition is necessary
	checkAddition();

	// advance the scene
	myScene.advance();

	// check to see if the score should be increased
	checkScore();
	// check to see if he wants to jump (and can)
	checkJump();
	// check to see if he is stuck in a wall
	checkWall();
	// check to see if he has hit an obstacle
	checkLose();
	// check to see if removal of items is necessary
	checkDeath();
}
示例#5
0
int* getSortedQuads(QuadBuffer *q, float eye[3]) {
  int *index;
  int *processed;
  int pos = 0;
  int i;

  if(q->current == 0) return NULL;

  index = (int*) malloc(q->current * sizeof(int));
  processed = (int*) malloc(q->current * sizeof(int));
  /* memset(processed, 0, q->current * sizeof(int)); */

  for(i = 0; i < q->current; i++)
    processed[i] = 0;

  for(i = 0; i < q->current; i++)
    if(processed[i] == 0)
      checkWall(eye, q, i, &pos, index, processed);

  free(processed);
  return index;
}
示例#6
0
文件: loop.c 项目: martino/snake3d
/*
 *  qui bisogna gestire tutto quello che riguarda i vari "update" del gioco, quindi
 * movimento del verme(velocita', direzione...) , mappa, collision detection
 */
void loop(){
  GLuint moveFrame = 0;
  GLuint delay = 0;


  /* calcolo del framerate */
  programData.frame++;
  programData.time = glutGet(GLUT_ELAPSED_TIME);
  if(programData.timerender == 0) programData.timerender = programData.time;
  if(programData.time - programData.timebase > 1000){
    sprintf(programData.fps, "FPS: %.0f", programData.frame*1000.0/(programData.time-programData.timebase));
    programData.timebase = programData.time;
    programData.frame = 0;
  }

  /* controllo lo stato della partita */
  switch(programData.gameStatus){
  case 0: /* ho perso */
    return;
    break;
  case 1: /* sto giocando */
    /* continuo e stampo i punti */
    sprintf(programData.pointsOSD, "PUNTI: %d",programData.points );
    break;
  case 2: /* ho vinto */
    return;
    break;
  default:
    break;
  }

  /* se sono nel menu' non devo muovere nulla */
  if(programData.menu == 1){
    return;
  }

  /* movimento della telecamera a scatti */
  if(programData.time - programData.timerender > programData.timeFrame){
    moveFrame = 1;
    delay = programData.time - (programData.timerender + programData.timeFrame);    
    programData.timerender = programData.time + delay ;
  }

  /* controllo l'input dell'utente */

  /* movimento verticale --> freccia up e down */
  if((worldData.kup)||(worldData.kdown)){
    if(worldData.yStatus == worldData.nextYstatus){ /* sono fermo */
      switch(worldData.yStatus){
      case 0: /*sono orizzontale*/
	if(worldData.kup){
	  worldData.nextYstatus = 1;
	  worldData.nextAngleX  = worldData.angleX - 90.0f;
	  worldData.nextAngleMX = worldData.angleMX -90.0f;
	  worldData.angleX = worldData.angleMX;
	}else{
	  worldData.nextYstatus = 2;
	  worldData.nextAngleX = worldData.angleX + 90.0f;
	  worldData.nextAngleMX = worldData.angleMX + 90.0f;
	  worldData.angleX = worldData.angleMX;
	}
	break;
      case 1: /*sono in alto*/
	if(worldData.kdown){
	  worldData.nextYstatus = 0;
	  worldData.nextAngleX = worldData.angleX + 90.0f;
	  worldData.nextAngleMX = worldData.angleMX + 90.0f;
	  worldData.angleX = worldData.angleMX;
	}
	break;
      case 2: /*sono in basso*/\
	if(worldData.kup){
	  worldData.nextYstatus = 0;
	  worldData.nextAngleX = worldData.angleX - 90.0f;
	  worldData.nextAngleMX = worldData.angleMX -90.0f;
	  worldData.angleX = worldData.angleMX;
	}
	break;
      default:
	break;
      }
    }else{ /* caso in cui sono in movimento*/

      if(worldData.kup){
	if(worldData.nextYstatus == 2){ /*sto andando verso il basso*/
	  worldData.nextYstatus = 0;
	  worldData.yStatus = 2;
	  worldData.angleX = worldData.nextAngleX;
	  /* qui bisogna muovere il verme */
	  worldData.nextAngleX = worldData.angleX - 90.0f;
	  worldData.nextAngleMX = worldData.angleX - 90.0f;

	}
      }else{
	if(worldData.nextYstatus == 1){ /*sto andando verso l'alto*/
	  worldData.nextYstatus = 0;
	  worldData.yStatus = 1;
 	  worldData.angleX = worldData.nextAngleX;
	  /* qui bisogna muovere il verme */
	  worldData.nextAngleX = worldData.angleX  + 90.0f;
	  worldData.nextAngleMX = worldData.angleX + 90.0f;
	}
      }
    }
    worldData.kup = 0;
    worldData.kdown = 0;
  }


  /* movimento laterale --> freccia sx e dx */
  if((worldData.kleft)||(worldData.kright)){
    if(worldData.xStatus == 0){ /* sto andando dritto */
      if(worldData.kleft){
	worldData.nextXstatus = 1; /* vado a sinistra */
	worldData.nextAngleY = worldData.angleY - 90.0f ;
	worldData.nextAngleMY = worldData.angleMY - 90.0f ;
	worldData.angleY = worldData.angleMY;
      }
      else{
	worldData.nextXstatus = 2; /* vado a destra */
	worldData.nextAngleY = worldData.angleY + 90.0f ;
	worldData.nextAngleMY = worldData.angleMY + 90.0f ;
	worldData.angleY = worldData.angleMY;
      }
      worldData.xStatus = 1;
    }else{
      switch(worldData.nextXstatus){
      case 1: /* sto andando verso sinistra */
	if(worldData.kright){
	  worldData.nextAngleY = worldData.nextAngleY + 90.0f;
	  worldData.nextAngleMY = worldData.nextAngleMY + 90.0f;
	  worldData.nextXstatus = 2;
	  worldData.angleY = worldData.angleMY;
	}
	break;
      case 2: /* sto andando verso destra */
	if(worldData.kleft){
	  worldData.nextAngleY = worldData.nextAngleY - 90.0f;
	  worldData.nextAngleMY = worldData.nextAngleMY - 90.0f;
	  worldData.nextXstatus = 1;
	  worldData.angleY = worldData.angleMY;
	}
	break;
      default:
	break;
      }
    }
      
    worldData.kleft  = 0;
    worldData.kright = 0;
  }
 
  

  /* modifico l'angolo X */
  if(worldData.yStatus != worldData.nextYstatus){

    switch(worldData.nextYstatus){
    case 0:  /* devo arrivare sul piano */
      switch(worldData.yStatus){
      case 1:
	worldData.angleMX += programData.velAngolare;
	moveFrame = 0;
	if(worldData.angleMX > worldData.nextAngleMX){
	  worldData.angleMX = worldData.nextAngleMX;
	  worldData.angleX = worldData.nextAngleX;
	  worldData.yStatus = 0;
	}
	break;
      case 2:
	worldData.angleMX -= programData.velAngolare;
	moveFrame = 0;
	if(worldData.angleMX < worldData.nextAngleMX){
	  worldData.angleMX = worldData.nextAngleMX;
	  worldData.angleX = worldData.nextAngleX;
	  worldData.yStatus = 0;
	}
	break;
      default:
	break;
      }
      break;
    case 1:
      worldData.angleMX -= programData.velAngolare;
      moveFrame = 0;
      if(worldData.angleMX < worldData.nextAngleMX){
	worldData.angleMX = worldData.nextAngleMX;
	worldData.angleX = worldData.nextAngleX;
	worldData.yStatus = 1;
      }
      break;
    case 2:
      worldData.angleMX += programData.velAngolare;
      moveFrame = 0;
      if(worldData.angleMX > worldData.nextAngleMX){
	worldData.angleMX = worldData.nextAngleMX;
	worldData.angleX = worldData.nextAngleX;
	worldData.yStatus = 2;
      }
      break;
    default:
      break;
    }
  }

  /* modifico l'angolo Y */
  if(worldData.xStatus){ 
    switch(worldData.nextXstatus){
    case 1: /* devo muovermi a sinistra */
      worldData.angleMY -= programData.velAngolare;
      moveFrame = 0;
      if(worldData.angleMY < worldData.nextAngleMY){
	worldData.angleMY = worldData.nextAngleMY;
	worldData.angleY = worldData.nextAngleY;
	worldData.xStatus = 0;
	worldData.nextXstatus = 0;
      }
      break;
    case 2: /* devo muovermi a destra */
      worldData.angleMY += programData.velAngolare;
      moveFrame = 0;
      if(worldData.angleMY > worldData.nextAngleMY){
	worldData.angleMY = worldData.nextAngleMY;
	worldData.angleY = worldData.nextAngleY;
	worldData.xStatus = 0;
	worldData.nextXstatus = 0;
      }
      break;
    default:
      break;
    }
  }

  
  /* controllo se sono in posizione tale da muovermi */
  if(moveFrame){
    float offSetX = 0.0f, offSetY = 0.0f, offSetZ = 0.0f;
    // collision detection
    double dist;
    int collision = 0;

    if(worldData.yStatus == 0){
      /* movimento sul piano X */
      offSetX = (float)sin(worldData.angleY * PIOVER180) * 3.5f; 
      offSetZ = (float)cos(worldData.angleY * PIOVER180) * 3.5f;
      if(!moveWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0)){
	programData.gameStatus = 0;
      }

      dist = dist2Point(-((myWorm.head)->x), -((myWorm.head)->y), (myWorm.head)->z, ball.x, ball.y, ball.z);
      if(dist<= ((WORMDIA+DIA)*(WORMDIA+DIA)) )
	collision = 1;
      else
	collision = 0;

      if(checkWall((myWorm.head)->x+myWorm.dia, (myWorm.head)->z +myWorm.dia, 1)){
	/*collision testa del verme*/
	if(collision){
	  if(worldData.yStatus == 0){
	    increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0);
	    increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0);
	    increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0);
	    increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0);
	  }
	  else{
	    increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1);
	    increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1);
	    increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1);
	    increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1);
	  }
	  generateBall();
	  programData.points+=100;
	  increaseVel(5);
	}
      }else{
	/* e' uscito dai muri */
	programData.gameStatus = 0;
      }
    }else{
      /* movimento sul piano Y */
      offSetY = (float)sin(worldData.angleX * PIOVER180) * 3.5f;
      offSetZ = (float)cos(worldData.angleX * PIOVER180) * 3.5f; 
      if(!moveWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1)){
	programData.gameStatus = 0;
      }


      dist = dist2Point(-((myWorm.head)->x), -((myWorm.head)->y), (myWorm.head)->z, ball.x, ball.y, ball.z);
      if(dist<= ((WORMDIA+DIA)*(WORMDIA+DIA)) )
	collision = 1;
      else
	collision = 0;

      if(checkWall((myWorm.head)->y+myWorm.dia, (myWorm.head)->z +myWorm.dia, 2)){
	/*collision testa del verme*/
	if(collision){
	  if(worldData.yStatus == 0){
	    increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0);
	    increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0);
	    increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0);
	    increaseWorm((float)sin(worldData.angleY * PIOVER180), (float)cos(worldData.angleY * PIOVER180), 0);
	  }
	  else{
	    increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1);
	    increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1);
	    increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1);
	    increaseWorm((float)sin(worldData.angleX * PIOVER180), (float)cos(worldData.angleX * PIOVER180), 1);
	  }
	  generateBall();
	  programData.points+=100;
	  increaseVel(5);
	}
      }else{
	/* e' uscito dai muri */
	programData.gameStatus = 0;
      }
    }

  }
}
示例#7
0
void Step(float dtime, unsigned char animBall)
{
	float posChange, d;
	unsigned char i, j;
	static float time = 0.0f;

	time = time+dtime;

	ReadAccState();

	if (animBall)
	{
		g_ballForceX = (float)(g_devAccelerationY-g_devAccOffsetY)/2.0f;
		g_ballForceY = (float)(g_devAccelerationX-g_devAccOffsetX)/2.0f;
		
		posChange = g_ballX + ((float)g_ballVelX * dtime) + (((g_ballForceX) / g_ballMass) * dtime * dtime) / 2.0f;
	    g_ballVelX = (posChange - g_ballX) / dtime;
	    g_ballX = posChange;
	
		posChange = g_ballY + ((float)g_ballVelY * dtime) + (((g_ballForceY) / g_ballMass) * dtime * dtime) / 2.0f;
	    g_ballVelY = (posChange - g_ballY) / dtime;
	    g_ballY = posChange;
	
	/*	posChange = g_ballZ + (g_ballVelZ * dtime) + (((g_ballForceZ) / g_ballMass) * dtime * dtime) / 2.0f;
	    g_ballVelZ = (posChange - g_ballZ) / dtime;
	    g_ballZ = posChange;*/
	
		if (g_ballY <= 3)
		{
			g_ballY = 3;
			g_ballVelY = -g_ballVelY*0.6f;

			if ((g_colDirs & 0x08) == 0x08)
				g_ballGth = 1;
		}
	
		if (g_ballY >= 53)
		{
			g_ballY = 53;
			g_ballVelY = -g_ballVelY*0.6f;

			if ((g_colDirs & 0x04) == 0x04)
				g_ballGth = 1;
		}
	
		if (g_ballX <= 3)
		{
			g_ballX = 3;
			g_ballVelX = -g_ballVelX*0.6f;

			if ((g_colDirs & 0x02) == 0x02)
				g_ballGth = 1;
		}
	
		if (g_ballX >= 118)
		{
			g_ballX = 118;
			g_ballVelX = -g_ballVelX*0.6f;

			if ((g_colDirs & 0x01) == 0x01)
				g_ballGth = 1;
		}
	}

for (i = 0; i < g_usedWalls; i++)
	{
		for (j = 0; j < g_usedWallMovers; j++)
		{
			if (i == g_physWallMovers[j].wallId)
			{
				if (g_physWallMovers[j].orientation == HORIZONTAL)
				{
					if (g_walls[i].orientation == HORIZONTAL)
					{
						// < ------ >
						g_walls[i].c2_start = (float)g_physWallMovers[j].x + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time);
						g_walls[i].c2_end = (float)g_physWallMovers[j].y + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time);
					}
					else
					{
						// <|>
						g_walls[i].c = (float)g_physWallMovers[j].x + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time);
					}
				}
				else
				{
					if (g_walls[i].orientation == HORIZONTAL)
					{
						// /\ ----- \/
						g_walls[i].c = (float)g_physWallMovers[j].y + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time);
					}
					else
					{
						// /\ | \/
						g_walls[i].c2_start = (float)g_physWallMovers[j].x + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time);
						g_walls[i].c2_end = (float)g_physWallMovers[j].y + (float)g_physWallMovers[j].amp*sin( (float)g_physWallMovers[j].speedCoef * time);
					}
				}

				GeneratePhysWall(&g_physWalls[i], g_walls[i]);
			}
		}
	}


	if (animBall)
	{
		// wall
		g_colDirs = 0;
		for (i = 0; i < g_usedWalls; i++)
		{
			checkWall(g_physWalls[i]);
		}
		
		if ((g_colDirs & 0x03) == 0x03 || (g_colDirs & 0x0C) == 0x0C)
			g_ballGth = 1;
	
		//holes
	
		for (i = 0; i < g_usedHoles; i++)
		{
			d = sqrt((float)(g_holes[i].x - g_ballX)*(float)(g_holes[i].x - g_ballX)+(float)(g_holes[i].y - g_ballY)*(float)(g_holes[i].y - g_ballY));
			if (d < 8)
			{
				g_ballVelX += (g_holes[i].x - g_ballX)*0.5f;
				g_ballVelY += (g_holes[i].y - g_ballY)*0.5f;
			}
	
			if (d<4)
			{
					g_ballX = g_holes[i].x;
					g_ballY = g_holes[i].y;
					g_ballGth = 1;
			}
		}
	
		//Trigger
		
		d = sqrt((float)(g_levelEndX - g_ballX)*(float)(g_levelEndX - g_ballX)+(float)(g_levelEndY - g_ballY)*(float)(g_levelEndY - g_ballY));
		if (d <= 5)
		{
			g_ballX = g_levelEndX;
			g_ballY = g_levelEndY;
			g_ballGtt = 1;
		}
	
		g_ballVelX *= 0.985f;
		g_ballVelY *= 0.985f;
	}

	return;
}