Cornell Cocos
Cornell Extensions to Cocos2d
CUSimpleObstacle.h
1 //
2 // CUSimpleObstacle.h
3 // Cornell Extensions to Cocos2D
4 //
5 // This class serves to provide a uniform interface for all single-body objects
6 // (regardless of shape). How, it still cannot be instantiated directly, as
7 // the correct instantiation depends on the shape. See BoxObstacle and CircleObstacle
8 // for concrete examples
9 //
10 // This file is based on the CS 3152 PhysicsDemo Lab by Don Holden, 2007
11 //
12 // Author: Walker White
13 // Version: 11/24/15
14 //
15 #ifndef __CC_SIMPLE_OBSTACLE_H__
16 #define __CC_SIMPLE_OBSTACLE_H__
17 
18 #include "CUObstacle.h"
19 
20 
21 NS_CC_BEGIN
22 
23 #pragma mark -
24 #pragma mark Simple Obstacle
25 
36 class CC_DLL SimpleObstacle : public Obstacle {
37 private:
39  CC_DISALLOW_COPY_AND_ASSIGN(SimpleObstacle);
40 
41 protected:
43  b2Body* _body;
44 
46  int _posSnap;
48  unsigned long _posFact;
50  int _angSnap;
52  unsigned long _angFact;
53 
54 
55 public:
56 #pragma mark -
57 #pragma mark BodyDef Methods
58 
67  virtual b2BodyType getBodyType() const override {
68  return (_body != nullptr ? _body->GetType() : _bodyinfo.type);
69  }
70 
80  virtual void setBodyType(b2BodyType value) override {
81  if (_body != nullptr) {
82  _body->SetType(value);
83  } else {
84  _bodyinfo.type = value;
85  }
86  }
87 
97  virtual Vec2 getPosition() const override {
98  if (_body != nullptr) {
99  return Vec2(_body->GetPosition().x,_body->GetPosition().y);
100  } else {
101  return Vec2(_bodyinfo.position.x,_bodyinfo.position.y);
102  }
103  }
104 
113  virtual void setPosition(const Vec2& value) override { setPosition(value.x,value.y); }
114 
121  virtual void setPosition(float x, float y) override {
122  if (_body != nullptr) {
123  _body->SetTransform(b2Vec2(x,y),_body->GetAngle());
124  } else {
125  _bodyinfo.position.Set(x,y);
126  }
127  }
128 
134  virtual float getX() const override {
135  return (_body != nullptr ? _body->GetPosition().x : _bodyinfo.position.x);
136  }
137 
143  virtual void setX(float value) override {
144  if (_body != nullptr) {
145  _body->SetTransform(b2Vec2(value,_body->GetPosition().y),_body->GetAngle());
146  } else {
147  _bodyinfo.position.x = value;
148  }
149  }
150 
156  virtual float getY() const override {
157  return (_body != nullptr ? _body->GetPosition().y : _bodyinfo.position.y);
158  }
159 
165  virtual void setY(float value) override {
166  if (_body != nullptr) {
167  _body->SetTransform(b2Vec2(_body->GetPosition().y,value),_body->GetAngle());
168  } else {
169  _bodyinfo.position.y = value;
170  }
171  }
172 
180  virtual float getAngle() const override {
181  return (_body != nullptr ? _body->GetAngle() : _bodyinfo.angle);
182  }
183 
189  virtual void setAngle(float value) override {
190  if (_body != nullptr) {
191  _body->SetTransform(_body->GetPosition(),value);
192  } else {
193  _bodyinfo.angle = value;
194  }
195  }
196 
206  virtual Vec2 getLinearVelocity() const override {
207  if (_body != nullptr) {
208  return Vec2(_body->GetLinearVelocity().x,_body->GetLinearVelocity().y);
209  } else {
210  return Vec2(_bodyinfo.linearVelocity.x,_bodyinfo.linearVelocity.y);
211  }
212  }
213 
222  virtual void setLinearVelocity(const Vec2& value) override { setLinearVelocity(value.x,value.y); }
223 
230  virtual void setLinearVelocity(float x, float y) override {
231  if (_body != nullptr) {
232  _body->SetLinearVelocity(b2Vec2(x,y));
233  } else {
234  _bodyinfo.linearVelocity.Set(x,y);
235  }
236  }
237 
243  virtual float getVX() const override {
244  if (_body != nullptr) {
245  return _body->GetLinearVelocity().x;
246  } else {
247  return _bodyinfo.linearVelocity.x;
248  }
249  }
250 
256  virtual void setVX(float value) override {
257  if (_body != nullptr) {
258  _body->SetLinearVelocity(b2Vec2(value,_body->GetLinearVelocity().y));
259  } else {
260  _bodyinfo.linearVelocity.x = value;
261  }
262  }
263 
269  virtual float getVY() const override {
270  if (_body != nullptr) {
271  return _body->GetLinearVelocity().y;
272  } else {
273  return _bodyinfo.linearVelocity.y;
274  }
275  }
276 
282  virtual void setVY(float value) override {
283  if (_body != nullptr) {
284  _body->SetLinearVelocity(b2Vec2(_body->GetLinearVelocity().x,value));
285  } else {
286  _bodyinfo.linearVelocity.y = value;
287  }
288  }
289 
297  virtual float getAngularVelocity() const override {
298  return (_body != nullptr ? _body->GetAngularVelocity() : _bodyinfo.angularVelocity);
299  }
300 
306  virtual void setAngularVelocity(float value) override {
307  if (_body != nullptr) {
308  _body->SetAngularVelocity(value);
309  } else {
310  _bodyinfo.angularVelocity = value;
311  }
312  }
313 
324  virtual bool isActive() const override {
325  return (_body != nullptr ? _body->IsActive() : _bodyinfo.active);
326  }
327 
338  virtual void setActive(bool value) override {
339  if (_body != nullptr) {
340  _body->SetActive(value);
341  } else {
342  _bodyinfo.active = value;
343  }
344  }
345 
356  virtual bool isAwake() const override {
357  return (_body != nullptr ? _body->IsAwake() : _bodyinfo.awake);
358  }
359 
370  virtual void setAwake(bool value) override {
371  if (_body != nullptr) {
372  _body->SetAwake(value);
373  } else {
374  _bodyinfo.awake = value;
375  }
376  }
377 
388  virtual bool isSleepingAllowed() const override {
389  return (_body != nullptr ? _body->IsSleepingAllowed() : _bodyinfo.allowSleep);
390  }
391 
402  virtual void setSleepingAllowed(bool value) override {
403  if (_body != nullptr) {
404  _body->SetSleepingAllowed(value);
405  } else {
406  _bodyinfo.allowSleep = value;
407  }
408  }
409 
426  virtual bool isBullet() const override {
427  return (_body != nullptr ? _body->IsBullet() : _bodyinfo.bullet);
428  }
429 
446  virtual void setBullet(bool value) override {
447  if (_body != nullptr) {
448  _body->SetBullet(value);
449  } else {
450  _bodyinfo.bullet = value;
451  }
452  }
453 
461  virtual bool isFixedRotation() const override {
462  return (_body != nullptr ? _body->IsFixedRotation() : _bodyinfo.fixedRotation);
463  }
464 
472  virtual void setFixedRotation(bool value) override {
473  if (_body != nullptr) {
474  _body->SetFixedRotation(value);
475  } else {
476  _bodyinfo.fixedRotation = value;
477  }
478  }
479 
488  virtual float getGravityScale() const override {
489  return (_body != nullptr ? _body->GetGravityScale() : _bodyinfo.gravityScale);
490  }
491 
500  virtual void setGravityScale(float value) override {
501  if (_body != nullptr) {
502  _body->SetGravityScale(value);
503  } else {
504  _bodyinfo.gravityScale = value;
505  }
506  }
507 
521  virtual float getLinearDamping() const override {
522  return (_body != nullptr ? _body->GetLinearDamping() : _bodyinfo.linearDamping);
523  }
524 
538  virtual void setLinearDamping(float value) override {
539  if (_body != nullptr) {
540  _body->SetLinearDamping(value);
541  } else {
542  _bodyinfo.linearDamping = value;
543  }
544  }
545 
559  virtual float getAngularDamping() const override {
560  return (_body != nullptr ? _body->GetAngularDamping() : _bodyinfo.angularDamping);
561  }
562 
576  virtual void setAngularDamping(float value) override {
577  if (_body != nullptr) {
578  _body->SetAngularDamping(value);
579  } else {
580  _bodyinfo.angularDamping = value;
581  }
582  }
583 
584 
585 #pragma mark -
586 #pragma mark FixtureDef Methods
587 
596  virtual void setDensity(float value) override;
597 
609  virtual void setFriction(float value) override;
610 
622  virtual void setRestitution(float value) override;
623 
633  virtual void setSensor(bool value) override;
634 
648  virtual void setFilterData(b2Filter value) override;
649 
650 
651 #pragma mark -
652 #pragma mark MassData Methods
653 
662  virtual Vec2 getCentroid() const override {
663  if (_body != nullptr) {
664  return Vec2(_body->GetLocalCenter().x,_body->GetLocalCenter().y);
665  } else {
666  return Vec2(_massdata.center.x,_massdata.center.y);
667  }
668  }
669 
678  virtual void setCentroid(const Vec2& value) override { setCentroid(value.x,value.y); }
679 
686  virtual void setCentroid(float x, float y) override {
687  Obstacle::setCentroid(x, y);
688  if (_body != nullptr) {
689  _body->SetMassData(&_massdata); // Protected accessor?
690  }
691  }
692 
701  virtual float getInertia() const override {
702  return (_body != nullptr ? _body->GetInertia() : _massdata.I);
703  }
704 
713  virtual void setInertia(float value) override {
714  Obstacle::setInertia(value);
715  if (_body != nullptr) {
716  _body->SetMassData(&_massdata); // Protected accessor?
717  }
718  }
719 
727  virtual float getMass() const override {
728  return (_body != nullptr ? _body->GetMass() : _massdata.mass);
729  }
730 
738  virtual void setMass(float value) override {
739  Obstacle::setMass(value);
740  if (_body != nullptr) {
741  _body->SetMassData(&_massdata); // Protected accessor?
742  }
743  }
744 
748  virtual void resetMass() override {
750  if (_body != nullptr) {
751  _body->ResetMassData();
752  }
753  }
754 
755 
756 #pragma mark -
757 #pragma mark Physics Methods
758 
765  virtual b2Body* getBody() const override { return _body; }
766 
777  virtual bool activatePhysics(b2World& world) override;
778 
785  virtual void deactivatePhysics(b2World& world) override;
786 
792  virtual void createFixtures() {}
793 
799  virtual void releaseFixtures() {}
800 
814  virtual void update(float delta) override;
815 
816 
817 #pragma mark -
818 #pragma mark Render Snap
819 
832  int getPositionSnap() { return _posSnap; }
833 
847  void setPositionSnap(unsigned int snap) {
848  _posSnap = snap;
849  _posFact = (unsigned long)(_posSnap >= 0 ? std::pow(10, snap) : 0);
850  }
851 
866  int getAngleSnap() { return _angSnap; }
867 
882  void setAngleSnap(unsigned int snap) {
883  _angSnap = snap;
884  _angFact = (unsigned long)(_angSnap >= 0 ? std::pow(10, snap) : 0);
885  }
886 
895  virtual void positionSceneNode() override;
896 
905  virtual void positionDebugNode() override;
906 
907 
908 #pragma mark -
909 #pragma mark Initializers
910 CC_CONSTRUCTOR_ACCESS:
914  SimpleObstacle() : Obstacle(), _body(nullptr) {
915  _posSnap = _angSnap = -1;
916  }
917 
927  virtual ~SimpleObstacle() {
928  CCASSERT(_body == nullptr, "You must deactive physics before deleting an object");
929  }
930 
931 };
932 
933 NS_CC_END
934 #endif /* defined(__CC_SIMPLE_OBSTACLE_H__) */
virtual void setInertia(float value)
Definition: CUObstacle.cpp:126
void setAngleSnap(unsigned int snap)
Definition: CUSimpleObstacle.h:882
virtual float getVY() const override
Definition: CUSimpleObstacle.h:269
virtual void setAngularDamping(float value) override
Definition: CUSimpleObstacle.h:576
virtual ~SimpleObstacle()
Definition: CUSimpleObstacle.h:927
virtual void setActive(bool value) override
Definition: CUSimpleObstacle.h:338
virtual void setBullet(bool value) override
Definition: CUSimpleObstacle.h:446
virtual void setFriction(float value)
Definition: CUObstacle.h:562
virtual void setCentroid(const Vec2 &value) override
Definition: CUSimpleObstacle.h:678
virtual void setAngularVelocity(float value) override
Definition: CUSimpleObstacle.h:306
void setPositionSnap(unsigned int snap)
Definition: CUSimpleObstacle.h:847
b2Body * _body
Definition: CUSimpleObstacle.h:43
virtual void setPosition(const Vec2 &value) override
Definition: CUSimpleObstacle.h:113
unsigned long _posFact
Definition: CUSimpleObstacle.h:48
virtual void setSleepingAllowed(bool value) override
Definition: CUSimpleObstacle.h:402
virtual bool isBullet() const override
Definition: CUSimpleObstacle.h:426
virtual void setFilterData(b2Filter value)
Definition: CUObstacle.h:638
virtual void setLinearVelocity(float x, float y) override
Definition: CUSimpleObstacle.h:230
virtual void setY(float value) override
Definition: CUSimpleObstacle.h:165
virtual void resetMass()
Definition: CUObstacle.h:713
virtual float getVX() const override
Definition: CUSimpleObstacle.h:243
virtual void setSensor(bool value)
Definition: CUObstacle.h:610
virtual void setLinearDamping(float value) override
Definition: CUSimpleObstacle.h:538
virtual float getY() const override
Definition: CUSimpleObstacle.h:156
virtual void setCentroid(const Vec2 &value)
Definition: CUObstacle.h:662
virtual void positionSceneNode()
Definition: CUObstacle.cpp:240
virtual void setVY(float value) override
Definition: CUSimpleObstacle.h:282
virtual void createFixtures()
Definition: CUSimpleObstacle.h:792
virtual float getAngularDamping() const override
Definition: CUSimpleObstacle.h:559
virtual b2Body * getBody() const override
Definition: CUSimpleObstacle.h:765
virtual float getGravityScale() const override
Definition: CUSimpleObstacle.h:488
virtual void setPosition(float x, float y) override
Definition: CUSimpleObstacle.h:121
virtual float getAngularVelocity() const override
Definition: CUSimpleObstacle.h:297
virtual bool isFixedRotation() const override
Definition: CUSimpleObstacle.h:461
virtual void releaseFixtures()
Definition: CUSimpleObstacle.h:799
virtual void setLinearVelocity(const Vec2 &value) override
Definition: CUSimpleObstacle.h:222
virtual void positionDebugNode()
Definition: CUObstacle.cpp:257
Definition: CUSimpleObstacle.h:36
virtual void setInertia(float value) override
Definition: CUSimpleObstacle.h:713
virtual bool isAwake() const override
Definition: CUSimpleObstacle.h:356
virtual void setFixedRotation(bool value) override
Definition: CUSimpleObstacle.h:472
virtual float getAngle() const override
Definition: CUSimpleObstacle.h:180
virtual void setX(float value) override
Definition: CUSimpleObstacle.h:143
virtual void setAngle(float value) override
Definition: CUSimpleObstacle.h:189
virtual b2BodyType getBodyType() const override
Definition: CUSimpleObstacle.h:67
virtual Vec2 getCentroid() const override
Definition: CUSimpleObstacle.h:662
virtual void deactivatePhysics(b2World &world)
Definition: CUObstacle.h:895
virtual bool activatePhysics(b2World &world)
Definition: CUObstacle.h:887
virtual void setVX(float value) override
Definition: CUSimpleObstacle.h:256
virtual void setDensity(float value)
Definition: CUObstacle.h:536
virtual void setMass(float value)
Definition: CUObstacle.cpp:142
virtual float getInertia() const override
Definition: CUSimpleObstacle.h:701
virtual bool isSleepingAllowed() const override
Definition: CUSimpleObstacle.h:388
int _angSnap
Definition: CUSimpleObstacle.h:50
virtual void setAwake(bool value) override
Definition: CUSimpleObstacle.h:370
virtual void setBodyType(b2BodyType value) override
Definition: CUSimpleObstacle.h:80
int _posSnap
Definition: CUSimpleObstacle.h:46
virtual Vec2 getPosition() const override
Definition: CUSimpleObstacle.h:97
Definition: CUObstacle.h:46
virtual void update(float delta)
Definition: CUObstacle.h:910
int getAngleSnap()
Definition: CUSimpleObstacle.h:866
virtual float getMass() const override
Definition: CUSimpleObstacle.h:727
unsigned long _angFact
Definition: CUSimpleObstacle.h:52
virtual bool isActive() const override
Definition: CUSimpleObstacle.h:324
virtual void setRestitution(float value)
Definition: CUObstacle.h:588
virtual void setMass(float value) override
Definition: CUSimpleObstacle.h:738
virtual float getLinearDamping() const override
Definition: CUSimpleObstacle.h:521
virtual void setGravityScale(float value) override
Definition: CUSimpleObstacle.h:500
virtual Vec2 getLinearVelocity() const override
Definition: CUSimpleObstacle.h:206
virtual void setCentroid(float x, float y) override
Definition: CUSimpleObstacle.h:686
virtual void resetMass() override
Definition: CUSimpleObstacle.h:748
virtual float getX() const override
Definition: CUSimpleObstacle.h:134
int getPositionSnap()
Definition: CUSimpleObstacle.h:832