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); | |||
|  | 		} | |||
|  | 	} | |||
|  | }; |