1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-11-29 03:33:48 +00:00
Aquaria/BBGE/Event.cpp
2016-05-05 19:57:50 +02:00

243 lines
3.6 KiB
C++

/*
Copyright (C) 2007, 2010 - Bit-Blot
This file is part of Aquaria.
Aquaria 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.
*/
#include "Event.h"
#include "ActionMapper.h"
EventPtr::EventPtr() : e(0)
{
this->_evm = EVM_NONE;
this->actionMapperCallback = 0;
this->actionValue = 0;
this->stateToCall = 0;
}
EventPtr::~EventPtr()
{
}
void EventPtr::clean()
{
// check to see if we have a pointer + want to clean up
// if so, do so!
if (e && evm()==EVM_CLEANUP)
{
delete e;
e=0;
}
}
const EventPtr& EventPtr::operator= (const EventPtr &e)
{
this->e = e.e;
this->_evm = e._evm;
return *this;
}
void EventPtr::call()
{
if (e) e->act();
if (e && evm()==EVM_CLEANUP)
{
delete e;
e=0;
}
if (actionMapperCallback)
{
actionMapperCallback->action(actionValue, stateToCall);
}
}
void EventPtr::set(Event *e, EventManage _evm)
{
this->e = e;
this->_evm = _evm;
}
void EventPtr::setActionMapperCallback(ActionMapper *actionMapperCallback, int actionValue, int stateToCall)
{
this->actionMapperCallback = actionMapperCallback;
this->actionValue = actionValue;
this->stateToCall = stateToCall;
}
EventPulser::EventPulser()
{
interval = 1;
time = 1;
randomVariance = 0;
times = -1;
}
void EventPulser::setInterval(float t)
{
interval = time = t;
}
void EventPulser::update(float dt)
{
if (times == 0) return;
time -= dt;
if (time <= 0)
{
if (times != -1)
{
times --;
}
e.call();
time = interval;
if (randomVariance)
{
time += rand()%randomVariance;
}
}
}
EventTimer::EventTimer(const EventPtr &p, float time)
{
eventPtr = p;
timer.start(time);
}
void EventTimer::update(float dt)
{
if (timer.updateCheck(dt))
{
eventPtr.call();
}
}
EventQueue::EventQueue()
{
}
void EventQueue::addEvent(const EventPtr &eventPtr, float t)
{
eventTimers.push_back(EventTimer(eventPtr, t));
}
void EventQueue::update(float dt)
{
for (EventTimers::iterator i = eventTimers.begin(); i != eventTimers.end();)
{
i->update(dt);
if (i->timer.isDone())
{
i = eventTimers.erase(i);
}
else
{
i++;
}
}
}
void EventQueue::clear()
{
for (EventTimers::iterator i = eventTimers.begin(); i != eventTimers.end(); i++)
{
i->eventPtr.clean();
}
eventTimers.clear();
}
int EventQueue::getSize()
{
return eventTimers.size();
}
Timer::Timer()
{
timer = time = 0;
running = 0;
}
float Timer::getPerc()
{
if (timer <= 0 || time <= 0) return 0;
return timer/time;
}
void Timer::start(float t)
{
timer = t;
time = t;
running = 1;
}
void Timer::stop()
{
timer = 0;
running = 0;
}
void Timer::startStopWatch()
{
timer = 0;
running = 2;
}
bool Timer::isDone()
{
return running == 0;
}
bool Timer::isActive()
{
return running != 0;
}
void Timer::update(float dt)
{
switch (running)
{
case 1:
timer -= dt;
if (timer < 0)
{
timer = 0;
running = 0;
}
break;
case 2:
timer += dt;
break;
}
}
bool Timer::updateCheck(float dt)
{
int wasRunning = running;
update(dt);
if (wasRunning && !running)
return true;
return false;
}
float Timer::getValue()
{
return timer;
}