Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
xXPinkertonXx
0 / 0 / 0
Регистрация: 21.06.2018
Сообщений: 3
1

Привязка ко времени

21.06.2018, 19:47. Просмотров 380. Ответов 6
Метки нет (Все метки)

Здравствуйте люди. Я начинающий программист, который еще очень много чего не знает. Поэтому хочу попросить помощи у знающих людей. Чтобы получить допуск к экзамену, мне нужно сделать курсач. Собственно курсач это игра, которую надо написать на С. Я выбрал себе жанр платформер. Ну и конечно же в процессе программирования наткнулся на кучу проблем.Одна из проблем это привязка ко времени. Мой персонаж двигается довольно кривовато. В последствии я понял, двигается он так потому что каждый виток игры делается за такт процессора. Следовательно я понял что нужна привязка ко времени. Собственно проблема не столько в реализации, сколько в маленькой ошибочке, которую я не знаю как решить.Пишем мы с помощью библиотеки SDL. Я нашел там функцию SDL_GetTicks();. Я создал переменную float startTime=SDL_GetTicks(); перед игровым циклом и переменную float currentTime=SDL_GetTicks(); в конце цикла. Потом я высчитываю время которое прошло за виток: float elapsedTime=currentTime-startTime; И вроде бы как все прекрасно,НО когда я домнажаю движение на время у меня говорится что переменная elapsedTime не инициализирована( естественно, ведь она появляется только в конце цикла а домнажаю я повыше). Тогда я не долго думая пишу в начале ПЕРЕД циклом elapsedTime=0; И по идее должно же работать. Но у меня появляется ошибка "Переопределение". Собственно вот вопрос: Как мне это обойти чтоб работало? Заранее вам спасибо).
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2018, 19:47
Ответы с готовыми решениями:

По введенному номеру времени года выдать соответствующие времени года месяцы
Нужен код на языке Cи, Помогите пожалуйста!:( Составить программу, используя...

Привязка ко времени
Доброго времени суток. Создаю игру, в итоге столкнулась с проблемой...

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

Привязка скорости перемещения к времени
У меня есть picturebox, который перемещается по форме по нажатию клавиш. Как...

Привязка изгибающего момента ко времени
Прошу не судить меня строго за оформление темы =) Вот ход решения моей...

6
Ovederax
198 / 137 / 95
Регистрация: 30.04.2017
Сообщений: 292
21.06.2018, 20:08 2
Цитата Сообщение от xXPinkertonXx Посмотреть сообщение
появляется ошибка "Переопределение"
Ты там в коде цикла случаем не пишешь?
Цитата Сообщение от xXPinkertonXx Посмотреть сообщение
float elapsedTime=currentTime-startTime;
вместо
elapsedTime=currentTime-startTime;
0
xXPinkertonXx
0 / 0 / 0
Регистрация: 21.06.2018
Сообщений: 3
21.06.2018, 21:24  [ТС] 3
Вот мой код, который работает, но он без привязки ко времени.
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 "SDL.h"
#include"SDL_image.h"
 
bool quit = false;
int ground = 240;
bool onGround;
 
struct Entity
{
    SDL_Texture*texture;
    SDL_Rect Pos, Source;
    int frame;
    int moveX;
    int moveY;
 
};
struct Speed
{
    int Dx;
    int Dy;
};
 
void Event(SDL_Event &event, Entity*E_Knight, Speed*S_Knight)
{
 
 
    while (SDL_PollEvent(&event))
    {
        if (event.type == SDL_KEYDOWN)
        {
            switch (event.key.keysym.sym)
            {
            case SDLK_d:
            {
                E_Knight->Source.y = 0;
                E_Knight->Source.x = 38;
                E_Knight->moveX = S_Knight->Dx;
                if (E_Knight->frame <= 9)
                {
                    E_Knight->frame++;
                }
                else E_Knight->frame = 1;
                break;
            }
            case SDLK_a:
            {
                E_Knight->Source.y = 35;
                E_Knight->Source.x = 38;
                E_Knight->moveX = -S_Knight->Dx;
                if (E_Knight->frame <= 9)
                {
                    E_Knight->frame++;
                }
                else E_Knight->frame = 1;
                break;
            }
            case SDLK_ESCAPE:
            {
                quit = true;
            }
            }
        }
 
        if (event.type == SDL_KEYUP)
        {
            E_Knight->frame = 0;
        }
        if (event.type == SDL_QUIT)
        {
            quit = true;
        }
    }
}
 
    void Update(Entity*E_Knight)
    {
        E_Knight->Pos.x += E_Knight->moveX;
        E_Knight->Pos.y += E_Knight->moveY;
        E_Knight->Source.x = E_Knight->Source.x * E_Knight->frame;
        E_Knight->moveX = 0;
 
    }
 
 
