ð TOP / èªè§£æŒç¿ Step 5
ã³ãŒãèªè§£æŒç¿ Step 5ã宿Šè§£èªãïŒå·šå€§ãªãŒãã³ãœãŒã¹ãªããžããªå®å°èªè§£ïŒBox2Dç·šïŒ
æ°åäžè¡ã®æªç¥ã®ã³ãŒãããŒã¹ãåã«ããŠãå§åãããªãïŒãããããŠã³æ¢çŽ¢ãšã³ã¢ããŒã¿æ§é ã®æœåºæ³
ãæ°æ©èœã®ããã«äžçæ°Žæºã®2Dç©çãšã³ãžã³ïŒBox2DïŒãã°ã©ãã£ãã¯ã¹åºç€ïŒSDL2ïŒãè§£èªã»çµã¿èŸŒã¿ãããããã¡ã€ã«ãäœçŸåããã£ãŠã©ãããèªãã°ãããåãããªããââæ¥åã§æãæ±ãããããåèŠã³ãŒãããŒã¹ã®é«éãããã³ã°æè¡ããäŒæããšã³ããªãã€ã³ãã®ç¹å®ãæœè±¡åã¬ã€ã€ãŒã®å¥ãåãããããŠãäžæ žããŒã¿æ§é ïŒWorld/BodyïŒãã«çããå®ããŠæçã§æ»ç¥ããããã®èªè§£ãããŒãäœåŸããŸãã
5.1 巚倧ãªããžããªæ»ç¥ã®3段éãã¬ãŒã ã¯ãŒã¯ïŒæ£®ãèŠãŠããæšãèŠãïŒ
巚倧ãªã©ã€ãã©ãªã瀟å
ãã¬ãŒã ã¯ãŒã¯ãæž¡ãããæã1ãã¡ã€ã«ãã€èªãã®ã¯æéã®ç¡é§ã§ãããããããŠã³ã®3段éã§æ»ç¥ããŸãã
ð§ ãã³ã®ã³å
茩
ã·ãã¯ãå
çïŒæ¥åã§ãªãŒãã³ãœãŒã¹ã®ç©çãšã³ãžã³ Box2D ãæž¡ããããã§ããããã¡ã€ã«ã200å以äžãã£ãŠãã©ãããèªã¿å§ããã°ããã®ãéæ¹ã«æ®ããŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ãµãã£ãµãã£ãµãïŒæªç¥ã®å·šå€§åéãæ»ç¥ããæã«ãç³å£ã®ç³ã1åãã€æ°ããŠã¯ãªãã¬ïŒããã®ãšã³ãžãã¢ã¯**ãâ samples / testbed ããæå°ã®åãã³ãŒããæ¢ããâãâ¡ å
¬éããã include/ ã®APIãçºããŠç¥ãªããžã§ã¯ããç¹å®ãããâã⢠ã¹ãããæŽæ°ã«ãŒãïŒStep()ïŒã®ãã€ãã©ã€ã³ã远ãã**ãšããé»éã®ãããããŠã³æé ãèžãã®ããïŒ
### 巚倧OSSã»åèŠã³ãŒãããŒã¹èªè§£ã®ã3段éãããããŠã³ã»ã¹ãã£ã³æ³ã 1. **第1段éïŒæå°ãµã³ãã«ïŒSamples/ExamplesïŒãããšã³ããªãã€ã³ããéåŒã**: - ããã¥ã¡ã³ããèªãåã« `samples/` ã `examples/` ãæ¢ãã - ããã£ã30è¡ã§ç«æ¹äœãèœäžããæå°ã³ãŒãããèŠã€ããåŒã³åºãããŠããAPIã®é åºïŒåæå â ç»é² â æŽæ°ïŒãç¹å®ããã 2. **第2段éïŒå
¬éãããïŒinclude/ïŒãããäžæ žããŒã¿æ§é ããç¹å®**: - å
éšå®è£
ïŒsrc/ïŒã«ã¯äžåç«ã¡å
¥ãããå€éšåããããã ããèŠãã - 倧æµã®ãšã³ãžã³ã«ã¯å
šäœã®èŠªçãšãªããWorldãããEngineãã¯ã©ã¹ãååšããã 3. **第3段éïŒæ¯ãã¬ãŒã ã®å¿èéšïŒStep() / Update()ïŒã®ãã€ãã©ã€ã³è§£èª**: - ãæéã®çµéïŒdtïŒããåãåãäžæ žé¢æ°ã®å
éšåŠçé åºãç®æ¡æžãã«ããã - äŸ: å
¥ååŠç â å€åé©çš â è¡çªå€å® â ææè§£æ±º â 座æšç©åã
ð¡ ãã®ã»ã¯ã·ã§ã³ã®éèŠãã€ã³ã
å
éšå®è£
ïŒsrc/ïŒããèªãã§ã¯ãããªã : å
éšã®çްããæ°åŠèšç®ãã¡ã¢ãªæé©åããèªããšç¢ºå®ã«è¿·åã«ãªããŸãããŸããå€éšããã©ã䜿ãããŠãããïŒUsageïŒããææ¡ããã®ãéåã§ãã
5.2 æŒç¿ã³ãŒãïŒBox2D颚 2Dç©çã·ãã¥ã¬ãŒã·ã§ã³ã»ãã€ã¯ãã³ã¢
äžçæ°Žæºã®ç©çãšã³ãžã³ Box2D ã®ã¢ãŒããã¯ãã£èšèšãåçž®ããæŒç¿ã³ãŒãã§ããå
šäœã®æ§é ãèªã¿è§£ããŠãã ããã
ð MiniPhysicsEngine.h
#include <iostream>
#include <vector>
#include <memory>
#include <string>
// 2次å
ãã¯ãã«
struct Vec2 {
float x = 0.0f;
float y = 0.0f;
Vec2(float _x, float _y) : x(_x), y(_y) {}
Vec2 operator+(const Vec2& o) const { return {x + o.x, y + o.y}; }
Vec2 operator*(float s) const { return {x * s, y * s}; }
};
// åäœå®çŸ©ïŒçæçšãã©ã¡ãŒã¿ïŒ
struct BodyDef {
Vec2 position{0.0f, 0.0f};
Vec2 velocity{0.0f, 0.0f};
float mass = 1.0f;
bool isStatic = false; // å°åœ¢ãªã©ã®éçåäœã
};
// åäœãªããžã§ã¯ãïŒBodyïŒ
class Body {
friend class World; // World ããã®ã¿çæã»ç®¡çãããèšèšïŒãã¡ã¯ããªãã¿ãŒã³ïŒ
private:
Vec2 m_position;
Vec2 m_velocity;
float m_mass;
float m_invMass; // é質éïŒèšç®é«éåã®ããäºåèšç®ïŒ
bool m_isStatic;
std::string m_userData; // ãŠãŒã¶ãŒãã²ãŒã åŽãªããžã§ã¯ããšçŽä»ããããã¯
Body(const BodyDef& def)
: m_position(def.position),
m_velocity(def.velocity),
m_mass(def.mass),
m_invMass(def.isStatic || def.mass <= 0.0f ? 0.0f : 1.0f / def.mass),
m_isStatic(def.isStatic) {}
public:
void applyForce(const Vec2& force, float dt) {
if (m_isStatic) return;
m_velocity = m_velocity + (force * (m_invMass * dt));
}
const Vec2& getPosition() const { return m_position; }
const Vec2& getVelocity() const { return m_velocity; }
void setUserData(std::string tag) { m_userData = std::move(tag); }
const std::string& getUserData() const { return m_userData; }
};
// ç©ç空éå
šäœãçµ±æ¬ããäžæ žã¯ã©ã¹ïŒWorldïŒ
class World {
private:
Vec2 m_gravity;
std::vector<std::unique_ptr<Body>> m_bodies;
public:
explicit World(Vec2 gravity) : m_gravity(gravity) {}
// åäœã®çæã¯å¿
ã World ãçµç±ããïŒæææš©ã®éäžç®¡çïŒ
Body* createBody(const BodyDef& def) {
auto body = std::unique_ptr<Body>(new Body(def));
Body* ptr = body.get();
m_bodies.push_back(std::move(body));
return ptr;
}
// ç©çã·ãã¥ã¬ãŒã·ã§ã³ã®1ã¹ãããé²è¡ïŒå¿èéšïŒ
void step(float dt) {
// 1. éåãšå€åã®é©çšïŒéåºŠæŽæ°ïŒ
for (auto& b : m_bodies) {
if (!b->m_isStatic) {
b->m_velocity = b->m_velocity + (m_gravity * dt);
}
}
// 2. 座æšã®æŽæ°ïŒãªã€ã©ãŒç©åïŒ
for (auto& b : m_bodies) {
if (!b->m_isStatic) {
b->m_position = b->m_position + (b->m_velocity * dt);
}
}
}
size_t getBodyCount() const { return m_bodies.size(); }
};
ð¡ ãã®ã»ã¯ã·ã§ã³ã®éèŠãã€ã³ã
ãªã new Body ã§ã¯ãªã world->createBody ãªã®ãïŒ : Box2Dã®ãããªé«æ§èœãšã³ãžã³ã§ã¯ãå
éšã®ã¡ã¢ãªããŒã«ïŒã¡ã¢ãªã¢ãªãŒãïŒããäžæ¬ã§é«éã¢ãã±ãŒã·ã§ã³ããè¡çªå€å®ããã£ãã·ã¥ã®å±ææ§ãä¿ã€ããã«ãçæçªå£ã World ã«äžæ¬åããèšèšãæ¡çšããŠããŸãã
5.3 ã¢ãŒããã¯ãã£ã®éªšæ ŒæœåºïŒããŒã¿ãããŒãšäŸåã°ã©ãã®å¯èŠå
ã³ãŒãããæœåºãããæææš©æ§é ããã·ãã¥ã¬ãŒã·ã§ã³ãã€ãã©ã€ã³ãã®éèçµæã§ãã
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. 巚倧ãªãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªãè§£èªããéãæåã«ç¢ºèªãã¹ããæãå¹ççãªå Žæãã¯ã©ãã§ãããïŒ
1. src/ ãã£ã¬ã¯ããªã®äžã«ããæãè¡æ°ã®å€ã .cpp ãã¡ã€ã« 2. samples/ ã examples/ ã«ãããæå°ã®åããµã³ãã«ã³ãŒãã 3. CMakeLists.txt ããã«ãã¹ã¯ãªããã®å
šè¡ 4. ããããã¡ã€ã«ã«å«ãŸããæ°åŠã¢ã«ãŽãªãºã ã®å°åºåŒ
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒsamples/ ã examples/ ã«ãããæå°ã®åããµã³ãã«ã³ãŒãã
æ£è§£ã§ãïŒæå°ãµã³ãã«ã³ãŒããèŠãããšã§ããåæåâãªããžã§ã¯ãçæâæ¯ãã¬ãŒã æŽæ°ããšããã©ã€ãã©ãªã®æå³ãããAPIåŒã³åºãæé ãäžç¬ã§ææ¡ã§ããŸãã
Q2. MiniPhysicsEngineïŒããã³Box2DïŒã«ãããŠãBody ã®ã³ã³ã¹ãã©ã¯ã¿ã private ã§ããã`world->createBody(def)` ã䜿ã£ãŠçæãããèšèšçç±ã¯äœã§ãããïŒ
1. C++ã®ææ³äžã®å¶çŽã§ãã¯ã©ã¹å€ã§ã³ã³ã¹ãã©ã¯ã¿ãåŒã¹ãªããã 2. World ãå
šåäœã®ã¡ã¢ãªæææš©ãäžæ¬ç®¡çããã¡ã¢ãªããŒã«ã«ããé«éåãè¡çªãã¢ç»é²ãäžå
çã«è¡ãããïŒãã¡ã¯ããªãã¿ãŒã³ïŒ 3. ã¡ã¢ãªäœ¿çšéãååã«ãããã 4. ãã«ãã¹ã¬ãããçŠæ¢ãããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒWorld ãå
šåäœã®ã¡ã¢ãªæææš©ãäžæ¬ç®¡çããã¡ã¢ãªããŒã«ã«ããé«éåãè¡çªãã¢ç»é²ãäžå
çã«è¡ãããïŒãã¡ã¯ããªãã¿ãŒã³ïŒ
æ£è§£ã§ãïŒç©çãšã³ãžã³ã空éå
ã®å
šåäœããªã¹ããã¢ãã±ãŒã¿ã§ç¢ºå®ã«è¿œè·¡ã»ç®¡çã§ããããã«ããããããã¡ã¯ããªã¡ãœããçµç±ã§ã®ã¿çæãèš±å¯ããå
ç¢ãªã«ãã»ã«åèšèšã§ãã
Q3. ç©çãšã³ãžã³å
éšã§ã質é mass ã§ã¯ãªããé質é invMassïŒ1.0f / massïŒããä¿æããŠèšç®ããæå€§ã®ã¡ãªããã¯äœã§ãããïŒ
1. CPUã«ãããŠéãå²ãç®åœä»€ãé¿ããé«éãªæãç®åœä»€ã§å é床ïŒF * invMassïŒãç®åºã§ããéçåäœïŒåºå®å°åœ¢ïŒã invMass = 0.0f ã§ãŒãé€ç®ãªãæ±ãããã 2. 倿°ã®ã¡ã¢ãªãµã€ãºãå°ãããªããã 3. è² ã®è³ªéã衚çŸã§ããããã«ãªããã 4. æµ®åå°æ°ç¹æ°ã®äžžã誀差ãå®å
šã«ãŒãã«ãªããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒCPUã«ãããŠéãå²ãç®åœä»€ãé¿ããé«éãªæãç®åœä»€ã§å é床ïŒF * invMassïŒãç®åºã§ããéçåäœïŒåºå®å°åœ¢ïŒã invMass = 0.0f ã§ãŒãé€ç®ãªãæ±ãããã
æ£è§£ã§ãïŒé€ç®ã¯ä¹ç®ã«æ¯ã¹ãŠCPUã¯ããã¯ãå€ãæ¶è²»ããŸããããã«è³ªéç¡é倧ïŒåããªãå°é¢ïŒã `invMass = 0.0f` ãšå®çŸ©ããããšã§ãç¹å¥ãª if åå²ãªãã« `velocity += force * 0.0f` ã§éæ¢ç¶æ
ãç¶æã§ããŸãã
Q4. ç©çãšã³ãžã³ã®åäœã« `void*` ã `std::string` ã® `m_userData` ãçšæãããŠããã¢ãŒããã¯ãã£äžã®ç®çã¯äœã§ãããïŒ
1. ç©çãšã³ãžã³ã®ã³ãŒããé£è§£ã«ããŠãªããŒã¹ãšã³ãžãã¢ãªã³ã°ãé²ããã 2. ç©çãšã³ãžã³åŽãã²ãŒã åŽã® Player ã Enemy ãªã©ã®å
·è±¡ã¯ã©ã¹ã«äŸåããããšãªããã²ãŒã åŽãªããžã§ã¯ããšçŽä»ããççµåããã¯ãæäŸãããã 3. åäœã®ãã¯ã¹ãã£ç»åãç©çãšã³ãžã³å
ã§æç»ãããã 4. ã»ãŒãããŒã¿ãæå·åãããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒç©çãšã³ãžã³åŽãã²ãŒã åŽã® Player ã Enemy ãªã©ã®å
·è±¡ã¯ã©ã¹ã«äŸåããããšãªããã²ãŒã åŽãªããžã§ã¯ããšçŽä»ããççµåããã¯ãæäŸãããã
æ£è§£ã§ãïŒç©çãšã³ãžã³ã¯ã²ãŒã åºæã®ããžãã¯ã«äŸåãã¹ãã§ã¯ãããŸãããuserData ããã¯ãæãããããšã§ãäŸåæ§ãé転ãããã«è¡çªçžæãã©ã®ã²ãŒã ãã£ã©ããå€å®ã§ããŸãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â