2 / 2 / 1
Регистрация: 13.04.2019
Сообщений: 35
1

Анимация в SFML

29.02.2020, 01:58. Показов 10007. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста,я не знаю как расчитать анимацию(из SpriteDecomposer)кол-во кадров за сек так,что бы анимация прыжка из 14 спрайтов прошла за время равное времени которое затратил персонаж на путь вверх и вниз.
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
192
193
#include<SFML/Graphics.hpp>
#include<iostream>
#include"view.h"
#include "level.h"//для TiledMapEditor
#include <vector>
#include <list>
#include"Animation.h"
using namespace std;
using namespace sf;
class Entity {
public:
    vector<Object> obj;
    float dx, dy, x, y, speed, moveTimer;
    int w, h, health;
    bool life, isMove, onGround;
    Texture texture;
    Sprite sprite;
    String name;
    Entity(Image &image, String Name, float X, float Y, int W, int H) {
        x = X; y = Y; w = W; h = H; name = Name; moveTimer = 0;
        speed = 0; health = 100; dx = 0; dy = 0;
        life = true; onGround = false; isMove = false;
        texture.loadFromImage(image);
        sprite.setTexture(texture);
 
    }
    virtual void update(float time) = 0;
    FloatRect getRect() {
        return FloatRect(x, y, w, h);
    }
};
 
class Player :public Entity {
public:
    AnimationManager anim; bool a;
    bool isShoot;
    float tick;
    enum { left, right, up, down, jump, stay } state;
    enum { left2, right2, up2, rightUp, leftUp } stateD;
    int playerScore;
 
    Player(Image &image, String Name,Level &lev, float X, float Y, int W, int H, AnimationManager& anim2) :Entity(image, Name, X, Y, W, H) {
        playerScore = 0; state = stay; obj = lev.GetAllObjects();
        if (name == "Player1") {
            anim = anim2;
            sprite.setTextureRect(IntRect(4, 19, w, h));
        }
    }
 
    void control() {
    
        if (Keyboard::isKeyPressed) {
            if (Keyboard::isKeyPressed(Keyboard::Up)) {
                stateD = up2;
            }
 
            if (Keyboard::isKeyPressed(Keyboard::Space) && onGround)
            {
                state = jump; dy = -0.6; onGround = false;
            }
            if (Keyboard::isKeyPressed(Keyboard::Left))
            {
                stateD = left2; state = left; speed = 0.2; a = true;
            }
            if (Keyboard::isKeyPressed(Keyboard::Down))
            {
                state = down; speed = 0.2;
            }
            if (Keyboard::isKeyPressed(Keyboard::Right))
            {
                stateD = right2;
                state = right; speed = 0.2; a = false;
            }
            if (Keyboard::isKeyPressed(Keyboard::Q))
            {
                isShoot = true;
            }
            if (Keyboard::isKeyPressed(Keyboard::Right) && Keyboard::isKeyPressed(Keyboard::Up))
            {
                stateD = rightUp;
            }
            if (Keyboard::isKeyPressed(Keyboard::Left) && Keyboard::isKeyPressed(Keyboard::Up))
            {
                stateD = leftUp;
            }
 
        }
    }
 
 
 
    void checkCollisionWithMap(float Dx, float Dy)
    {
        for (int i = 0; i < obj.size(); i++) {
            if (getRect().intersects(obj[i].rect))
            {
                if (obj[i].name == "solid")
                {
                    if (Dy > 0) { y = obj[i].rect.top - h;  dy = 0; onGround = true; }
                    if (Dy < 0) { y = obj[i].rect.top + obj[i].rect.height;   dy = 0; }
                    if (Dx > 0) { x = obj[i].rect.left - w; }
                    if (Dx < 0) { x = obj[i].rect.left + obj[i].rect.width; }
                }
 
            }
 
        }
    }
 
