载入中...
搜索中...
未找到
World.h
浏览该文件的文档.
1#pragma once
2
3#include <cstdint>
4#include <string>
5#include <unordered_set>
6#include <unordered_map>
7#include <vector>
8
9class b2World;
10class b2Body;
11class b2Fixture;
12class b2Contact;
13class b2Manifold;
14struct b2ContactImpulse;
15
16namespace eve::graphics {
17class Graphics;
18}
19
20namespace eve::physics {
21
22class Body;
23class Fixture;
24class ContactRelay;
25class DebugDraw;
26
31class World {
32public:
33 struct ContactEvent {
34 int bodyAId = 0;
35 int bodyBId = 0;
36 std::string fixtureATag;
37 std::string fixtureBTag;
38 };
39
41 float pointX = 0.f;
42 float pointY = 0.f;
43 float normalX = 0.f;
44 float normalY = 0.f;
46 float normalImpulse = 0.f;
47 float tangentImpulse = 0.f;
48 };
55 World(float gravityX, float gravityY, bool sleep, float meter);
56 ~World();
57
58 World(const World &) = delete;
59 World &operator=(const World &) = delete;
60
62 void update(float dt);
64 void updateFull(float dt, int velocityIterations, int positionIterations);
65
67 void setGravity(float gx, float gy);
68 float getGravityX() const;
69 float getGravityY() const;
70
72 void setMeter(float pixelsPerMeter);
73 float getMeter() const { return meter_; }
74
76 Body *newBody(const std::string &bodyType, float x, float y);
77
79 void destroyBody(Body *body);
81 void destroy();
82
85
90 int rayCast(float x1, float y1, float x2, float y2);
91 bool hasRayHit() const { return rayHitBodyId_ >= 0; }
92 int getRayHitBodyId() const { return rayHitBodyId_; }
93 float getRayHitX() const { return rayHitX_; }
94 float getRayHitY() const { return rayHitY_; }
95 float getRayHitNormalX() const { return rayHitNormalX_; }
96 float getRayHitNormalY() const { return rayHitNormalY_; }
98 float getRayHitFraction() const { return rayHitFraction_; }
99
104 int queryAABB(float x, float y, float w, float h);
105 int getQueryCount() const { return static_cast<int>(queryBodyIds_.size()); }
106 int getQueryBodyId(int index) const;
107
108 int getBeginContactCount() const { return int(beginContacts_.size()); }
109 int getBeginContactBodyAId(int index) const;
110 int getBeginContactBodyBId(int index) const;
111 std::string getBeginContactFixtureATag(int index) const;
112 std::string getBeginContactFixtureBTag(int index) const;
113 int getEndContactCount() const { return int(endContacts_.size()); }
114 int getEndContactBodyAId(int index) const;
115 int getEndContactBodyBId(int index) const;
116 std::string getEndContactFixtureATag(int index) const;
117 std::string getEndContactFixtureBTag(int index) const;
118
119 int getImpactCount() const { return int(impacts_.size()); }
120 int getImpactBodyAId(int index) const;
121 int getImpactBodyBId(int index) const;
122 std::string getImpactFixtureATag(int index) const;
123 std::string getImpactFixtureBTag(int index) const;
124 float getImpactPointX(int index) const;
125 float getImpactPointY(int index) const;
126 float getImpactNormalX(int index) const;
127 float getImpactNormalY(int index) const;
128 float getImpactRelativeNormalSpeed(int index) const;
129 float getImpactNormalImpulse(int index) const;
130 float getImpactTangentImpulse(int index) const;
132 void clearContactEvents();
133
135 float toMeters(float pixels) const;
137 float toPixels(float meters) const;
138
140 b2World *raw() { return world_; }
141 const b2World *raw() const { return world_; }
142
143 void onBeginContact(b2Contact *contact);
144 void onEndContact(b2Contact *contact);
145 void onPreSolve(b2Contact *contact, const b2Manifold *oldManifold);
146 void onPostSolve(b2Contact *contact, const b2ContactImpulse *impulse);
147
148 void forgetBody(Body *body);
149 void forgetFixture(Fixture *fixture);
150
151 int nextBodyId();
152
153private:
154 friend class Body;
155 friend class Fixture;
156
157 b2World *world_ = nullptr;
158 ContactRelay *relay_ = nullptr;
159 DebugDraw *draw_ = nullptr;
160 float meter_ = 30.f;
161 int nextId_ = 1;
162 bool destroyed_ = false;
163
164 std::unordered_set<Body *> bodies_;
165 std::unordered_set<Fixture *> fixtures_;
166
167 int rayHitBodyId_ = -1;
168 float rayHitX_ = 0.f;
169 float rayHitY_ = 0.f;
170 float rayHitNormalX_ = 0.f;
171 float rayHitNormalY_ = 0.f;
172 float rayHitFraction_ = 0.f;
173
174 std::vector<int> queryBodyIds_;
175
176 struct PreSolveData {
177 float pointX = 0.f;
178 float pointY = 0.f;
179 float normalX = 0.f;
180 float normalY = 0.f;
181 float relativeNormalSpeed = 0.f;
182 };
183 std::unordered_map<b2Contact *, PreSolveData> preSolve_;
184 std::vector<ContactEvent> beginContacts_;
185 std::vector<ContactEvent> endContacts_;
186 std::vector<ImpactEvent> impacts_;
187};
188
189} // namespace eve::physics
int y
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
int h
int w
JobFunc body
2D rigid body (Box2D) in pixel-space coordinates. Owned by a World; create shapes with newRectangleFi...
Definition Body.h:16
2D fixture: a shape attached to a Body with material + filter settings. Also carries a string tag use...
Definition Fixture.h:16
Box2D world wrapper (2D physics) with pixel-space coordinates. Handles stepping, gravity,...
Definition World.h:31
void setMeter(float pixelsPerMeter)
Changes the pixels-per-meter conversion.
Definition World.cpp:219
float getRayHitX() const
Definition World.h:93
int getRayHitBodyId() const
Definition World.h:92
void update(float dt)
Steps the simulation by dt seconds (5 velocity / 2 position iterations).
Definition World.cpp:194
int queryAABB(float x, float y, float w, float h)
Query fixtures overlapping an axis-aligned box in pixel space (x,y,w,h). Returns match count; read id...
Definition World.cpp:484
float getImpactNormalY(int index) const
Definition World.cpp:412
void destroyBody(Body *body)
Destroys a body (null is ignored).
Definition World.cpp:244
void onBeginContact(b2Contact *contact)
Definition World.cpp:284
std::string getBeginContactFixtureATag(int index) const
Definition World.cpp:373
void forgetBody(Body *body)
Definition World.cpp:249
float getRayHitY() const
Definition World.h:94
void onEndContact(b2Contact *contact)
Definition World.cpp:300
void forgetFixture(Fixture *fixture)
Definition World.cpp:260
World(const World &)=delete
std::string getEndContactFixtureATag(int index) const
Definition World.cpp:385
float getImpactPointX(int index) const
Definition World.cpp:403
void drawDebug(graphics::Graphics *gfx)
Optional: draw fixture AABBs via Graphics::drawSolidRect.
Definition World.cpp:432
int getQueryBodyId(int index) const
Definition World.cpp:515
int getQueryCount() const
Definition World.h:105
int getEndContactBodyBId(int index) const
Definition World.cpp:382
int getBeginContactBodyBId(int index) const
Definition World.cpp:370
void destroy()
Destroys the underlying Box2D world and resets event buffers.
Definition World.cpp:159
void setGravity(float gx, float gy)
Sets the world gravity vector in pixels/s^2.
Definition World.cpp:204
void onPostSolve(b2Contact *contact, const b2ContactImpulse *impulse)
Definition World.cpp:340
int getEndContactBodyAId(int index) const
Definition World.cpp:379
int getImpactCount() const
Definition World.h:119
float getGravityX() const
Definition World.cpp:209
float toPixels(float meters) const
Converts a meter-space length to pixels.
Definition World.cpp:226
float getRayHitFraction() const
Fraction along the segment [0,1] of the closest hit.
Definition World.h:98
float getRayHitNormalY() const
Definition World.h:96
bool hasRayHit() const
Definition World.h:91
float getImpactNormalX(int index) const
Definition World.cpp:409
float getImpactRelativeNormalSpeed(int index) const
Definition World.cpp:415
b2World * raw()
The underlying Box2D world (advanced use).
Definition World.h:140
Body * newBody(const std::string &bodyType, float x, float y)
bodyType: "static" | "kinematic" | "dynamic". x/y in pixels.
Definition World.cpp:230
int getBeginContactBodyAId(int index) const
Definition World.cpp:367
int getImpactBodyAId(int index) const
Definition World.cpp:391
int getBeginContactCount() const
Definition World.h:108
World & operator=(const World &)=delete
int getImpactBodyBId(int index) const
Definition World.cpp:394
float getRayHitNormalX() const
Definition World.h:95
int getEndContactCount() const
Definition World.h:113
const b2World * raw() const
Definition World.h:141
float getImpactNormalImpulse(int index) const
Definition World.cpp:418
std::string getEndContactFixtureBTag(int index) const
Definition World.cpp:388
int rayCast(float x1, float y1, float x2, float y2)
Closest raycast in pixel space from (x1,y1) to (x2,y2). Returns hit body id, or -1....
Definition World.cpp:439
float getImpactTangentImpulse(int index) const
Definition World.cpp:421
float getGravityY() const
Definition World.cpp:214
std::string getBeginContactFixtureBTag(int index) const
Definition World.cpp:376
void updateFull(float dt, int velocityIterations, int positionIterations)
Steps with explicit iteration counts.
Definition World.cpp:196
void clearContactEvents()
Clears collected begin/end contact and impact event buffers.
Definition World.cpp:425
void onPreSolve(b2Contact *contact, const b2Manifold *oldManifold)
Definition World.cpp:317
float toMeters(float pixels) const
Converts a pixel-space length to meters.
Definition World.cpp:225
std::string getImpactFixtureATag(int index) const
Definition World.cpp:397
std::string getImpactFixtureBTag(int index) const
Definition World.cpp:400
float getMeter() const
Definition World.h:73
float getImpactPointY(int index) const
Definition World.cpp:406
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition AnimTrail.h:6