A 2D tile-based sandbox game.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

PhysicsTrait.h 833B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #pragma once
  2. #include "../traits/BodyTrait.h"
  3. #include "../Vector2.h"
  4. #include "../common.h"
  5. namespace Swan {
  6. struct PhysicsTrait {
  7. struct Physics;
  8. struct Tag {};
  9. virtual Physics &get(Tag) = 0;
  10. struct PhysicsProps {
  11. float mass;
  12. float bounciness = 0;
  13. float mushyness = 2;
  14. };
  15. struct Physics {
  16. Vec2 vel{};
  17. Vec2 force{};
  18. bool on_ground = false;
  19. void friction(Vec2 coef = Vec2(400, 50));
  20. void gravity(float mass, Vec2 g = Vec2(0, 20));
  21. void standardForces(float mass) { friction(); gravity(mass); }
  22. void update(
  23. const Swan::Context &ctx, float dt,
  24. BodyTrait::Body &body, const PhysicsProps &props);
  25. };
  26. };
  27. /*
  28. * Physics
  29. */
  30. inline void PhysicsTrait::Physics::friction(Vec2 coef) {
  31. force += -vel * coef;
  32. }
  33. inline void PhysicsTrait::Physics::gravity(float mass, Vec2 g) {
  34. force += g * mass;
  35. }
  36. }