Пример #1
0
/**
 * Returns the entity at specified point, searching only children. May not take rotation or scale into account.
 */
ScreenEntity *ScreenEntity::getChildAt(Number x, Number y) {
    for(int i=children.size()-1; i >= 0; i--) {
        ScreenEntity *child = (ScreenEntity *)children[i];
        ScreenEntity *found = child->getEntityAt(x,y);
        if (found)
            return found;
    }
}
Пример #2
0
bool HelloPolycodeApp::Update() {
	if(lastEntity)
		lastEntity->setColor(1.0, 1.0, 1.0, 1.0);	
	Vector2 mouse = core->getInput()->getMousePosition();
	ScreenEntity * entity = screen->getEntityAtPosition(mouse.x, mouse.y);
	if(entity) {
		entity->setColor(1.0, 0.0, 0.0, 1.0);
		lastEntity = entity;
	}
    return core->Update();
}
void PolycodeScreenEditor::handleDroppedFile(OSFileEntry file, Number x, Number y) {
	ScreenEntity *newEntity = NULL;
	if(file.extension == "png") {
		ScreenImage *newImage = new ScreenImage(file.fullPath);
		newImage->setPositionMode(ScreenEntity::POSITION_CENTER);
		baseEntity->addChild(newImage);
		newImage->setPosition(x-baseEntity->getPosition2D().x,y-baseEntity->getPosition2D().y);
		newEntity = newImage;
		newImage->processInputEvents = true;
	}
	
	if(newEntity) {
		newEntity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
		newEntity->blockMouseInput = true;
	}
}
Пример #4
0
void HelloPolycodeApp::createClientPlayer(int clientID) {
	ClientPlayer *player = new ClientPlayer();
	player->clientID = clientID;
	
	ScreenEntity *playerEntity = new ScreenEntity();				
	playerEntity->setPositionMode(ScreenEntity::POSITION_CENTER);
	ScreenShape *playerBody = new ScreenShape(ScreenShape::SHAPE_CIRCLE, 30,30,3);				
	playerBody->setRotation(-90.0);	
	playerEntity->addChild(playerBody);
	playerEntity->setPosition(640/2,480/2);
	gameScreen->addChild(playerEntity);
	player->playerEntity = playerEntity;												
	
	player->state = 0;
	players.push_back(player);						
}
Пример #5
0
HelloPolycodeApp::HelloPolycodeApp(PolycodeView *view) {

#ifdef __APPLE__
	core = new CocoaCore(view, 640,480,false,false,0,0,90);	  
#else
	core = new SDLCore(view, 640,480,false,false,0,0,90);	  
#endif

	PhysicsScreen *screen = new PhysicsScreen(10, 50);

	ScreenShape *ceiling = new ScreenShape(ScreenShape::SHAPE_RECT, 640, 20);
	ceiling->setColor(0.0, 0.0, 0.0, 1.0);
	ceiling->setPosition(640/2, 10);
	screen->addPhysicsChild(ceiling, PhysicsScreenEntity::ENTITY_RECT, true);
	
	// Revolute Joint	
	ScreenShape *shape = new ScreenShape(ScreenShape::SHAPE_RECT, 10, 30);
	shape->setPosition(150, 20+15);
	screen->addPhysicsChild(shape, PhysicsScreenEntity::ENTITY_RECT, false);
	screen->createRevoluteJoint(shape, ceiling, 0, -15);
	screen->applyImpulse(shape, 10, 0);
	
	// Distance Joint	
	shape = new ScreenShape(ScreenShape::SHAPE_RECT, 10, 30);
	shape->setPosition(250, 20+25);
	screen->addPhysicsChild(shape, PhysicsScreenEntity::ENTITY_RECT, false);
	screen->createDistanceJoint(shape, ceiling, false);
	screen->applyImpulse(shape, 200, 0);
	
	ScreenLine *line = new ScreenLine(shape, ceiling);
	line->setColor(1.0, 0.0, 0.0, 1.0);
	screen->addChild(line);

	// Prismatic Joint	
	shape = new ScreenShape(ScreenShape::SHAPE_RECT, 10, 30);
	shape->setPosition(450, 20+25);
	screen->addPhysicsChild(shape, PhysicsScreenEntity::ENTITY_RECT, false);
	screen->createPrismaticJoint(ceiling, shape, Vector2(0,1), 0,0, false, 100, 0, true);

	ScreenEntity *lineAnchor = new ScreenEntity();
	lineAnchor->setPosition(450,10);
	line = new ScreenLine(shape, lineAnchor);
	line->setColor(0.0, 1.0, 0.0, 1.0);
	screen->addChild(line);
}
Пример #6
0
//Handle events
void TGApp::handleEvent(Event *e) {
	if(e->getDispatcher() == core->getInput()) {
		InputEvent *inputEvent = (InputEvent*)e;		
		switch(e->getEventCode()) {
			case InputEvent::EVENT_KEYUP:
				switch (inputEvent->key) {					
					case KEY_SPACE:
						randomWorld();
					break;
				}
			break;
			case InputEvent::EVENT_MOUSEDOWN:
				float xx = inputEvent->mousePosition.x - XSIZ/2;
				float yy = inputEvent->mousePosition.y - YSIZ/2;
				ScreenEntity *e = screen->getEntityAtPosition(xx,yy);
				if(e == NULL) break;
				e->setColor(1,0,0,1);
				printf("%f",e->bBox.length());				
			break;
		}		
	}
}
ScreenEntity *ScreenEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry) {

	ScreenEntity *entity = NULL;
	
	ObjectEntry *entityType = (*entry)["type"];
	if(entityType) {
	
		if(entityType->stringVal == "ScreenImage") {
			ObjectEntry *screenImageEntry = (*entry)["ScreenImage"];			
			String imagePath = (*screenImageEntry)["filePath"]->stringVal;
			ScreenImage *image = new ScreenImage(imagePath);
			
			ObjectEntry *screenShapeEntry = (*entry)["ScreenShape"];
			applyScreenShape(screenShapeEntry, image);
			entity = image;
		}
		
		if(entityType->stringVal == "ScreenParticleEmitter") {
			ObjectEntry *emitterEntry = (*entry)["ScreenParticleEmitter"];
									
			ScreenParticleEmitter *placingEmitter = new ScreenParticleEmitter((*emitterEntry)["texturePath"]->stringVal, Particle::BILLBOARD_PARTICLE, ParticleEmitter::CONTINUOUS_EMITTER, (*emitterEntry)["lifespan"]->NumberVal, (*emitterEntry)["particleCount"]->NumberVal, Vector3((*emitterEntry)["dirX"]->NumberVal, (*emitterEntry)["dirY"]->NumberVal, 0.0), Vector3((*emitterEntry)["gravX"]->NumberVal, (*emitterEntry)["gravY"]->NumberVal, 0.0), Vector3((*emitterEntry)["deviationX"]->NumberVal, (*emitterEntry)["deviationY"]->NumberVal, 0.0), Vector3((*emitterEntry)["radiusX"]->NumberVal, (*emitterEntry)["radiusY"]->NumberVal, 0.0));
			
				placingEmitter->brightnessDeviation = (*emitterEntry)["brightnessDeviation"]->NumberVal;
				placingEmitter->particleSize = (*emitterEntry)["particleSize"]->NumberVal;
				placingEmitter->perlinModSize = (*emitterEntry)["perlinModSize"]->NumberVal;
				placingEmitter->perlinEnabled = (*emitterEntry)["perlinEnabled"]->boolVal;
				placingEmitter->particleSpeedMod = (*emitterEntry)["particleSpeedMod"]->NumberVal;

				placingEmitter->rotationSpeed = (*emitterEntry)["rotationSpeed"]->NumberVal;
				placingEmitter->rotationFollowsPath = (*emitterEntry)["rotationFollowsPath"]->boolVal;
				placingEmitter->useScaleCurves = (*emitterEntry)["useScaleCurves"]->boolVal;
				placingEmitter->useColorCurves = (*emitterEntry)["useColorCurves"]->boolVal;
									
				placingEmitter->setParticleBlendingMode((*emitterEntry)["particleBlendMode"]->intVal);			
				
				placingEmitter->setWidth(placingEmitter->emitterRadius.x);
				placingEmitter->setHeight(placingEmitter->emitterRadius.y);	
				
				parseObjectIntoCurve((*emitterEntry)["scaleCurve"], &placingEmitter->scaleCurve);
				parseObjectIntoCurve((*emitterEntry)["colorCurveR"], &placingEmitter->colorCurveR);
				parseObjectIntoCurve((*emitterEntry)["colorCurveG"], &placingEmitter->colorCurveG);
				parseObjectIntoCurve((*emitterEntry)["colorCurveB"], &placingEmitter->colorCurveB);
				parseObjectIntoCurve((*emitterEntry)["colorCurveA"], &placingEmitter->colorCurveA);										
			
			entity = placingEmitter;
		
		}		

		if(entityType->stringVal == "ScreenSprite") {
			ObjectEntry *screenSpriteEntry = (*entry)["ScreenSprite"];			
			String filePath = (*screenSpriteEntry)["filePath"]->stringVal;
			
			ScreenSprite *sprite = new ScreenSprite(filePath);
			
			String animName = (*screenSpriteEntry)["anim"]->stringVal;
			sprite->playAnimation(animName, -1, false);
		

			ObjectEntry *screenShapeEntry = (*entry)["ScreenShape"];
			applyScreenShape(screenShapeEntry, sprite);
			entity = sprite;
		}


		if(entityType->stringVal == "ScreenEntityInstance") {
			ObjectEntry *screenInstanceEntry = (*entry)["ScreenEntityInstance"];
			String filePath = (*screenInstanceEntry)["filePath"]->stringVal;
			ScreenEntityInstance *instance = new ScreenEntityInstance(filePath);			
			entity = instance;
		}
		

		if(entityType->stringVal == "ScreenShape") {
			ObjectEntry *screenShapeEntry = (*entry)["ScreenShape"];
			ScreenShape *shape = new ScreenShape(0, 1, 1);
			applyScreenShape(screenShapeEntry, shape);
			entity = shape;
		}
		
		if(entityType->stringVal == "ScreenSound") {
			ObjectEntry *screenSoundEntry = (*entry)["ScreenSound"];
			
			String filePath = (*screenSoundEntry)["filePath"]->stringVal;
			Number refDistance = (*screenSoundEntry)["refDistance"]->NumberVal;
			Number maxDistance = (*screenSoundEntry)["maxDistance"]->NumberVal;
			Number volume = (*screenSoundEntry)["volume"]->NumberVal;
			Number pitch = (*screenSoundEntry)["pitch"]->NumberVal;
															
			ScreenSound *sound = new ScreenSound(filePath, refDistance, maxDistance);
			sound->getSound()->setVolume(volume);
			sound->getSound()->setPitch(pitch);	
			
			sound->setWidth(50);
			sound->setHeight(50);				
										
			entity = sound;
		}		
		

		if(entityType->stringVal == "ScreenLabel") {
			ObjectEntry *screenLabelEntry = (*entry)["ScreenLabel"];
			
			String text = (*screenLabelEntry)["text"]->stringVal;
			String font = (*screenLabelEntry)["font"]->stringVal;
			int size = (*screenLabelEntry)["size"]->intVal;
			int aaMode = (*screenLabelEntry)["aaMode"]->intVal;
												
			ScreenLabel *label = new ScreenLabel(text, size, font, aaMode);
			label->positionAtBaseline = false;
			
			ObjectEntry *screenShapeEntry = (*entry)["ScreenShape"];			
			applyScreenShape(screenShapeEntry, label);
			entity = label;
		}
	
	} 

	if(!entity) {
		entity = new ScreenEntity();
	}
	
	entity->ownsChildren = true;
	
	entity->setPositionMode(ScreenEntity::POSITION_CENTER);
	
	entity->color.r = (*entry)["colorR"]->NumberVal;
	entity->color.g = (*entry)["colorG"]->NumberVal;
	entity->color.b = (*entry)["colorB"]->NumberVal;
	entity->color.a = (*entry)["colorA"]->NumberVal;

	entity->blendingMode = (*entry)["blendMode"]->intVal;

	entity->scale.x = (*entry)["scaleX"]->NumberVal;
	entity->scale.y = (*entry)["scaleY"]->NumberVal;

	entity->position.x = (*entry)["posX"]->NumberVal;
	entity->position.y = (*entry)["posY"]->NumberVal;

	entity->setRotation((*entry)["rotation"]->NumberVal);
	
	entity->id = (*entry)["id"]->stringVal;
	
	String tagString = (*entry)["tags"]->stringVal; 
	
	if(tagString != "") {
		std::vector<String> tags = tagString.split(",");
		for(int i=0; i < tags.size(); i++) {
			entity->addTag(tags[i]);
		}
	}
	
	ObjectEntry *props = (*entry)["props"];
	if(props) {
		for(int i=0; i < props->length; i++) {		
			ObjectEntry *prop = ((*props))[i];		
			if(prop) {
				entity->setEntityProp((*prop)["name"]->stringVal, (*prop)["value"]->stringVal);
			}
		}
	}
														
	ObjectEntry *children = (*entry)["children"];
	
	if(children) {
		for(int i=0; i < children->length; i++) {
			ObjectEntry *childEntry = ((*children))[i];
			ScreenEntity *childEntity = loadObjectEntryIntoEntity(childEntry);
			entity->addChild(childEntity);				
		}
	}
		
	return entity;
}
Пример #8
0
void HelloPolycodeApp::handleEvent(Event *event) {

	for(int i=0; i < players.size(); i++) {
		if(event->getDispatcher() == players[i]->client) {		
			ServerClientEvent *clientEvent = (ServerClientEvent*) event;
			Player *player = players[i];
			switch(clientEvent->getEventCode()) {
				case ServerClientEvent::EVENT_CLIENT_DATA:				
					switch(clientEvent->dataType) {
						case CLIENT_READY:
						{
							ServerClientInfo info = player->getClientInfo();
							server->sendReliableDataToAllClients((char*)&info, sizeof(ServerClientInfo), PLAYER_JOIN);
						}
						break;					
						case PLAYER_SHOOT:
						{
						
						}	
						break;
						case PACKET_TYPE_CLIENT_DATA:
							ClientData *clientData = (ClientData*) clientEvent->data;
							player->turning_state = clientData->turning_state;
							player->thrusting = clientData->thrusting;
						break;
					}
				break;
			}
		}
	}

	if(event->getDispatcher() == server) {
		ServerEvent *serverEvent = (ServerEvent*) event;
		switch(serverEvent->getEventCode()) {
		
			case ServerEvent::EVENT_CLIENT_DISCONNECTED:		
			{
				for(int i=0;i<players.size();i++) {
					if(players[i]->client == serverEvent->client) {			
						Player *player = players[i];
						players.erase(players.begin()+i);						
						
						gameScreen->removeChild(player->playerEntity);
						delete player->playerEntity;
						delete player;
					}
				}
			}	
			break;
			
			case ServerEvent::EVENT_CLIENT_CONNECTED:
			{
				Player *newPlayer = new Player();
				newPlayer->position.x = 640/2;
				newPlayer->position.y = 480/2;				
				newPlayer->client = serverEvent->client;												
				newPlayer->client->addEventListener(this, ServerClientEvent::EVENT_CLIENT_DATA);					
				ScreenEntity *playerEntity = new ScreenEntity();				
				playerEntity->setPositionMode(ScreenEntity::POSITION_CENTER);
				ScreenShape *playerBody = new ScreenShape(ScreenShape::SHAPE_CIRCLE, 30,30,3);				
				playerBody->setRotation(-90.0);
				playerEntity->addChild(playerBody);
				playerEntity->setPosition(640/2,480/2);
				gameScreen->addChild(playerEntity);
				newPlayer->playerEntity = playerEntity;												
				players.push_back(newPlayer);
				printf("Player connected\n");
				serverInfo.initialServerState = serverState;
				server->sendReliableDataToClient(newPlayer->client, (char*) &serverInfo, sizeof(ServerInfo), SERVER_INFO);
			}
			break;
		}
		
	}
}