| 
									
										
										
										
											2019-03-14 17:55:06 +08:00
										 |  |  |  | // 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>
 | 
					
						
							| 
									
										
										
										
											2019-04-08 14:15:27 +08:00
										 |  |  |  | 		AddListener(Event::Click, MakeClosure(this, &MainScene::Click)); | 
					
						
							| 
									
										
										
										
											2019-03-14 17:55:06 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <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); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | }; |