Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
EruRorato
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 22
#1

Необработанное исключение - C++

06.03.2014, 22:21. Просмотров 432. Ответов 2
Метки нет (Все метки)

Добрый день!
разобравшись с предыдущими ошибками, я столкнулся с новой.
содержимое:
Level.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef LEVEL_H
#define LEVEL_H
 
#pragma comment(lib,"Box2D.lib")
#pragma comment(lib,"sfml-graphics.lib")
#pragma comment(lib,"sfml-window.lib")
#pragma comment(lib,"sfml-system.lib")
 
#include <string>
#include <vector>
#include <map>
#include <SFML/Graphics.hpp>
 
 
struct Object
{
    int GetPropertyInt(std::string name);
    float GetPropertyFloat(std::string name);
    std::string GetPropertyString(std::string name);
 
    std::string name;
    std::string type;
    sf::Rect<int> rect;
    std::map<std::string, std::string> properties;
 
    sf::Sprite sprite;
};
 
struct Layer
{
    int opacity;
    std::vector<sf::Sprite> tiles;
};
 
class Level
{
public:
    bool LoadFromFile(std::string filename);
    Object GetObject(std::string name);
    std::vector<Object> GetObjects(std::string name);
    void Draw(sf::RenderWindow &window);
    sf::Vector2i GetTileSize();
 
private:
    int width, height, tileWidth, tileHeight;
    int firstTileID;
    sf::Rect<float> drawingBounds;
    sf::Texture tilesetImage;
    std::vector<Object> objects;
    std::vector<Layer> layers;
};
 
#endif

Level.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
#include "level.h"
 
#include <iostream>
#include "tinyxml.h"
 
 
int Object::GetPropertyInt(std::string name)
{
    return atoi(properties[name].c_str());
}
 
float Object::GetPropertyFloat(std::string name)
{
    return strtod(properties[name].c_str(), NULL);
}
 
std::string Object::GetPropertyString(std::string name)
{
    return properties[name];
}
 
