Jelajahi Sumber

Added ability to edit screen entity width and height in the editor. Entities no longer default to 50x50 size in editor, but use the source entity dimensions. Adjusted platformer example to set entity sizes in the editor.

Ivan Safrin 12 tahun lalu
induk
melakukan
0c7d315b87

+ 16 - 1
Core/Contents/Source/PolyScreenEntityInstance.cpp

@@ -293,6 +293,17 @@ ScreenEntity *ScreenEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry
 		entity->setPositionMode(ScreenEntity::POSITION_CENTER);
 	}
 
+	Number _width, _height;
+	
+	if(entry->readNumber("width", &_width)) {
+		entity->setWidth(_width);	
+	}
+	
+	if(entry->readNumber("height", &_height)) {
+		entity->setHeight(_height);	
+	}
+
+
 	if(!targetEntity) {	
 		entity->color.r = (*entry)["colorR"]->NumberVal;
 		entity->color.g = (*entry)["colorG"]->NumberVal;
@@ -308,9 +319,13 @@ ScreenEntity *ScreenEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry
 		entity->position.y = (*entry)["posY"]->NumberVal;
 
 		entity->setRotation((*entry)["rotation"]->NumberVal);
+	} else {
+	
 	}
 	
-	entity->id = (*entry)["id"]->stringVal;
+	if((*entry)["id"]->stringVal != "") {
+		entity->id = (*entry)["id"]->stringVal;
+	}
 	
 	String tagString = (*entry)["tags"]->stringVal; 
 	

TEMPAT SAMPAH
Examples/Lua/Game_Demos/Platformer/Resources/entities/button.entity2d


TEMPAT SAMPAH
Examples/Lua/Game_Demos/Platformer/Resources/entities/coin.entity2d


TEMPAT SAMPAH
Examples/Lua/Game_Demos/Platformer/Resources/entities/fly.entity2d


TEMPAT SAMPAH
Examples/Lua/Game_Demos/Platformer/Resources/entities/spaceman.entity2d


TEMPAT SAMPAH
Examples/Lua/Game_Demos/Platformer/Resources/levels/level1.entity2d


+ 0 - 4
Examples/Lua/Game_Demos/Platformer/Scripts/Level.lua

@@ -43,15 +43,11 @@ function Level:initLevel()
 
 	self.coins = self.level:getScreenEntitiesByTag("coin", true)
 	for i=1,count(self.coins) do
-		self.coins[i].width = 20
-		self.coins[i].height = 20
 		self.screen:trackCollisionChild(self.coins[i], PhysicsScreenEntity.ENTITY_CIRCLE)
 	end
 
 	self.buttons = self.level:getScreenEntitiesByTag("button", true)
 	for i=1,count(self.buttons) do
