A 2D tile-based sandbox game.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include "EntItemStack.h"
  2. #include <random>
  3. EntItemStack::EntItemStack(const Swan::Context &ctx, const Swan::SRF &params):
  4. PhysicsEntity(SIZE, MASS) {
  5. PhysicsEntity::body_.bounciness_ = 0.6;
  6. readSRF(ctx, params);
  7. static std::uniform_real_distribution vx(-2.3f, 2.3f);
  8. static std::uniform_real_distribution vy(-2.3f, -1.2f);
  9. body_.pos_.y += 0.5 - body_.size_.y / 2;
  10. body_.vel_ += Swan::Vec2{ vx(ctx.world.random_), vy(ctx.world.random_) };
  11. }
  12. void EntItemStack::draw(const Swan::Context &ctx, Swan::Win &win) {
  13. win.setPos(body_.pos_);
  14. win.draw(sprite_);
  15. }
  16. void EntItemStack::tick(const Swan::Context &ctx, float dt) {
  17. despawn_timer_ -= dt;
  18. if (despawn_timer_ <= 0)
  19. ctx.plane.despawnEntity(*this);
  20. }
  21. void EntItemStack::readSRF(const Swan::Context &ctx, const Swan::SRF &srf) {
  22. auto &arr = dynamic_cast<const Swan::SRFArray &>(srf);
  23. auto *pos = dynamic_cast<Swan::SRFFloatArray *>(arr.val[0].get());
  24. auto *name = dynamic_cast<Swan::SRFString *>(arr.val[1].get());
  25. body_.pos_.set(pos->val[0], pos->val[1]);
  26. item_ = &ctx.world.getItem(name->val);
  27. tex_.loadFromImage(*item_->image);
  28. sprite_.setTexture(tex_);
  29. sprite_.setScale(SIZE);
  30. }
  31. Swan::SRF *EntItemStack::writeSRF(const Swan::Context &ctx) {
  32. return new Swan::SRFArray{
  33. new Swan::SRFFloatArray{ body_.pos_.x, body_.pos_.y },
  34. new Swan::SRFString{ item_->name },
  35. };
  36. }