#ifndef ANIM_ANIMATION_H #define ANIM_ANIMATION_H #include "../oo/base.qh" void setterDummy(entity, float); CLASS(Animation, Object) METHOD(Animation, configureAnimation, void(entity, entity, void(entity, float), float, float, float, float)); METHOD(Animation, update, void(entity, float, float, float)); METHOD(Animation, setTimeStartEnd, void(entity, float, float)); METHOD(Animation, setTimeStartDuration, void(entity, float, float)); METHOD(Animation, setValueStartEnd, void(entity, float, float)); METHOD(Animation, setValueStartDelta, void(entity, float, float)); METHOD(Animation, setObjectSetter, void(entity, entity, void(entity, float))); METHOD(Animation, tick, void(entity, float)); METHOD(Animation, calcValue, float(entity, float, float, float, float)); METHOD(Animation, isStopped, float(entity)); METHOD(Animation, stopAnim, void(entity)); METHOD(Animation, resumeAnim, void(entity)); METHOD(Animation, isFinished, float(entity)); METHOD(Animation, finishAnim, void(entity)); ATTRIB(Animation, object, entity, NULL) ATTRIB(Animation, setter, void(entity, float), setterDummy) ATTRIB(Animation, value, float, 0) ATTRIB(Animation, startTime, float, 0) ATTRIB(Animation, duration, float, 0) ATTRIB(Animation, startValue, float, 0) ATTRIB(Animation, delta, float, 0) ATTRIB(Animation, stopped, float, false) ATTRIB(Animation, finished, float, false) ENDCLASS(Animation) #endif #ifdef IMPLEMENTATION void Animation_configureAnimation(entity me, entity obj, void(entity, float) objSetter, float animStartTime, float animDuration, float animStartValue, float animEndValue) { me.setObjectSetter(me, obj, objSetter); me.setTimeStartDuration(me, animStartTime, animDuration); me.setValueStartEnd(me, animStartValue, animEndValue); } void Animation_update(entity me, float animDuration, float animStartValue, float animEndValue) { me.setTimeStartDuration(me, time, animDuration); me.setValueStartEnd(me, animStartValue, animEndValue); } void Animation_setTimeStartEnd(entity me, float s, float e) { me.startTime = s; me.duration = e - s; } void Animation_setTimeStartDuration(entity me, float s, float d) { me.startTime = s; me.duration = d; } void Animation_setValueStartEnd(entity me, float s, float e) { me.startValue = s; me.delta = e - s; } void Animation_setValueStartDelta(entity me, float s, float d) { me.startValue = s; me.delta = d; } void Animation_setObjectSetter(entity me, entity o, void(entity, float) s) { me.object = o; me.setter = s; } void Animation_tick(entity me, float tickTime) { if (me.isStopped(me) || me.isFinished(me) || (tickTime < me.startTime)) return; if (tickTime >= (me.startTime + me.duration)) me.finishAnim(me); else me.value = me.calcValue(me, (tickTime - me.startTime), me.duration, me.startValue, me.delta); me.setter(me.object, me.value); } float Animation_calcValue(entity me, float tickTime, float animDuration, float animStartValue, float animDelta) { return animStartValue; } float Animation_isStopped(entity me) { return me.stopped; } void Animation_stopAnim(entity me) { me.stopped = true; } void Animation_resumeAnim(entity me) { me.stopped = false; } float Animation_isFinished(entity me) { return me.finished; } void Animation_finishAnim(entity me) { me.value = me.delta + me.startValue; me.finished = true; me.setter(me.object, me.value); } void setterDummy(entity obj, float objValue) { } #endif