Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 19.06.2018
Сообщений: 173
1

Не выводит карту в игру Mario

02.03.2019, 15:34. Показов 1642. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <SFML/Graphics.hpp>
#include <ctime>
#include <string>
using namespace sf;
int ground = 350;
int z = 0;
clock_t o = clock();
 
 
const int H = 12;
const int W = 40;
std::string TileMap[H] = {
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"B                                B     B",
"B                                B     B",
"B                                B     B",
"B                                B     B",
"B         0000                BBBB     B",
"B                                B     B",
"BBB                              B     B",
"B              BB                BB    B",
"B              BB                      B",
"B    B         BB         BB           B",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
};
 
 
 
 
class Player {
 
public:
 
    float dx, dy;
    FloatRect rect;
    bool onGround;
    Sprite sprite;
    float currentFrame;
 
    Player(Texture &image)
    {
        sprite.setTexture(image);
        rect = FloatRect(0, 0, 40, 50);
        dx = dy = 0;
        currentFrame = 0;
    }
 
    void update(float time) {
        rect.left += dx * time;
        if (!onGround) dy = dy + 0.0005*time;
        rect.top += dy * time;
        onGround = false;
        if (rect.top >= ground) { rect.top = ground; dy = 0; onGround = true; }
        if (clock() - o > 100) {
            currentFrame += 37;
            o = clock();
        }
        if (currentFrame > 37 * 2) currentFrame -= 37 * 2;
 
        if (dx < 0) { sprite.setTextureRect(IntRect(int(currentFrame), 61, 30, 50)); z = 0; }
        else if (dx > 0) {sprite.setTextureRect(IntRect(int(currentFrame) + 30, 61, -30, 50)); z = 1;}
        else if (z == 0) sprite.setTextureRect(IntRect(226, 1, 30, 50));
        else sprite.setTextureRect(IntRect(226+30, 1, -30, 50));
        if (onGround == false) {
            if ( z == 0) sprite.setTextureRect(IntRect(42, 165, 30, 55));
            else sprite.setTextureRect(IntRect(42+30, 165, -30, 55));
        }
        sprite.setPosition(rect.left, rect.top);
        dx = 0;
    }
};
 
 
 
 
int main() {
    RenderWindow window(sf::VideoMode(600, 400), "Test!");
 
    CircleShape MyCircle(100.f);
    MyCircle.setFillColor(sf::Color::Green);
    clock_t o = clock(); 
    Texture t;
    t.loadFromFile("PaperMario.png");
 
    float currentFrame = 0;
 
    Player p(t);
 
    Clock clock1;
 
    RectangleShape rectangle;
 
    while (window.isOpen()) {
        float time = clock1.getElapsedTime().asMicroseconds();
        clock1.restart();
        time = time / 800;
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) window.close();
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Left)) { 
            p.dx = -0.1; 
        //if (clock() - o > 100) { currentFrame += 37;
        //o = clock(); 
        //}
        //if (currentFrame > 37 * 2) currentFrame -= 37 * 2;
        //s.setTextureRect(IntRect(int(currentFrame), 61, 30, 55));
        }
        if (Keyboard::isKeyPressed(Keyboard::Right)) {
            p.dx = 0.1;
        }
        if (Keyboard::isKeyPressed(Keyboard::Up)) {
            if (p.onGround) { p.dy = -0.4; p.onGround = false; }
        }
        p.update(time);
        window.clear(Color::White);
        for (int i = 0; i < H; i++)
            for (int j = 0; j < W; j++)
            {
                if (TileMap[i][j] == 'B') rectangle.setFillColor(Color::Black);
 
                if (TileMap[i][j] == '0')  rectangle.setFillColor(Color::Green);
 
                if (TileMap[i][j] == ' ') continue;
 
                rectangle.setPosition(j*32, i*32);
                window.draw(rectangle);
            }
        window.draw(p.sprite);
        window.display();
    }
    return 0;
}
Как вы видите по строке 118-131 я использую функцию чтобы раскрасить и вывести карту на экран,но дело в том,что карта не выводится. У меня просто белый экран. В чем проблема?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2019, 15:34
Ответы с готовыми решениями:

Составить программу, которая выводит карту Минска
Составить программу, которая выводит карту Минска и обозначает административные районы квадратами,...

Выводит только одну часть изображения при попытке заполнить карту через массив
При попытке в SFML заполнить карту через массив столкнулся с такой проблемой - выводит только одну...

Mario c++
Здравствуйте, преподаватель задал написать всеми известную игру &quot;Марио&quot; на чистом с++, без...

Mario PascalABC
Всем доброго времени суток!!! Собираюсь написать Марио на ABC и думаю над тем, как будет...

3
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
02.03.2019, 15:43 2
Лучший ответ Сообщение было отмечено shuraros1 как решение

Решение