    void update(float time)
    {
        checkCollisionWithMap(0, dy);
        if (onGround)state = stay;
        if (dy > 0)anim.set("Jump2"); if (a)anim.flip();
        control();
        
        switch (state)
        {
        case right:dx = speed; if (onGround) { anim.set("Run"); } break;
        case left:dx = -speed; if (onGround) { anim.set("Run"); anim.flip(); } break;
        case up: break;
        case jump:anim.set("Jump"); if (a)anim.flip(); break;
        case down: dx = 0;  break;
        case stay:if (onGround) { anim.set("Stay"); if (a) { anim.flip(); } dx = 0; } break;
        }
        
        x += dx * time;
        checkCollisionWithMap(dx, 0);
        y += dy * time;
        checkCollisionWithMap(0, dy);
    
        sprite.setPosition(x, y);
        if (health <= 0) { life = false; }
        if (!isMove) { speed = 0; }
        GetView(x + w / 2, y + h / 2, time);
        //  if (life) { GetView(x, y, time); }
        dy = dy + 0.001*time;
        anim.tick(time);
    }
};
 
 
 
class Enemy :public Entity {
public:
    /*...*/
};
class Platform :public Entity
{
public:
    /*...*/
};
class Bullet :public Entity
{
public:
    /*...*/
};
int main()
{
    RenderWindow window(VideoMode(640,480), "Game", Style::Default);
    view.reset(FloatRect(0, 0, 640,480));
    /*...*/
    Clock clock;
    int dir = 0;
    Clock timerF; float fpst;
    int ifps = 0; int fps;
    while (window.isOpen())
    {
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
        
        time = time / 800;
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
 
            dir = p.stateD;
            if (p.isShoot)
            {
                p.isShoot = false;
                entetys.push_back(new Bullet(bulletImage, "bullet", lvl, p.x, p.y, 7, 7, dir));
            }
            if (dir == 2)p.stateD = Player::right2;
        }
 
        p.update(time);
 
                /*...*/
    
    return 0;
}
Animation.h :
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
#ifndef ANIMATION_H
#define ANIMATION_H
 
#include "TinyXML/tinyxml.h"
#include <SFML/Graphics.hpp>
 
 
using namespace sf;
 
class Animation
{
public:
    std::vector<IntRect> frames, frames_flip;
    float currentFrame, speed;
    bool loop, flip, isPlaying;   // loop показвает зациклена ли анимация. Например анимация взрыва должна проиграться один раз и остановиться, loop=false
    Sprite sprite;
    
    Animation()
    {
        currentFrame = 0;
        isPlaying=true;
        flip=false;
        loop=true;
    }
 
    void tick(float time)
    {
        if (!isPlaying) return;
 
        currentFrame += speed * time;
 
        if (currentFrame > frames.size()) { currentFrame -= frames.size();
                                            if (!loop) {isPlaying=false; return;}
                                          }
 
        int i = currentFrame;
        sprite.setTextureRect( frames[i] );
        if (flip) sprite.setTextureRect( frames_flip[i] );
    }
 
};
 
 
 
class AnimationManager
{
 
public:
    std::string currentAnim;
    std::map<std::string, Animation> animList;
    
    AnimationManager()
    {}
 
    ~AnimationManager()
    { animList.clear();
    }
 
   //создание анимаций вручную
    void create(std::string name, Texture &texture, int x, int y, int w, int h, int count, float speed, int step=0, bool Loop=true)
    {
        Animation a;
        a.speed = speed;
        a.loop = Loop;
        a.sprite.setTexture(texture);
        a.sprite.setOrigin(0,h);
 
        for (int i=0;i<count;i++)
        {
            a.frames.push_back( IntRect(x+i*step, y, w, h)  );
            a.frames_flip.push_back( IntRect(x+i*step+w, y, -w, h)  );
        }
        animList[name] = a;
        currentAnim = name;
    }
    int tick2 = 0;
    //загрузка из файла XML
    void loadFromXML(std::string fileName,Texture &t)
    {
        TiXmlDocument animFile(fileName.c_str());
 
        animFile.LoadFile();
 
        TiXmlElement *head;
        head = animFile.FirstChildElement("sprites");
 
        TiXmlElement *animElement;
        animElement = head->FirstChildElement("animation");
        while(animElement)
        {
            Animation anim;
            currentAnim = animElement->Attribute("title");
            int delay = atoi(animElement->Attribute("delay"));
            anim.speed = 1.0/delay; anim.sprite.setTexture(t);
 
            TiXmlElement *cut;
            cut = animElement->FirstChildElement("cut");
            while (cut)
            {
                int x = atoi(cut->Attribute("x"));
                int y = atoi(cut->Attribute("y"));
                int w = atoi(cut->Attribute("w"));
                int h = atoi(cut->Attribute("h"));
 
                anim.frames.push_back( IntRect(x,y,w,h) );
                anim.frames_flip.push_back( IntRect(x+w,y,-w,h)  );
                cut = cut->NextSiblingElement("cut"); 
            }
 
            //anim.sprite.setOrigin(0,anim.frames[0].height);
 
            animList[currentAnim] = anim;
            animElement = animElement->NextSiblingElement("animation"); tick2++;
        }
    }
 
    void set(std::string name)
    {
        currentAnim = name;
        animList[currentAnim].flip=0;
    }
    
    void draw(RenderWindow &window,int x=0, int y=0)
    {
    
        animList[currentAnim].sprite.setPosition(x,y);
        window.draw( animList[currentAnim].sprite );
    
    }
 
    void flip(bool b=1) {animList[currentAnim].flip = b;}
 
    void tick(float time)    {animList[currentAnim].tick(time); }
 
    void pause() {animList[currentAnim].isPlaying=false;}
 
    void play()  {animList[currentAnim].isPlaying=true;}
 
    void play(std::string name)  {animList[name].isPlaying=true;}
 
    bool isPlaying()  {return animList[currentAnim].isPlaying;}
 
    float getH()  {return animList[currentAnim].frames[0].height;}
 
    float getW() {return animList[currentAnim].frames[0].width;}
    
};
 
#endif ANIMATION_H
анимация:
Анимация в SFML

есть идея насчет того что когда уже доходит до последнего кадра , тогда анимацию поставиить на пауз.Хз почему но я ставил и ничего не вышло,помогите ,прошу
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2020, 01:58
Ответы с готовыми решениями:

SFML анимация в С++
Добрый день! Начал изучать библиотеку SFML С++ и пытаться создать игру- платформер. При изучении не...

Анимация / SFML
Как осуществить анимацию когда спрайты разложены криво + в несколько строк Например как создать...

Анимация в SFML C++
Объясните суть, пожалуйста. Возник такой вопрос - как сделать так, чтобы анимация пушки...

[SFML] Анимация взрыва после клика мыши
Всем привет, мне нужен ваш совет. Я хочу сыграть анимацию из спрайта( 64 фрейма и 40px width/height...

5
0 / 0 / 0
Регистрация: 16.04.2020
Сообщений: 1
19.04.2020, 17:13 2
А ты бы не мог сказать где ты взял код Animation.h?
0
162 / 6 / 2
Регистрация: 09.01.2019
Сообщений: 92
23.07.2022, 22:27 3
Цитата Сообщение от Владлен Владлен Посмотреть сообщение
А ты бы не мог сказать где ты взял код Animation.h?
Это из уроков FamTrinli на youtube
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 25
02.09.2022, 22:51 4
Не по теме.
Подскажи как называется эта программа для выделения кадров для спрайтов?
0
162 / 6 / 2
Регистрация: 09.01.2019
Сообщений: 92
03.09.2022, 22:49 5
Цитата Сообщение от A553M613R Посмотреть сообщение
Подскажи как называется эта программа для выделения кадров для спрайтов?
SpriteDecomposer

Если нужно программа для "обратной" разборки атласа на множество текстур - гугли ASU19
1
129 / 17 / 5
Регистрация: 23.03.2020
Сообщений: 103
02.10.2022, 09:14 6
Я бы сделал зависимость выводимого спрайта от ускорения по вертикали, но при каком значении какой спрайт подбирать придется на глазок)
0
02.10.2022, 09:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2022, 09:14
Помогаю со студенческими работами здесь

Анимация при нажатии одной и той же клавиши в sfml
Снова здравствуйте. Есть изображение 32x16 пикселей. На экран выводится (0,0,16,16) - правая...

SFML платформер - Анимация работает (человечек бегает), но не удается загрузить карту (пустой экран)
пытаюсь вот написать простой платформер с помощью SFML. Анимация работает (человечек бегает), но не...

SFML в C::B пытается что-то найти в D:\sfml-release\ которого нет
Добрый день, вторые сутки пытаюсь подключить SFML библиотеку к C::B. При подключении по мануалу с...

D:\C++ Projekts\SFML\main.cpp [Error] SFML\Graphics.hpp: No such file or directory
Пытаюсь начать кодить на библиотеке SFML но при компиляции пучтого проэкта выдает ...


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

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

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