SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Программа закрывается сама.
В этой теме 2 ответа, 2 участника, последнее обновление Павел Букреев 8 года/лет, 3 мес. назад.
-
АвторСообщения
-
Кто нибудь сталкивался с самовольным закрытием вашей игры на SFML?
Вот у меня уже не первый раз такое наблюдается. Начал отслеживать в каких ситуациях это происходит.Итак ситуация первая (Логически необъяснимая), игра закрывается когда курсор подвожу к левому нижнему краю экрана, не до конца, 10% не доходя до края, даже нажимать ничего не надо. Там ничего нет, нет ни кнопок, ни активных объектов которые я программировал.
При этом компилятор говорит о завершении программы с кодом 0x0 (без ошибок).
Но есть подозрительная строка:
Первый этап обработки исключения по адресу 0x74DC812F (KernelBase.dll) в SFML Game.exe: 0x000006C6: Неверные границы массива.Как отследить что это такое?
xxx.h
C++12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091#pragma once#include"Hero.h"#include<iostream>class PickHeroMenuObjects;class PickHeroMenu : public Hero{public:PickHeroMenu(sf::String F, float W, float H, float X, float Y);void IsCheck(bool);bool GetIsCheck(void) const;void IsPick(void);virtual void UpdateEvent(sf::Event &Event, sf::RenderWindow &window, sf::Vector2f &CursorGlobalPosition, PickHeroMenuObjects &obj);virtual void UpdateTime(float &time, sf::RenderWindow &window, sf::Vector2f &CursorGlobalPosition, PickHeroMenuObjects &obj);PickHeroMenu();~PickHeroMenu(void);private:float cr, cg, cb;bool isCheck;bool isClick, isRelease;bool isEnable;bool isPick;bool isMaxScale;bool pick;};class PickHeroMenuObjects{public:std:: vector <PickHeroMenu*> HeroIcons;std:: vector <PickHeroMenu*> Balls;std:: vector <PickHeroMenu*>:: iterator vIter;PickHeroMenu *ButtonPickHero;PickHeroMenu *ButtonRandom;PickHeroMenu *ButtonMainMenu;PickHeroMenu *CheckGlow;PickHeroMenu *Description;PickHeroMenu *BackGround;PickHeroMenuObjects(){float sx = (float)GetSystemMetrics( SM_CXSCREEN ); float sy = (float)GetSystemMetrics( SM_CYSCREEN );setlocale(LC_ALL,"rus");ButtonPickHero = (new PickHeroMenu( "ButtonPickHero.png", sx*.3, sy*.1, sx*.84, sy*.68));ButtonRandom = (new PickHeroMenu( "ButtonRandom.png", sx*.3, sy*.1, sx*.84, sy*.79 ));ButtonMainMenu = (new PickHeroMenu( "ButtonMainMenu.png",sx*.3, sy*.1, sx*.84, sy*.9 ));CheckGlow = (new PickHeroMenu( "PickHeroCheckGlow.png", sx*.2, sx*.2, 0, 0 ));Description = (new PickHeroMenu( "PickHeroDescription.png", sx*.3, sy*.6, sx*.84, sy*.31 ));BackGround = (new PickHeroMenu( "PickHeroBackGround.png", sx, sy, sx/2, sy/2 ));std::cout << "Загрузка фона и кнопок завершена.\n";HeroIcons.push_back( new PickHeroMenu ( "HeroGruntIco.png", 100, 100, sx*.125, sy*.13*0 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroOgreIco.png", 100, 100, sx*.125, sy*.13*1 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroPaladinIco.png", 100, 100, sx*.125, sy*.13*2 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroRickIco.png", 100, 100, sx*.125, sy*.13*3 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroTaurenIco.png", 100, 100, sx*.125, sy*.13*4 + (sy*.25)));std::cout << "Загрузка героев силы завершена.\n";HeroIcons.push_back( new PickHeroMenu ( "HeroWolfIco.png", 100, 100, sx*.285, sy*.13*0 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroMartellaIco.png", 100, 100, sx*.285, sy*.13*1 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroPunisherIco.png", 100, 100, sx*.285, sy*.13*2 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroSatyrIco.png", 100, 100, sx*.285, sy*.13*3 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroXimusIco.png", 100, 100, sx*.285, sy*.13*4 + (sy*.25)));std::cout << "Загрузка героев ловкости завершена.\n";HeroIcons.push_back( new PickHeroMenu ( "HeroJainaIco.png", 100, 100, sx*.450, sy*.13*0 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroMaryIco.png", 100, 100, sx*.450, sy*.13*1 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroSuccubIco.png", 100, 100, sx*.450, sy*.13*2 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroTreantIco.png", 100, 100, sx*.450, sy*.13*3 + (sy*.25)));HeroIcons.push_back( new PickHeroMenu ( "HeroWarlockIco.png", 100, 100, sx*.450, sy*.13*4 + (sy*.25)));std::cout << "Загрузка героев разума завершена.\n";std::srand(time(0));int elem = 0;for(int i = 0; i < 300; ++i){int px = rand()%(int)sx;int py = rand()%(int)sy;int sz = rand()%20+10;Balls.push_back( new PickHeroMenu ( "FlyBall.png", sz, sz, px, py ));elem++;}std::cout << "Загрузка STL завершена. Загружено " << elem << " объектов.\n";std::cout << "Открываем окно. Запуск игры!\n";}};xxx.cpp
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113#include "PickHeroMenu.h"typedef PickHeroMenu PHM;void PHM::IsCheck(bool b) { PHM::isCheck = b; }bool PHM::GetIsCheck() const { return PHM::isCheck; }PHM::PickHeroMenu(sf::String F, float W, float H, float X, float Y){Rect::x = X; Rect::y = Y;width = W; height = H;sf::Vector2f size(width,height);rect.setSize(size);file = "Textures/PickHeroMenu/"+F;texture.loadFromFile(file);rect.setTexture(&texture);rect.setOrigin( width / 2, height / 2 );rect.setPosition(Rect::x,Rect::y);speed = 0;isCheck = false; isMaxScale = false; isClick = false; isRelease = false; pick = false;cr = rand()% 255+1, cg = rand()% 255+1, cb = rand()% 255+1;}void PHM::UpdateEvent(sf::Event &Event, sf::RenderWindow &window, sf::Vector2f &CGPos, PickHeroMenuObjects &obj){switch(Event.type) {case sf::Event::MouseButtonPressed : // Если клавиша мышки нажатаif(Event.key.code == sf::Mouse::Left) { // И это левая кнопкаfor(obj.vIter = obj.HeroIcons.begin(); obj.vIter < obj.HeroIcons.end(); obj.vIter++) { // Проходим циклом по иконкам персонажейif( (*obj.vIter) -> rect.getGlobalBounds().contains( CGPos ) == true ) { // Если курсор на одной из иконок(*obj.vIter) -> isCheck = true; // Устанавливаем чек на выбранного персонажаobj.CheckGlow -> rect.setPosition( (*obj.vIter) -> rect.getPosition().x, (*obj.vIter) -> rect.getPosition().y ); // Устанавливаем спецэффект выбора на выбранную иконку}else if( obj.ButtonPickHero -> rect.getGlobalBounds().contains( CGPos ) == false ) // Иначе, если курсор НЕ на кнопке "Выбрать героя"(*obj.vIter) -> isCheck = false; // Отменяем чек на выбранного персонажаif( obj.ButtonPickHero -> rect.getGlobalBounds().contains( CGPos ) == true ){ // Если курсор на кнопке "Выбрать героя"obj.ButtonPickHero -> isClick = true; // Фиксируем клик на кнопке "Выбрать героя"obj.ButtonPickHero -> rect.setScale(0.95, 0.95);}}}break;case sf::Event::MouseButtonReleased : // Если клавиша мышки отпущенаif(Event.key.code == sf::Mouse::Left) { // И это левая кнопкаobj.ButtonPickHero -> rect.setScale(1, 1);obj.ButtonMainMenu -> rect.setScale(1, 1);obj.ButtonRandom -> rect.setScale(1, 1);if((obj.ButtonPickHero) -> rect.getGlobalBounds().contains( CGPos ) == true // Если курсор на кнопке "Выбрать героя"&& (obj.ButtonPickHero) -> isClick == true) // И зафиксирован клик на кнопке "Выбрать героя"for(obj.vIter = obj.HeroIcons.begin(); obj.vIter < obj.HeroIcons.end(); obj.vIter++) { // То проходим циклом по иконкам персонажейif( (*obj.vIter) -> isCheck == true) { // Если установлен чек(*obj.vIter) -> rect.setFillColor(sf::Color( 100, 255, 100 )); // Красим иконку (Далее другие действия)(*obj.vIter) -> pick = true;}}}break;}}void PHM::UpdateTime(float &time, sf::RenderWindow &window, sf::Vector2f &CGPos, PickHeroMenuObjects &obj){float sx = (float)GetSystemMetrics( SM_CXSCREEN ), sy = (float)GetSystemMetrics( SM_CYSCREEN );srand(time);window.draw( obj.BackGround->rect ); // Отображаем фонfor(obj.vIter = obj.Balls.begin(); obj.vIter != obj.Balls.end(); obj.vIter++) { // Проходим циклом по летающим пузырькам(*obj.vIter) -> speed = rand() % 8 + 1; // Устанавливаем скорость движения(*obj.vIter) -> speed /= 50; // Устанавливаем скорость движения(*obj.vIter) -> rect.move( -(*obj.vIter) -> speed * 2.25, -(*obj.vIter) -> speed ); //Двигаем пузырьки(*obj.vIter) -> rect.setTextureRect(sf::IntRect( 0, 0, 120, 120 ));(*obj.vIter) -> rect.rotate( time * 0.1 );if( (*obj.vIter) -> rect.getPosition().x < -(*obj.vIter) -> rect.getSize().x) // Если позиция X ушла за пределы экрана(*obj.vIter) -> rect.setPosition( sx + (*obj.vIter) -> rect.getSize().x, (*obj.vIter) -> rect.getPosition().y ); // Возвращаем в начало Xif( (*obj.vIter) -> rect.getPosition().y < -(*obj.vIter) -> rect.getSize().x ) // Если позиция Y ушла за пределы экрана(*obj.vIter) -> rect.setPosition( (*obj.vIter) -> rect.getPosition().x, sy + (*obj.vIter) -> rect.getSize().y ); // Возвращаем в начало Yif((*obj.vIter) -> cr >= 255) (*obj.vIter) -> cr = 0; (*obj.vIter) -> cr += 0.05; // Переливающийся красный оттенокif((*obj.vIter) -> cg >= 255) (*obj.vIter) -> cg = 0; (*obj.vIter) -> cg += 0.05; // Переливающийся зелёный оттенокif((*obj.vIter) -> cb >= 255) (*obj.vIter) -> cb = 0; (*obj.vIter) -> cb += 0.05; // Переливающийся синий оттенок(*obj.vIter) -> rect.setFillColor(sf::Color((*obj.vIter) -> cr, (*obj.vIter) -> cg, (*obj.vIter) -> cb)); // Устанавливаем цвецwindow.draw( (*obj.vIter) -> rect ); // Отображаем пузырьки}// Меняем координаты текстуры при наведении курсора на кнопкиif ( obj.ButtonMainMenu -> rect.getGlobalBounds().contains( CGPos )) obj.ButtonMainMenu -> rect.setTextureRect( sf::IntRect( 0, 0, 512, 192 ));else obj.ButtonMainMenu -> rect.setTextureRect( sf::IntRect( 0, 192, 512, 192 ));if ( obj.ButtonPickHero -> rect.getGlobalBounds().contains( CGPos )) obj.ButtonPickHero -> rect.setTextureRect( sf::IntRect( 0, 0, 512, 192 ));else obj.ButtonPickHero -> rect.setTextureRect( sf::IntRect( 0, 192, 512, 192 ));if ( obj.ButtonRandom -> rect.getGlobalBounds().contains( CGPos )) obj.ButtonRandom -> rect.setTextureRect( sf::IntRect( 0, 0, 512, 192 ));else obj.ButtonRandom -> rect.setTextureRect( sf::IntRect( 0, 192, 512, 192 ));// Отображаем кнопкиwindow.draw( obj.ButtonMainMenu -> rect );window.draw( obj.ButtonPickHero -> rect );window.draw( obj.ButtonRandom -> rect );for(obj.vIter = obj.HeroIcons.begin(); obj.vIter != obj.HeroIcons.end(); obj.vIter++){ // Проходим циклом по иконкам персонажейif ( (*obj.vIter) -> rect.getGlobalBounds().contains( CGPos )) // Если курсор на иконке персонажа(*obj.vIter) -> rect.setScale( 1.25, 1.25 ); // Увеличиваем размер иконки на 25%else (*obj.vIter) -> rect.setScale( 1.0, 1.0 ); // Иначе возвращаем исходный размерif((*obj.vIter)->isCheck) { // Если зафиксирован чек на иконке персонажа(*obj.vIter) -> rect.setScale( 1.5, 1.5 ); // Увеличиваем размер иконки на 50%obj.CheckGlow -> rect.setTextureRect(sf::IntRect( 0, 0, 320, 320 )); window.draw( obj.CheckGlow -> rect );obj.CheckGlow -> rect.setTextureRect(sf::IntRect( 0, 320, 320, 320 )); window.draw( obj.CheckGlow -> rect );obj.CheckGlow -> rect.rotate( time * 0.05 ); // Вращаем спецэффект выбора}window.draw( (*obj.vIter) -> rect ); // Отображаем иконки персонажей}window.draw( obj.Description->rect ); // Отображаем панель для описания}PHM::PickHeroMenu() {}PHM::~PickHeroMenu(void) {}Очепятался в названии темы XD
бедный сомик )) исправил)
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.