1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source 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 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef QDENGINE_QDCORE_QD_COORDS_ANIMATION_H
#define QDENGINE_QDCORE_QD_COORDS_ANIMATION_H
#include "qdengine/parser/xml_fwd.h"
#include "qdengine/qdcore/qd_named_object.h"
#include "qdengine/qdcore/qd_coords_animation_point.h"
#include "qdengine/qdcore/qd_named_object_reference.h"
namespace QDEngine {
const int QD_COORDS_ANM_OBJECT_START_FLAG = 0x01;
const int QD_COORDS_ANM_LOOP_FLAG = 0x02;
const int QD_COORDS_ANM_RELATIVE_FLAG = 0x04; // Флаг перемещения траектории в текущую точку нахождения объекта
class qdCoordsAnimation : public qdNamedObject {
public:
enum qdCoordsAnimationType {
CA_INTERPOLATE_COORDS,
CA_WALK
};
qdCoordsAnimation();
qdCoordsAnimation(const qdCoordsAnimation &anm);
~qdCoordsAnimation();
qdCoordsAnimation &operator = (const qdCoordsAnimation &anm);
int named_object_type() const {
return QD_NAMED_OBJECT_COORDS_ANIMATION;
}
float speed() const {
return _speed;
}
void set_speed(float sp) {
_speed = sp;
}
const qdGameObject *start_object() const {
return _start_object;
}
void set_start_object(const qdGameObject *p_obj);
const qdNamedObjectReference &start_object_ref() const {
return _start_object_ref;
}
bool is_playing() const {
return _status;
}
bool is_finished() const {
return _is_finished;
}
qdCoordsAnimationType type() const {
return _type;
}
void set_type(qdCoordsAnimationType tp) {
_type = tp;
}
float animation_phase() const {
return _animation_phase;
}
void set_animation_phase(float p) {
_animation_phase = p;
}
void start() const;
void stop() const;
void quant(float dt) const;
bool reset_cur_point() const;
bool set_cur_point(int point_num) const;
int get_cur_point() const {
return _cur_point;
}
void set_time_rel(float tm);
void add_point(const qdCoordsAnimationPoint *p);
void insert_point(const qdCoordsAnimationPoint *p, int insert_pos);
void remove_point(int num);
void clear();
qdCoordsAnimationPoint *get_point(int index = 0) {
return &_points[index];
};
const qdCoordsAnimationPoint *get_point(int index = 0) const {
return &_points[index];
};
int size() const {
return _points.size();
}
void load_script(const xml::tag *p);
bool save_script(Common::WriteStream &fh, int indent = 0) const;
bool is_empty() const {
if (_points.empty()) return true;
return false;
}
//! Загрузка данных из сэйва.
bool load_data(Common::SeekableReadStream &fh, int save_version);
//! Запись данных в сэйв.
bool save_data(Common::WriteStream &fh) const;
Common::String flag2str(int flags) const;
private:
qdCoordsAnimationType _type;
qdCoordsAnimationPointVector _points;
float _animation_phase;
float _speed;
// Для относительного перемещения персонажа (QD_COORDS_ANM_RELATIVE_FLAG):
// объект, относительно коориднат которого будет работать траектория движения (если не задано, то работаем
// относительно координат объекта-владельца координатной анимации)
const qdGameObject *_start_object;
qdNamedObjectReference _start_object_ref;
mutable bool _status;
mutable bool _is_finished;
mutable qdCoordsAnimationPoint _start_point;
mutable int _cur_point;
Vect3f cur_pos() const;
class qdGameObjectAnimated *object() const;
void calc_paths() const;
// Дельта (вектор) смещения координат анимации
mutable Vect3f _del;
};
//typedef Std::list<qdCoordsAnimation*> qdCoordsAnimationList;
} // namespace QDEngine
#endif // QDENGINE_QDCORE_QD_COORDS_ANIMATION_H
|