34 std::shared_ptr<
TextComponent> text_ping = std::make_shared<TextComponent>(_clientCore, _socket);
35 std::shared_ptr<
TextComponent> text_score = std::make_shared<TextComponent>(_clientCore, _socket);
37 std::shared_ptr<
MusicComponent> music = std::make_shared<MusicComponent>(_clientCore, _socket);
38 std::shared_ptr<
SoundComponent> sound_new_player = std::make_shared<SoundComponent>(_clientCore, _socket);
39 std::shared_ptr<
SoundComponent> sound_player_left = std::make_shared<SoundComponent>(_clientCore, _socket);
40 std::shared_ptr<
TextComponent> text_event = std::make_shared<TextComponent>(_clientCore, _socket);
42 music->setSound(
"../src/client/assets/musics/thisgirl.ogg");
45 text_ping->setAttribute(
"text ping");
46 text_ping->setText(
"");
47 text_ping->setPosition(sf::Vector2f(0, 550));
48 text_score->setAttribute(
"text score");
49 text_score->setText(
"Score: 0");
50 text_score->setPosition(sf::Vector2f(650, 550));
52 text_event->setAttribute(
"text event");
53 text_event->setText(
"");
54 text_event->setPosition(sf::Vector2f(425, 0));
58 sound_new_player->setAttribute(
"new player");
60 sound_player_left->setAttribute(
"player left");
66 addComponent(text_ping);
67 addComponent(text_score);
68 addComponent(sound_new_player);
69 addComponent(sound_player_left);
70 addComponent(text_event);
78 std::tuple<std::unique_ptr<Packet>,
int> packet = _socket->receive();
79 std::unique_ptr<Packet> p = std::move(std::get<0>(packet));
80 while (p !=
nullptr) {
81 if (p->code == ELEMENT) {
82 auto *drawable =
static_cast<DrawablePacket *>(p->data);
83 for (
auto &component : _components) {
84 if (component->getType() == ComponentType::SPRITE) {
85 char *attributechar =
static_cast<
char *>(malloc(16));
86 std::memset(attributechar, 0, 16);
87 std::memcpy(attributechar, &drawable->attribute, 8);
88 std::memcpy(attributechar + 8, &drawable->attribute2, 8);
89 std::string attributeString(attributechar);
90 std::string componentAttribute = component->getAttribute();
91 if (component->getAttribute() == attributeString) {
95 auto *sprite =
dynamic_cast<SpriteComponent *>(component.get());
96 sprite->setPosition({drawable->x, drawable->y});
97 sprite->setSize({drawable->sizeHorizontal, drawable->sizeVertical});
99 {drawable->rectLeft, drawable->rectTop, drawable->rectWidth, drawable->rectHeight});
101 if (component->getAttribute() ==
"sprite enemy") {
102 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::ENEMY));
104 if (component->getAttribute() ==
"sprite bullet") {
105 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::BULLET));
107 if (component->getAttribute() ==
"sprite floor bg") {
108 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::FLOOR_BACKGROUND));
110 if (component->getAttribute() ==
"sprite roof bg") {
111 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::ROOF_BACKGROUND));
113 if (component->getAttribute() ==
"sprite bg1") {
114 dynamic_cast<SpriteComponent *>(component.get())
115 ->setTexture(getTextureByType(Type::BACKGROUND1));
117 if (component->getAttribute() ==
"sprite bg2") {
118 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::BACKGROUND2));
120 if (component->getAttribute() ==
"sprite bg3") {
121 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::BACKGROUND3));
123 if (component->getAttribute() ==
"sprite bg4") {
124 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::BACKGROUND4));
126 if (component->getAttribute() ==
"sprite boss") {
127 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::BOSS));
129 if (component->getAttribute() ==
"boss attack") {
130 dynamic_cast<SpriteComponent *>(component.get())->setTexture(getTextureByType(Type::BOSS_BULLET));
135 if (p->code == HEARTBEAT) {
138 gettimeofday(&now,
nullptr);
139 timerecv = *
static_cast<timeval *>(p->data);
142 for (
auto &component : _components) {
143 if (component->getType() == ComponentType::TEXT) {
144 if (component->getAttribute() ==
"text ping") {
145 dynamic_cast<TextComponent *>(component.get())
146 ->setText(
"Ping: " + std::to_string(_pingTime.tv_sec * 1000 + _pingTime.tv_usec / 1000) +
147 ", " + std::to_string(_pingTime.tv_usec % 1000) +
"ms");
153 if (p->code == MESSAGE) {
154 std::string attribute =
static_cast<
char *>(p->data);
155 if (attribute.find(
"Score") != std::string::npos) {
156 for (
auto &component : _components) {
157 if (component->getType() == ComponentType::TEXT) {
158 if (component->getAttribute() ==
"text score") {
159 std::istringstream iss(attribute);
167 if (prefix ==
"Score:") {
170 std::cout <<
"Score: " << std::to_string(score) << std::endl;
171 dynamic_cast<TextComponent *>(component.get())
172 ->setText(
"Score: " + std::to_string(score));
179 if (p->code == NEW_COMPONENT) {
180 auto *newComponent =
static_cast<NewComponent *>(p->data);
181 newComponent->type =
static_cast<ComponentTypeSocket>(ComponentType::SPRITE);
182 char *attributechar =
static_cast<
char *>(malloc(16));
183 std::memset(attributechar, 0, 16);
184 std::memcpy(attributechar, &newComponent->attribute, 16);
188 std::string attributeString(attributechar);
189 attributeString = attributeString.substr(0, attributeString.find(
'\001'));
192 for (
auto &component : _components) {
193 if (component->getType() == ComponentType::SPRITE) {
194 if (component->getAttribute() ==
reinterpret_cast<
char *>(&newComponent->attribute)) {
195 _components.erase(std::remove(_components.begin(), _components.end(), component),
202 if (newComponent->type == ComponentType::SPRITE) {
203 auto sprite = std::make_shared<SpriteComponent>(_clientCore, _socket);
204 sprite->setAttribute(attributeString);
206 sprite->setTexture(getTextureByType((Type)newComponent->id));
207 sprite->setPosition({newComponent->x, newComponent->y});
208 sprite->setSize({newComponent->sizeHorizontal, newComponent->sizeVertical});
210 {newComponent->rectLeft, newComponent->rectTop, newComponent->rectWidth, newComponent->rectHeight});
211 addComponent(sprite);
213 if (newComponent->type == ComponentType::TEXT) {
214 auto text = std::make_shared<TextComponent>(_clientCore, _socket);
217 if (newComponent->type == ComponentType::MUSIC) {
218 auto music = std::make_shared<MusicComponent>(_clientCore, _socket);
222 if (p->code == DELETE_COMPONENT) {
223 std::string attribute =
static_cast<
char *>(p->data);
224 for (
auto &component : _components) {
225 if (component->getAttribute() == attribute) {
226 _components.erase(std::remove(_components.begin(), _components.end(), component),
231 std::cout <<
"delete component: " << attribute << std::endl;
234 if (p->code == MESSAGE) {
235 std::string message =
static_cast<
char *>(p->data);
236 std::cout <<
"Message: " << message << std::endl;
237 if (message.find(
"event: ") != std::string::npos) {
238 std::string event = message.substr(message.find(
"event: ") + 7);
239 for (
auto &component : _components) {
240 if (component->getType() == ComponentType::TEXT) {
241 if (component->getAttribute() ==
"text event") {
242 dynamic_cast<TextComponent *>(component.get())->setText(event);
249 if (p->code == EVENT) {
250 auto *data =
static_cast<
char *>(p->data);
251 std::string message(data);
252 if (message ==
"new player") {
253 for (
auto &component : _components) {
254 if (component->getType() == ComponentType::SOUND) {
255 if (component->getAttribute() ==
"new player") {
256 dynamic_cast<SoundComponent *>(component.get())->action();
260 }
else if (message ==
"player left") {
261 for (
auto &component : _components) {
262 if (component->getType() == ComponentType::SOUND) {
263 if (component->getAttribute() ==
"player left") {
264 dynamic_cast<SoundComponent *>(component.get())->action();
271 packet = _socket->receive();
272 p = std::move(std::get<0>(packet));
283 return _textures.at(type);
291 _textures[Type::MISSINGTXT] = sf::Texture();
292 _textures[Type::MISSINGTXT].loadFromFile(
"../src/client/assets/missing.png");
293 _textures[Type::PLAYER] = sf::Texture();
294 _textures[Type::PLAYER].loadFromFile(
"../sprites/r-typesheet1.gif");
295 _textures[Type::ENEMY] = sf::Texture();
296 _textures[Type::ENEMY].loadFromFile(
"../testsprites/r-typesheet5_invert.png");
297 _textures[Type::BULLET] = sf::Texture();
298 _textures[Type::BULLET].loadFromFile(
"../sprites/r-typesheet1.gif");
299 _textures[Type::BACKGROUND1] = sf::Texture();
300 _textures[Type::BACKGROUND1].loadFromFile(
"../testsprites/bg_800_600/background_1.png");
301 _textures[Type::BACKGROUND2] = sf::Texture();
302 _textures[Type::BACKGROUND2].loadFromFile(
"../testsprites/bg_800_600/background_2.png");
303 _textures[Type::BACKGROUND3] = sf::Texture();
304 _textures[Type::BACKGROUND3].loadFromFile(
"../testsprites/bg_800_600/background_3.png");
305 _textures[Type::BACKGROUND4] = sf::Texture();
306 _textures[Type::BACKGROUND4].loadFromFile(
"../testsprites/bg_800_600/background_4.png");
307 _textures[Type::FLOOR_BACKGROUND] = sf::Texture();
308 _textures[Type::FLOOR_BACKGROUND].loadFromFile(
"../testsprites/bg_800_600/ground_texture_bg.png");
309 _textures[Type::ROOF_BACKGROUND] = sf::Texture();
310 _textures[Type::ROOF_BACKGROUND].loadFromFile(
"../testsprites/bg_800_600/roof_texture_bg.png");
311 _textures[Type::BOSS] = sf::Texture();
312 _textures[Type::BOSS].loadFromFile(
"../testsprites/r-typesheet30-alone.png");
313 _textures[Type::BOSS_BULLET] = sf::Texture();
314 _textures[Type::BOSS_BULLET].loadFromFile(
"../testsprites/boss-bullets.png");
324 while (window.pollEvent(
const_cast<sf::Event &>(event))) {
325 if (event.type == sf::Event::Closed) {
332 _socket->send(&packet, _socket->serv_addr);
335 if (sf::Keyboard::isKeyPressed(sf::Keyboard::Scancode::Escape)) {
337 for (
auto &component : _clientCore->getCurrentScene()->getComponents()) {
338 if (component->getType() == ComponentType::MUSIC) {
339 dynamic_cast<MusicComponent *>(component.get())->action();
347 _socket->send(&packet, _socket->serv_addr);
352 if (!window.hasFocus())
355 if (sf::Keyboard::isKeyPressed(sf::Keyboard::Scancode::Space)) {
361 event1.key =
static_cast<
int>(sf::Keyboard::Space);
362 event1.eventType =
static_cast<
int>(sf::Event::KeyPressed);
364 _socket->send(&packet, _socket->serv_addr);
368 if (sf::Keyboard::isKeyPressed(sf::Keyboard::Scancode::Up)) {
374 event1.key =
static_cast<
int>(sf::Keyboard::Up);
375 event1.eventType =
static_cast<
int>(sf::Event::KeyPressed);
377 _socket->send(&packet, _socket->serv_addr);
381 if (sf::Keyboard::isKeyPressed(sf::Keyboard::Scancode::Down)) {
387 event1.key =
static_cast<
int>(sf::Keyboard::Down);
388 event1.eventType =
static_cast<
int>(sf::Event::KeyReleased);
390 _socket->send(&packet, _socket->serv_addr);
394 if (sf::Keyboard::isKeyPressed(sf::Keyboard::Scancode::Left)) {
400 event1.key =
static_cast<
int>(sf::Keyboard::Left);
401 event1.eventType =
static_cast<
int>(sf::Event::KeyPressed);
403 _socket->send(&packet, _socket->serv_addr);
407 if (sf::Keyboard::isKeyPressed(sf::Keyboard::Scancode::Right)) {
413 event1.key =
static_cast<
int>(sf::Keyboard::Right);
414 event1.eventType =
static_cast<
int>(sf::Event::KeyPressed);
416 _socket->send(&packet, _socket->serv_addr);
420 for (
auto &component : _components) {
421 component->handleEvent(event, window);