Задать вопрос
Dimpik
@Dimpik

Ошибка в игре на Qt (C++) Аварийное завершение, как решить?

Создавал игру, вышла ошибка. Код ошибки :
The program has unexpectedly finished.
The process was ended forcefully.
build-SpaceRangers-Desktop_Qt_5_15_1_MSVC2015_64bit-Debug\debug\SpaceRangers.exe crashed.

Код игры :

View.h

#pragma once

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QObject>

#include "player.h"
#include "virus.h"
#include "laserbullet.h"

class View :public QGraphicsView
{
public:
    View();
    void view_elements();
    QList<QGraphicsItem*> Viruses;
    void viruspodMoving(QGraphicsItem *virus);
    void deleteVirus(QGraphicsItem *virus);

public slots:
    void addVirus();
    void virusMov();
    void PlayerAttack();

private:
    QGraphicsScene mainScene;
    Player pl;
    Virus vir;
    LaserBullet lb;
    View *v;
    QTimer     *timer; // Таймер
    QTimer *createVirus;
    QTimer *vm;
    Virus *vc;
};


View.cpp

#include "view.h"
#include "player.h"

#include <QObject>
#include <QTimer>
#include <QtGlobal>

View::View()
{

    setWindowTitle("Space Rangers");

    setRenderHint(QPainter::Antialiasing);

    setFrameStyle(0);
    setSceneRect(0, 0, 600,700);
    setFixedSize(600, 700);


    mainScene.setItemIndexMethod(QGraphicsScene::NoIndex);
    setScene(&mainScene);

    connect(&pl, &Player::IS_IT_Attack, this, &View::PlayerAttack);

    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, &pl, &Player::actions);
    timer->start(1000 / 50);
    view_elements();

    vm = new QTimer(this);
    connect(vm, &QTimer::timeout, this, &View::virusMov);

    createVirus = new QTimer(this);
    connect(createVirus, &QTimer::timeout, this, &View::addVirus);
    createVirus->start(30000);

}

void View::view_elements(){

    pl.setPos(205, 400);
    mainScene.addItem(&pl);
}

void View::addVirus(){

    Virus *virus = new Virus();
    vc = virus;
    mainScene.addItem(virus);
    virus->x = ((int)rand()/(420));
    virus->setPos(vir.x, 0);
    Viruses.append(virus);
    viruspodMoving(virus);

}

void View::deleteVirus(QGraphicsItem *virus){

    foreach(QGraphicsItem *v, Viruses){
        if(v == virus){
            mainScene.removeItem(v);
            Viruses.removeOne(v);
            delete vc;
            vir.y = 0;
        }
    }

    createVirus->start(30000);
}

void View::viruspodMoving(QGraphicsItem *virus){

    if(vir.y < 671){
        emit vm->start(100);
    }

    if(vir.y >= 670){
        deleteVirus(virus);
    }

}

void View::virusMov(){

    if(vir.y < 671){
        vir.y = vir.y + 4;
        vc->setPos(vir.x, vir.y);
        viruspodMoving(vc);
       
  }

}

void View::PlayerAttack(){

    LaserBullet *bullet = new LaserBullet();
    LaserBullet *bullet2 = new LaserBullet();
    lb.x = pl.x + 41;
    lb.y = pl.y - 32;
    lb.x2 = pl.x + 25;
    lb.y2 = pl.y - 32;
    bullet->setPos(lb.x, lb.y);
    mainScene.addItem(bullet);
    bullet2->setPos(lb.x2, lb.y2);
    mainScene.addItem(bullet2);
}


Virus.h

#pragma once

#include <QtWidgets>
#include <QGraphicsItem>

class Virus: public QObject, public QGraphicsItem
{
    Q_OBJECT

public:
    Virus(QObject *parent = 0);
    ~Virus();
    int vWidth = 70;
    int vHeigth = 55;
    int x = 0;
    int y = 0;


signals:
    void checkVirus(QGraphicsItem *item);


private:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) override;
    QRectF boundingRect() const override;
    QPixmap *VirusImage;

};


Virus.cpp

+
#include "virus.h"
#include "view.h"

Virus::Virus(QObject *parent):QObject(parent), QGraphicsItem()
{
    VirusImage = new QPixmap();
    VirusImage->load(":/Virus.png");
}

Virus::~Virus(){

}

QRectF Virus::boundingRect() const{

    return QRectF(0, 0, vWidth, vHeigth);
}

void Virus::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget){

    painter->drawPixmap(0, 0, vWidth, vHeigth, *VirusImage);
    Q_UNUSED(option);
    Q_UNUSED(widget);

}
  • Вопрос задан
  • 518 просмотров
Подписаться 1 Простой 1 комментарий
Ответ пользователя Wataru К ответам на вопрос (1)
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Запустите в дебаггере. Где-то обращаетесь по нулевому адресу, или выходите за границу массива, или на 0 делите. Так по простыне кода не поймешь, в чем проблема. Скорее всего забыли где-то создать объект.

Дебаггер покажет конкретную позицию, где произошла ошибка. Там уже, видя, какая переменная некоректна надо смотреть логику вокруг нее.
Ответ написан