Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
248 views
in Technique[技术] by (71.8m points)

c++ - A function-definition is not allowed here before '{'

i am getting a REALLY annoying error. i literally looked everywhere for it! i even went back and changed all of my

if (case)
    // to-do

to

if (case)
{
    // to-do
}

i don't ask a lot of questions like this, but i am really getting frustrated, and i am almost positive it is something simple that i am not seeing.

here is the error:

entity.cpp: In member function ‘virtual void Entity::clean()’:
entity.cpp:148: error: a function-definition is not allowed here before ‘{’ token
entity.cpp:394: error: expected ‘}’ at end of input

here is my class code:

#include "./entity.hpp"

std::vector<Entity *> Entity::entity_list_;
std::vector<EntityCollision> EntityCollision::collision_list_;

EntityCollision::EntityCollision()
{
  a_ = NULL;
  b_ = NULL;
}

Entity::Entity()
{
  image_buffer_ = NULL;
  x_ = y_ = 0.0f;
  width_ = height_ = 0;
  animation_state_ = 0;
  move_left_ = false;
  move_right_ = false;
  type_ = ENTITY_TYPE_GENERIC;
  flags_ = ENTITY_FLAG_GRAVITY;
  dead_ = false;
  speed_x_ = 0;
  speed_y_ = 0;
  max_speed_x_ = 0;
  max_speed_y_ = 0;
  column_x_ = 0;
  column_y_ = 0;
  column_width_ = 0;
  column_height_ = 0;
}

Entity::~Entity()
{
}

bool Entity::init(const std::string &image_file, int width, int height, int max_frames)
{
  if ((image_buffer_ = Surface::mount_image(image_file)) == NULL)
    {
      return false;
    }

  animation_helper_.max_frames_ = max_frames;

  width_ = width;
  height_ = height;
  return Surface::set_color_key(255, 0, 255, image_buffer_);
}

void Entity::render(SDL_Surface *dest)
{
  if (image_buffer_ == NULL || dest == NULL)
    {
      return;
    }

  Surface::draw(x_ - CameraManager::camera_controller_.x(),
        y_ - CameraManager::camera_controller_.y(),
        current_frame_column_ * width_,
        (current_frame_row_ + animation_helper_.current_frame()) * height_,
        width_, height_,
        image_buffer_,
        dest);
}

void Entity::animate()
{
  if (move_left_)
    {
      current_frame_column_ = 0;
    }
  else if (move_right_)
    {
      current_frame_column_ = 1;
    }

  animation_helper_.animate();
}

void Entity::collision(Entity *entity)
{
}

void Entity::update()
{
  /* if the entity isn't moving left or right */
  if (move_left_ == false && move_right_ == false)
    {
      stop(); // stop movement
    }

  if (move_left_) // if it wants to move left
    {
      accel_x_ = -0.5; // move negatively down x axis
    }
  else if (move_right_)
    {
      accel_x_ = 0.5; // move positively up the x axis
    }

  /* if gravity is applied to the entity */
  if (flags_ & ENTITY_FLAG_GRAVITY)
    {
      accel_y_ = 0.75f; // it will fall
    }

  /* set the entity's speed */
  speed_x_ += accel_x_ * FPSManager::fps_controller_.speed_factor();
  speed_y_ += accel_y_ * FPSManager::fps_controller_.speed_factor();

  /* make sure the entity won't move too fast */
  if (speed_x_ > max_speed_x_)
    {
      speed_x_ = max_speed_x_;
    }

  if (speed_x_ < -max_speed_x_)
    {
      speed_x_ = -max_speed_x_;
    }

  if (speed_y_ > max_speed_y_)
    {
      speed_y_ = max_speed_y_;
    }

  if (speed_y_ < -max_speed_y_)
    {
      speed_y_ = -max_speed_y_;
    }

  animate(); // animate the entity
  move(speed_x_, speed_y_); // now move it
}

void Entity::clean()
{
  if (image_buffer_) // if the image buffer has an image on it
    {
      SDL_FreeSurface(image_buffer_); // get rid of it!
    }

  image_buffer_ = NULL; // just set it to null if it doesn't :
}

