目 录CONTENT

文章目录

【2D割草类游戏 - 04】一些技巧总结

千年的霜雪
2024-08-31 / 0 评论 / 0 点赞 / 13 阅读 / 0 字 / 正在检测是否收录...

【2D割草类游戏 - 04】一些技巧总结

总结一下这个项目中学到的一些技术

方向向量

在处理移动时,斜向移动会由于两个方向的速度叠加,变为设定速度的根号2倍

可以使用方向向量优化处理:

  1. 处理出移动速度的x与y分量
  2. 计算出向量长度
  3. 计算出单位长度的x与y方向分量(原始分量/向量长度)
  4. 再使用单位长度的方向分量乘以标准速度,并修改对象位置

如:

// 使用方向向量处理速度
int dir_x = is_move_right - is_move_left; // x分量
int dir_y = is_move_down - is_move_up; // y分量
double len_dir = sqrt(dir_x * dir_x + dir_y * dir_y); // 向量长度
if (len_dir != 0)
{
	double normalized_x = dir_x / len_dir;
	double normalized_y = dir_y / len_dir;
	position.x += (int)(SPEED * normalized_x);
	position.y += (int)(SPEED * normalized_y);
}

Vector容器中删除元素

对于不需要维护顺序的元素,可以使用以下方法删除第i个元素:

  1. 使用swap函数交换第i个元素和末尾元素
  2. 使用popback方法删除末尾元素
  3. 使用delete释放空间

如:

// 移除生命值归零的敌人
for (size_t i = 0; i < enemy_list.size(); i++)
{
	Enemy* enemy = enemy_list[i];
	if (!enemy->CheckAlive())
	{
		std::swap(enemy_list[i], enemy_list.back());
		enemy_list.pop_back();
		delete enemy;
	}
}

这里需要delete的原因:

  • enemy是一个局部变量指针,但它指向的是在堆上分配的Enemy对象
  • enemy_list 中的每个元素是 Enemy* 类型的指针,这些指针指向通过 new 操作符在堆上分配的Enemy对象
0

评论区