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