File: qd_coords_animation.h

package info (click to toggle)
scummvm 2.9.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 450,268 kB
  • sloc: cpp: 4,297,604; asm: 28,322; python: 12,901; sh: 11,219; java: 8,477; xml: 7,843; perl: 2,633; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (165 lines) | stat: -rw-r--r-- 4,647 bytes parent folder | download | duplicates (2)
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