bool Level::LoadFromFile(std::string filename)
{
    TiXmlDocument levelFile(filename.c_str());
 
    // Загружаем XML-карту
    if(!levelFile.LoadFile())
    {
        std::cout << "Loading level \"" << filename << "\" failed." << std::endl;
        return false;
    }
 
    // Работаем с контейнером map
    TiXmlElement *map;
    map = levelFile.FirstChildElement("map");
 
    // Пример карты: <map version="1.0" orientation="orthogonal"
    // width="10" height="10" tilewidth="34" tileheight="34">
    width = atoi(map->Attribute("width"));
    height = atoi(map->Attribute("height"));
    tileWidth = atoi(map->Attribute("tilewidth"));
    tileHeight = atoi(map->Attribute("tileheight"));
 
    // Берем описание тайлсета и идентификатор первого тайла
    TiXmlElement *tilesetElement;
    tilesetElement = map->FirstChildElement("tileset");
    firstTileID = atoi(tilesetElement->Attribute("firstgid"));
 
    // source - путь до картинки в контейнере image
    TiXmlElement *image;
    image = tilesetElement->FirstChildElement("image");
    std::string imagepath = image->Attribute("source");
 
    // Пытаемся загрузить тайлсет
    sf::Image img;
 
    if(!img.loadFromFile(imagepath))
    {
        std::cout << "Failed to load tile sheet." << std::endl;
        return false;
    }
 
    // Очищаем карту от света (109, 159, 185)
    // Вообще-то в тайлсете может быть фон любого цвета, но я не нашел решения, как 16-ричную строку
    // вроде "6d9fb9" преобразовать в цвет
    img.createMaskFromColor(sf::Color(109, 159, 185));
    // Грузим текстуру из изображения
    tilesetImage.loadFromImage(img);
    // Расплывчатость запрещена
    tilesetImage.setSmooth(false);
 
    // Получаем количество столбцов и строк тайлсета
    int columns = tilesetImage.getSize().x / tileWidth;
    int rows = tilesetImage.getSize().y / tileHeight;
 
    // Вектор из прямоугольников изображений (TextureRect)
    std::vector<sf::Rect<int>> subRects;
 
    for(int y = 0; y < rows; y++)
    for(int x = 0; x < columns; x++)
    {
        sf::Rect<int> rect;
 
        rect.top = y * tileHeight;
        rect.height = tileHeight;
        rect.left = x * tileWidth;
        rect.width = tileWidth;
 
        subRects.push_back(rect);
    }
 
    // Работа со слоями
    TiXmlElement *layerElement;
    layerElement = map->FirstChildElement("layer");
    while(layerElement)
    {
        Layer layer;
        
        // Если присутствует opacity, то задаем прозрачность слоя, иначе он полностью непрозрачен
        if (layerElement->Attribute("opacity") != NULL)
        {
            float opacity = strtod(layerElement->Attribute("opacity"), NULL);
            layer.opacity = 255 * opacity;
        }
        else
        {
            layer.opacity = 255;
        }
 
        // Контейнер <data>
        TiXmlElement *layerDataElement;
        layerDataElement = layerElement->FirstChildElement("data");
 
        if(layerDataElement == NULL)
        {
            std::cout << "Bad map. No layer information found." << std::endl;
        }
 
        // Контейнер <tile> - описание тайлов каждого слоя
        TiXmlElement *tileElement;
        tileElement = layerDataElement->FirstChildElement("tile");
 
        if(tileElement == NULL)
        {
            std::cout << "Bad map. No tile information found." << std::endl;
            return false;
        }
 
        int x = 0;
        int y = 0;
 
        while(tileElement)
        {
            int tileGID = atoi(tileElement->Attribute("gid"));
            int subRectToUse = tileGID - firstTileID;
 
            // Устанавливаем TextureRect каждого тайла
            if (subRectToUse >= 0)
            {
                sf::Sprite sprite;
                sprite.setTexture(tilesetImage);
                sprite.setTextureRect(subRects[subRectToUse]);
                sprite.setPosition(x * tileWidth, y * tileHeight);
                sprite.setColor(sf::Color(255, 255, 255, layer.opacity));
 
                layer.tiles.push_back(sprite);
            }
 
            tileElement = tileElement->NextSiblingElement("tile");
 
            x++;
            if (x >= width)
            {
                x = 0;
                y++;
                if(y >= height)
                    y = 0;
            }
        }
 
        layers.push_back(layer);
 
        layerElement = layerElement->NextSiblingElement("layer");
    }
 
    // Работа с объектами
    TiXmlElement *objectGroupElement;
 
    // Если есть слои объектов
    if (map->FirstChildElement("objectgroup") != NULL)
    {
        objectGroupElement = map->FirstChildElement("objectgroup");
        while (objectGroupElement)
        {
            // Контейнер <object>
            TiXmlElement *objectElement;
            objectElement = objectGroupElement->FirstChildElement("object");
           
            while(objectElement)
            {
                // Получаем все данные - тип, имя, позиция, etc
                std::string objectType;
                if (objectElement->Attribute("type") != NULL)
                {
                    objectType = objectElement->Attribute("type");
                }
                std::string objectName;
                if (objectElement->Attribute("name") != NULL)
                {
                    objectName = objectElement->Attribute("name");
                }
                int x = atoi(objectElement->Attribute("x"));
                int y = atoi(objectElement->Attribute("y"));
 
                int width, height;
 
                sf::Sprite sprite;
                sprite.setTexture(tilesetImage);
                sprite.setTextureRect(sf::Rect<int>(0,0,0,0));
                sprite.setPosition(x, y);
 
                if (objectElement->Attribute("width") != NULL)
                {
                    width = atoi(objectElement->Attribute("width"));
                    height = atoi(objectElement->Attribute("height"));
                }
                else
                {
                    width = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].width;
                    height = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].height;
                    sprite.setTextureRect(subRects[atoi(objectElement->Attribute("gid")) - firstTileID]);
                }
 
                // Экземпляр объекта
                Object object;
                object.name = objectName;
                object.type = objectType;
                object.sprite = sprite;
 
                sf::Rect <int> objectRect;
                objectRect.top = y;
                objectRect.left = x;
                objectRect.height = height;
                objectRect.width = width;
                object.rect = objectRect;
 
                // "Переменные" объекта
                TiXmlElement *properties;
                properties = objectElement->FirstChildElement("properties");
                if (properties != NULL)
                {
                    TiXmlElement *prop;
                    prop = properties->FirstChildElement("property");
                    if (prop != NULL)
                    {
                        while(prop)
                        {
                            std::string propertyName = prop->Attribute("name");
                            std::string propertyValue = prop->Attribute("value");
 
                            object.properties[propertyName] = propertyValue;
 
                            prop = prop->NextSiblingElement("property");
                        }
                    }
                }
 
                // Пихаем объект в вектор
                objects.push_back(object);
 
                objectElement = objectElement->NextSiblingElement("object");
            }
            objectGroupElement = objectGroupElement->NextSiblingElement("objectgroup");
        }
    }
    else
    {
        std::cout << "No object layers found..." << std::endl;
    }
 
    return true;
}
 
