From 46e842c7cc2e977f9bdd9fb4480dac26163fa25b Mon Sep 17 00:00:00 2001 From: Patrik Gornicz Date: Thu, 21 Aug 2008 16:29:27 -0400 Subject: [PATCH] created a gravity well --- src/Effects/GravityWell.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++ src/Effects/GravityWell.h | 39 +++++++++++++++++++++++++++++++++++ src/Effects/Screen.cpp | 8 ++++---- src/Makefile | 1 + src/effectManager.cpp | 8 ++++++-- 5 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 src/Effects/GravityWell.cpp create mode 100644 src/Effects/GravityWell.h diff --git a/src/Effects/GravityWell.cpp b/src/Effects/GravityWell.cpp new file mode 100644 index 0000000..4fcd446 --- /dev/null +++ b/src/Effects/GravityWell.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "GravityWell.h" +#include "../Entities/PhysicsEntity.h" + + +/// ***** Constructors/Destructors ***** + +GravityWell::GravityWell(const Vector2& pos) + : position(pos) +{ + +} +GravityWell::~GravityWell() +{ + +} + +/// ***** Public Class Methods ***** + +Vector2 GravityWell::forceDelta(const PhysicsEntity* e, float) const +{ + const Vector2& pos = e->positionRaw(); + float mass = e->mass; + + Vector2 delta = position - pos; + float sqrDist = delta.sqrLength(); + + Vector2 acc(0,0); + + if( sqrDist > 0.5F ) + acc += delta / sqrDist * mass; + + return acc; +} diff --git a/src/Effects/GravityWell.h b/src/Effects/GravityWell.h new file mode 100644 index 0000000..36b9dec --- /dev/null +++ b/src/Effects/GravityWell.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef GRAVITYWELL_H +#define GRAVITYWELL_H + +#include "Effect.h" +#include "../Vector2.h" + + +/// ***** Header Class ***** + +class GravityWell: public Effect +{ + public: + GravityWell(const Vector2& pos); + ~GravityWell(); + + Vector2 forceDelta(const PhysicsEntity*, float) const; + + private: + Vector2 position; +}; + +#endif // GRAVITYWELL_H diff --git a/src/Effects/Screen.cpp b/src/Effects/Screen.cpp index e4ef901..61108c4 100644 --- a/src/Effects/Screen.cpp +++ b/src/Effects/Screen.cpp @@ -47,16 +47,16 @@ Vector2 Screen::positionDelta(const PhysicsEntity* e, float time_step) const radius = b->getRadius(); - if(pos.y > 600-radius && velo.y > 0) + if(pos.y > 600-radius) acc.y += 600-radius - pos.y; - if(pos.y < 0+radius && velo.y < 0) + if(pos.y < 0+radius) acc.y += 0+radius - pos.y; - if(pos.x > 800-radius && velo.x > 0) + if(pos.x > 800-radius) acc.x += 800-radius - pos.x; - if(pos.x < 0+radius && velo.x < 0) + if(pos.x < 0+radius) acc.x += 0+radius - pos.x; return acc; diff --git a/src/Makefile b/src/Makefile index 3ed4b86..b04d5cd 100644 --- a/src/Makefile +++ b/src/Makefile @@ -43,6 +43,7 @@ SRCS += GameStates/Running.cpp SRCS += Effects/Effect.cpp SRCS += Effects/Gravity.cpp +SRCS += Effects/GravityWell.cpp SRCS += Effects/Screen.cpp SRCS += config/config.cpp diff --git a/src/effectManager.cpp b/src/effectManager.cpp index d4c07e5..6ebffdd 100644 --- a/src/effectManager.cpp +++ b/src/effectManager.cpp @@ -19,8 +19,11 @@ #include "Effects/Effect.h" #include "Effects/Gravity.h" +#include "Effects/GravityWell.h" #include "Effects/Screen.h" +#include "Vector2.h" + /// ***** Private Variables ***** Effect** effects; @@ -30,11 +33,12 @@ int numEffects; void effect::init() { - numEffects = 2; + numEffects = 3; effects = new Effect*[numEffects](); effects[0] = new Gravity(); - effects[1] = new Screen(); + effects[1] = new GravityWell(Vector2(400,400)); + effects[2] = new Screen(); } void effect::clean() { -- 2.10.2