void Entity::move(float x, float y)
{
  /* if thee entity  doesn't want to move, why try? */
  if (x == 0 && y == 0)
    {
      return;
    }

  double new_x = 0; // the x position increment
  double new_y = 0; // the y position increment

  /* give us the correct movement per second */
  x *= FPSManager::fps_controller_.speed_factor();
  y *= FPSManager::fps_controller_.speed_factor();

  if (y != 0) // if we should move up or down
    {
      if (y >= 0) // down in this case
      {
        new_y = FPSManager::fps_controller_.speed_factor();
      }
        else // up in this case
      {
        new_y = -FPSManager::fps_controller_.speed_factor();
      }
    }

  while (true)
    {
      if (flags_ & ENTITY_FLAG_GHOST) // is the entity a ghost?
      {
        /* notify the entity of other collisions */
        valid_pos((int) (x_ + new_x), (int) (y_ + new_y));
        /* move regardless of the results */
        x_ += new_x_;
        y_ += new_y_;
      }
      else
      {
        /* if the new y position is valid (empty) */
        if (valid_pos((int) (x_ + new_x), (int) y_))
          {
            x_ += new_x; // move the entity
          }
        else
          {
            speed_x_ = 0;
          }

      /* if the new y position is valid (empty) */
      if (valid_pos((int) x_, (int) (y_ + new_y)))
        {
          y_ += new_y; // move the entity
        }
      else
        {
          speed_y_ = 0;
        }
    }

      /* decrease x by new_x until it reaches 0 */
      x += -new_x;

      /* decrease y by new_y until it reaches 0 */
      y += -new_y;

      if (new_x > 0 && x <= 0)
      {
        new_x = 0;
      }

      if (new_x < 0 && x >= 0)
      {
        new_x = 0;
      }

      if (new_y > 0 && y <= 0)
      {
        new_y = 0;
      }

      if (new_y < 0 && y >= 0)
      {
        new_y = 0;
      }

      /* if the entity reached it's new position on the x axis */
      if (x == 0)
      {
        new_x = 0; // don't move left || right anymore
      }

      /* if the entity reached it's new position on the y axis */
      if (y == 0)
      {
        new_y = 0; // don't move up || down anymore
      }

      /* when we finally come to a stop */
      if (x == 0 && y == 0)
      {
        break; // break out of the loop
      }

      if (new_x == 0 && new_y == 0)
      {
        break;
      }
    }
}

void Entity::stop()
{
  if (speed_x_ > 0)
    {
      accel_x_ = -1;
    }

  if (speed_x_ < 0)
    {
      accel_x_ = 1;
    }

  if (speed_x_ < 2.0f && speed_x_ > -2.0f)
    {
      accel_x_ = 0;
      speed_x_ = 0;
    }
}

bool Entity::collides(int o_x, int o_y, int o_w, int o_h)
{
  int left1, left2;
  int right1, right2;
  int top1, int top2;
  int bottom1, int bottom2;

  int t_x = (int) x_ + column_x_;
  int t_y = (int) y_ + column_y_;

  left1 = t_x;
  left2 = o_x;

  right1 = left1 + width_ - 1 - column_width_;
  right2 = o_x + o_w - 1;

  top1 = t_y;
  top2 = o_y;

  bottom1 = top1 + height_ - 1 - column_height_;
  bottom2 = o_y + o_h - 1;

  if (bottom1 < top2)
    {
      return false;
    }

  if (top1 > bottom2)
    {
      return false;
    }

  if (right1 < left2)
    {
      return false;
    }

  if (left1 > right2)
    {
      return false;
    }

  return true;
}

bool valid_pos(int x, int y)
{
  bool _return = true;

  int start_x = (x + column_x_) / TILE_SIZE;
  int start_y = (y + column_y_) / TILE_SIZE;

  int end_x = ((x + column_x_) + width_ - column_width_ - 1) / TILE_SIZE;
  int end_y = ((x + column_y_) + height_ - column_height_ - 1) / TILE_SIZE;

  for (int i_y = start_y; i_y < end_y; i_y++)
    {
      for (int i_x = start_x; i_x < end_x; i_x++)
      {
        Tile *tile = MapManager::map_control_.get_tile(i_x * TILE_SIZE,
                             i_y * TILE_SIZE);
        if (valid_pos_tile(tile) == false)
          {
            _return = false;
          }
      }
    }

  if (flags_ & ENTITY_FLAG_MAPONLY)
    {
    }
  else
    {
      for (int i = 0; i < entity_list_.size(); i++)
      {
        if (!valid_pos_entity(entity_list_[i], x, y))
          {
            _return = false;
          }
      }
    }

  return _return;
}

bool valid_pos(Tile *t)
{
  if (t == NULL)
    {
      return true;
    }

  if (tile->type_id_ == TILE_TYPE_BLOCK)
    {
      return false;
    }

  return true;
}

bool valid_pos(Entity *e, int x, int y)
{
  if ((this != e) && (e != NULL) && (e->dead_ == false) &&
      (e->flags_ ^ ENTITY_FLAG_MAPONLY) &&
      (e->collides(x + column_x, y + column_y,
          width_ - column_width_ - 1,
           height_ - column_height_ - 1) == true))
    {
      EntityCollision ec;
      ec.a_ = this;
      ec.b_ = e;

      EntityCollision::collision_list_.push_back(ec);
      return false;
    }

  return true;
}

thanks

edit: i don't know why some of the indentation broke. fixing it now.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
  image_buffer_ = NULL; // just set it to null if it doesn't :
}

Placing a backslash at the end of a line splices it with the line that follows, which, effectively, comments out the closing bracket in your function.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...