Object Level::GetObject(std::string name)
{
    // Только первый объект с заданным именем
    for (int i = 0; i < objects.size(); i++)
        if (objects[i].name == name)
            return objects[i];
}
 
std::vector<Object> Level::GetObjects(std::string name)
{
    // Все объекты с заданным именем
    std::vector<Object> vec;
    for(int i = 0; i < objects.size(); i++)
        if(objects[i].name == name)
            vec.push_back(objects[i]);
 
    return vec;
}
 
sf::Vector2i Level::GetTileSize()
{
    return sf::Vector2i(tileWidth, tileHeight);
}
 
void Level::Draw(sf::RenderWindow &window)
{
    // Рисуем все тайлы (объекты НЕ рисуем!)
    for(int layer = 0; layer < layers.size(); layer++)
        for(int tile = 0; tile < layers[layer].tiles.size(); tile++)
            window.draw(layers[layer].tiles[tile]);
}

main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include "level.h"
#include <Box2D\Box2D.h>
 
#include <iostream>
#include <random>
 
Object player;
b2Body* playerBody;
 
std::vector<Object> coin;
std::vector<b2Body*> coinBody;
 
std::vector<Object> enemy;
std::vector<b2Body*> enemyBody;
 
int main()
{
    srand(time(NULL));
 
    Level lvl;
    lvl.LoadFromFile("map4.tmx");
 
 
    b2Vec2 gravity(0.0f, 1.0f);
    b2World world(gravity);
 
    sf::Vector2i tileSize = lvl.GetTileSize();
 
    std::vector<Object> block = lvl.GetObjects("block");
    for(int i = 0; i < block.size(); i++)
    {
        b2BodyDef bodyDef;
        bodyDef.type = b2_staticBody;
        bodyDef.position.Set(block[i].rect.left + tileSize.x / 2 * (block[i].rect.width / tileSize.x - 1),
            block[i].rect.top + tileSize.y / 2 * (block[i].rect.height / tileSize.y - 1));
        b2Body* body = world.CreateBody(&bodyDef);
        b2PolygonShape shape;
        shape.SetAsBox(block[i].rect.width / 2, block[i].rect.height / 2);
        body->CreateFixture(&shape,1.0f);
    }
 
    coin = lvl.GetObjects("coin");
    for(int i = 0; i < coin.size(); i++)
    {
        b2BodyDef bodyDef;
        bodyDef.type = b2_dynamicBody;
        bodyDef.position.Set(coin[i].rect.left + tileSize.x / 2 * (coin[i].rect.width / tileSize.x - 1),
            coin[i].rect.top + tileSize.y / 2 * (coin[i].rect.height / tileSize.y - 1));
        bodyDef.fixedRotation = true;
        b2Body* body = world.CreateBody(&bodyDef);
        b2PolygonShape shape;
        shape.SetAsBox(coin[i].rect.width / 2, coin[i].rect.height / 2);
        body->CreateFixture(&shape,1.0f);
        coinBody.push_back(body);
    }
 
    enemy = lvl.GetObjects("enemy");
    for(int i = 0; i < enemy.size(); i++)
    {
        b2BodyDef bodyDef;
        bodyDef.type = b2_dynamicBody;
        bodyDef.position.Set(enemy[i].rect.left +
            tileSize.x / 2 * (enemy[i].rect.width / tileSize.x - 1),
            enemy[i].rect.top + tileSize.y / 2 * (enemy[i].rect.height / tileSize.y - 1));
        bodyDef.fixedRotation = true;
        b2Body* body = world.CreateBody(&bodyDef);
        b2PolygonShape shape;
        shape.SetAsBox(enemy[i].rect.width / 2, enemy[i].rect.height / 2);
        body->CreateFixture(&shape,1.0f);
        enemyBody.push_back(body);
    }
 
 
    player = lvl.GetObject("player");
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(player.rect.left, player.rect.top);
    bodyDef.fixedRotation = true;
    playerBody = world.CreateBody(&bodyDef);
    b2PolygonShape shape; shape.SetAsBox(player.rect.width / 2, player.rect.height / 2);
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &shape;
    fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f;
    playerBody->CreateFixture(&fixtureDef);
 
 
 
    sf::Vector2i screenSize(800, 600);
 
    sf::RenderWindow window;
    window.create(sf::VideoMode(screenSize.x, screenSize.y), "Game");
 
 
    sf::View view;
    view.reset(sf::FloatRect(0.0f, 0.0f, screenSize.x, screenSize.y));
    view.setViewport(sf::FloatRect(0.0f, 0.0f, 2.0f, 2.0f));
 
    while(window.isOpen())
    {
        sf::Event evt;
 
        while(window.pollEvent(evt))
        {
            switch(evt.type)
            {
            case sf::Event::Closed:
                window.close();
                break;
 
            case sf::Event::KeyPressed:
                if(evt.key.code == sf::Keyboard::W && playerBody->GetLinearVelocity().y == 0)
                    playerBody->SetLinearVelocity(b2Vec2(0.0f, -15.0f));
 
                if(evt.key.code == sf::Keyboard::D)
                    playerBody->SetLinearVelocity(b2Vec2(5.0f, 0.0f));
 
                if(evt.key.code == sf::Keyboard::A)
                    playerBody->SetLinearVelocity(b2Vec2(-5.0f, 0.0f));
                break;
            }
        }
 
        world.Step(1.0f / 60.0f, 1, 1);
 
 
        for(b2ContactEdge* ce = playerBody->GetContactList(); ce; ce = ce->next)
        {
            b2Contact* c = ce->contact;
            
            for(int i = 0; i < coinBody.size(); i++)
                if(c->GetFixtureA() == coinBody[i]->GetFixtureList())
                {
                    coinBody[i]->DestroyFixture(coinBody[i]->GetFixtureList());
                    coin.erase(coin.begin() + i);
                    coinBody.erase(coinBody.begin() + i);
                }
 
            for(int i = 0; i < enemyBody.size(); i++)
                if(c->GetFixtureA() == enemyBody[i]->GetFixtureList())
                {
                    if(playerBody->GetPosition().y < enemyBody[i]->GetPosition().y)
                    {
                        playerBody->SetLinearVelocity(b2Vec2(0.0f, -10.0f));
 
                        enemyBody[i]->DestroyFixture(enemyBody[i]->GetFixtureList());
                        enemy.erase(enemy.begin() + i);
                        enemyBody.erase(enemyBody.begin() + i);
                    }
                    else
                    {
                        int tmp = (playerBody->GetPosition().x < enemyBody[i]->GetPosition().x)
                            ? -1 : 1;
                        playerBody->SetLinearVelocity(b2Vec2(10.0f * tmp, 0.0f));
                    }
                }
        }
 
        for(int i = 0; i < enemyBody.size(); i++)
        {
            if(enemyBody[i]->GetLinearVelocity() == b2Vec2_zero)
            {
                int tmp = (rand() % 2 == 1) ? 1 : -1;
                enemyBody[i]->SetLinearVelocity(b2Vec2(5.0f * tmp, 0.0f));
            }
        }
 
 
        b2Vec2 pos = playerBody->GetPosition();
        view.setCenter(pos.x + screenSize.x / 4, pos.y + screenSize.y / 4);
        window.setView(view);
 
        player.sprite.setPosition(pos.x, pos.y);
 
        for(int i = 0; i < coin.size(); i++)
            coin[i].sprite.setPosition(coinBody[i]->GetPosition().x, coinBody[i]->GetPosition().y);
 
        for(int i = 0; i < enemy.size(); i++)
            enemy[i].sprite.setPosition(enemyBody[i]->GetPosition().x, enemyBody[i]->GetPosition().y);
 
        window.clear();
 
        lvl.Draw(window);
 
        window.draw(player.sprite);
 
        for(int i = 0; i < coin.size(); i++)
            window.draw(coin[i].sprite);
 
        for(int i = 0; i < enemy.size(); i++)
            window.draw(enemy[i].sprite);
 
        window.display();
    }
 
    return 0;
}