void Draw(SDL_Renderer*_renderer,Entity*Knight)
{
    SDL_RenderCopy(_renderer, Knight->texture, &Knight->Source, &Knight->Pos);
 
}
 
void Hero(Entity* E_Knight,Speed*S_Knight,SDL_Renderer*_renderer)
{
    SDL_Surface*PlayerSurf = IMG_Load("Sprites.png");
    E_Knight->texture = SDL_CreateTextureFromSurface(_renderer, PlayerSurf);
    E_Knight->frame = 0;
    E_Knight->Source = { 0,0,38,35 };
    E_Knight->Pos = { 0,0,38*2,33*2 };
    S_Knight->Dx = 8;
    S_Knight->Dy = 10;
    E_Knight->moveX = 0;
    E_Knight->moveY = 0;
 
 
 
}
 
void GameLoop(SDL_Window*_window, SDL_Renderer*_renderer,Entity*E_Knight,Speed*S_Knight)
{
    
    SDL_Event event;
    while (!quit)
    {
        
        SDL_SetRenderDrawColor(_renderer, 0, 0, 0, 0);
        SDL_RenderClear(_renderer);
        
        Event(event, E_Knight,S_Knight);
        Update(E_Knight);
        Draw(_renderer, E_Knight);
        SDL_RenderPresent(_renderer);
        SDL_Delay(70);
    }
    
}
 
 
int main(int argc, char *argv[])
{
    IMG_Init(IMG_INIT_PNG);
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Window*_window = NULL;
    SDL_Renderer*_renderer = NULL;
    SDL_CreateWindowAndRenderer(640, 480, 0, &_window, &_renderer);
    SDL_SetWindowTitle(_window, "Game");
    Entity E_Knight;
    Speed S_Knight;
    Hero(&E_Knight,&S_Knight,_renderer);
    GameLoop(_window, _renderer,&E_Knight,&S_Knight);
    SDL_DestroyWindow(_window);
 
    
    return 0;
}
0
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
21.06.2018, 21:30 4
Цитата Сообщение от xXPinkertonXx Посмотреть сообщение
Пишем мы с помощью библиотеки SDL.
А надо с нуля... Тогда бы ошибок не было.
0
xXPinkertonXx
0 / 0 / 0
Регистрация: 21.06.2018
Сообщений: 3
21.06.2018, 21:47  [ТС] 5
А вот тут я пытаюсь привязать все ко времени
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
#include "SDL.h"
#include"SDL_image.h"
 
bool quit = false;
int ground = 240;
bool onGround;
 
struct Entity
{
    SDL_Texture*texture;
    SDL_Rect Pos, Source;
    int frame;
    int moveX;
    int moveY;
 
};
struct Speed
{
    int Dx;
    int Dy;
};
 
void Event(SDL_Event &event, Entity*E_Knight, Speed*S_Knight,unsigned int elapsedTime)
{
 
 
    while (SDL_PollEvent(&event))
    {
        if (event.type == SDL_KEYDOWN)
        {
            switch (event.key.keysym.sym)
            {
            case SDLK_d:
            {
                E_Knight->Source.y = 0;
                E_Knight->Source.x = 38;
                E_Knight->moveX = S_Knight->Dx [COLOR="yellow"]*elapsedTime;[/COLOR]
                if (E_Knight->frame <= 9)
                {
                    E_Knight->frame+=E_Knight->frame[COLOR="yellow"]*elapsedTime[/COLOR];
                }
                else E_Knight->frame = 1;
                break;
            }
            case SDLK_a:
            {
                E_Knight->Source.y = 35;
                E_Knight->Source.x = 38;
                E_Knight->moveX = -S_Knight->Dx;
                if (E_Knight->frame <= 9)
                {
                    E_Knight->frame++;
                }
                else E_Knight->frame = 1;
                break;
            }
            case SDLK_ESCAPE:
            {
                quit = true;
            }
            }
        }
 
        if (event.type == SDL_KEYUP)
        {
            E_Knight->frame = 0;
        }
        if (event.type == SDL_QUIT)
        {
            quit = true;
        }
    }
}
 
    void Update(Entity*E_Knight)
    {
        E_Knight->Pos.x += E_Knight->moveX;
        E_Knight->Pos.y += E_Knight->moveY;
        E_Knight->Source.x = E_Knight->Source.x * E_Knight->frame;
        E_Knight->moveX = 0;
 
    }
 
 
