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

Ошибка C2661 с RectangleShape в Марио на C++ - C++

Восстановить пароль Регистрация
 
R_User
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 7
26.07.2015, 14:35     Ошибка C2661 с RectangleShape в Марио на C++ #1
Код был написан по туториалу с этого видео - http://www.youtube.com/watch?v=6OHMFwQK44k. SFML подключил с помощью инструкции отсюда - http://kychka-pc.ru/sfml/urok-1-podk...udio-2013.html.

Видеоурок.

Переписанный под диктовку код.
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
#include <SFML/Graphics.hpp>
 
using namespace sf;
 
int ground = 400;
 
const int H = 12;
const int W = 40;
 
String TileMap[H] = {
 
    "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
    "B                         B     B",
    "B                         B     B",
    "B                         B     B",
    "B                         B     B",
    "B      0000           BBBBB     B",
    "BBB                       B     B",
    "B           BB            BB    B",
    "B           BB                  B",
    "B           BB     BB           B",
    "BBBBBB    BBBBBBBBBBBBBBBBBBBBBBB",
 
};
 
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;
        if (!onGround) dy = dy + 0.0005*time;
        rect.top += dy*time;
        onGround = false;
        if (rect.top > ground) { rect.top = ground; dy = 0; onGround = true; }
        
        currentFrame += 0.005*time;
        if (currentFrame > 6) currentFrame -= 6;
        
        if (dx > 0) sprite.setTextureRect(IntRect(40 * Int16(currentFrame), 244, 40, 50));
        if (dx < 0) sprite.setTextureRect(IntRect(40 * Int16(currentFrame)+40, 244, -40, 50));
 
        sprite.setPosition(rect.left, rect.top);
    
        dx = 0;
    }
};
 
int main()
{
    RenderWindow window(VideoMode(600, 450), "Test!");
 
    Texture t;
    t.loadFromFile("fang.png");
 
    float currentFrame = 0;
 
    PLAYER p(t);
 
    Clock clock;
 
    RectangleShape rectangle(32,32);
 
    while (window.isOpen())
    {
        float Time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
 
        Time = Time / 700;
 
        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);
 
        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;
}

До момента "8:54 - 9:53" с видеоурока код работал нормально, но строка #78 с RectangleShape выдала ошибку и ее замены на перечисленные ниже не помогли и, либо вызывали больше ошибок (в других строках), либо выводили окно с надписью "Debug Assertion Failed! Expression: string subscript out of range".

Описание основной ошибки.
Error C2661: sf::RectangleShape::RectangleShape: нет перегруженной функции, принимающей 2 аргументов.

IntelliSense: отсутствуют экземпляры конструктора "sf::RectangleShape::RectangleShape", соответствующие списку аргументов
(типы аргументов: (int, int)).

Неудачные варианты замены строки, взятые с этого же форума.
RectangleShape rectangle;
RectangleShape rectangle(sf::Vector2f(32.0f,32.0f));
RectangleShape rectangle();

Как починить это?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
26.07.2015, 14:46     Ошибка C2661 с RectangleShape в Марио на C++ #2
R_User,
У меня такой вариант заработал:
C++
1
    RectangleShape rectangle(Vector2f(32,32));
В видеоуроке описывается более старая версия библиотеки.
Сверяйся с документацией при написании кода.
R_User
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 7
26.07.2015, 15:05  [ТС]     Ошибка C2661 с RectangleShape в Марио на C++ #3
DrOffset,
Ваш вариант мне не подошел и вызвал окно с ошибкой: "Debug Assertion Failed! Expression: string subscript out of range".
Цитата Сообщение от DrOffset Посмотреть сообщение
Сверяйся с документацией при написании кода.
Я новичок в C++/SFML. Подскажите, где брать документацию (желательно, на русском)?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
26.07.2015, 15:20     Ошибка C2661 с RectangleShape в Марио на C++ #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от R_User Посмотреть сообщение
Ваш вариант мне не подошел и вызвал окно с ошибкой: "Debug Assertion Failed! Expression: string subscript out of range".
Ну так это уже другая ошибка. И не факт, что корень этой ошибки кроется в этой строке. Под отладчиком запустить надо бы, он укажет скорее всего сразу на проблемное место.
Цитата Сообщение от R_User Посмотреть сообщение
Я новичок в C++/SFML. Подскажите, где брать документацию (желательно, на русском)?
Про русский не знаю, а так на официальном сайте конечно же.

Добавлено через 7 минут
R_User, все, я нашел в чем дело. У нас тут выход за пределы массива в строках 114-123 из слишком больших значений W и H. В массиве символов 34 элемента (33 символа и ноль), а мы итерируемся по 40. Количество строк 11, а мы итерируемся по 12.
Поменяй константы на
C++
1
2
const int H = 11;
const int W = 33;
R_User
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 7
26.07.2015, 16:04  [ТС]     Ошибка C2661 с RectangleShape в Марио на C++ #5
DrOffset, спасибо, заработало!

P.S: Как тут вставлять картинки?
Миниатюры
Ошибка C2661 с RectangleShape в Марио на C++  
DrOffset
26.07.2015, 16:09     Ошибка C2661 с RectangleShape в Марио на C++
  #6

Не по теме:

Цитата Сообщение от R_User Посмотреть сообщение
P.S: Как тут вставлять картинки?
Кнопка-скрепка в форме отправки сообщения. Или в расширенном режиме кнопка "управление вложениями".

Yandex
Объявления
26.07.2015, 16:09     Ошибка C2661 с RectangleShape в Марио на C++
Ответ Создать тему
Опции темы

Текущее время: 04:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru