SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Анимация объекта
В этой теме 5 ответов, 2 участника, последнее обновление Alex_Ken 7 года/лет, 1 месяц назад.
-
АвторСообщения
-
Как анимацию объекта перенести в класс? А то я перекинул, а он без движения
Код бы скинули, что вы там перекинули.
В одну сторону просто картинка едет (не анимация), а в обратную – полоска, картинки вообще нету. Как сделать чтоб и в одну и в другую сторону была анимация? Спрайт только в одну сторону, в другую он отображается зеркально. Код ниже
#include <SFML/Graphics.hpp>
using namespace sf;
class Entity
{
public:
float dx, dy, x, y, speed;
int h, w, health;
bool onGround;
String name;
Image image;
Texture texture;
Sprite sprite;
Entity(Image &image, String Name, float X, float Y, int W, int H)
{
health = 100; onGround = false; speed = 0; x = X; y = Y; w = W; h = H; name = Name; dx = 0; dy = 0;
texture.loadFromImage(image);
sprite.setTexture(texture);
//sprite.setOrigin(w/2, h/2);
}
};class Player :public Entity
{
public:
float CF = 0;
float time;
enum {right, left, jump, down, stay} state;
Player(Image &image, String Name, float X, float Y, int W, int H) :Entity(image, Name, X, Y, W, H)
{
state = stay;
if (name == “Player1″){
sprite.setTextureRect(IntRect(0, 0, w, h));
}
}void control()
{
time = time / 800;
if (Keyboard::isKeyPressed)
{
if (Keyboard::isKeyPressed(Keyboard::Right))
{
state = right; speed = 0.1;
CF += 0.005*time;
if (CF > 6) CF -= 6;
sprite.setTextureRect(IntRect(36 * int(CF), 48, 30, 48));
}
if (Keyboard::isKeyPressed(Keyboard::Left))
{
state = left; speed = 0.1;
CF += 0.005*time;
if (CF > 6) CF -= 6;
sprite.setTextureRect(IntRect(36 * int(CF), 48, -30, 48));
}
}
}void update(float time)
{
control();
switch (state)
{
case right: dx = speed; break;
case left: dx = -speed; break;
}
x+=dx*time;
y+=dy*time;
speed = 0;
sprite.setPosition(x+w/2,y+h/2);
}
};int main()
{
RenderWindow window(VideoMode(640, 480), “Donald Duck”);Clock clock;
Image duck;
duck.loadFromFile(“images/duck.png”);Player p(duck, “Player1″, 200, 200, 27.0, 48.0);
while (window.isOpen())
{
float time = clock.getElapsedTime().asMicroseconds();
clock.restart();
time = time / 800;Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();
}p.update(time);
window.clear();
window.draw(p.sprite);
window.display();
}
return 0;
}Тут есть возможность вставки кода в удобно виде для чтения, третий слева значок. Для зеркального отображения анимации надо
прибавить ширину кадра к позиции в тайлсете по x и сделать отрицательной ширину.
C++1sprite.setTextureRect(IntRect(36 * int(CF)+36, 48, -30, 48));Анимации почему-то нету, та и зеркально не полностью отображается,только половина обьекта….
#include <SFML/Graphics.hpp>
using namespace sf;
class Entity
{
public:
float dx, dy, x, y, speed;
int h, w, health;
bool onGround;
String name;
Image image;
Texture texture;
Sprite sprite;
Entity(Image &image, String Name, float X, float Y, int W, int H)
{
health = 100; onGround = false; speed = 0; x = X; y = Y; w = W; h = H; name = Name; dx = 0; dy = 0;
texture.loadFromImage(image);
sprite.setTexture(texture);
//sprite.setOrigin(w/2, h/2);
}
};class Player :public Entity
{
public:
float CF = 0;
float time;
enum {right, left, jump, down, stay} state;
Player(Image &image, String Name, float X, float Y, int W, int H) :Entity(image, Name, X, Y, W, H)
{
state = stay;
if (name == “Player1″){
sprite.setTextureRect(IntRect(0, 0, w, h));
}
}void control()
{
time = time / 800;
if (Keyboard::isKeyPressed)
{
if (Keyboard::isKeyPressed(Keyboard::Right))
{
state = right; speed = 0.1;
CF += 0.005*time;
if (CF > 6) CF -= 6;
sprite.setTextureRect(IntRect(36 * int(CF), 48, 30, 48));
}
if (Keyboard::isKeyPressed(Keyboard::Left))
{
state = left; speed = 0.1;
CF += 0.005*time;
if (CF > 6) CF -= 6;
sprite.setTextureRect(IntRect(36 * int(CF) + 36, 48, -30, 48));
}
}
}void update(float time)
{
control();
switch (state)
{
case right: dx = speed; break;
case left: dx = -speed; break;
}
x+=dx*time;
y+=dy*time;
speed = 0;
sprite.setPosition(x+w/2,y+h/2);
}
};int main()
{
RenderWindow window(VideoMode(640, 480), “Donald Duck”);Clock clock;
Image duck;
duck.loadFromFile(“images/duck.png”);Player p(duck, “Player1″, 200, 200, 27.0, 48.0);
while (window.isOpen())
{
float time = clock.getElapsedTime().asMicroseconds();
clock.restart();
time = time / 800;Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();
}p.update(time);
window.clear();
window.draw(p.sprite);
window.display();
}
return 0;
} -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.