void AnimatedSprite::_reset_timeout() { if (!playing) return; timeout = _get_frame_duration(); }
void AnimatedSprite::set_speed_scale(float p_speed_scale) { float elapsed = _get_frame_duration() - timeout; speed_scale = MAX(p_speed_scale, 0.0f); // We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed _reset_timeout(); timeout -= elapsed; }
void AnimatedSprite::_notification(int p_what) { switch (p_what) { case NOTIFICATION_INTERNAL_PROCESS: { if (frames.is_null()) return; if (!frames->has_animation(animation)) return; if (frame < 0) return; float speed = frames->get_animation_speed(animation) * speed_scale; if (speed == 0) return; //do nothing float remaining = get_process_delta_time(); while (remaining) { if (timeout <= 0) { timeout = _get_frame_duration(); int fc = frames->get_frame_count(animation); if (frame >= fc - 1) { if (frames->get_animation_loop(animation)) { frame = 0; emit_signal(SceneStringNames::get_singleton()->animation_finished); } else { frame = fc - 1; if (!is_over) { is_over = true; emit_signal(SceneStringNames::get_singleton()->animation_finished); } } } else { frame++; } update(); _change_notify("frame"); emit_signal(SceneStringNames::get_singleton()->frame_changed); } float to_process = MIN(timeout, remaining); remaining -= to_process; timeout -= to_process; } } break; case NOTIFICATION_DRAW: { if (frames.is_null()) return; if (frame < 0) return; if (!frames->has_animation(animation)) return; Ref<Texture> texture = frames->get_frame(animation, frame); if (texture.is_null()) return; Ref<Texture> normal = frames->get_normal_frame(animation, frame); RID ci = get_canvas_item(); Size2i s; s = texture->get_size(); Point2 ofs = offset; if (centered) ofs -= s / 2; if (Engine::get_singleton()->get_use_pixel_snap()) { ofs = ofs.floor(); } Rect2 dst_rect(ofs, s); if (hflip) dst_rect.size.x = -dst_rect.size.x; if (vflip) dst_rect.size.y = -dst_rect.size.y; texture->draw_rect_region(ci, dst_rect, Rect2(Vector2(), texture->get_size()), Color(1, 1, 1), false, normal); } break; } }