Список дополнительных зависимостей компоновщика
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sfml-audio-s-d.lib
sfml-audio-s.lib
sfml-audio-d.lib
sfml-audio.lib
sfml-window-s-d.lib
sfml-window-s.lib
sfml-window-d.lib
sfml-window.lib
sfml-system-s-d.lib
sfml-system-s.lib
sfml-system-d.lib
sfml-system.lib
sfml-network-s-d.lib
sfml-network-s.lib
sfml-network-d.lib
sfml-network.lib
sfml-main-d.lib
sfml-main.lib
sfml-graphics-s-d.lib
sfml-graphics-s.lib
sfml-graphics-d.lib
sfml-graphics.lib
tinyxml.lib

Запускаю отладку, после чего получаю сообщение об ошибке необработанного исключения(скриншот прилагаю). Какой участок кода вызывает данную ошибку, и как ее устранить? Заранее благодарю за помощь. (использую Visual studio 2012, Box2D, SFML, tinyXML)
Миниатюры
Необработанное исключение  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2014, 22:21     Необработанное исключение
Посмотрите здесь:

Необработанное исключение - C++
есть программный код на поиск самой длинной последовательности чисел в файле с последующим её копированием в другой файл #include...

Необработанное исключение - C++
Здравствуйте! Задачу см. во вложениях. Мой код: заголовочный файл: #include &lt;string&gt; #include &lt;iostream&gt; using...

