Sử dụng Physic sẽ cải thiện được performance hơn là việc tự bắt va chạm theo tọa độ!

Các thành phần chính của Physic

PhysicsWorld

Các tác động vật lý chỉ có thể phát huy tác dụng trong môi trường mà các tương tác đó tồn tại!
Ở đây được biết đến với các tên Physic World!
Từ World thể hiện là nó có thể effect tới tất cả các objec ở trong nó!
Do vậy nó cần phải được tạo cùng với Scene để có thể effect tới tất cả các object có trong scene!

auto scene = Scene::createWithPhysics();

Các thuộc tính của Physic World:

-gravity: Global gravity applied to the world. Defaults to Vec2(0.0f, -98.0f).
(Gia tốc trọng trường)

-speed: Set the speed of physics world, speed is the rate at which the simulation executes. Defaults to 1.0.

-updateRate: set the update rate of physics world, update rate is the value of EngineUpdateTimes/PhysicsWorldUpdateTimes.

-substeps: set the number of substeps in an update of the physics world.

PhysicsBody

PhysicsBody là component quản lý các thành phần vật lý của game object.
Bao gồm: mass, position, rotation, velocity and damping.
Physicbody cần có shape!

Có 2 loại physicbody là static and dynamic:
– Static: Nó không chuyển động theo các mô phỏng vật lý, có thể coi nó có khối lượng vô tận, và chỉ di chuyển theo cách mà chúng ta di chuyển các node khác, chứ không phải các tác động vật lý như lực, trọng lực …
Nó chỉ tác động tác dụng vật lý lên các vật khác thôi!
Kiểu như đấm vào 1 thằng to con thì nó ko sao còn mình thì đau tay và bật ra vậy!

– Dynamic: là loại mà hoàn toàn chuyển động VẬT LÝ của nó được tính toán và mô phỏng theo thực tế hết!
Vẫn có thể di chuyển các đối tượng này theo cách thông thường nhưng thường thì những đối tượng này được di chuyển bằng force hơn!

Một số

Material

Mô tả thuộc tính của physic
-density:…
-friction:Ma sát
-restitution:Độ đàn hồi

Shapes

Shape tương tự như collider vậy, nó là cái hình dạng của body dể quy định cái vùng mà các tương tác vật lý hoạt động. Một body có thể có nhiều shape, tương ứng với các thành phần của nó.
-type:hình dạng circle, box, polygon, etc.
-area: used to compute the mass properties of the body. The density and area gives the mass.
-mass: the quantity of matter that a body contains, as measured by its acceleration under a given force or by the force exerted on it by a gravitational field.
-moment: determines the torque needed for a desired angular acceleration.

-offset: offset from the body’s center of gravity in body local coordinates.

-tag: used to identify the shape easily for developers.​ You probably remember that you can assign all Node objects a tag for identification and easy access.

Contacts/Joints

Cách các body tương tác/gắn với nhau.

Một số lưu ý khi sử dụng physic:
– Cần setMass
– Khi sử dụng addforce: applyImpulse
– Để không cho nó quay sử dụng: _body->setAngularVelocityLimit(0.0f);

Một số thuộc tính băt buộc:
Node* _groundUp = Node::create();
_groundUp->setTag(Tags::GROUND);
auto _groundUpBody = PhysicsBody::createBox(Size(Config::screenSize.width, 50), PhysicsMaterial(1.0f, 0.0f, 0.0f));
_groundUpBody->setGravityEnable(false);
_groundUpBody->setDynamic(false);
_groundUpBody->setCollisionBitmask(Tags::GROUND);
_groundUpBody->setContactTestBitmask(true);
_groundUp->setPhysicsBody(_groundUpBody);
_groundUp->setAnchorPoint(Vec2(0.5f,0));
_groundUp->setPosition(Vec2(Config::screenSize.width / 2, Config::screenSize.height-5));
this->addChild(_groundUp);

Một số phương thức chú ý:
setContactTestBitmask : có phát tín hiệu hay ko (sử dụng phép AND để tính toán)
setCollisionBitmask : có thực hiện va chạm vật lý thật hay ko
Lúc nào nó cũng phát sinh trigger!
– Nếu muốn thực hiện vật lý thì để: ContactTest = 0, Collision = 1, và OnContact return true;
(nếu trả về true thì nó sẽ tác động lực, còn false thì ko!)

– Còn các trường hợp còn lại nó sẽ ko va chạm.
– Muốn bắt được va chạm 1 trong 2 cái phải để dynamic = true???? (Có vẻ như đúng là như thế)

Advertisements