void Draw(SDL_Renderer*_renderer,Entity*Knight)
{
    SDL_RenderCopy(_renderer, Knight->texture, &Knight->Source, &Knight->Pos);
 
}
 
void Hero(Entity* E_Knight,Speed*S_Knight,SDL_Renderer*_renderer)
{
    SDL_Surface*PlayerSurf = IMG_Load("Sprites.png");
    E_Knight->texture = SDL_CreateTextureFromSurface(_renderer, PlayerSurf);
    E_Knight->frame = 0;
    E_Knight->Source = { 0,0,38,35 };
    E_Knight->Pos = { 0,0,38*2,33*2 };
    S_Knight->Dx = 8;
    S_Knight->Dy = 10;
    E_Knight->moveX = 0;
    E_Knight->moveY = 0;
 
 
 
}
 
void GameLoop(SDL_Window*_window, SDL_Renderer*_renderer,Entity*E_Knight,Speed*S_Knight)
{
    
    SDL_Event event;
    [COLOR="yellow"]unsigned int lastTime = 0, currentTime,elapsedTime=0;[/COLOR]
    while (!quit)
    {
        
        SDL_SetRenderDrawColor(_renderer, 0, 0, 0, 0);
        SDL_RenderClear(_renderer);
        
        Event(event, E_Knight,S_Knight,[COLOR="yellow"]elapsedTime[/COLOR]);
        Update(E_Knight);
        Draw(_renderer, E_Knight);
        SDL_RenderPresent(_renderer);
        [COLOR="yellow"]currentTime = SDL_GetTicks();[/COLOR]
        [COLOR="yellow"]elapsedTime = currentTime - lastTime;[/COLOR]
        [COLOR="yellow"]lastTime = currentTime;[/COLOR]
        
    }
    
}
 
 
int main(int argc, char *argv[])
{
    IMG_Init(IMG_INIT_PNG);
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Window*_window = NULL;
    SDL_Renderer*_renderer = NULL;
    SDL_CreateWindowAndRenderer(640, 480, 0, &_window, &_renderer);
    SDL_SetWindowTitle(_window, "Game");
    Entity E_Knight;
    Speed S_Knight;
    Hero(&E_Knight,&S_Knight,_renderer);
    GameLoop(_window, _renderer,&E_Knight,&S_Knight);
    SDL_DestroyWindow(_window);
 
    
    return 0;
}
Добавлено через 3 минуты
Выделение почему-то не сработало

Добавлено через 3 минуты
Ну мы не прям чистые программисты. Мы САПР (Системы автоматического проектирования). Нас учат чуть-чуть поменьше чем ОП(ориентированное программирование). Я сам пытаюсь конечно разобраться как свои библиотеки писать, но для меня это пока сложновато.
0
SlavaSokolov
170 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 735
21.06.2018, 21:52 6
Цитата Сообщение от xXPinkertonXx Посмотреть сообщение
библиотеки писать
А язык? Или будем использовать результат работы каких-то проходимцев, а потом страдать от ошибок?
0
ValeryS
Модератор
7446 / 5638 / 716
Регистрация: 14.02.2011
Сообщений: 19,206
Завершенные тесты: 1
21.06.2018, 23:45 7
Цитата Сообщение от xXPinkertonXx Посмотреть сообщение
SDL_GetTicks();
есть стандартные средства
https://ru.wikipedia.org/wiki/Time.h
для определения времени работы можно сделать так
C
1
2
3
4
5
6
clock_t  deltaTime;
clock_t  oldTime=clock();
...........
// измеряемый участок
.................
deltaTime=clock()-oldTime;
вот пример
http://cppstudio.com/post/561/
0
21.06.2018, 23:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2018, 23:45

Привязка времени к стрелочным часам canvas
Как привязать реальное время к стрелкам часов, нарисованных канвой? Секундная...

Что это жесткая привязка к точке входа, физическое смещение в файле, окрестность точки входа в файл, привязка?
Что это жесткая привязка к точке входа, физическое смещение в файле,...

Расчет времени пуска,установившегося времени,времени торможения и паузу для лифта
t0=(3600/h)*(1-E) - пауза.ЕЕ можно взять произвольно(самим). А остальное надо...


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

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

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