X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fphysic.h;h=002b42f805cc8ab6b0d0c6ef965169b4093cb280;hb=828b5e1ef1cb89d830735f24dd79bbd9b09d5b32;hp=38f923f2031738c0fa8afb4d6b90da253b57d1ea;hpb=cf865a9388d9dce0422510c5369a2471191d1299;p=supertux.git diff --git a/src/physic.h b/src/physic.h index 38f923f20..002b42f80 100644 --- a/src/physic.h +++ b/src/physic.h @@ -1,50 +1,78 @@ +// $Id$ +// +// SuperTux +// Copyright (C) 2004 Tobias Glaesser // -// C++ Interface: physic -// -// Description: -// -// -// Author: Tobias Glaesser , (C) 2004 -// -// Copyright: See COPYING file that comes with this distribution -// +// 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 2 +// 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, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. #ifndef SUPERTUX_PHYSIC_H #define SUPERTUX_PHYSIC_H -#include "timer.h" +/** This is a very simplistic physics engine handling accelerated and constant + * movement along with gravity. + */ +class Physic +{ +public: + Physic(); + ~Physic(); -enum { - PH_VT, /* Vertical throw.*/ - PH_HA /* Horizontal acceleration. */ -}; + /** resets all velocities and accelerations to 0 */ + void reset(); + + /** sets velocity to a fixed value */ + void set_velocity(float vx, float vy); + + void set_velocity_x(float vx); + void set_velocity_y(float vy); -/* Physic type: */ - -typedef struct physic_type - { - int state; - float start_vy; - float start_vx; - float acceleration; - unsigned int start_time; - } -physic_type; - -/* global variables. */ -extern float gravity; - -void physic_init(physic_type* pphysic); -int physic_get_state(physic_type* pphysic); -void physic_set_state(physic_type* pphysic, int nstate); -void physic_set_start_vy(physic_type* pphysic, float start_vy); -void physic_set_start_vx(physic_type* pphysic, float start_vx); -void physic_set_acceleration(physic_type* pphysic, float acceleration); -int physic_is_set(physic_type* pphysic); -float physic_get_velocity(physic_type* pphysic); -float physic_get_max_distance(physic_type* pphysic); -unsigned int physic_get_max_time(physic_type* pphysic); -unsigned int physic_get_time_gone(physic_type* pphysic); + /** velocities invertion */ + void inverse_velocity_x(); + void inverse_velocity_y(); + + float get_velocity_x(); + float get_velocity_y(); + + /** sets acceleration applied to the object. (Note that gravity is + * eventually added to the vertical acceleration) + */ + void set_acceleration(float ax, float ay); + + void set_acceleration_x(float ax); + void set_acceleration_y(float ay); + + float get_acceleration_x(); + float get_acceleration_y(); + + /** enables or disables handling of gravity */ + void enable_gravity(bool gravity_enabled); + + /** applies the physical simulation to given x and y coordinates */ + void apply(float frame_ratio, float &x, float &y); + + /** applies the physical simulation to given x and y coordinates */ + void apply(Vector& vector, float frame_ratio); + +private: + /// horizontal and vertical acceleration + float ax, ay; + /// horizontal and vertical velocity + float vx, vy; + /// should we respect gravity in out calculations? + bool gravity_enabled; +}; #endif /*SUPERTUX_PHYSIC_H*/