void Capturable::Capture(void) { const CapturableTemplate &capturable = Database::capturabletemplate.Get(mId); // if spawning on capture... if (capturable.mSpawnOnCapture) { // get the entity Entity *entity = Database::entity.Get(mId); if (entity) { // instantiate the template Database::Instantiate(capturable.mSpawnOnCapture, Database::owner.Get(mId), mId, entity->GetAngle(), entity->GetPosition(), entity->GetVelocity(), entity->GetOmega()); } } // if switching on capture... if (capturable.mSwitchOnCapture) { // change dynamic type Database::Switch(mId, capturable.mSwitchOnCapture); } else { // delete the entity Database::Delete(mId); } }
void Pickup::Kill(float aFraction) { const PickupTemplate &pickup = Database::pickuptemplate.Get(mId); // if spawning on pickup... if (pickup.mSpawnOnCollect) { // get the entity Entity *entity = Database::entity.Get(mId); if (entity) { // spawn template at entity location unsigned int spawnId = Database::Instantiate(pickup.mSpawnOnCollect, Database::owner.Get(mId), mId, entity->GetAngle(), entity->GetPosition(), entity->GetVelocity(), entity->GetOmega()); if (Renderable *renderable = Database::renderable.Get(spawnId)) renderable->SetFraction(aFraction); } } // if switching on pickup... if (pickup.mSwitchOnCollect) { // change dynamic type unsigned int aId = mId; Database::Switch(aId, pickup.mSwitchOnCollect); if (Renderable *renderable = Database::renderable.Get(aId)) renderable->SetFraction(aFraction); } else { // delete the entity Database::Delete(mId); } return; }
// Gunner Update void Gunner::Update(float aStep) { // get the owner unsigned int aOwnerId = Database::backlink.Get(mId); // get the owner entity Entity *owner = Database::entity.Get(aOwnerId); // if the owner does not exist... if (!owner) { // self-destruct Database::Delete(mId); return; } // gunner template const GunnerTemplate &gunner = Database::gunnertemplate.Get(mId); // get owner movement const Vector2 &posP = owner->GetPosition(); #ifdef GUNNER_TRACK_DEQUE const Vector2 &posL0 = mTrackPos.back(); #else const Vector2 &posL0 = mTrackPos[mTrackLast]; #endif float movement = posP.DistSq(posL0); // if the owner has moved... if (movement > FLT_EPSILON) { #ifdef GUNNER_TRACK_DEQUE // get the last segment const Vector2 &posL1 = mTrackPos[mTrackPos.size()-2]; float lastsegment = posL0.Dist(posL1); // if the last segment isn't long enough... if (lastsegment < GUNNER_TRACK_GRANULARITY) { // replace the last segment mTrackPos.pop_back(); mTrackLength -= lastsegment; } // add new position mTrackPos.push_back(posP); mTrackLength += posP.Dist(mTrackPos[mTrackPos.size()-2]); #else // get the last segment size_t mTrackPrev = (mTrackLast > 0) ? (mTrackLast - 1) : (mTrackCount - 1); const Vector2 &posL1 = mTrackPos[mTrackPrev]; float lastsegment = posL0.Dist(posL1); // if the last segment is long enough... if (lastsegment >= GUNNER_TRACK_GRANULARITY) { // start a new segment mTrackPrev = mTrackLast; mTrackLast = (mTrackLast < mTrackCount - 1) ? (mTrackLast + 1) : 0; } else { // replace the last segment mTrackLength -= lastsegment; } // add new position mTrackPos[mTrackLast] = posP; mTrackLength += posP.Dist(mTrackPos[mTrackPrev]); #endif // while there is excess track length... while (mTrackLength > gunner.mFollowLength) { // get the excess length float excess = mTrackLength - gunner.mFollowLength; // get the first segment length #ifdef GUNNER_TRACK_DEQUE Vector2 &pos0 = mTrackPos[0]; const Vector2 &pos1 = mTrackPos[1]; #else size_t mTrackNext = (mTrackFirst < mTrackCount - 1) ? (mTrackFirst + 1) : 0; Vector2 &pos0 = mTrackPos[mTrackFirst]; const Vector2 &pos1 = mTrackPos[mTrackNext]; #endif float firstsegment = pos0.Dist(pos1); // if the segment is longer than the excess... if (firstsegment > excess) { // shorten the segment pos0 += excess / firstsegment * (pos1 - pos0); mTrackLength -= excess; break; } else { // remove the segment mTrackLength -= firstsegment; #ifdef GUNNER_TRACK_DEQUE mTrackPos.pop_front(); #else mTrackFirst = mTrackNext; #endif } } } // move to new position Entity *entity = Database::entity.Get(mId); entity->Step(); #ifdef GUNNER_TRACK_DEQUE entity->SetPosition(mTrackPos.front()); #else entity->SetPosition(mTrackPos[mTrackFirst]); #endif entity->SetAngle(owner->GetAngle()); entity->SetVelocity(owner->GetVelocity()); // <-- HACK! entity->SetOmega(owner->GetOmega()); }
// cancel void Cancelable::Cancel(unsigned int aId, unsigned int aSourceId) { const CancelableTemplate &cancelable = Database::cancelabletemplate.Get(mId); // set owner to source damage owner unsigned int aOwnerId = Database::owner.Get(aSourceId); Database::owner.Put(mId, aOwnerId); // bump the hit combo counter int &combo = Database::hitcombo.Open(mId); combo = std::max<int>(combo, Database::hitcombo.Get(aSourceId) + 1); Database::hitcombo.Close(mId); if (cancelable.mBacklash) { for (unsigned int creator = Database::creator.Get(aId); creator != 0; creator = Database::backlink.Get(creator)) { if (Damagable *damagable = Database::damagable.Get(creator)) { Damagable::DeathSignal &signal = Database::deathsignal.Open(creator); signal.Disconnect(this, &Cancelable::CreatorDeath); Database::deathsignal.Close(creator); // damagable->Damage(mId, cancelable.mBacklash); // burn tether from the cancelable to the creator new TetherBurn(creator, mId, aOwnerId, cancelable.mBacklash, combo); break; } } } // if spawning on cancelable... if (cancelable.mSpawn) { // get the entity Entity *entity = Database::entity.Get(mId); if (entity) { // spawn template at the entity location Database::Instantiate(cancelable.mSpawn, Database::owner.Get(mId), mId, entity->GetAngle(), entity->GetPosition(), entity->GetVelocity(), entity->GetOmega()); } } // if switching on cancelable... if (cancelable.mSwitch) { // get the entity Entity *entity = Database::entity.Get(mId); if (entity) { // change dynamic type Database::Switch(mId, cancelable.mSwitch); } } else { // delete the entity Database::Delete(mId); } }
int main(int argc, char *argv[]) { Options& options = Options::GetInstance(); options.LoadFromCommandLine(argc, argv); options.LoadFromIniFile("gravity.ini"); GRAVITY_LOG(info, "Client started."); sf::ContextSettings settings; settings.depthBits = 0; settings.stencilBits = 8; settings.antialiasingLevel = options.msaa; int style = options.fullscreen ? sf::Style::Fullscreen : sf::Style::Default; sf::RenderWindow window(sf::VideoMode(options.hres, options.vres, options.bitdepth), "Gravity", style, settings); ::Gravity::Game::Game game; game.Start(); BoundingCamera camera(Vec2f(400, 300), Vec2f()); // ROCKET RocketRendererInterfaceImpl rendererInterface; RocketSystemInterfaceImpl systemInterface; RocketShellInterfaceImpl shellInterface("../data/gui/"); rendererInterface.target = &window; rendererInterface.states = (sf::RenderStates *) &sf::RenderStates::Default; Rocket::Core::SetFileInterface(&shellInterface); Rocket::Core::SetRenderInterface(&rendererInterface); Rocket::Core::SetSystemInterface(&systemInterface); if(!Rocket::Core::Initialise()) return 0; Rocket::Controls::Initialise(); Rocket::Core::FontDatabase::LoadFontFace("Delicious-Bold.otf"); Rocket::Core::FontDatabase::LoadFontFace("Delicious-BoldItalic.otf"); Rocket::Core::FontDatabase::LoadFontFace("Delicious-Italic.otf"); Rocket::Core::FontDatabase::LoadFontFace("Delicious-Roman.otf"); Rocket::Core::FontDatabase::LoadFontFace("DejaVuSans-Bold.ttf"); Rocket::Core::FontDatabase::LoadFontFace("DejaVuSans-BoldOblique.ttf"); Rocket::Core::FontDatabase::LoadFontFace("DejaVuSans-Oblique.ttf"); Rocket::Core::FontDatabase::LoadFontFace("DejaVuSans.ttf"); Rocket::Core::Context *Context = Rocket::Core::CreateContext("default", Rocket::Core::Vector2i(window.getSize().x, window.getSize().y)); Rocket::Debugger::Initialise(Context); //Rocket::Debugger::SetVisible(true); Rocket::Core::ElementDocument *document = Context->LoadDocument("my.rml"); if(document) { document->Show(); document->RemoveReference(); }; // END ROCKET //Rocket::Core::ElementDocument* document; std::cout << "OpenGL Version" << window.getSettings().ContextSettings::majorVersion << "." << window.getSettings().ContextSettings::minorVersion << std::endl; sf::ContextSettings settingz = window.getSettings(); std::cout << settingz.majorVersion << "." << settingz.minorVersion << std::endl; while(window.isOpen()) { sf::Event event; Entity* ship = game.GetWorld().GetEntities()[0]; while (window.pollEvent(event)) { //window.PollEvent(event); if (event.type == sf::Event::Closed) window.close(); if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)) return 0; if ((event.type == sf::Event::MouseWheelMoved)) { options.renderscale += event.mouseWheel.delta*.1f; } if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space)) { Shape* bombShape = Shape::CreateBombShape(); Entity* bomb = new Entity(game.GetWorld(), *bombShape, ship->GetPos() + Vec2f(1, 1)); bomb->SetVel(ship->GetVel()); bomb->SetMass(0.01f); game.GetWorld().AddEntity(*bomb); } switch(event.type) { case sf::Event::Resized: //rendererInterface.Resize(); break; case sf::Event::MouseMoved: Context->ProcessMouseMove(event.mouseMove.x, event.mouseMove.y, systemInterface.GetKeyModifiers(&window)); break; case sf::Event::MouseButtonPressed: Context->ProcessMouseButtonDown(event.mouseButton.button, systemInterface.GetKeyModifiers(&window)); break; case sf::Event::MouseButtonReleased: Context->ProcessMouseButtonUp(event.mouseButton.button, systemInterface.GetKeyModifiers(&window)); break; case sf::Event::MouseWheelMoved: Context->ProcessMouseWheel(event.mouseWheel.delta, systemInterface.GetKeyModifiers(&window)); break; case sf::Event::TextEntered: if (event.text.unicode > 32) Context->ProcessTextInput(event.text.unicode); break; case sf::Event::KeyPressed: Context->ProcessKeyDown(systemInterface.TranslateKey(event.key.code), systemInterface.GetKeyModifiers(&window)); break; case sf::Event::KeyReleased: if(event.key.code == sf::Keyboard::F8) { Rocket::Debugger::SetVisible(!Rocket::Debugger::IsVisible()); }; Context->ProcessKeyUp(systemInterface.TranslateKey(event.key.code), systemInterface.GetKeyModifiers(&window)); break; case sf::Event::Closed: return 1; break; }; } int rotate = sf::Keyboard::isKeyPressed(sf::Keyboard::Right) - sf::Keyboard::isKeyPressed(sf::Keyboard::Left); bool forward = sf::Keyboard::isKeyPressed(sf::Keyboard::Up); sf::View nView(Vec2f(options.hres, options.vres), Vec2f(options.hres, options.vres)); camera.Update(ship->GetPos() * options.renderscale); nView.move(camera.GetPos() - Vec2f(options.hres, options.vres)); ship->Rotate(rotate*2); if (forward) ship->ApplyForce(Vec2f(0.f, 2.f).Rotate(ship->GetAngle())); window.clear(); window.setView(nView); DrawWorld(window, game.GetWorld(), 0.f); sf::View viewEmpty = window.getDefaultView(); window.setView(viewEmpty); Context->Update(); Context->Render(); window.setFramerateLimit(60); window.display(); game.Step(); } game.Stop(); return 0; }