Цитата Сообщение от shuraros1 Посмотреть сообщение
В чем проблема?
Размер прямоугольника нулевой.

Добавлено через 54 секунды
fix:
C++
1
RectangleShape rectangle(Vector2f(32, 32));
1
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
02.03.2019, 15:45 3
а где ваш rectangle инициализируется (ширина высота там)?
1
1 / 1 / 0
Регистрация: 19.06.2018
Сообщений: 173
02.03.2019, 15:50  [ТС] 4
Если я возьму этот код
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
#include <SFML/Graphics.hpp>
 
using namespace sf;
 
 
float offsetX=0, offsetY=0;
 
 
const int H = 12;
const int W = 40;
 
 
String TileMap[H] = {
 
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"B                                B     B",
"B                                B     B",
"B                                B     B",
"B                                B     B",
"B         0000                BBBB     B",
"B                                B     B",
"BBB                              B     B",
"B              BB                BB    B",
"B              BB                      B",
"B    B         BB         BB           B",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
 
}; 
 
class PLAYER {
 
public:
 
float dx,dy;
FloatRect rect;
bool onGround;
Sprite sprite;
float currentFrame;
 
    PLAYER(Texture &image)
   {
    sprite.setTexture(image);
    rect = FloatRect(7*32,9*32,40,50);
 
    dx=dy=0.1;
    currentFrame = 0;
   }
 
 
   void update(float time)
   {    
 
     rect.left += dx * time;    
     Collision(0);
 
     if (!onGround) dy=dy+0.0005*time;
     rect.top += dy*time;
     onGround=false;
     Collision(1);
  
     
      currentFrame += 0.005*time;
      if (currentFrame > 6) currentFrame -=6 ;
 
      if (dx>0) sprite.setTextureRect(IntRect(40*int(currentFrame),244,40,50));
      if (dx<0) sprite.setTextureRect(IntRect(40*int(currentFrame)+40,244,-40,50));
     
 
      sprite.setPosition(rect.left - offsetX, rect.top - offsetY);
 
      dx=0;
   }
 
 
 
   void Collision(int dir)
   {
     for (int i = rect.top/32 ; i<(rect.top+rect.height)/32; i++)
      for (int j = rect.left/32; j<(rect.left+rect.width)/32; j++)
        { 
         if (TileMap[i][j]=='B') 
           { 
            if ((dx>0) && (dir==0)) rect.left =  j*32 -  rect.width; 
            if ((dx<0) && (dir==0)) rect.left =  j*32 + 32;
            if ((dy>0) && (dir==1))  { rect.top =   i*32 -  rect.height;  dy=0;   onGround=true; }
            if ((dy<0) && (dir==1))  { rect.top = i*32 + 32;   dy=0;}
           }
         
         if (TileMap[i][j]=='0') 
                           { 
                             TileMap[i][j]=' ';
                           }
                
        }
   
   }
};
 
int main()
{
    RenderWindow window( VideoMode(600, 400), "Test!");
 
    Texture t;
    t.loadFromFile("fang.png");
 
    float currentFrame=0;
 
    PLAYER p(t);
 
    Clock clock;
 
    RectangleShape rectangle( Vector2f(32,32));
 
    while (window.isOpen())
    {
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
 
        time = time/700;
        
        if (time>20) time = 20;
 
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Left)) 
        {
            p.dx = -0.1;
 
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Right)) 
        {
            p.dx = 0.1;
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Up)) 
        {
            if (p.onGround) { p.dy=-0.35; p.onGround=false;}
        }
 
        p.update(time);
 
        if (p.rect.left>300) offsetX = p.rect.left - 300;
        offsetY = p.rect.top - 200;
 
        window.clear(Color::White);
 
 
         for (int i=0; i<H; i++)
             for (int j=0; j<W ; j++)
                { 
                  if (TileMap[i][j]=='B') rectangle.setFillColor(Color::Black);
 
                  if (TileMap[i][j]=='0')  rectangle.setFillColor(Color::Green);
 
                  if (TileMap[i][j]==' ') continue;
 
                  rectangle.setPosition(j*32-offsetX,i*32 - offsetY) ; 
                  window.draw(rectangle);
             }
    
        window.draw(p.sprite);
        window.display();
    }
 
    return 0;
}
то все выводится. Где ошибка?
Всё,понял где ошибка. Благодарю
0
02.03.2019, 15:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2019, 15:50
Помогаю со студенческими работами здесь

Super Mario
Привет Ребята! Помогите, пожалуйста, найти ошибку! #include &lt;SFML/Graphics.hpp&gt; using namespace...

Super Mario на C++ и OpenGL
Всем привет. Решил написать марио на opengl. Пока это все без текстур. Проблема в том, что уже...

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

Pac Man Vs Mario
Еще ностальжи)) 2P4cQAkQ56Q&amp;NR


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru