Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
1

Как реализовать анимацию атаки?

09.11.2014, 14:12. Показов 3358. Ответов 1
Метки c++, sfml (Все метки)

Author24 — интернет-сервис помощи студентам
Обычное движение персонажа не вызывает проблем, но вот анимация удара мечом оставляется желать лучшего. При нажатии клавиши атаки, в цикле должна крутиться анимация замаха и удара - 4 кадра. Они прокручиваются, да, но чтобы анимацию было видно - ее нужно показывать в этом же цикле в блоке нажатия клавиши атаки. Отсюда проблема - предыдущие кадры не исчезают, а остаются висеть и появляется "эффект матрицы", когда кто-нибудь уклоняется от пуль так быстро, что видны всего его предыдущие движения.

Показать не могу - скрин пустой получается. Помогите решить эту проблему. Как-то нужно удалять старую уже отрисованную картинку перед рисованием нового кадра атаки, но как?
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
if (Keyboard::isKeyPressed(Keyboard::Numpad5))
        {
            if (IsAttacking==0)
            {
                IsAttacking=1;
 
                while ((AttackFrame<4)&&(IsAttacking!=0))
                {
                    AttackFrame+=0.005*time/500;
               
                    if (AttackFrame<4)
                    {
                        switch (lastside)
                        {
                            case 1:warrior_player_sprite.setTextureRect(IntRect(216,360+72*int(AttackFrame),-72,72));break;
                            case 2:warrior_player_sprite.setTextureRect(IntRect(144,360+72*int(AttackFrame),72,72));break;
                            case 3:warrior_player_sprite.setTextureRect(IntRect(0,360+72*int(AttackFrame),72,72));break;
                            case 4:warrior_player_sprite.setTextureRect(IntRect(288,360+72*int(AttackFrame),72,72));break;
                            case 5:warrior_player_sprite.setTextureRect(IntRect(144,360+72*int(AttackFrame),-72,72));break;
                            case 6:warrior_player_sprite.setTextureRect(IntRect(72,360+72*int(AttackFrame),72,72));break;
                            case 7:warrior_player_sprite.setTextureRect(IntRect(288,360+72*int(AttackFrame),-72,72));break;
                            case 8:warrior_player_sprite.setTextureRect(IntRect(216,360+72*int(AttackFrame),72,72));break;
                        }
 
                    }
                    else
                    {
                        switch (lastside)
                        {
                            case 1:warrior_player_sprite.setTextureRect(IntRect(216,0,-72,72));break;
                            case 2:warrior_player_sprite.setTextureRect(IntRect(144,0,72,72));break;
                            case 3:warrior_player_sprite.setTextureRect(IntRect(0,0,72,72));break;
                            case 4:warrior_player_sprite.setTextureRect(IntRect(288,0,72,72));break;
                            case 5:warrior_player_sprite.setTextureRect(IntRect(144,0,-72,72));break;
                            case 6:warrior_player_sprite.setTextureRect(IntRect(72,0,72,72));break;
                            case 7:warrior_player_sprite.setTextureRect(IntRect(288,0,-72,72));break;
                            case 8:warrior_player_sprite.setTextureRect(IntRect(216,0,72,72));break;
                        }
 
                        AttackFrame=0;
                        IsAttacking=0;
                    }
                    
                    window.draw(warrior_player_sprite);
 
                    window.display();
                }
            }
        }
