【2D割草类游戏 - 04】一些技巧总结
总结一下这个项目中学到的一些技术
方向向量
在处理移动时,斜向移动会由于两个方向的速度叠加,变为设定速度的根号2倍
可以使用方向向量优化处理:
- 处理出移动速度的x与y分量
- 计算出向量长度
- 计算出单位长度的x与y方向分量(原始分量/向量长度)
- 再使用单位长度的方向分量乘以标准速度,并修改对象位置
如:
// 使用方向向量处理速度
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个元素:
- 使用swap函数交换第i个元素和末尾元素
- 使用popback方法删除末尾元素
- 使用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对象
评论区