Added an option to ParallaxLayer to add an extra scroll offset, helps if you want to make clouds to move by themselves and animate that, for example.

This commit is contained in:
Juan Linietsky 2016-06-26 16:22:20 -03:00
parent 33f1204dc4
commit 282da142ae
4 changed files with 50 additions and 7 deletions

View File

@ -104,16 +104,18 @@ void ParallaxBackground::_update_scroll() {
}
ofs = -ofs;
final_offset=ofs;
for(int i=0;i<get_child_count();i++) {
ParallaxLayer *l=get_child(i)->cast_to<ParallaxLayer>();
if (!l)
continue;
if (ignore_camera_zoom)
l->set_base_offset_and_scale(ofs, 1.0);
else
l->set_base_offset_and_scale(ofs, scale);
if (ignore_camera_zoom)
l->set_base_offset_and_scale(ofs, 1.0);
else
l->set_base_offset_and_scale(ofs, scale);
}
}
@ -180,6 +182,11 @@ bool ParallaxBackground::is_ignore_camera_zoom(){
}
Vector2 ParallaxBackground::get_final_offset() const {
return final_offset;
}
void ParallaxBackground::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_camera_moved"),&ParallaxBackground::_camera_moved);

View File

@ -44,6 +44,7 @@ class ParallaxBackground : public CanvasLayer {
String group_name;
Point2 limit_begin;
Point2 limit_end;
Point2 final_offset;
bool ignore_camera_zoom;
void _update_scroll();
@ -73,8 +74,10 @@ public:
void set_limit_end(const Point2& p_ofs);
Point2 get_limit_end() const;
void set_ignore_camera_zoom(bool ignore);
bool is_ignore_camera_zoom();
void set_ignore_camera_zoom(bool ignore);
bool is_ignore_camera_zoom();
Vector2 get_final_offset() const;
ParallaxBackground();
};

View File

@ -32,6 +32,15 @@
void ParallaxLayer::set_motion_scale(const Size2& p_scale) {
motion_scale=p_scale;
ParallaxBackground *pb = get_parent()->cast_to<ParallaxBackground>();
if (is_inside_tree() && pb) {
Vector2 ofs = pb->get_final_offset();
float scale = pb->get_scroll_scale();
set_base_offset_and_scale(ofs,scale);
}
}
Size2 ParallaxLayer::get_motion_scale() const {
@ -40,6 +49,23 @@ Size2 ParallaxLayer::get_motion_scale() const {
}
void ParallaxLayer::set_motion_offset(const Size2& p_offset) {
motion_offset=p_offset;
ParallaxBackground *pb = get_parent()->cast_to<ParallaxBackground>();
if (is_inside_tree() && pb) {
Vector2 ofs = pb->get_final_offset();
float scale = pb->get_scroll_scale();
set_base_offset_and_scale(ofs,scale);
}
}
Size2 ParallaxLayer::get_motion_offset() const {
return motion_offset;
}
void ParallaxLayer::_update_mirroring() {
@ -89,7 +115,7 @@ void ParallaxLayer::set_base_offset_and_scale(const Point2& p_offset,float p_sca
return;
if (get_tree()->is_editor_hint())
return;
Point2 new_ofs = ((orig_offset+p_offset)*motion_scale)*p_scale;
Point2 new_ofs = ((orig_offset+p_offset)*motion_scale)*p_scale+motion_offset;
if (mirroring.x) {
@ -132,10 +158,13 @@ void ParallaxLayer::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_motion_scale","scale"),&ParallaxLayer::set_motion_scale);
ObjectTypeDB::bind_method(_MD("get_motion_scale"),&ParallaxLayer::get_motion_scale);
ObjectTypeDB::bind_method(_MD("set_motion_offset","offset"),&ParallaxLayer::set_motion_offset);
ObjectTypeDB::bind_method(_MD("get_motion_offset"),&ParallaxLayer::get_motion_offset);
ObjectTypeDB::bind_method(_MD("set_mirroring","mirror"),&ParallaxLayer::set_mirroring);
ObjectTypeDB::bind_method(_MD("get_mirroring"),&ParallaxLayer::get_mirroring);
ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"motion/scale"),_SCS("set_motion_scale"),_SCS("get_motion_scale"));
ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"motion/offset"),_SCS("set_motion_offset"),_SCS("get_motion_offset"));
ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"motion/mirroring"),_SCS("set_mirroring"),_SCS("get_mirroring"));
}

View File

@ -38,6 +38,7 @@ class ParallaxLayer : public Node2D {
Point2 orig_offset;
Point2 orig_scale;
Size2 motion_scale;
Vector2 motion_offset;
Vector2 mirroring;
void _update_mirroring();
@ -48,6 +49,9 @@ protected:
public:
void set_motion_offset(const Size2& p_scale);
Size2 get_motion_offset() const;
void set_motion_scale(const Size2& p_scale);
Size2 get_motion_scale() const;