Я создаю свою первую игру на 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
Ryan Swann 24 Фев 2016 в 11:45

2 ответа

Лучший ответ

Класс Enemy имеет два константных члена, поэтому оператор присваивания не может быть сгенерирован для этого класса компилятором и определяется как удаленный (следовательно, возникает ошибка «удаленная функция»).

1
Mohammad 24 Фев 2016 в 09:26

Вы начинаете свой цикл с for (int enemy = 0; enemy < enemies.size(); enemy++), но внутри цикла вы вызываете enemies.erase(enemies.begin() + enemy);, что означает, что индекс цикла теперь недействителен. Вы начали с вектора размера враги.size (), но вы изменили его размер, вызвав стирание в своем цикле

1
systemcpro 24 Фев 2016 в 08:54