From 8edcae5adcceb9113d0d9fe199818470679b5a75 Mon Sep 17 00:00:00 2001 From: Chris Cromer Date: Wed, 20 Apr 2022 11:48:11 -0400 Subject: [PATCH] add camera limit script --- godot/CameraLimit.gdns | 8 ++++++ godot/levels/Level2.tscn | 2 +- godot/levels/Prototype.tscn | 2 +- src/CameraLimit.cpp | 52 +++++++++++++++++++++++++++++++++++++ src/CameraLimit.h | 48 ++++++++++++++++++++++++++++++++++ src/godot.cpp | 2 ++ 6 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 godot/CameraLimit.gdns create mode 100644 src/CameraLimit.cpp create mode 100644 src/CameraLimit.h diff --git a/godot/CameraLimit.gdns b/godot/CameraLimit.gdns new file mode 100644 index 0000000..fe16c94 --- /dev/null +++ b/godot/CameraLimit.gdns @@ -0,0 +1,8 @@ +[gd_resource type="NativeScript" load_steps=2 format=2] + +[ext_resource path="res://gdnative/alai.tres" type="GDNativeLibrary" id=1] + +[resource] +resource_name = "CameraLimit" +class_name = "CameraLimit" +library = ExtResource( 1 ) diff --git a/godot/levels/Level2.tscn b/godot/levels/Level2.tscn index 13c3651..717c1fe 100644 --- a/godot/levels/Level2.tscn +++ b/godot/levels/Level2.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=5 format=2] -[ext_resource path="res://camera_fix.gd" type="Script" id=1] +[ext_resource path="res://CameraLimit.gdns" type="Script" id=1] [ext_resource path="res://characters/player/Player.tscn" type="PackedScene" id=2] [ext_resource path="res://assets/backgrounds/hills.png" type="Texture" id=3] [ext_resource path="res://levels/Level2.tmx" type="PackedScene" id=4] diff --git a/godot/levels/Prototype.tscn b/godot/levels/Prototype.tscn index d33d09c..b18e1ae 100644 --- a/godot/levels/Prototype.tscn +++ b/godot/levels/Prototype.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=5 format=2] -[ext_resource path="res://camera_fix.gd" type="Script" id=1] +[ext_resource path="res://CameraLimit.gdns" type="Script" id=1] [ext_resource path="res://characters/player/Player.tscn" type="PackedScene" id=2] [ext_resource path="res://levels/Prototype.tmx" type="PackedScene" id=3] [ext_resource path="res://assets/backgrounds/mountains.png" type="Texture" id=4] diff --git a/src/CameraLimit.cpp b/src/CameraLimit.cpp new file mode 100644 index 0000000..ca0dae6 --- /dev/null +++ b/src/CameraLimit.cpp @@ -0,0 +1,52 @@ +#include "CameraLimit.h" + +#include +#include +#include +#include +#include + +using namespace godot; + +void CameraLimit::_register_methods() +{ + register_method("_ready", &CameraLimit::_ready); +} + +CameraLimit::CameraLimit() +{ +} + +CameraLimit::~CameraLimit() +{ +} + +void CameraLimit::_init() +{ +} + +void CameraLimit::_ready() +{ + auto node = find_node("Middleground"); + auto middle_ground = cast_to(node); + if (middle_ground != NULL) + { + auto used_rect = middle_ground->get_used_rect(); + auto bounds = Vector2(used_rect.position.x + used_rect.size.x, used_rect.position.y + used_rect.size.y - 1); + node = get_tree()->get_root()->find_node("Camera2D", true, false); + auto camera = cast_to(node); + if (camera != NULL) + { + camera->set_limit(2, bounds.x * middle_ground->get_cell_size().x); + camera->set_limit(3, bounds.y * middle_ground->get_cell_size().y); + } + else + { + ERR_PRINT("Could not find Camera2D node!"); + } + } + else + { + ERR_PRINT("Could not find Middleground node!"); + } +} diff --git a/src/CameraLimit.h b/src/CameraLimit.h new file mode 100644 index 0000000..838d4b5 --- /dev/null +++ b/src/CameraLimit.h @@ -0,0 +1,48 @@ +#ifndef ALAI_CAMERA_LIMIT_H +#define ALAI_CAMERA_LIMIT_H + +#include +#include + +namespace godot +{ + class CameraLimit: public Node2D + { + GODOT_CLASS(CameraLimit, Node2D) + + public: + /** + * @brief This method registers classes with Godot. + * + * @details This method registers methods, properties, and signals with the Godot engine. + */ + static void _register_methods(); + + /** + * @brief Construct a new Camera Limit object. + * + */ + CameraLimit(); + + /** + * @brief Destroy the Camera Limit object. + * + */ + ~CameraLimit(); + + /** + * @brief Initialize the class from Godot. + * + * @details This method is called just once when the Godot engine connects to the instance of the class. + */ + void _init(); + + /** + * @brief Code to be run when ready. + * + * @details This method is run when all the children of this node are ready. + */ + void _ready(); + }; +} +#endif diff --git a/src/godot.cpp b/src/godot.cpp index 76e07ec..1c56d09 100644 --- a/src/godot.cpp +++ b/src/godot.cpp @@ -3,6 +3,7 @@ #include "state_machine/StateMachine.h" #include "state_machine/State.h" #include "Main.h" +#include "CameraLimit.h" #include "player/Player.h" #include "player/states/PlayerIdle.h" #include "player/states/PlayerMove.h" @@ -42,6 +43,7 @@ extern "C" void GDN_EXPORT godot_nativescript_init(void *handle) register_class(); register_class(); register_class(); + register_class(); register_class(); register_class(); register_class();