feat: implemented pinboard mechanic

This commit is contained in:
Sara Gerretsen 2025-10-30 16:26:27 +01:00
parent ac70e60dc2
commit de854910ee
7 changed files with 147 additions and 4 deletions

View file

@ -1,4 +1,5 @@
#include "pinboard.h"
#include "core/config/engine.h"
#include "pinned_photo.h"
void Pinboard::_bind_methods() {
@ -6,9 +7,30 @@ void Pinboard::_bind_methods() {
void Pinboard::enter_tree() {
connect("body_entered", callable_mp(this, &self_type::on_body_entered));
connect("body_exited", callable_mp(this, &self_type::on_body_exited));
}
void Pinboard::on_body_entered(Node2D *node) {
if (PinnedPhoto * photo{ cast_to<PinnedPhoto>(node) }) {
photo->set_can_drop(true);
}
}
void Pinboard::on_body_exited(Node2D *node) {
if (PinnedPhoto * photo{ cast_to<PinnedPhoto>(node) }) {
photo->set_can_drop(false);
}
}
void Pinboard::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_ENTER_TREE:
enter_tree();
return;
}
}

View file

@ -7,6 +7,7 @@ class Pinboard : public Area2D {
static void _bind_methods();
void enter_tree();
void on_body_entered(Node2D *node);
void on_body_exited(Node2D *node);
protected:
void _notification(int what);

View file

@ -1,8 +1,56 @@
#include "pinned_photo.h"
#include "core/config/engine.h"
#include "core/input/input_event.h"
#include "macros.h"
void PinnedPhoto::_bind_methods() {
BIND_PROPERTY(Variant::BOOL, can_drop);
BIND_HPROPERTY(Variant::INT, clue, PROPERTY_HINT_ENUM, NetworkData::ClueID_hint());
}
void PinnedPhoto::enter_tree() {
connect("input_event", callable_mp(this, &self_type::on_input_event));
}
void PinnedPhoto::process(double delta) {
if (this->is_held) {
set_global_position(get_global_mouse_position());
}
}
void PinnedPhoto::on_input_event(Viewport *viewport, Ref<InputEvent> event, int shape) {
Ref<InputEventMouseButton> button{ event };
if (button.is_valid() && button->is_pressed()) {
this->is_held = true;
viewport->set_input_as_handled();
}
}
void PinnedPhoto::unhandled_input(Ref<InputEvent> const &event) {
Ref<InputEventMouseButton> button{ event };
if (button.is_valid() && this->can_drop && button->is_released()) {
this->is_held = false;
get_viewport()->set_input_as_handled();
}
}
void PinnedPhoto::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_ENTER_TREE:
set_process(true);
set_pickable(true);
set_process_unhandled_input(true);
enter_tree();
return;
case NOTIFICATION_PROCESS:
process(get_process_delta_time());
return;
}
}
void PinnedPhoto::set_can_drop(bool value) {
@ -12,3 +60,11 @@ void PinnedPhoto::set_can_drop(bool value) {
bool PinnedPhoto::get_can_drop() const {
return this->can_drop;
}
void PinnedPhoto::set_clue(NetworkData::ClueID id) {
this->clue = id;
}
NetworkData::ClueID PinnedPhoto::get_clue() const {
return this->clue;
}

View file

@ -1,15 +1,29 @@
#pragma once
#include "core/input/input_event.h"
#include "scene/2d/physics/animatable_body_2d.h"
#include "scene/main/viewport.h"
#include "ydi_networking.h"
class PinnedPhoto : public AnimatableBody2D {
GDCLASS(PinnedPhoto, AnimatableBody2D);
static void _bind_methods();
void enter_tree();
void process(double delta);
void on_input_event(Viewport *viewport, Ref<InputEvent> event, int shape);
protected:
virtual void unhandled_input(Ref<InputEvent> const &event) override;
void _notification(int what);
public:
void set_can_drop(bool value);
bool get_can_drop() const;
void set_clue(NetworkData::ClueID id);
NetworkData::ClueID get_clue() const;
private:
NetworkData::ClueID clue{ NetworkData::CLUE_MAX };
bool can_drop{ false };
bool is_held{ false };
};

View file

@ -5,6 +5,8 @@
#include "you_done_it/clue_data.h"
#include "you_done_it/clue_finder.h"
#include "you_done_it/clue_marker.h"
#include "you_done_it/pinboard.h"
#include "you_done_it/pinned_photo.h"
#include "you_done_it/server_node.h"
#include "you_done_it/ydi_networking.h"
#include "you_done_it/ydi_vr_origin.h"
@ -21,6 +23,8 @@ void initialize_you_done_it_module(ModuleInitializationLevel p_level) {
ClassDB::register_class<ClueFinder>();
ClassDB::register_class<ClueData>();
ClassDB::register_class<ClueDB>();
ClassDB::register_class<Pinboard>();
ClassDB::register_class<PinnedPhoto>();
}
void uninitialize_you_done_it_module(ModuleInitializationLevel p_level) {