| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  animated_sprite.cpp                                                  */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2021-01-01 20:13:46 +01:00
										 |  |  | /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "animated_sprite.h"
 | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/os/os.h"
 | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | #include "scene/scene_string_names.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-18 00:03:28 -03:00
										 |  |  | #define NORMAL_SUFFIX "_normal"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 23:37:07 +02:00
										 |  |  | #ifdef TOOLS_ENABLED
 | 
					
						
							| 
									
										
										
										
											2017-11-07 08:58:35 +01:00
										 |  |  | Dictionary AnimatedSprite::_edit_get_state() const { | 
					
						
							|  |  |  | 	Dictionary state = Node2D::_edit_get_state(); | 
					
						
							|  |  |  | 	state["offset"] = offset; | 
					
						
							|  |  |  | 	return state; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::_edit_set_state(const Dictionary &p_state) { | 
					
						
							|  |  |  | 	Node2D::_edit_set_state(p_state); | 
					
						
							|  |  |  | 	set_offset(p_state["offset"]); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::_edit_set_pivot(const Point2 &p_pivot) { | 
					
						
							|  |  |  | 	set_offset(get_offset() - p_pivot); | 
					
						
							|  |  |  | 	set_position(get_transform().xform(p_pivot)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Point2 AnimatedSprite::_edit_get_pivot() const { | 
					
						
							|  |  |  | 	return Vector2(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimatedSprite::_edit_use_pivot() const { | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Rect2 AnimatedSprite::_edit_get_rect() const { | 
					
						
							| 
									
										
										
										
											2018-05-05 16:59:00 +02:00
										 |  |  | 	return _get_rect(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimatedSprite::_edit_use_rect() const { | 
					
						
							| 
									
										
										
										
											2017-11-07 08:58:35 +01:00
										 |  |  | 	if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { | 
					
						
							| 
									
										
										
										
											2018-05-05 16:59:00 +02:00
										 |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	Ref<Texture> t; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (animation) { | 
					
						
							| 
									
										
										
										
											2018-05-05 16:59:00 +02:00
										 |  |  | 		t = frames->get_frame(animation, frame); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-06-26 15:08:25 +02:00
										 |  |  | 	return t.is_valid(); | 
					
						
							| 
									
										
										
										
											2018-05-05 16:59:00 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-10-21 23:37:07 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-05-05 16:59:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Rect2 AnimatedSprite::get_anchorable_rect() const { | 
					
						
							|  |  |  | 	return _get_rect(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Rect2 AnimatedSprite::_get_rect() const { | 
					
						
							|  |  |  | 	if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { | 
					
						
							|  |  |  | 		return Rect2(); | 
					
						
							| 
									
										
										
										
											2017-11-07 08:58:35 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Texture> t; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (animation) { | 
					
						
							| 
									
										
										
										
											2017-11-07 08:58:35 +01:00
										 |  |  | 		t = frames->get_frame(animation, frame); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (t.is_null()) { | 
					
						
							| 
									
										
										
										
											2018-05-05 16:59:00 +02:00
										 |  |  | 		return Rect2(); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-07 08:58:35 +01:00
										 |  |  | 	Size2 s = t->get_size(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Point2 ofs = offset; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (centered) { | 
					
						
							| 
									
										
										
										
											2021-10-03 14:15:21 +02:00
										 |  |  | 		ofs -= s / 2; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-07 08:58:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (s == Size2(0, 0)) { | 
					
						
							| 
									
										
										
										
											2017-11-07 08:58:35 +01:00
										 |  |  | 		s = Size2(1, 1); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-07 08:58:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return Rect2(ofs, s); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteFrames::add_frame(const StringName &p_anim, const Ref<Texture> &p_frame, int p_at_pos) { | 
					
						
							|  |  |  | 	Map<StringName, Anim>::Element *E = animations.find(p_anim); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (p_at_pos >= 0 && p_at_pos < E->get().frames.size()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		E->get().frames.insert(p_at_pos, p_frame); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		E->get().frames.push_back(p_frame); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	emit_changed(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | int SpriteFrames::get_frame_count(const StringName &p_anim) const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	const Map<StringName, Anim>::Element *E = animations.find(p_anim); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_V_MSG(!E, 0, "Animation '" + String(p_anim) + "' doesn't exist."); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	return E->get().frames.size(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | void SpriteFrames::remove_frame(const StringName &p_anim, int p_idx) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Map<StringName, Anim>::Element *E = animations.find(p_anim); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	E->get().frames.remove(p_idx); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	emit_changed(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | void SpriteFrames::clear(const StringName &p_anim) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Map<StringName, Anim>::Element *E = animations.find(p_anim); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	E->get().frames.clear(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	emit_changed(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | void SpriteFrames::clear_all() { | 
					
						
							|  |  |  | 	animations.clear(); | 
					
						
							|  |  |  | 	add_animation("default"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteFrames::add_animation(const StringName &p_anim) { | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(animations.has(p_anim), "SpriteFrames already has animation '" + p_anim + "'."); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	animations[p_anim] = Anim(); | 
					
						
							| 
									
										
										
										
											2017-06-18 00:03:28 -03:00
										 |  |  | 	animations[p_anim].normal_name = String(p_anim) + NORMAL_SUFFIX; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool SpriteFrames::has_animation(const StringName &p_anim) const { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	return animations.has(p_anim); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteFrames::remove_animation(const StringName &p_anim) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	animations.erase(p_anim); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteFrames::rename_animation(const StringName &p_prev, const StringName &p_next) { | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(!animations.has(p_prev), "SpriteFrames doesn't have animation '" + String(p_prev) + "'."); | 
					
						
							|  |  |  | 	ERR_FAIL_COND_MSG(animations.has(p_next), "Animation '" + String(p_next) + "' already exists."); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Anim anim = animations[p_prev]; | 
					
						
							|  |  |  | 	animations.erase(p_prev); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	animations[p_next] = anim; | 
					
						
							| 
									
										
										
										
											2017-06-18 00:03:28 -03:00
										 |  |  | 	animations[p_next].normal_name = String(p_next) + NORMAL_SUFFIX; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Vector<String> SpriteFrames::_get_animation_list() const { | 
					
						
							|  |  |  | 	Vector<String> ret; | 
					
						
							|  |  |  | 	List<StringName> al; | 
					
						
							|  |  |  | 	get_animation_list(&al); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (List<StringName>::Element *E = al.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		ret.push_back(E->get()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteFrames::get_animation_list(List<StringName> *r_animations) const { | 
					
						
							|  |  |  | 	for (const Map<StringName, Anim>::Element *E = animations.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		r_animations->push_back(E->key()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 19:50:01 +02:00
										 |  |  | Vector<String> SpriteFrames::get_animation_names() const { | 
					
						
							|  |  |  | 	Vector<String> names; | 
					
						
							|  |  |  | 	for (const Map<StringName, Anim>::Element *E = animations.front(); E; E = E->next()) { | 
					
						
							|  |  |  | 		names.push_back(E->key()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	names.sort(); | 
					
						
							|  |  |  | 	return names; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteFrames::set_animation_speed(const StringName &p_anim, float p_fps) { | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(p_fps < 0, "Animation speed cannot be negative (" + itos(p_fps) + ")."); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Map<StringName, Anim>::Element *E = animations.find(p_anim); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	E->get().speed = p_fps; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | float SpriteFrames::get_animation_speed(const StringName &p_anim) const { | 
					
						
							|  |  |  | 	const Map<StringName, Anim>::Element *E = animations.find(p_anim); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_V_MSG(!E, 0, "Animation '" + String(p_anim) + "' doesn't exist."); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	return E->get().speed; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteFrames::set_animation_loop(const StringName &p_anim, bool p_loop) { | 
					
						
							|  |  |  | 	Map<StringName, Anim>::Element *E = animations.find(p_anim); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	E->get().loop = p_loop; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool SpriteFrames::get_animation_loop(const StringName &p_anim) const { | 
					
						
							|  |  |  | 	const Map<StringName, Anim>::Element *E = animations.find(p_anim); | 
					
						
							| 
									
										
										
										
											2019-09-25 10:28:50 +02:00
										 |  |  | 	ERR_FAIL_COND_V_MSG(!E, false, "Animation '" + String(p_anim) + "' doesn't exist."); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	return E->get().loop; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-13 02:32:51 +02:00
										 |  |  | void SpriteFrames::_set_frames(const Array &p_frames) { | 
					
						
							|  |  |  | 	clear_all(); | 
					
						
							|  |  |  | 	Map<StringName, Anim>::Element *E = animations.find(SceneStringNames::get_singleton()->_default); | 
					
						
							|  |  |  | 	ERR_FAIL_COND(!E); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	E->get().frames.resize(p_frames.size()); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	for (int i = 0; i < E->get().frames.size(); i++) { | 
					
						
							| 
									
										
										
										
											2018-09-13 02:32:51 +02:00
										 |  |  | 		E->get().frames.write[i] = p_frames[i]; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-13 02:32:51 +02:00
										 |  |  | } | 
					
						
							|  |  |  | Array SpriteFrames::_get_frames() const { | 
					
						
							|  |  |  | 	return Array(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Array SpriteFrames::_get_animations() const { | 
					
						
							|  |  |  | 	Array anims; | 
					
						
							|  |  |  | 	for (Map<StringName, Anim>::Element *E = animations.front(); E; E = E->next()) { | 
					
						
							|  |  |  | 		Dictionary d; | 
					
						
							|  |  |  | 		d["name"] = E->key(); | 
					
						
							|  |  |  | 		d["speed"] = E->get().speed; | 
					
						
							|  |  |  | 		d["loop"] = E->get().loop; | 
					
						
							|  |  |  | 		Array frames; | 
					
						
							|  |  |  | 		for (int i = 0; i < E->get().frames.size(); i++) { | 
					
						
							|  |  |  | 			frames.push_back(E->get().frames[i]); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		d["frames"] = frames; | 
					
						
							|  |  |  | 		anims.push_back(d); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return anims; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void SpriteFrames::_set_animations(const Array &p_animations) { | 
					
						
							|  |  |  | 	animations.clear(); | 
					
						
							|  |  |  | 	for (int i = 0; i < p_animations.size(); i++) { | 
					
						
							|  |  |  | 		Dictionary d = p_animations[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ERR_CONTINUE(!d.has("name")); | 
					
						
							|  |  |  | 		ERR_CONTINUE(!d.has("speed")); | 
					
						
							|  |  |  | 		ERR_CONTINUE(!d.has("loop")); | 
					
						
							|  |  |  | 		ERR_CONTINUE(!d.has("frames")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Anim anim; | 
					
						
							|  |  |  | 		anim.speed = d["speed"]; | 
					
						
							|  |  |  | 		anim.loop = d["loop"]; | 
					
						
							|  |  |  | 		Array frames = d["frames"]; | 
					
						
							| 
									
										
										
										
											2019-02-12 21:10:08 +01:00
										 |  |  | 		for (int j = 0; j < frames.size(); j++) { | 
					
						
							|  |  |  | 			RES res = frames[j]; | 
					
						
							| 
									
										
										
										
											2018-09-13 02:32:51 +02:00
										 |  |  | 			anim.frames.push_back(res); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		animations[d["name"]] = anim; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void SpriteFrames::_bind_methods() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("add_animation", "anim"), &SpriteFrames::add_animation); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("has_animation", "anim"), &SpriteFrames::has_animation); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("remove_animation", "anim"), &SpriteFrames::remove_animation); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("rename_animation", "anim", "newname"), &SpriteFrames::rename_animation); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 19:50:01 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_animation_names"), &SpriteFrames::get_animation_names); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_animation_speed", "anim", "speed"), &SpriteFrames::set_animation_speed); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_animation_speed", "anim"), &SpriteFrames::get_animation_speed); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_animation_loop", "anim", "loop"), &SpriteFrames::set_animation_loop); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_animation_loop", "anim"), &SpriteFrames::get_animation_loop); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-10 15:37:49 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("add_frame", "anim", "frame", "at_position"), &SpriteFrames::add_frame, DEFVAL(-1)); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_frame_count", "anim"), &SpriteFrames::get_frame_count); | 
					
						
							| 
									
										
										
										
											2017-08-09 13:19:41 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_frame", "anim", "idx"), &SpriteFrames::get_frame); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("set_frame", "anim", "idx", "txt"), &SpriteFrames::set_frame); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("remove_frame", "anim", "idx"), &SpriteFrames::remove_frame); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("clear", "anim"), &SpriteFrames::clear); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("clear_all"), &SpriteFrames::clear_all); | 
					
						
							| 
									
										
										
										
											2018-09-13 02:32:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("_set_frames"), &SpriteFrames::_set_frames); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("_get_frames"), &SpriteFrames::_get_frames); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-08 11:30:02 -03:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "frames", PROPERTY_HINT_NONE, "", 0), "_set_frames", "_get_frames"); //compatibility
 | 
					
						
							| 
									
										
										
										
											2018-09-13 02:32:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("_set_animations"), &SpriteFrames::_set_animations); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("_get_animations"), &SpriteFrames::_get_animations); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-08 11:30:02 -03:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "animations", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_animations", "_get_animations"); //compatibility
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SpriteFrames::SpriteFrames() { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	add_animation(SceneStringNames::get_singleton()->_default); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AnimatedSprite::_validate_property(PropertyInfo &property) const { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (!frames.is_valid()) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (property.name == "animation") { | 
					
						
							|  |  |  | 		property.hint = PROPERTY_HINT_ENUM; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		List<StringName> names; | 
					
						
							|  |  |  | 		frames->get_animation_list(&names); | 
					
						
							|  |  |  | 		names.sort_custom<StringName::AlphCompare>(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		bool current_found = false; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (List<StringName>::Element *E = names.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 			if (E->prev()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				property.hint_string += ","; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			property.hint_string += String(E->get()); | 
					
						
							|  |  |  | 			if (animation == E->get()) { | 
					
						
							|  |  |  | 				current_found = true; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!current_found) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (property.hint_string == String()) { | 
					
						
							|  |  |  | 				property.hint_string = String(animation); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				property.hint_string = String(animation) + "," + property.hint_string; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (property.name == "frame") { | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 		property.hint = PROPERTY_HINT_RANGE; | 
					
						
							| 
									
										
										
										
											2017-10-11 17:46:22 +09:00
										 |  |  | 		if (frames->has_animation(animation) && frames->get_frame_count(animation) > 1) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 		property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::_notification(int p_what) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_what) { | 
					
						
							| 
									
										
										
										
											2017-01-10 18:02:19 -03:00
										 |  |  | 		case NOTIFICATION_INTERNAL_PROCESS: { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			if (frames.is_null()) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (!frames->has_animation(animation)) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (frame < 0) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-26 21:08:21 +02:00
										 |  |  | 			float speed = frames->get_animation_speed(animation) * speed_scale; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			if (speed == 0) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 				return; //do nothing
 | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			float remaining = get_process_delta_time(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			while (remaining) { | 
					
						
							|  |  |  | 				if (timeout <= 0) { | 
					
						
							| 
									
										
										
										
											2018-05-13 23:29:06 +02:00
										 |  |  | 					timeout = _get_frame_duration(); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					int fc = frames->get_frame_count(animation); | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 					if ((!backwards && frame >= fc - 1) || (backwards && frame <= 0)) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 						if (frames->get_animation_loop(animation)) { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 							if (backwards) { | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 								frame = fc - 1; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 							} else { | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 								frame = 0; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-27 17:31:55 +01:00
										 |  |  | 							emit_signal(SceneStringNames::get_singleton()->animation_finished); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 						} else { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 							if (backwards) { | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 								frame = 0; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 							} else { | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 								frame = fc - 1; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-04 12:51:45 +02:00
										 |  |  | 							if (!is_over) { | 
					
						
							|  |  |  | 								is_over = true; | 
					
						
							| 
									
										
										
										
											2018-11-23 16:53:25 +01:00
										 |  |  | 								emit_signal(SceneStringNames::get_singleton()->animation_finished); | 
					
						
							| 
									
										
										
										
											2018-10-04 12:51:45 +02:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 						if (backwards) { | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 							frame--; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 						} else { | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 							frame++; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					update(); | 
					
						
							|  |  |  | 					_change_notify("frame"); | 
					
						
							| 
									
										
										
										
											2017-08-05 16:32:34 -03:00
										 |  |  | 					emit_signal(SceneStringNames::get_singleton()->frame_changed); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				float to_process = MIN(timeout, remaining); | 
					
						
							|  |  |  | 				remaining -= to_process; | 
					
						
							|  |  |  | 				timeout -= to_process; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case NOTIFICATION_DRAW: { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			if (frames.is_null()) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (frame < 0) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (!frames->has_animation(animation)) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			Ref<Texture> texture = frames->get_frame(animation, frame); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			if (texture.is_null()) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-18 00:03:28 -03:00
										 |  |  | 			Ref<Texture> normal = frames->get_normal_frame(animation, frame); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			RID ci = get_canvas_item(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-03 14:15:21 +02:00
										 |  |  | 			Size2 s = texture->get_size(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			Point2 ofs = offset; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			if (centered) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				ofs -= s / 2; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-04 13:33:41 +00:00
										 |  |  | 			if (Engine::get_singleton()->get_use_gpu_pixel_snap()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				ofs = ofs.floor(); | 
					
						
							| 
									
										
										
										
											2015-10-13 15:53:34 -03:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			Rect2 dst_rect(ofs, s); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			if (hflip) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				dst_rect.size.x = -dst_rect.size.x; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (vflip) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				dst_rect.size.y = -dst_rect.size.y; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-18 00:03:28 -03:00
										 |  |  | 			texture->draw_rect_region(ci, dst_rect, Rect2(Vector2(), texture->get_size()), Color(1, 1, 1), false, normal); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (frames.is_valid()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		frames->disconnect("changed", this, "_res_changed"); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	frames = p_frames; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (frames.is_valid()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		frames->connect("changed", this, "_res_changed"); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!frames.is_valid()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		frame = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		set_frame(frame); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	_change_notify(); | 
					
						
							|  |  |  | 	_reset_timeout(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	update(); | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | 	update_configuration_warning(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Ref<SpriteFrames> AnimatedSprite::get_sprite_frames() const { | 
					
						
							|  |  |  | 	return frames; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::set_frame(int p_frame) { | 
					
						
							|  |  |  | 	if (!frames.is_valid()) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (frames->has_animation(animation)) { | 
					
						
							|  |  |  | 		int limit = frames->get_frame_count(animation); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 		if (p_frame >= limit) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			p_frame = limit - 1; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (p_frame < 0) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		p_frame = 0; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (frame == p_frame) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	frame = p_frame; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	_reset_timeout(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | 	_change_notify("frame"); | 
					
						
							| 
									
										
										
										
											2014-12-07 02:04:20 -03:00
										 |  |  | 	emit_signal(SceneStringNames::get_singleton()->frame_changed); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | int AnimatedSprite::get_frame() const { | 
					
						
							|  |  |  | 	return frame; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-26 21:08:21 +02:00
										 |  |  | void AnimatedSprite::set_speed_scale(float p_speed_scale) { | 
					
						
							| 
									
										
										
										
											2018-05-13 23:29:06 +02:00
										 |  |  | 	float elapsed = _get_frame_duration() - timeout; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-26 21:08:21 +02:00
										 |  |  | 	speed_scale = MAX(p_speed_scale, 0.0f); | 
					
						
							| 
									
										
										
										
											2018-05-13 23:29:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed
 | 
					
						
							|  |  |  | 	_reset_timeout(); | 
					
						
							|  |  |  | 	timeout -= elapsed; | 
					
						
							| 
									
										
										
										
											2018-04-26 21:08:21 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float AnimatedSprite::get_speed_scale() const { | 
					
						
							|  |  |  | 	return speed_scale; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void AnimatedSprite::set_centered(bool p_center) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	centered = p_center; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | 	item_rect_changed(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimatedSprite::is_centered() const { | 
					
						
							|  |  |  | 	return centered; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AnimatedSprite::set_offset(const Point2 &p_offset) { | 
					
						
							|  |  |  | 	offset = p_offset; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | 	item_rect_changed(); | 
					
						
							| 
									
										
										
										
											2014-12-07 02:04:20 -03:00
										 |  |  | 	_change_notify("offset"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | Point2 AnimatedSprite::get_offset() const { | 
					
						
							|  |  |  | 	return offset; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::set_flip_h(bool p_flip) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	hflip = p_flip; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | bool AnimatedSprite::is_flipped_h() const { | 
					
						
							|  |  |  | 	return hflip; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::set_flip_v(bool p_flip) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	vflip = p_flip; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | bool AnimatedSprite::is_flipped_v() const { | 
					
						
							|  |  |  | 	return vflip; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::_res_changed() { | 
					
						
							|  |  |  | 	set_frame(frame); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	_change_notify("frame"); | 
					
						
							|  |  |  | 	_change_notify("animation"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | void AnimatedSprite::_set_playing(bool p_playing) { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (playing == p_playing) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	playing = p_playing; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	_reset_timeout(); | 
					
						
							| 
									
										
										
										
											2017-01-10 18:02:19 -03:00
										 |  |  | 	set_process_internal(playing); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimatedSprite::_is_playing() const { | 
					
						
							|  |  |  | 	return playing; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | void AnimatedSprite::play(const StringName &p_animation, const bool p_backwards) { | 
					
						
							| 
									
										
										
										
											2019-09-03 15:59:54 -07:00
										 |  |  | 	backwards = p_backwards; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (p_animation) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		set_animation(p_animation); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 		if (frames.is_valid() && backwards && get_frame() == 0) { | 
					
						
							| 
									
										
										
										
											2019-09-03 15:59:54 -07:00
										 |  |  | 			set_frame(frames->get_frame_count(p_animation) - 1); | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-09-03 15:59:54 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	_set_playing(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AnimatedSprite::stop() { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	_set_playing(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimatedSprite::is_playing() const { | 
					
						
							| 
									
										
										
										
											2017-12-07 18:14:39 -03:00
										 |  |  | 	return playing; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-13 23:29:06 +02:00
										 |  |  | float AnimatedSprite::_get_frame_duration() { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	if (frames.is_valid() && frames->has_animation(animation)) { | 
					
						
							| 
									
										
										
										
											2018-04-26 21:08:21 +02:00
										 |  |  | 		float speed = frames->get_animation_speed(animation) * speed_scale; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if (speed > 0) { | 
					
						
							| 
									
										
										
										
											2018-05-13 23:29:06 +02:00
										 |  |  | 			return 1.0 / speed; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-05-13 23:29:06 +02:00
										 |  |  | 	return 0.0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite::_reset_timeout() { | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (!playing) { | 
					
						
							| 
									
										
										
										
											2018-05-13 23:29:06 +02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-05-13 23:29:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	timeout = _get_frame_duration(); | 
					
						
							| 
									
										
										
										
											2018-10-04 12:51:45 +02:00
										 |  |  | 	is_over = false; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AnimatedSprite::set_animation(const StringName &p_animation) { | 
					
						
							| 
									
										
										
										
											2021-05-04 16:00:45 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(frames == nullptr, vformat("There is no animation with name '%s'.", p_animation)); | 
					
						
							| 
									
										
										
										
											2019-08-08 22:11:48 +02:00
										 |  |  | 	ERR_FAIL_COND_MSG(frames->get_animation_names().find(p_animation) == -1, vformat("There is no animation with name '%s'.", p_animation)); | 
					
						
							| 
									
										
										
										
											2018-12-19 20:38:19 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	if (animation == p_animation) { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2021-05-05 12:44:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	animation = p_animation; | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	_reset_timeout(); | 
					
						
							|  |  |  | 	set_frame(0); | 
					
						
							|  |  |  | 	_change_notify(); | 
					
						
							|  |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | StringName AnimatedSprite::get_animation() const { | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 	return animation; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | String AnimatedSprite::get_configuration_warning() const { | 
					
						
							| 
									
										
										
										
											2020-03-22 11:31:09 +03:00
										 |  |  | 	String warning = Node2D::get_configuration_warning(); | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | 	if (frames.is_null()) { | 
					
						
							| 
									
										
										
										
											2020-03-22 11:31:09 +03:00
										 |  |  | 		if (warning != String()) { | 
					
						
							|  |  |  | 			warning += "\n\n"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		warning += TTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite to display frames."); | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 11:31:09 +03:00
										 |  |  | 	return warning; | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void AnimatedSprite::_bind_methods() { | 
					
						
							| 
									
										
										
										
											2017-08-09 13:19:41 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_sprite_frames", "sprite_frames"), &AnimatedSprite::set_sprite_frames); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_sprite_frames"), &AnimatedSprite::get_sprite_frames); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_animation", "animation"), &AnimatedSprite::set_animation); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_animation"), &AnimatedSprite::get_animation); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("_set_playing", "playing"), &AnimatedSprite::_set_playing); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("_is_playing"), &AnimatedSprite::_is_playing); | 
					
						
							| 
									
										
										
										
											2016-05-14 23:48:23 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-06 16:12:59 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("play", "anim", "backwards"), &AnimatedSprite::play, DEFVAL(StringName()), DEFVAL(false)); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("stop"), &AnimatedSprite::stop); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_playing"), &AnimatedSprite::is_playing); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_centered", "centered"), &AnimatedSprite::set_centered); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_centered"), &AnimatedSprite::is_centered); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_offset", "offset"), &AnimatedSprite::set_offset); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_offset"), &AnimatedSprite::get_offset); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_flip_h", "flip_h"), &AnimatedSprite::set_flip_h); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_flipped_h"), &AnimatedSprite::is_flipped_h); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_flip_v", "flip_v"), &AnimatedSprite::set_flip_v); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_flipped_v"), &AnimatedSprite::is_flipped_v); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_frame", "frame"), &AnimatedSprite::set_frame); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_frame"), &AnimatedSprite::get_frame); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-26 21:08:21 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_speed_scale", "speed_scale"), &AnimatedSprite::set_speed_scale); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_speed_scale"), &AnimatedSprite::get_speed_scale); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("_res_changed"), &AnimatedSprite::_res_changed); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-07 02:04:20 -03:00
										 |  |  | 	ADD_SIGNAL(MethodInfo("frame_changed")); | 
					
						
							| 
									
										
										
										
											2017-01-08 17:35:11 -03:00
										 |  |  | 	ADD_SIGNAL(MethodInfo("animation_finished")); | 
					
						
							| 
									
										
										
										
											2014-12-07 02:04:20 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-08 11:30:02 -03:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "animation"), "set_animation", "get_animation"); | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); | 
					
						
							| 
									
										
										
										
											2018-11-08 11:30:02 -03:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale"), "set_speed_scale", "get_speed_scale"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing"), "_set_playing", "_is_playing"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "centered"), "set_centered", "is_centered"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset"), "set_offset", "get_offset"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_h"), "set_flip_h", "is_flipped_h"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_v"), "set_flip_v", "is_flipped_v"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AnimatedSprite::AnimatedSprite() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	centered = true; | 
					
						
							|  |  |  | 	hflip = false; | 
					
						
							|  |  |  | 	vflip = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	frame = 0; | 
					
						
							| 
									
										
										
										
											2018-04-26 21:08:21 +02:00
										 |  |  | 	speed_scale = 1.0f; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	playing = false; | 
					
						
							| 
									
										
										
										
											2019-03-17 04:03:23 -03:00
										 |  |  | 	backwards = false; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	animation = "default"; | 
					
						
							|  |  |  | 	timeout = 0; | 
					
						
							| 
									
										
										
										
											2018-10-04 12:51:45 +02:00
										 |  |  | 	is_over = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } |