我正在使用OOP在C ++ / SDL中构建我的第一个游戏,并且遇到了我在游戏的单个文件版本中没有的问题。
在检查碰撞时,如果检测到碰撞,我希望玩家激光和敌舰从我的数据结构中被摧毁但是我收到一个我无法解决的错误。
错误C2280。试图引用已删除的函数。
如果没有发布太多代码并试图让您更容易阅读,我已经包含了我认为必要的内容。 正在从具有保持敌人和激光的数据结构的函数调用'CheckCollisions'。
谢谢。
game.cpp
void Game::start(Display& display, Media& media, Player& player)
{
//Initialize SDL
if (!display.init())
{
printf("Failed to initailize.", SDL_GetError());
}
else
{
//Load all media
if (!media.load(display))
{
printf("Failed to load media", SDL_GetError());
}
else
{
SDL_Event e;
std::vector<Enemy> enemies; //Holds all enemies
std::vector<Laser> playerLasers; //Holds all of player lasers
//std::vector<Laser> enemyLasers; //Holds all of the enemy lasers
addEnemy(enemies); //Adds enemies to the game
//Begin game loop
while (!m_quit)
{
//Event management
while (SDL_PollEvent(&e) != 0)
{
if(e.type == SDL_KEYDOWN)
{
player.movement(e);
}
if (e.type == SDL_MOUSEBUTTONDOWN)
{
player.shoot(playerLasers);
}
}
//Movement
player.movementBounds();
moveLasers(playerLasers);
moveEnemies(enemies);
//Collision detection
checkCollisions(player, enemies, playerLasers);
//Render
display.render(media, player, enemies, playerLasers);
//Simulate 60 fps - Read on tutorial, not entirely sure if this is ok.
SDL_Delay(16);
}
}
}
}
bool Game::checkCollisions(Player& player, std::vector<Enemy>& enemies, std::vector<Laser>& playerLasers, int& enemyPos)
{
//Check for playerLaser/Enemy collision
for (int playerLaser = 0; playerLaser < playerLasers.size(); playerLaser++)
{
for (int enemy = 0; enemy < enemies.size(); enemy++)
{
//If collision has been detected, delete both playerLaser and Enemy
if (findPlayerLaserCollision(playerLasers[playerLaser], enemies[enemy]))
{
printf("Collision");
playerLasers.erase(playerLasers.begin() + playerLaser);
enemies.erase(enemies.begin() + enemy);
}
}
}
}
Enemy.h
#pragma once
#include <SDL.h>
#include "MoveDirection.h"
struct Enemy
{
Enemy(SDL_Rect pos, int movementSpeed, MoveDirection dir)
{
m_pos = pos;
m_movementSpeed = movementSpeed;
m_dir = dir;
}
SDL_Rect m_pos; //Position of enemy
int m_movementSpeed = 0; //Movement speed of enemy
MoveDirection m_dir; //Movement direction of enemy
const int MIN_X_POS = 0;
const int MAX_X_POS = 750;
};
Laser.h
#pragma once
#include <SDL.h>
#include "MoveDirection.h"
struct Laser
{
Laser(SDL_Rect pos, int movementSpeed, MoveDirection dir)
{
m_pos = pos;
m_movementSpeed = movementSpeed;
m_dir = dir;
}
SDL_Rect m_pos; //Position of enemy
int m_movementSpeed = 0; //Movement speed of enemy
MoveDirection m_dir; //Movement direction of enemy
};
答案 0 :(得分:1)
您使用for (int enemy = 0; enemy < enemies.size(); enemy++)
开始循环,但在循环内调用enemies.erase(enemies.begin() + enemy);
,这意味着循环索引现在无效。你开始使用大小为enemies.size()的向量,但是你通过在循环中调用erase来调整它的大小
答案 1 :(得分:1)
Enemy类有两个const成员,因此编译器无法为此类生成赋值运算符,并将其定义为已删除(因此会发生“已删除函数”错误)。