summaryrefslogtreecommitdiff
path: root/scene
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-06-26 16:22:20 -0300
committerJuan Linietsky <reduzio@gmail.com>2016-06-26 16:22:20 -0300
commit282da142aea365680acd80c12916d8e46dd2f5e8 (patch)
tree0e77c1b9c7d370412f2b7a7308dcc3259c73bc29 /scene
parent33f1204dc4e919660bd923f366897349a9f9fdbb (diff)
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.
Diffstat (limited to 'scene')
-rw-r--r--scene/2d/parallax_background.cpp15
-rw-r--r--scene/2d/parallax_background.h7
-rw-r--r--scene/2d/parallax_layer.cpp31
-rw-r--r--scene/2d/parallax_layer.h4
4 files changed, 50 insertions, 7 deletions
diff --git a/scene/2d/parallax_background.cpp b/scene/2d/parallax_background.cpp
index 7f2e9efd96..1b6ab66fcc 100644
--- a/scene/2d/parallax_background.cpp
+++ b/scene/2d/parallax_background.cpp
@@ -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);
diff --git a/scene/2d/parallax_background.h b/scene/2d/parallax_background.h
index bdaf7d241f..c00cd52f26 100644
--- a/scene/2d/parallax_background.h
+++ b/scene/2d/parallax_background.h
@@ -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();
};
diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp
index bf559deb09..ec7189ff93 100644
--- a/scene/2d/parallax_layer.cpp
+++ b/scene/2d/parallax_layer.cpp
@@ -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"));
}
diff --git a/scene/2d/parallax_layer.h b/scene/2d/parallax_layer.h
index c2d345da47..6b1d73ea66 100644
--- a/scene/2d/parallax_layer.h
+++ b/scene/2d/parallax_layer.h
@@ -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;