コード例 #1
0
ファイル: paths.c プロジェクト: Poncholay/TekDefense
void		get_best_way(t_paths **path, t_map *map)
{
  float		best_len;
  float		len;
  int		best_way;
  int		i;

  best_way = 0;
  for (i = 0; (*path)->neighboors[i] != NULL; i++);
  if (i == 1)
    best_way = 0;
  else
    for (i = 0; (*path)->neighboors[i] != NULL; i++)
      {
	if (((*path)->neighboors[i])->pos[0] == map->fortress_pos[0] && ((*path)->neighboors[i])->pos[1] == map->fortress_pos[1])
	  {
	    best_len = 1;
	    best_way = i;
	  }
	else if (i == 0)
	  {
	    best_len = pathfinding((*path)->neighboors[i], map);
	    best_way = i;
	  }
	else
	  if ((distance(((*path)->neighboors[i])->pos, map->fortress_pos)) < best_len)
	    if ((len = pathfinding((*path)->neighboors[i], map)) < best_len && len != -1)
	      {
		best_len = len;
		best_way = i;
	      }
      }
  (*path)->best_way[0] = (*path)->neighboors[best_way]->pos[0];
  (*path)->best_way[1] = (*path)->neighboors[best_way]->pos[1];
}
コード例 #2
0
t_coord			*get_path(t_engine *e, t_entity *t, t_coord g)
{
  t_coord		*res;
  t_path		*path;
  t_path		*next;
  int			i;

  res = (t_coord*)xmalloc(sizeof(*res) *
			  e->map_data.w *
			  e->map_data.h + 1);
  i = 0;
  path = pathfinding(e, t, &g);
  if (!path)
    {
      free(res);
      return (0);
    }
  while (path)
    {
      next = path->next;
      res[i].x = path->x;
      res[i].y = path->y;
      i++;
      free(path);
      path = next;
    }
  res[i].x = -1;
  res[i].y = -1;
  return (res);
}
コード例 #3
0
int	pathfinding(char ***map, t_pos dst, t_pos pos, char c)
{
  char	tmp;

  if (pos.x == dst.x && pos.y == dst.y)
    return (1);
  else if (pos.x < 0 || pos.y < 0)
    return (0);
  else if ((*map)[pos.y][pos.x] == 'X' || (*map)[pos.y][pos.x] == c)
    return (0);
  tmp = (*map)[pos.y][pos.x];
  (*map)[pos.y][pos.x] = c;
  if (pathfinding(map, dst, new_pos(pos.x, pos.y + 1), c))
    return (1);
  if (pathfinding(map, dst, new_pos(pos.x + 1, pos.y), c))
    return (1);
  if (pathfinding(map, dst, new_pos(pos.x, pos.y - 1), c))
    return (1);
  if (pathfinding(map, dst, new_pos(pos.x - 1, pos.y), c))
    return (1);
  (*map)[pos.y][pos.x] = tmp;
  return (0);
}
コード例 #4
0
void GameStatePlay::update() {
    //enemy.moveRight = true;
    //enemy.setSpeedX(10);
    for(int i = 0; i < Entity::entityList.size(); i++) {
        if(!Entity::entityList[i]) continue;
        if(Entity::entityList[i]->type == Entity::ENTITYTYPE_ENEMY &&
                (!Entity::entityList[i]->nextTile &&
                 Entity::entityList[i]->curTile) &&
                Entity::entityList[i]->nextReached == true) {
            //if(Entity::entityList[i]->type == Entity::ENTITYTYPE_ENEMY && Entity::entityList[i]->nextReached == true) {
            printf("\rPATHFINDING FOR %f, %f with id %i type %i place %i\r",
                   Entity::entityList[i]->x,
                   Entity::entityList[i]->y,
                   Entity::entityList[i]->id,
                   Entity::entityList[i]->type,
                   i);
            pathfinding(Entity::entityList[i]);
        }
        //printf("pathfinding1 %i type %i\r", Entity::entityList[i]->getId(), Entity::entityList[i]->type);
        /*else if(Entity::entityList[i]->type == Entity::ENTITYTYPE_ENEMY && Entity::entityList[i]->nextTile && Entity::entityList[i]->curTile)
            if(Entity::entityList[i]->nextTile->tileID < 0 && Entity::entityList[i]->curTile->tileID != Entity::entityList[i]->nextTile->tileID)
                pathfinding(Entity::entityList[i]);
                //printf("pathfinding2 %i type %i\r", Entity::entityList[i]->getId(), Entity::entityList[i]->type);*/
        Entity::entityList[i]->update();
    }

    // Collisions
    for(int i = 0; i < CollisionHandler::entityColQueue.size(); i++) {
        Entity* entityA = CollisionHandler::entityColQueue[i].entityA;
        Entity* entityB = CollisionHandler::entityColQueue[i].entityB;

        if(entityA == NULL || entityB == NULL) continue;

        if(entityA->handleCollision(entityB)) {
            entityB->handleCollision(entityA);
        }
    }

    CollisionHandler::entityColQueue.clear();

    if(debugMessages.size() > 0) {
        for(int i = 0; i < debugMessages.size(); i++) {
            delete debugMessages[i];
            debugMessages[i] = NULL;
        }
        debugMessages.clear();

        SDL_Color textColor = {255, 255, 255};
        char buffer[100];
        sprintf(buffer, "Camera: %i, %i", CameraHandler::cameraControl.getX() + WWIDTH/2, CameraHandler::cameraControl.getY() + WHEIGHT/2);
        debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor));
        sprintf(buffer, "Tile: %i, %i", mouseposX / TILE_SIZE, mouseposY / TILE_SIZE);
        debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor));
        sprintf(buffer, "TileId: %i", MapArea::areaControl.getTileHoveredId());
        debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor));
        sprintf(buffer, "TileType: %i", MapArea::areaControl.getTileId(MapArea::areaControl.getTileHoveredId())->typeID);
        debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor));
        sprintf(buffer, "Entities: %i", Entity::entityList.size());
        debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor));
        if(Entity::entityList[1]->nextTile) {
            sprintf(buffer, "Entity on: %i",
                    MapArea::areaControl.getTileAt(Entity::entityList[1]->x, Entity::entityList[1]->y)->tileID);
            debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor));
            sprintf(buffer, "Entity nextTile: %i",
                    Entity::entityList[1]->nextTile->tileID);
            debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor));
            sprintf(buffer, "Entity turntime: %i", Entity::entityList[1]->turnTime);
            debugMessages.push_back(TTF_RenderText_Solid(Globals::getFont(), buffer, textColor));
        }
    }
}