Необработанное исключение - C++
Здравствуйте. При запуске программы возникает проблема: &quot;Необработанное исключение по адресу 0x00035E17 в ConsoleApplication1.exe:...

Необработанное исключение - C++
Здравствуйте! При полном заполнении массива пятью значениями, программа зависает ненадолго, и выскакивает ошибка (см.вложение). Такжево...

Необработанное исключение - C++
При компиляции кода #include &lt;fstream&gt; const int block_size = 8; const int char_size = 8; const int conversions = 8; const int...

Необработанное исключение - C++
Здравствуйте. Нужно добавить в готовый класс свои функции из предыдущих работ. Все добавил, но при вызове функции &quot;cdd&quot; вылезает ошибка...

Необработанное исключение - C++
Всем привет! Совсем недавно начал писать на C++. Делаю курсовую работу. Программа моделирует процесс и полученные значения записывает...

Необработанное исключение - C++
Доброго времени суток. Ошибка: Необработанное исключение типа &quot;System.Resources.MissingManifestResourceException&quot; в mscorlib.dll ...

Необработанное исключение - C++
Здравствуйте. Подскажите, в чем может быть ошибка в этой строке? view-&gt;web_view()-&gt;Resize(LOWORD(lParam), HIWORD(lParam)); VS 2013...

Ошибка: необработанное исключение - C++
int Kramer(int **M, int n, int det, int *ravno) { int **res = new int*; int **submatr = new int*; for(int i = 0; i &lt; n; i++) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.03.2014, 22:25     Необработанное исключение #2
Цитата Сообщение от EruRorato Посмотреть сообщение
Какой участок кода вызывает данную ошибку, и как ее устранить?
Ставьте точки останова и выясняйте какой участок кода.
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
07.03.2014, 10:09     Необработанное исключение #3
данная ошибка как правило обращение по не инициализированному указателю, ищите такие обращения и проверяйте
Yandex
Объявления
07.03.2014, 10:09     Необработанное исключение
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru