Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 02.08.2019
Сообщений: 17
1

Проблема с картой в Mario

15.08.2019, 19:04. Показов 1267. Ответов 4
Метки sfml (Все метки)

Делаю копию Марио на C++ SFML!!! Но когда добавляю в Map.h новую строку, чтобы увеличить высоту карты, программа вылетает

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
#include <SFML/Graphics.hpp>
#include "View.h"
#include "Map.h"
#include <windows.h>
 
using namespace sf;
 
 
class Player{
public:
    enum {stay, left, right, up, jump} state;
 
    bool isMove, onGround;
    float x, y, dx, dy, speed, moveTimer, currentFrame;
    int w, h, health;
    String name;
    Texture texture;
    Sprite sprite;
    Keyboard::Key lastKeyPressed=Keyboard::Left;
    Player(Image &image, String Name, float X, float Y, int W, int H){
        x=X; y=Y; w=W; h=H; name=Name; moveTimer=0; health=100;
        state=stay;
        isMove=false; onGround=false;
        currentFrame=0;
        texture.loadFromImage(image);
        sprite.setTexture(texture);
        sprite.setTextureRect(IntRect(0, 0, w, h));
        sprite.setOrigin(w/2, h/2);
    }
 
    void control(){
 
            if(Keyboard::isKeyPressed(Keyboard::Left)){
                lastKeyPressed=Keyboard::Left;
                state=left; speed=0.1;
            }
            if(Keyboard::isKeyPressed(Keyboard::Right)){
                lastKeyPressed=Keyboard::Right;
                state=right; speed=0.1;
            }
            if(Keyboard::isKeyPressed(Keyboard::Up) && onGround){
                state=jump; dy=-0.25; onGround=false;
 
 
            }
 
    }
 
    void checkCollisionWithMap(float Dx, float Dy){
        for(int i = y/16; i<(y+h)/16; i++){
            for(int j = x/16; j<(x+w)/16; j++){
                if(TileMap[i][j]=='0' || TileMap[i][j]=='b' || TileMap[i][j]=='?'){
                    if(Dy>0){
                        y=i*16-h; dy=0; onGround=true;
                    }
                    if(Dy<0){
                        y=i*16+16; dy=0;
                    }
                    if(Dx>0){
                        x=j*16-w;
                    }
                    if(Dx<0){
                        x=j*16+16;
                    }
                }else{onGround=false;}
                if(x<0){
                    x=0;
                }if(y<0){
                    y=0;
                }
            }
        }
    }
 
    void update(float time){
        if(currentFrame>3)currentFrame-=3;
        control();
        switch(state){
            case stay:
                if(lastKeyPressed==Keyboard::Left){
                    sprite.setTextureRect(IntRect(16, 0, -16, 16));
                }
                if(lastKeyPressed==Keyboard::Right){
                    sprite.setTextureRect(IntRect(0, 0, 16, 16));
                }
                currentFrame=0;
            break;
            case left:
                currentFrame+=0.006*time;
                if(onGround)
                    sprite.setTextureRect(IntRect(16*int(currentFrame)+32, 0, -16, 16));
                    dx=-speed;
                    break;
            case right:
                currentFrame+=0.006*time;
                if(onGround)
                    sprite.setTextureRect(IntRect(16*int(currentFrame)+16, 0, 16, 16));
                    dx=speed;
                    break;
            case up: break;
            case jump:
                if(lastKeyPressed==Keyboard::Right){
                    sprite.setTextureRect(IntRect(80, 0, 16, 16));
                }
                if(lastKeyPressed==Keyboard::Left){
                    sprite.setTextureRect(IntRect(96, 0, -16, 16));
                }
                break;
        }
 
        x+=dx*time;
        checkCollisionWithMap(dx, 0);
        y+=dy*time;
        checkCollisionWithMap(0, dy);
        if(!isMove){
            speed=0;
        }
        sprite.setPosition(x+w/2, y+h/2);
        setPlayerCoordinateForView(x, y);
        dy = dy + 0.0005*time;
        if(dx==0 && onGround){
            state=stay;
        }
 
    }
 
 
};
int main(){
    err().rdbuf(NULL);
    RenderWindow window(VideoMode(640, 480), "Mario");
    window.setFramerateLimit(60);
    view.reset(FloatRect(0, 0, 640, 480));
    view.setSize(320, 240);
 
    Image playerImage;
    playerImage.loadFromFile("images/player.png");
    Player mario(playerImage, "Mario", 32, 144, 16, 16);
 
    Image tileImage;
    tileImage.loadFromFile("images/world.png");
 
    Texture tileTexture;
    tileTexture.loadFromImage(tileImage);
 
    Sprite s_map;
    s_map.setTexture(tileTexture);
 
    Clock clock;
    bool stopTime=true;
    while(window.isOpen()){
        float time = clock.getElapsedTime().asMicroseconds();
 
        if(Keyboard::isKeyPressed(Keyboard::Pause)){
            stopTime=!stopTime;
        }
        clock.restart();
        if(stopTime){
            time=0;
        }else{
            time/=800;
        }
 
 
        Event event;
        while(window.pollEvent(event)){
            if(event.type==event.Closed){
                window.close();
            }
        }
 
 
        mario.update(time);
        window.clear();
        window.setView(view);
        for(int i=0; i<HEIGHT_MAP; i++){
            for(int j = 0; j<WIDTH_MAP; j++){
                if(TileMap[i][j]=='0'){s_map.setTextureRect(IntRect(0, 0, 16, 16));}
                if(TileMap[i][j]=='b'){s_map.setTextureRect(IntRect(384, 0, 16, 16));}
                if(TileMap[i][j]=='?'){s_map.setTextureRect(IntRect(16, 0, 16, 16));}
                if(TileMap[i][j]==' '){s_map.setTextureRect(IntRect(48, 336, 16, 16));}
 
 
                s_map.setPosition(j*16, i*16);
                window.draw(s_map);
            }
        }
        window.draw(mario.sprite);
        window.display();
    }
}
map.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <SFML/Graphics.hpp>
 
const int HEIGHT_MAP=13;
const int WIDTH_MAP=100;
 
sf::String TileMap[HEIGHT_MAP]={
"                                                                                                    ",//Добавил эту строчку, увеличил HEIGHT_MAP на 1 и вылетает
"                                                                                                    ",
"                                                                                                    ",
"                                                                                                    ",
"                                                                                                    ",
"                                                                                                    ",
"                                                                                                    ",
"                                                                                                    ",
"                ?    b?b?b                                                                          ",
"                                                                                                    ",
"                                                                                                    ",
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
};
view.h:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <SFML/Graphics.hpp>
using namespace sf;
 
sf::View view;
 
void setPlayerCoordinateForView(float x, float y){
    float tempX=x, tempY=y;
    if(x<160) tempX=160;
    if(y>72) tempY=72;
    view.setCenter(tempX, tempY);
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2019, 19:04
Ответы с готовыми решениями:

Проблема с картой памяти
Здравствуйте, форумчане. Возникла такая проблема: карта памяти перестала открываться телефоном, при...

Проблема с картой памяти
Ребята привет.У меня проблема : купил фотик,некоторое время пользовался без проблем,потом хотел...

Проблема со звуковой картой
Купил себе звуковую карту Creative Sound Blaster Z, установил, но проблема в том, что нету звука,...

Проблема с картой памяти microSdHc
В телефоне стоит карта памяти microSDHC 4Гига, комп карту вообще не видит. В Администрировании,...

4
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
15.08.2019, 19:32 2
Лучший ответ Сообщение было отмечено Yura2344 как решение

Решение

Цитата Сообщение от Yura2344 Посмотреть сообщение
программа вылетает
Возьми отладчик и найди, в коде, точное место вылета, потом можно дальше разбираться.
0
1504 / 903 / 583
Регистрация: 25.04.2016
Сообщений: 2,511
15.08.2019, 20:42 3
Yura2344, попробуйте изменить map.h на:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <SFML/Graphics.hpp>
 
const int HEIGHT_MAP = 13;
const int WIDTH_MAP = 100;
 
sf::String TileMap[HEIGHT_MAP] = {
    "                                                                                                   ",
    "                                                                                                   ",
    "                                                                                                   ",
    "                                                                                                   ",
    "                                                                                                   ",
    "                                                                                                   ",
    "                                                                                                   ",
    "                                                                                                   ",
    "                ?    b?b?b                                                                         ",
    "                                                                                                   ",
    "                                                                                                   ",
    "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
};
0
4333 / 2391 / 995
Регистрация: 07.02.2019
Сообщений: 6,271
15.08.2019, 21:21 4
Цитата Сообщение от Yura2344 Посмотреть сообщение
Добавил эту строчку, увеличил HEIGHT_MAP на 1 и вылетает
Что-то я не вижу открывающей кавычки в первой строке
0
0 / 0 / 0
Регистрация: 02.08.2019
Сообщений: 17
15.08.2019, 21:35  [ТС] 5
Цитата Сообщение от nd2 Посмотреть сообщение
Возьми отладчик и найди, в коде, точное место вылета, потом можно дальше разбираться.
Проверил отладчиком!! ПРоблема была в функции checkCollisionWithMap(), значение dx показывало в виде -1.234e-12, и тут я понял, что надо задать начальное значение 0 для dx и, на всякий случай, dy;!!

Добавлено через 3 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
Что-то я не вижу открывающей кавычки в первой строке
В начало строки глянь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2019, 21:35

Проблема с картой памяти Micro SD
Добрый день! Я произвела форматирование карты памяти Micro SD 2 Gb на телефоне. Потом пыталась...

Проблема с встроенной звуковой картой
Подавал в микрофонный вход сигнал с выхода комбо-усилителя (проще говоря, колонка для...

Bing Maps проблема с картой
Всем привет! Не пойму где проблема? я использую в WPF Bing карту уже который день по среди карту...

Asus P8H77-V LE проблема с сетевой картой
Доброго дня. Есть материнка Asus P8H77-V LE, в ней была произведена замена ЦПУ с i5 3330 на i7...

Lenovo g570 проблема с интегрированной картой
Друзья, так как накрылась дискретная карта, хотел забить на нее и перейти на интегрированную. Но...

Проблема со звуковой картой, не получается вывести звук на 2 канала.
У меня такая проблема. В одной диджейской проге (трактор) можно вывести звук на 2 канала. В сетупе...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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