-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPlayer.cpp
More file actions
153 lines (131 loc) · 4.02 KB
/
Player.cpp
File metadata and controls
153 lines (131 loc) · 4.02 KB
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
#include "Player.h"
#include <cstdio>
#include <Windows.h>
#include <cmath>
Sprite Player::copy = Sprite(new Surface("assets/skier.png"), 6);
Player::Player(vec2 pos, int health, float speed) : pos(pos), health(health), speed(speed),
player(Sprite(new Surface("assets/skier.png"), 6)),
collider(BoxCollider(vec2(12, 17), vec2(20, 25)))
{
player.SetFrame(2);
}
void Player::TurnLeft()
{
speed *= (float)pow(0.999f, elapsedTime);
direction = Direction::Left;
}
void Player::TurnRight()
{
speed *= (float)pow(0.999, elapsedTime);
direction = Direction::Right;
}
void Player::SlowDown()
{
speed -= 0.1f * elapsedTime;
if (speed < 0) speed = 0;
player.SetFrame(5);
direction = Direction::Normal;
}
void Player::Accelerate()
{
if (acceleration_counter < 10) player.SetFrame(0), speed += 0.01f * elapsedTime;
else if (acceleration_counter < 20) player.SetFrame(2);
else if (acceleration_counter < 30) player.SetFrame(1), speed += 0.01f * elapsedTime;
else acceleration_counter = 0;
acceleration_counter++;
direction = Direction::Normal;
}
void Player::NormalPosition()
{
player.SetFrame(2);
acceleration_counter = 0;
direction = Direction::Normal;
}
void Player::Draw(Surface& screen, float elapsedTime)
{
this->elapsedTime = elapsedTime;
SetCorrectFrame();
speed += 0.001f * elapsedTime;
if (speed > 5.0f) speed = 5.0f;
pos.x += (float)direction * speed * elapsedTime;
// Blink
if (hit_timer >= 0) Blink((int)hit_timer), hit_timer -= elapsedTime;
else if (is_hit) Blink(0), is_hit = false;
player.Draw(&screen, (int)pos.x, (int)pos.y);
// Draw shield
if (shield_timer >= 0) DrawShield(screen), shield_timer -= elapsedTime;
}
void Player::DrawShield(Surface& screen)
{
static Surface shield = Surface("assets/shield.png");
if (shield_timer > 100 || (int)shield_timer % 20 < 10) {
shield.BlendCopyTo(&screen, (int)pos.x, (int)pos.y);
screen.Circle(pos.x, pos.y, (float)shield.GetHeight() / 2, 0xff79f2f2);
}
}
void Player::DrawCollisionBox(Surface& screen)
{
screen.Box((int)(pos.x + collider.min.x), (int)(pos.y + collider.min.y),
(int)(pos.x + collider.max.x), (int)(pos.y + collider.max.y), 0xff00ff00);
}
void Player::Blink(int timer)
{
int width = player.GetSurface()->GetWidth();
int height = player.GetSurface()->GetHeight();
int step = 25;
Pixel* buf = player.GetBuffer();
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
Pixel p = buf[i * width + j];
Pixel ref = copy.GetBuffer()[i * width + j];
// Original values
int refA = (ref & 0xff000000) >> 24;
int refR = (ref & 0xff0000) >> 16;
int refG = (ref & 0x00ff00) >> 8;
int refB = ref & 0x0000ff;
// New values
// int r = refR / step * (timer % (2 * step) - step); // Use original red
int g = refG / step * (timer % (2 * step) - step);
int b = refB / step * (timer % (2 * step) - step);
// For smoother transition
// if (r == 0 && refR != 0) r = 1; // Use original red
if (g == 0 && refG != 0) g = 1;
if (b == 0 && refB != 0) b = 1;
// Values are negative when image is appearing
// if (r < 0) r = -r; // Use original red
if (g < 0) g = -g;
if (b < 0) b = -b;
// Apply new color
buf[i * width + j] = (refA << 24) | (refR << 16) | (g << 8) | b;
}
}
}
void Player::SetCorrectFrame()
{
current_frame = player.GetFrame();
if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState(VkKeyScanA('a'))) {
TurnLeft();
if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState(VkKeyScanA('s'))) {
speed += 0.001f * elapsedTime;
}
if (current_frame == 3) player.SetFrame(2);
else player.SetFrame(4);
}
else if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState(VkKeyScanA('d'))) {
TurnRight();
if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState(VkKeyScanA('s'))) {
speed += 0.001f * elapsedTime;
}
if (current_frame == 4) player.SetFrame(2);
else player.SetFrame(3);
}
else if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState(VkKeyScanA('w'))) {
SlowDown();
}
else if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState(VkKeyScanA('s'))) {
Accelerate();
}
else {
NormalPosition();
}
}