1 / 1 / 0
Регистрация: 19.06.2018
Сообщений: 173
1

Функция не может взять данные из другой функции

03.03.2019, 10:10. Показов 325. Ответов 1
Метки нет (Все метки)

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
#include <SFML/Graphics.hpp>
#include <ctime>
using namespace sf;
int ground = 300;
int z = 0;
clock_t o = clock();
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(0, 0, 40, 50);
        dx = dy = 0;
        currentFrame = 0;
    }
 
    void update(float time) {
        rect.left += dx * time;
        CollisionX(0);
        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;
    }
};
void CollisionX(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) rect.left = j * 32 - rect.width;
                if (dx < 0) rect.left = j * 32 + 32;
            }
        }
}
 
 
 
 
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(Vector2f(32, 32));
    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();
        for (int i = 0; i < H; i++)
            for (int j = 0; j < W; j++)
            {
                if (TileMap[i][j] == 'B') rectangle.setFillColor(Color::Blue);
 
                if (TileMap[i][j] == '0')  rectangle.setFillColor(Color::Red);
 
                if (TileMap[i][j] == ' ') continue;
 
                rectangle.setPosition(j*32, i*32);
                window.draw(rectangle);
            }
        window.draw(p.sprite);
        window.display();
    }
    return 0;
}
Функция void CollisionX говорит,что rect и dx не определены,почему она не может взять эти данные? void update спокойно их берет

Добавлено через 2 минуты
Уже не надо,я понял свою ошибку. (Не поместил в скобки)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2019, 10:10
Ответы с готовыми решениями:

Как взять данные с одной функции и работать с другой
Доброго времени суток! Как сделать так что бы из функции GetWage собрать все данные и уже...

Как в access взять данные из другой формы
Всем привет. В общем у меня есть форма авторизации. Когда пользователь вошёл открывается вторая...

Нужно взять данные из другой книги в рабочий лист
Здравствуйте! у меня такая задача на рабочем листе в А1 номер листа, в В1 номер столбца...

Как взять данные из одного массива и вставить в другой
Есть два jsona, успешно разобраны с помощью json_decode. Один вот такой {&quot;data&quot;: } ...

1
Модератор
Эксперт С++
12126 / 9791 / 5916
Регистрация: 18.12.2011
Сообщений: 26,268
03.03.2019, 12:21 2
Update - член класса Player.
Если хотите CollisionX тоже сделать членом класса, то надо
1. Обявить ее внутри класса
2. Перед именем функции указать ее принадлежность к классу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void CollisionX(int dir);
 
};
void Player::CollisionX(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) rect.left = j * 32 - rect.width;
                if (dx < 0) rect.left = j * 32 + 32;
            }
        }
}
И так нужно делать для всех функций длина которых более 3-5 строк.
Это
1. улучшает понимание состава класса
2. не заставляет компилятор пытаться делать эти методы инлайновыми (т.е. вставлять код функции при каждом вызове вместо того, чтобы создавать реальную функцию).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2019, 12:21
Помогаю со студенческими работами здесь

Нужно взять данные из локальной бд в процедуре другой бд (InterBase xe7)
см. картинку: в Central DB нужно создать процедуру, которая будет в том числе использовать данные...

Взять из текстового файла данные, прочитать их и вывести ответ в другой текстовый файл
как взять из текстового файла данные, прочитать их и вывести ответ в другой текстовый файл var...

Как взять значение переменной из другой функции которая уже выполнилась
:help:Привет, объясните пожалуйста как взять значение переменной из другой функции которая уже...

Функция может менять глобальные данные и сохраняются ли эти изменения
Например функция в ходе работы записывает что то в глобальную переменную, которая не является ни...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru