Как реализовать анимацию атаки?
09.11.2014, 14:12. Показов 3358. Ответов 1
Обычное движение персонажа не вызывает проблем, но вот анимация удара мечом оставляется желать лучшего. При нажатии клавиши атаки, в цикле должна крутиться анимация замаха и удара - 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
|