Добавлено через 21 час 17 минут
Сам разобрался. Костыль, но все-таки работает. Основа в том, что решил делать полного без цикла при 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
 if (Keyboard::isKeyPressed(Keyboard::Numpad5))
        {
         
                IsAttacking=1;
 
                if ((AttackFrame<4)&&(IsAttacking==1))
                {
                    AttackFrame+=0.005*time/500;
                   
                    if (AttackFrame<4)
                    {
                        switch (lastside)
                        {
                            case 1:warrior_player_sprite.setTextureRect(IntRect(216,360+72*int(AttackFrame),-72,72));break;
                            case 2:warrior_player_sprite.setTextureRect(IntRect(144,360+72*int(AttackFrame),72,72));break;
                            case 3:warrior_player_sprite.setTextureRect(IntRect(0,360+72*int(AttackFrame),72,72));break;
                            case 4:warrior_player_sprite.setTextureRect(IntRect(288,360+72*int(AttackFrame),72,72));break;
                            case 5:warrior_player_sprite.setTextureRect(IntRect(144,360+72*int(AttackFrame),-72,72));break;
                            case 6:warrior_player_sprite.setTextureRect(IntRect(72,360+72*int(AttackFrame),72,72));break;
                            case 7:warrior_player_sprite.setTextureRect(IntRect(288,360+72*int(AttackFrame),-72,72));break;
                            case 8:warrior_player_sprite.setTextureRect(IntRect(216,360+72*int(AttackFrame),72,72));break;
                        }
                    }
                    else
                    {
                        switch (lastside)
                        {
                            case 1:warrior_player_sprite.setTextureRect(IntRect(216,0,-72,72));break;
                            case 2:warrior_player_sprite.setTextureRect(IntRect(144,0,72,72));break;
                            case 3:warrior_player_sprite.setTextureRect(IntRect(0,0,72,72));break;
                            case 4:warrior_player_sprite.setTextureRect(IntRect(288,0,72,72));break;
                            case 5:warrior_player_sprite.setTextureRect(IntRect(144,0,-72,72));break;
                            case 6:warrior_player_sprite.setTextureRect(IntRect(72,0,72,72));break;
                            case 7:warrior_player_sprite.setTextureRect(IntRect(288,0,-72,72));break;
                            case 8:warrior_player_sprite.setTextureRect(IntRect(216,0,72,72));break;
                        }
 
                        AttackFrame=0;
                        
                    }
                }
           }
 
        if (!Keyboard::isKeyPressed(Keyboard::Numpad5))
        {
            if (IsAttacking==1)
            {
                if ((AttackFrame<4)&&(IsAttacking==1))
                {
                    AttackFrame+=0.005*time/500;
                   
                    if (AttackFrame<4)
                    {
                        switch (lastside)
                        {
                            case 1:warrior_player_sprite.setTextureRect(IntRect(216,360+72*int(AttackFrame),-72,72));break;
                            case 2:warrior_player_sprite.setTextureRect(IntRect(144,360+72*int(AttackFrame),72,72));break;
                            case 3:warrior_player_sprite.setTextureRect(IntRect(0,360+72*int(AttackFrame),72,72));break;
                            case 4:warrior_player_sprite.setTextureRect(IntRect(288,360+72*int(AttackFrame),72,72));break;
                            case 5:warrior_player_sprite.setTextureRect(IntRect(144,360+72*int(AttackFrame),-72,72));break;
                            case 6:warrior_player_sprite.setTextureRect(IntRect(72,360+72*int(AttackFrame),72,72));break;
                            case 7:warrior_player_sprite.setTextureRect(IntRect(288,360+72*int(AttackFrame),-72,72));break;
                            case 8:warrior_player_sprite.setTextureRect(IntRect(216,360+72*int(AttackFrame),72,72));break;
                        }
                    }
                    else
                    {
                        switch (lastside)
                        {
                            case 1:warrior_player_sprite.setTextureRect(IntRect(216,0,-72,72));break;
                            case 2:warrior_player_sprite.setTextureRect(IntRect(144,0,72,72));break;
                            case 3:warrior_player_sprite.setTextureRect(IntRect(0,0,72,72));break;
                            case 4:warrior_player_sprite.setTextureRect(IntRect(288,0,72,72));break;
                            case 5:warrior_player_sprite.setTextureRect(IntRect(144,0,-72,72));break;
                            case 6:warrior_player_sprite.setTextureRect(IntRect(72,0,72,72));break;
                            case 7:warrior_player_sprite.setTextureRect(IntRect(288,0,-72,72));break;
                            case 8:warrior_player_sprite.setTextureRect(IntRect(216,0,72,72));break;
                        }
                        AttackFrame=0;
                        IsAttacking=0;
                    }
                }
            }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2014, 14:12
Ответы с готовыми решениями:

Как реализовать комбо атаки по нажатию левой кнопки мыши?
есть три анимации для удара персонажа, обрабатываю атаку в скрипте по нажатию на Mouse0, как можно...

Как реализовать анимацию в Лазарусе?
Объясните, пожалуйста, как написать анимацию в лазарусе.

Как реализовать анимацию в Android?
Есть ли какие то хорошие уроке по анимации в андроид пло прорисовке графики хочу посмотреть разные...

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

1
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
08.11.2020, 14:53 2
Зачем тебе так много проверок атаки, некоторые можно и убрать
0
08.11.2020, 14:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2020, 14:53
Помогаю со студенческими работами здесь

Как реализовать анимацию заполнения цветом?
Как можно реализовать анимацю на WPF + C#? Есть грид, на нем круглая кнопка, Необходимо чтобы от...

Как реализовать такую сложную анимацию?
Интересует анимация на этом сайте. pride-reklama.ru изучил немного html css. хотел бы научиться...

Как грамотно реализовать анимацию в игре
Как сделать анимацию (к примеру, бегущий человечек) в VB6. У меня есть варианты которые я бы мог...

Как реализовать анимацию по щелчку? Машина Тьюринга
Здравствуйте. Нужно чтобы в правой части окна была линия, создающая имитацию барабана с 1 и 0, с...

Как лучше реализовать анимацию электрических цепей?
Доброго времени суток! Подскажите пожалуйста, как лучше реализовать анимацию электрических цепей?...

Как реализовать эффекты и анимацию для контролов
всем привет! я хочу сделать всякие эффекты, анимации для контролов. есть какой-нибудь хороший...


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

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