-		self.buttons[i].width = 40
-		self.buttons[i].height = 95
 		self.screen:trackPhysicsChild(self.buttons[i], PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
 	end
 

+ 0 - 2
Examples/Lua/Game_Demos/Platformer/Scripts/Player.lua

@@ -4,8 +4,6 @@ class "Player"
 function Player:Player(screen, playerEntity)
 	self.screen = screen
 	self.playerEntity = playerEntity
-	playerEntity.width = 50
-	playerEntity.height = 90
 	self.playerPhysics = screen:trackPhysicsChild(playerEntity, PhysicsScreenEntity.ENTITY_TRIPLE_CIRCLE, false, 0.0, 1, 0, false, true, -1)
 	self.playerSprite = safe_cast(playerEntity:getEntityById("playerSprite", true), ScreenSprite)
 	self.groundSensor = safe_cast(playerEntity:getEntityById("groundSensor", true), ScreenShape)

+ 14 - 0
IDE/Contents/Include/PolycodeProps.h

@@ -412,6 +412,20 @@ class ScreenEntityInstanceSheet : public PropSheet {
 		ScreenEntityInstanceProp *instanceProp;
 };
 
+class ScreenEntitySheet : public PropSheet {
+	public:
+		ScreenEntitySheet();
+		~ScreenEntitySheet();
+		
+		void handleEvent(Event *event);
+		void Update();
+		
+		NumberProp *widthProp;
+		NumberProp *heightProp;
+		
+		ScreenEntity *entity;
+		ScreenEntity *lastEntity;
+};
 
 class SoundSheet : public PropSheet {
 	public:

+ 5 - 0
IDE/Contents/Include/PolycodeScreenEditor.h

@@ -145,6 +145,8 @@ class PolycodeScreenEditorMain : public UIElement {
 		
 		void setGrid(int gridSize);
 		
+		void adjustForSnap(Vector2 *position);
+		
 		String Copy(void **data);
 		void Paste(void *data, String clipboardType);
 		void destroyClipboardData(void *data, String type);
@@ -183,6 +185,7 @@ class PolycodeScreenEditorMain : public UIElement {
 		ScreenEntityInstanceSheet *instanceSheet;
 		ScreenSpriteSheet *spriteSheet;
 		ScreenParticleSheet *particleSheet;
+		ScreenEntitySheet *screenEntitySheet;
 		
 		EntityTreeView *treeView;
 		
@@ -194,6 +197,8 @@ class PolycodeScreenEditorMain : public UIElement {
 	
 		int gridSize;
 		bool gridSnap;
+		
+		bool pixelSnap;
 	
 		ScreenShape *previewShape;
 		ScreenImage *previewImage;

+ 44 - 0
IDE/Contents/Source/PolycodeProps.cpp

@@ -1236,6 +1236,50 @@ void ShaderTexturesSheet::setShader(Shader *shader, Material *material) {
 	Resize(width, height);
 }
 
+ScreenEntitySheet::ScreenEntitySheet() : PropSheet("SCREEN ENTITY", "screen_entity") {
+
+	widthProp = new NumberProp("Width");
+	addProp(widthProp);
+	
+	heightProp = new NumberProp("Height");
+	addProp(heightProp);
+	
+	propHeight = 100;
+	entity = NULL;
+	lastEntity = NULL;
+}
+
+ScreenEntitySheet::~ScreenEntitySheet() {
+
+}
+		
+void ScreenEntitySheet::handleEvent(Event *event) {
+	if(entity) {
+		if(event->getDispatcher() == widthProp) {
+			entity->setWidth(widthProp->get());
+			dispatchEvent(new Event(), Event::CHANGE_EVENT);		
+		} else 	if(event->getDispatcher() == heightProp) {
+			entity->setHeight(heightProp->get());
+			dispatchEvent(new Event(), Event::CHANGE_EVENT);		
+		}
+
+	}
+	PropSheet::handleEvent(event);	
+}
+
+void ScreenEntitySheet::Update() {
+	if(entity) {
+		enabled = true;
+		if(entity != lastEntity) {
+			widthProp->set(entity->getWidth());
+			heightProp->set(entity->getHeight());
+			lastEntity = entity;
+		}
+	} else {
+		enabled = false;
+	}
+}
+
 EntitySheet::EntitySheet() : PropSheet("ENTITY", "entity"){
 	idProp = new StringProp("ID");
 	addProp(idProp);

+ 45 - 59
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -294,8 +294,8 @@ PolycodeScreenEditorMain::PolycodeScreenEditorMain() {
 	baseEntity->addChild(objectBaseEntity);
 	objectBaseEntity->processInputEvents = true;
 
-	sizePreviewShape = new ScreenShape(ScreenShape::SHAPE_RECT, 100, 100);
-//	baseEntity->addChild(sizePreviewShape);
+	sizePreviewShape = new ScreenShape(ScreenShape::SHAPE_RECT, 1, 1);
+	baseEntity->addChild(sizePreviewShape);
 	sizePreviewShape->setColor(1.0, 1.0, 1.0, 0.0);
 	sizePreviewShape->strokeEnabled = true;
 	sizePreviewShape->strokeColor = Color(1.0, 0.3, 0.0, 0.8);
@@ -364,6 +364,7 @@ PolycodeScreenEditorMain::PolycodeScreenEditorMain() {
 	setGrid(16);
 	
 	gridSnap = false;
+	pixelSnap = true;
 
 	centerImage = new ScreenImage("Images/ScreenEditor/screenCenter.png");
 	centerImage->setPositionMode(ScreenEntity::POSITION_CENTER);
@@ -736,6 +737,10 @@ PolycodeScreenEditorMain::PolycodeScreenEditorMain() {
 	transform2dSheet->addEventListener(this, Event::CHANGE_EVENT);
 	entityProps->addPropSheet(transform2dSheet);
 	
+	screenEntitySheet = new ScreenEntitySheet();
+	entityProps->addPropSheet(screenEntitySheet);
+	screenEntitySheet->addEventListener(this, Event::CHANGE_EVENT);	
+			
 	entitySheet = new EntitySheet();
 	entityProps->addPropSheet(entitySheet);
 	
@@ -797,6 +802,9 @@ PolycodeScreenEditorMain::~PolycodeScreenEditorMain() {
 
 
 void PolycodeScreenEditorMain::syncTransformToSelected() {
+	sizePreviewShape->setShapeSize(layerBaseEntity->getWidth() * objectBaseEntity->getScale().x, layerBaseEntity->getHeight() * objectBaseEntity->getScale().x);
+
+
 	if(!selectedEntity)
 		return;
 	
@@ -981,6 +989,16 @@ void PolycodeScreenEditorMain::handleMouseUp(Vector2 position) {
 	}
 }
 
+void PolycodeScreenEditorMain::adjustForSnap(Vector2 *position) {
+	if(gridSnap) {
+		position->x = round(((Number)position->x)/((Number)gridSize)) * gridSize;
+		position->y = round(((Number)position->y)/((Number)gridSize)) * gridSize;	
+	} else if(pixelSnap) {
+		position->x = round(((Number)position->x));
+		position->y = round(((Number)position->y));
+	}			
+}
+
 void PolycodeScreenEditorMain::handleMouseMove(Vector2 position) {
 	switch(mode) {
 	
@@ -1118,10 +1136,7 @@ void PolycodeScreenEditorMain::handleMouseMove(Vector2 position) {
 				
 					Vector2 newPosition = Vector2(baseEntityPositions[i].x + trans3_b.x, baseEntityPositions[i].y + trans3_b.y);
 				
-					if(gridSnap) {
-						newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-						newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-					}				
+					adjustForSnap(&newPosition);
 				
 					selectedEntities[i]->setPosition(newPosition); 
 				}
@@ -1133,86 +1148,54 @@ void PolycodeScreenEditorMain::handleMouseMove(Vector2 position) {
 		case MODE_SHAPE:
 		{
 				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				if(gridSnap) {
-					newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-					newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-				}				
-				
+				adjustForSnap(&newPosition);
 				previewShape->setPosition(newPosition);		
 		}
 		break;
 		case MODE_IMAGE:
 		{
 				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				if(gridSnap) {
-					newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-					newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-				}				
-		
+				adjustForSnap(&newPosition);		
 			previewImage->setPosition(newPosition);	
 		}
 		break;
 		case MODE_PARTICLES:
 		{
 				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				if(gridSnap) {
-					newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-					newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-				}				
-		
+				adjustForSnap(&newPosition);		
 			previewEmitter->setPosition(newPosition);	
 		}
 		break;		
 		case MODE_TEXT:				
 		{
 				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				if(gridSnap) {
-					newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-					newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-				}				
-		
+				adjustForSnap(&newPosition);		
 			previewLabel->setPosition(newPosition);				
 		}
 		break;
 		case MODE_LINK:				
 		{
 				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				if(gridSnap) {
-					newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-					newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-				}				
-		
+				adjustForSnap(&newPosition);		
 			previewInstance->setPosition(newPosition);				
 		}
 		break;		
 		case MODE_ENTITY:				
 		{
 				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				if(gridSnap) {
-					newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-					newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-				}				
-		
+				adjustForSnap(&newPosition);		
 			previewEntity->setPosition(newPosition);				
 		}
 		case MODE_SOUND:				
 		{
 				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				if(gridSnap) {
-					newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-					newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-				}				
-		
+				adjustForSnap(&newPosition);		
 			previewSound->setPosition(newPosition);				
 		}		
 		case MODE_SPRITE:
 		{
 				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				if(gridSnap) {
-					newPosition.x = round(((Number)newPosition.x)/((Number)gridSize)) * gridSize;
-					newPosition.y = round(((Number)newPosition.y)/((Number)gridSize)) * gridSize;	
-				}				
-		
+				adjustForSnap(&newPosition);		
 			previewSprite->setPosition(newPosition);				
 		}			
 		
@@ -1391,10 +1374,7 @@ void PolycodeScreenEditorMain::handleMouseDown(Vector2 position) {
 				placingInstance->id = "ScreenInstance."+String::IntToString(placementCount);				
 				placingInstance->blockMouseInput = true;
 				placementCount++;	
-				
-				placingInstance->setWidth(50);
-				placingInstance->setHeight(50);				
-				
+								
 				applyEditorProperties(placingInstance);
 
 				if(treeView) {
@@ -1576,6 +1556,7 @@ void PolycodeScreenEditorMain::selectEntity(ScreenEntity *entity) {
 	particleSheet->emitter = NULL;
 	spriteSheet->sprite = NULL;
 	entityPropSheet->entity = NULL;
+	screenEntitySheet->entity = NULL;
 				
 	if(!entity) {
 		selectedEntity = NULL;
@@ -1612,10 +1593,12 @@ void PolycodeScreenEditorMain::selectEntity(ScreenEntity *entity) {
 	if(entity != layerBaseEntity && entity->getEntityProp("editor_type") != "layer") {
 		entitySheet->entity = entity;
 		entityPropSheet->entity = entity;
+		screenEntitySheet->entity = entity;
 	} else {
 		entitySheet->entity = entity;
 		if(entity == layerBaseEntity) {
 			entityPropSheet->entity = entity;		
+			screenEntitySheet->entity = entity;			
 		}
 	}
 
@@ -1629,6 +1612,7 @@ void PolycodeScreenEditorMain::selectEntity(ScreenEntity *entity) {
 	
 	if(dynamic_cast<ScreenShape*>(entity)) {
 		shapeSheet->shape = (ScreenShape*) entity;
+		screenEntitySheet->entity = NULL;
 	}
 
 	if(dynamic_cast<ScreenImage*>(entity)) {
@@ -1675,7 +1659,7 @@ void PolycodeScreenEditorMain::resizePreviewScreen() {
 	Number scaleVal = 1.0/atof(scaleInput->getText().c_str());		
 	screenPreviewShape->setShapeSize(1.0/scaleVal * previewAspectRatio * objectBaseEntity->getScale().x, 1.0/scaleVal * objectBaseEntity->getScale().x);
 	
-	sizePreviewShape->setShapeSize(16.0f * objectBaseEntity->getScale().x, 22.0f * objectBaseEntity->getScale().x);
+	sizePreviewShape->setShapeSize(layerBaseEntity->getWidth() * objectBaseEntity->getScale().x, layerBaseEntity->getHeight() * objectBaseEntity->getScale().x);
 
 }
 
@@ -1708,8 +1692,7 @@ void PolycodeScreenEditorMain::handleEvent(Event *event) {
 
 
 		if(event->getDispatcher() == pixelSnapBox) {
-			layerBaseEntity->setDefaultScreenOptions(pixelSnapBox->isChecked());
-			screenTransform->setDefaultScreenOptions(pixelSnapBox->isChecked());
+			pixelSnap = pixelSnapBox->isChecked();
 		} else if(event->getDispatcher() == gridSnapBox) {
 			gridSnap = gridSnapBox->isChecked();
 		} else if(event->getDispatcher() == gridSizeInput) {
@@ -1722,7 +1705,7 @@ void PolycodeScreenEditorMain::handleEvent(Event *event) {
 			if(zoomComboBox->getSelectedIndex() != 7) {
 				Number newScale = zooms[zoomComboBox->getSelectedIndex()];
 				objectBaseEntity->setScale(newScale, newScale);
-				baseEntity->setPosition(getWidth()/2.0, getHeight()/2.0);
+//				baseEntity->setPosition(getWidth()/2.0, getHeight()/2.0);
 				resizePreviewScreen();
 				syncTransformToSelected();				
 			}
@@ -1730,6 +1713,7 @@ void PolycodeScreenEditorMain::handleEvent(Event *event) {
 			resizePreviewScreen();
 		} else if(event->getDispatcher() == showRefsBox) {
 			setRefVisibility(showRefsBox->isChecked());
+			sizePreviewShape->visible = showRefsBox->isChecked();
 		}
 	}
 
@@ -1764,7 +1748,7 @@ void PolycodeScreenEditorMain::handleEvent(Event *event) {
 			entityProps->scrollContainer->setScrollValue(0.0, 1.0);
 	}
 	
-	if((event->getDispatcher() == transform2dSheet || event->getDispatcher() == labelSheet || event->getDispatcher() == imageSheet) && event->getEventType() == "") {
+	if((event->getDispatcher() == transform2dSheet || event->getDispatcher() == labelSheet || event->getDispatcher() == imageSheet || event->getDispatcher() == shapeSheet || event->getDispatcher() == screenEntitySheet) && event->getEventType() == "") {
 		syncTransformToSelected();
 		treeView->Refresh();		
 	}
@@ -2499,6 +2483,9 @@ void PolycodeScreenEditor::saveEntityToObjectEntry(ScreenEntity *entity, ObjectE
 	entry->addChild("posX", entity->position.x);	
 	entry->addChild("posY", entity->position.y);
 	
+	entry->addChild("width", entity->getWidth());
+	entry->addChild("height", entity->getHeight());
+		
 	ObjectEntry *children = NULL;
 	
 	for(int i=0; i < entity->getNumChildren(); i++) {
@@ -2583,8 +2570,6 @@ void PolycodeScreenEditorMain::applyEditorProperties(ScreenEntity *entity) {
 			instance->getResourceEntry()->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
 			CoreServices::getInstance()->getResourceManager()->addResource(instance->getResourceEntry());
 		}
-		entity->setWidth(50);
-		entity->setHeight(50);		
 	} else if(dynamic_cast<ScreenShape*>(entity)) {
 	
 	} else if(dynamic_cast<ScreenImage*>(entity)) {
@@ -2596,8 +2581,6 @@ void PolycodeScreenEditorMain::applyEditorProperties(ScreenEntity *entity) {
 		createParticleRef((ScreenParticleEmitter*)entity);		
 	} else {	
 		if(entity != layerBaseEntity && entity->getEntityProp("editor_type") != "layer") {
-			entity->setWidth(50);
-			entity->setHeight(50);						
 			createEntityRef(entity);
 		}
 	}
@@ -2644,6 +2627,9 @@ bool PolycodeScreenEditor::openFile(OSFileEntry filePath) {
 		treeView->setRootEntity(editorMain->layerBaseEntity);
 		treeView->Refresh();
 	}
+	
+	editorMain->syncTransformToSelected();
+	
 	return true;
 }