85 lines
1.7 KiB
C
85 lines
1.7 KiB
C
|
|
// Copyright (C) 2019 Nomango
|
|||
|
|
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include "Circle.h"
|
|||
|
|
#include "Rect.h"
|
|||
|
|
#include "Board.h"
|
|||
|
|
|
|||
|
|
E2D_DECLARE_SMART_PTR(MainScene);
|
|||
|
|
class MainScene
|
|||
|
|
: public Scene
|
|||
|
|
{
|
|||
|
|
b2World* world_;
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
MainScene()
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ӧ״̬, ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD> Click <20><>Ϣ
|
|||
|
|
SetResponsible(true);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
AddListener(Event::Click, Closure(this, &MainScene::Click));
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
world_ = new b2World(b2Vec2(0, 10));
|
|||
|
|
|
|||
|
|
BoardPtr board = new Board(world_, Size(GetWidth() - 100, 20), Point(GetWidth() / 2, GetHeight() - 50));
|
|||
|
|
AddChild(board);
|
|||
|
|
|
|||
|
|
CirclePtr circle = new Circle(world_, Point(320, 240));
|
|||
|
|
AddChild(circle);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
~MainScene()
|
|||
|
|
{
|
|||
|
|
if (world_)
|
|||
|
|
delete world_;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void OnUpdate(Duration dt) override
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD> Box2D <20><><EFBFBD><EFBFBD>
|
|||
|
|
world_->Step(dt.Seconds(), 6, 2);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
|
|||
|
|
b2Body* body = world_->GetBodyList();
|
|||
|
|
while (body)
|
|||
|
|
{
|
|||
|
|
Node* node = (Node*)body->GetUserData();
|
|||
|
|
b2Body* next = body->GetNext();
|
|||
|
|
if (node)
|
|||
|
|
{
|
|||
|
|
const b2Vec2& pos = body->GetPosition();
|
|||
|
|
node->SetPosition(Vec2Convert(pos));
|
|||
|
|
node->SetRotation(body->GetAngle() * 180.f / math::constants::PI_F);
|
|||
|
|
|
|||
|
|
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>䵽<EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (node->GetPosition().y > GetHeight() + 50)
|
|||
|
|
{
|
|||
|
|
body->SetUserData(0);
|
|||
|
|
world_->DestroyBody(body);
|
|||
|
|
|
|||
|
|
node->RemoveFromParent();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
body = next;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Click(Event const& evt)
|
|||
|
|
{
|
|||
|
|
if (evt.mouse.button == MouseButton::Left)
|
|||
|
|
{
|
|||
|
|
CirclePtr circle = new Circle(world_, Point{ evt.mouse.x, evt.mouse.y });
|
|||
|
|
AddChild(circle);
|
|||
|
|
}
|
|||
|
|
else if (evt.mouse.button == MouseButton::Right)
|
|||
|
|
{
|
|||
|
|
SquarePtr rect = new Square(world_, Point{ evt.mouse.x, evt.mouse.y });
|
|||
|
|
AddChild(rect);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|