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);

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

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

Войдите, чтобы написать ответ

Похожие вопросы