feat: TEST DAY TEST DAY TEST DAY

This commit is contained in:
Sara 2025-06-02 17:17:49 +02:00
parent 7af00521df
commit 9dca189fa5
38 changed files with 592 additions and 102 deletions

View file

@ -157,10 +157,10 @@
},
{
"a": 1,
"b": 0.293732,
"g": 0.558716,
"b": 0.317825,
"g": 0.449612,
"pos": 1,
"r": 0.683594
"r": 0.511719
}
],
"type": "Gradient"
@ -188,10 +188,10 @@
},
{
"a": 1,
"b": 0.238342,
"g": 0.431115,
"b": 0.194183,
"g": 0.320966,
"pos": 1,
"r": 0.554688
"r": 0.394531
}
],
"type": "Gradient"
@ -209,9 +209,9 @@
"parameters": {
"color": {
"a": 1,
"b": 0.148543,
"g": 0.40435,
"r": 0.513205,
"b": 0.098557,
"g": 0.200086,
"r": 0.243821,
"type": "Color"
}
},

View file

@ -246,8 +246,8 @@
"opacity": 0,
"rotate": 33.6,
"scale": 0,
"scale_x": 0.1,
"scale_y": 0.1,
"scale_x": 0.08,
"scale_y": 0.08,
"select_inputs": 0,
"variations": false
},
@ -363,15 +363,15 @@
"longdesc": "",
"name": "graph",
"node_position": {
"x": -1656.337646,
"y": 239.964798
"x": -1659.217529,
"y": 234.204788
},
"nodes": [
{
"name": "gradient",
"node_position": {
"x": -1348.702759,
"y": -153.089325
"x": -975.742798,
"y": -137.249329
},
"parameters": {
"gradient": {
@ -410,8 +410,8 @@
{
"name": "profile",
"node_position": {
"x": -1083.223633,
"y": -554.144897
"x": -1011.223633,
"y": -529.664917
},
"parameters": {
"gradient": {
@ -466,8 +466,8 @@
"generic_size": 1,
"name": "transform2",
"node_position": {
"x": -840.445862,
"y": -606.117126
"x": -755.48584,
"y": -525.477112
},
"parameters": {
"mode": 0,
@ -483,7 +483,7 @@
{
"name": "mirror_2",
"node_position": {
"x": -480.723633,
"x": -482.163635,
"y": -528.339417
},
"parameters": {
@ -527,8 +527,8 @@
{
"name": "gradient_2",
"node_position": {
"x": -1407.029297,
"y": -349.533844
"x": -1034.069336,
"y": -333.693848
},
"parameters": {
"gradient": {
@ -560,8 +560,8 @@
{
"name": "math_3",
"node_position": {
"x": -1096.695801,
"y": -304.339325
"x": -723.735779,
"y": -288.499329
},
"parameters": {
"clamp": true,
@ -575,8 +575,8 @@
{
"name": "mirror",
"node_position": {
"x": -867.75824,
"y": -317.321564
"x": -494.798187,
"y": -301.481567
},
"parameters": {
"direction": 0,
@ -652,8 +652,8 @@
{
"name": "colorize_2",
"node_position": {
"x": 768.980774,
"y": -574.599365
"x": 760.782471,
"y": -570.259094
},
"parameters": {
"gradient": {
@ -661,31 +661,24 @@
"points": [
{
"a": 0,
"b": 1,
"g": 1,
"pos": 0,
"r": 1
},
{
"a": 1,
"b": 1,
"g": 1,
"pos": 0.000001,
"r": 1
"b": 0,
"g": 0,
"pos": 0.016611,
"r": 0
},
{
"a": 1,
"b": 0.17453,
"g": 0.519531,
"pos": 0.028095,
"pos": 0.0299,
"r": 0.201483
},
{
"a": 1,
"b": 0.109985,
"g": 0.207031,
"pos": 0.821499,
"r": 0.163057
"b": 0,
"g": 0,
"pos": 0.851905,
"r": 0
}
],
"type": "Gradient"
@ -712,8 +705,8 @@
{
"name": "gen_outputs",
"node_position": {
"x": 1041.897461,
"y": -436.653137
"x": 1056.36499,
"y": -564.450195
},
"parameters": {
@ -749,8 +742,8 @@
{
"name": "math",
"node_position": {
"x": 721.161072,
"y": -414.326324
"x": 755.883301,
"y": -499.202881
},
"parameters": {
"clamp": true,

BIN
materials/vignette.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

77
materials/vignette.svg Normal file
View file

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="270.93332mm"
height="203.2mm"
viewBox="0 0 270.93332 203.2"
version="1.1"
id="svg1"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
sodipodi:docname="vignette.svg"
inkscape:export-filename="../project/ui/vignette.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.82182644"
inkscape:cx="450.82511"
inkscape:cy="483.07037"
inkscape:window-width="2540"
inkscape:window-height="1394"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs1">
<linearGradient
id="linearGradient1"
inkscape:collect="always">
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="0"
id="stop2" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1"
id="radialGradient2"
cx="135.05614"
cy="101.73478"
fx="135.05614"
fy="101.73478"
r="135.70003"
gradientTransform="matrix(0.83155397,0,0,0.74970345,22.74967,25.463864)"
gradientUnits="userSpaceOnUse" />
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:url(#radialGradient2);stroke:none;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round"
id="rect1"
width="271.40005"
height="203.46956"
x="-0.64389098"
y="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

33
modules/going/game_ui.cpp Normal file
View file

@ -0,0 +1,33 @@
#include "game_ui.h"
GameUI *GameUI::singleton_instance{nullptr};
void GameUI::_bind_methods() {
ClassDB::bind_method(D_METHOD("display_message", "text"), &self_type::display_message);
ClassDB::bind_static_method("GameUI", D_METHOD("get_singleton"), &self_type::get_singleton);
}
void GameUI::_notification(int what) {
if(Engine::get_singleton()->is_editor_hint()) {
return;
}
if(what == NOTIFICATION_ENTER_TREE) {
ERR_FAIL_COND_EDMSG(self_type::singleton_instance != nullptr, "GameUI instance already exists, deleting second instance");
self_type::singleton_instance = this;
} else if(what == NOTIFICATION_EXIT_TREE) {
self_type::singleton_instance = nullptr;
}
if(what == NOTIFICATION_READY) {
this->message = Object::cast_to<RichTextLabel>(this->get_node(NodePath("%MessageLabel")));
this->clear_message_timer = Object::cast_to<Timer>(this->get_node(NodePath("%ClearMessageTimer")));
}
}
GameUI *GameUI::get_singleton() {
return self_type::singleton_instance;
}
void GameUI::display_message(String text) {
this->message->set_text(text);
this->clear_message_timer->start(0.0);
}

22
modules/going/game_ui.h Normal file
View file

@ -0,0 +1,22 @@
#ifndef GAME_UI_H
#define GAME_UI_H
#include "core/string/ustring.h"
#include "scene/main/canvas_layer.h"
#include "scene/gui/rich_text_label.h"
#include "scene/main/timer.h"
class GameUI : public CanvasLayer {
GDCLASS(GameUI, CanvasLayer);
static void _bind_methods();
void _notification(int what);
static GameUI *singleton_instance;
public:
static GameUI *get_singleton();
void display_message(String text);
private:
RichTextLabel *message{nullptr};
Timer *clear_message_timer{nullptr};
};
#endif // !GAME_UI_H

View file

@ -28,6 +28,8 @@ void PlayerBody::_bind_methods() {
BIND_PROPERTY(Variant::VECTOR2, jump_impulse);
BIND_PROPERTY(Variant::FLOAT, model_lean);
BIND_PROPERTY(Variant::FLOAT, model_lean_speed);
BIND_PROPERTY(Variant::FLOAT, game_over_speed);
BIND_PROPERTY(Variant::BOOL, can_jump);
}
void PlayerBody::_notification(int what) {
@ -189,3 +191,19 @@ void PlayerBody::set_model_lean_speed(float value) {
float PlayerBody::get_model_lean_speed() const {
return this->model_lean_speed;
}
void PlayerBody::set_game_over_speed(float value) {
this->game_over_speed = value;
}
float PlayerBody::get_game_over_speed() const {
return this->game_over_speed;
}
void PlayerBody::set_can_jump(bool value) {
this->can_jump = value;
}
bool PlayerBody::get_can_jump() const {
return this->can_jump;
}

View file

@ -44,6 +44,10 @@ public:
float get_model_lean() const;
void set_model_lean_speed(float value);
float get_model_lean_speed() const;
void set_game_over_speed(float value);
float get_game_over_speed() const;
void set_can_jump(bool value);
bool get_can_jump() const;
private:
Vector2 movement{0.f, 0.f};
@ -65,6 +69,8 @@ private:
double max_delta_fov{100.f};
float model_lean{0.25f};
float model_lean_speed{0.25f};
double game_over_speed{1.0/4.0};
bool can_jump{false};
public:
static char *const split_step_action;
static char *const move_left_action;

View file

@ -3,6 +3,8 @@
#include "core/math/math_funcs.h"
#include "core/typedefs.h"
#include "going/player_body.h"
#include "scene/main/scene_tree.h"
#include "servers/rendering_server.h"
PlayerBody *PlayerState::get_body() const {
@ -21,6 +23,18 @@ PlayerState::StateID StandingState::get_next_state() const {
void StandingState::state_entered() {
this->get_body()->get_anim()->play("RESET", 0.1);
this->game_over_timer = 0.0;
}
void StandingState::process(double delta) {
this->game_over_timer += delta * this->get_body()->get_game_over_speed();
if(this->game_over_timer > 1.0) {
RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, 0.0);
SceneTree::get_singleton()->reload_current_scene();
} else {
RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, float(this->game_over_timer));
this->game_over_timer = MIN(this->game_over_timer, 1.f);
}
}
void StandingState::physics_process(double delta) {
@ -29,6 +43,10 @@ void StandingState::physics_process(double delta) {
this->get_body()->set_velocity(current.move_toward(Vector3(), speed_delta));
}
void StandingState::state_exited() {
RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, 0.0f);
}
PlayerState::StateID RunningState::get_next_state() const {
Vector3 const velocity{this->get_body()->get_velocity()};
Vector3 const desired{this->get_body()->get_desired_velocity()};
@ -47,7 +65,7 @@ void RunningState::state_entered() {
this->get_body()->get_anim()->play("run", 0.1);
}
void RunningState::process(double delta) {
void RunningState::process_lean(double delta) {
Vector3 const current{this->get_body()->get_velocity()};
if(!current.is_zero_approx()) {
Vector3 const cross{Vector3{0.f, 1.f, 0.f}.cross(current).normalized()};
@ -77,6 +95,7 @@ void RunningState::physics_process(double delta) {
)
};
this->get_body()->set_velocity(current.move_toward(desired, speed_delta) + Vector3{0.f, -0.01f, 0.f});
this->process_lean(delta);
}
void RunningState::state_exited() {
@ -91,7 +110,7 @@ void RunningState::state_exited() {
PlayerState::StateID SplitStepState::get_next_state() const {
if(!this->get_body()->is_on_floor()) {
return FallingState::get_class_static();
} else if(this->timer <= 0.0 && Input::get_singleton()->is_action_pressed("jump")) {
} else if(this->get_body()->get_can_jump() && this->jump && this->timer <= 0.0) {
return JumpingState::get_class_static();
} else if(this->timer <= 0.0) {
return RunningState::get_class_static();
@ -101,6 +120,7 @@ PlayerState::StateID SplitStepState::get_next_state() const {
}
void SplitStepState::state_entered() {
this->jump = false;
this->last_velocity = this->get_body()->get_velocity();
this->timer = this->get_body()->get_split_step_time();
this->get_body()->set_velocity(last_velocity.normalized() * this->get_body()->get_target_speed() * 0.75f);
@ -111,18 +131,22 @@ void SplitStepState::process(double delta) {
this->timer -= delta;
this->get_body()->set_velocity(this->get_body()->get_velocity()
.move_toward(Vector3(), this->get_body()->get_target_speed() / this->get_body()->get_split_step_stop_time() * delta));
this->jump |= Input::get_singleton()->is_action_pressed("jump");
}
void SplitStepState::state_exited() {
if(this->get_body()->is_on_floor()) {
Vector3 const desired_direction{this->get_body()->get_desired_direction()};
Vector3 desired_direction{0.f, 0.f, 0.f};
if(this->jump) {
desired_direction = Vector3{last_velocity.x, 0.f, last_velocity.z}.normalized();
} else if(this->get_body()->is_on_floor()) {
desired_direction = this->get_body()->get_desired_direction();
}
float const dot{this->last_velocity.normalized().dot(desired_direction)};
this->get_body()->set_velocity(dot > -0.8f
? desired_direction * MAX(last_velocity.length(), this->get_body()->get_step_boost())
: Vector3()
);
}
}
PlayerState::StateID FallingState::get_next_state() const {
if(this->get_body()->is_on_floor()) {
@ -133,13 +157,29 @@ PlayerState::StateID FallingState::get_next_state() const {
}
void FallingState::state_entered() {
this->game_over_timer = 0.0;
this->get_body()->get_anim()->play("falling", 0.1);
}
void FallingState::process(double delta) {
Vector3 const current{this->get_body()->get_velocity()};
Vector3 const flattened{current.x, 0.f, current.z};
this->get_body()->set_velocity((flattened - (flattened * 0.025f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
this->get_body()->set_velocity((flattened - (flattened * 0.015f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
if(this->can_game_over_falling) {
this->game_over_timer += delta * this->get_body()->get_game_over_speed();
if(this->game_over_timer > 1.0) {
RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, 0.0);
SceneTree::get_singleton()->reload_current_scene();
} else {
RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, float(this->game_over_timer));
this->game_over_timer = MIN(this->game_over_timer, 1.f);
}
}
}
void FallingState::state_exited() {
RenderingServer::get_singleton()->global_shader_parameter_set(this->game_over_param, 0.0);
this->can_game_over_falling = true;
}
PlayerState::StateID JumpingState::get_next_state() const {
@ -153,18 +193,17 @@ PlayerState::StateID JumpingState::get_next_state() const {
void JumpingState::state_entered() {
Vector3 const current{this->get_body()->get_velocity()};
Vector2 const impulse{this->get_body()->get_jump_impulse()};
float const force{(Vector2{current.x, current.z}.length() / this->get_body()->get_target_speed())};
this->get_body()->set_velocity( (
Vector3{current.x, impulse.y, current.z}
+ current.normalized() * impulse.x
) * force);
));
this->get_body()->get_anim()->play("jump");
}
void JumpingState::process(double delta) {
Vector3 const current{this->get_body()->get_velocity()};
Vector3 const flattened{current.x, 0.f, current.z};
this->get_body()->set_velocity((flattened - (flattened * 0.025f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
this->get_body()->set_velocity((flattened - (flattened * 0.015f)) + Vector3{0.f, current.y - float(9.8 * delta), 0.f});
}
void PlayerStateMachine::_bind_methods() {
@ -194,10 +233,10 @@ void PlayerStateMachine::ready() {
this->set_process(true);
this->set_physics_process(true);
this->body = Object::cast_to<PlayerBody>(this->get_parent());
this->add_state<FallingState>();
this->add_state<StandingState>();
this->add_state<RunningState>();
this->add_state<SplitStepState>();
this->add_state<FallingState>();
this->add_state<JumpingState>();
}

View file

@ -30,7 +30,12 @@ class StandingState : public PlayerState {
public:
virtual StateID get_next_state() const override;
virtual void state_entered() override;
virtual void process(double delta) override;
virtual void physics_process(double delta) override;
virtual void state_exited() override;
private:
double game_over_timer{0.0};
StringName game_over_param{"game_over_percentage"};
};
class RunningState : public PlayerState {
@ -38,7 +43,7 @@ class RunningState : public PlayerState {
public:
virtual StateID get_next_state() const override;
virtual void state_entered() override;
virtual void process(double delta) override;
void process_lean(double delta);
virtual void physics_process(double delta) override;
virtual void state_exited() override;
private:
@ -55,6 +60,7 @@ public:
private:
Vector3 last_velocity{0.f, 0.f, 0.f};
double timer{0.0};
bool jump{false};
};
class FallingState : public PlayerState {
@ -63,6 +69,11 @@ public:
virtual StateID get_next_state() const override;
virtual void state_entered() override;
virtual void process(double delta) override;
virtual void state_exited() override;
private:
bool can_game_over_falling{false};
double game_over_timer{0.0};
StringName game_over_param{"game_over_percentage"};
};
class JumpingState : public PlayerState {

View file

@ -1,6 +1,7 @@
#include "register_types.h"
#include "core/object/class_db.h"
#include "going/game_ui.h"
#include "going/player_body.h"
#include "going/player_states.h"
@ -16,6 +17,7 @@ void initialize_going_module(ModuleInitializationLevel p_level) {
ClassDB::register_class<FallingState>();
ClassDB::register_class<JumpingState>();
ClassDB::register_class<PlayerStateMachine>();
ClassDB::register_class<GameUI>();
}
void uninitialize_going_module(ModuleInitializationLevel p_level) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

View file

@ -0,0 +1,53 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://cdyr4yad84cp2"
path="res://.godot/imported/twirly.blend-fad795a9868d207b62ee28c2ea4b5e16.scn"
[deps]
source_file="res://models/pickups/twirly.blend"
dest_files=["res://.godot/imported/twirly.blend-fad795a9868d207b62ee28c2ea4b5e16.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 MiB

After

Width:  |  Height:  |  Size: 3.8 MiB

View file

@ -3,25 +3,26 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dg6wbdfd7t314"
path="res://.godot/imported/evertree_cutout_texture.png-50f94b21ecb859ae84e27208edce57e7.ctex"
path.s3tc="res://.godot/imported/evertree_cutout_texture.png-50f94b21ecb859ae84e27208edce57e7.s3tc.ctex"
metadata={
"vram_texture": false
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://models/props/evertree_cutout_texture.png"
dest_files=["res://.godot/imported/evertree_cutout_texture.png-50f94b21ecb859ae84e27208edce57e7.ctex"]
dest_files=["res://.godot/imported/evertree_cutout_texture.png-50f94b21ecb859ae84e27208edce57e7.s3tc.ctex"]
[params]
compress/mode=0
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@ -31,4 +32,4 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
detect_3d/compress_to=0

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 MiB

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

Binary file not shown.

View file

@ -1,7 +1,40 @@
[gd_scene load_steps=2 format=3 uid="uid://dp48t6earfkm4"]
[gd_scene load_steps=6 format=3 uid="uid://dp48t6earfkm4"]
[ext_resource type="PackedScene" uid="uid://cvu7bq8hur8yy" path="res://models/props/evergreen.blend" id="1_xfn5b"]
[ext_resource type="Texture2D" uid="uid://dg6wbdfd7t314" path="res://models/props/evertree_cutout_texture.png" id="2_1mi82"]
[sub_resource type="CylinderMesh" id="CylinderMesh_1mi82"]
top_radius = 0.0
bottom_radius = 10.626
height = 20.987
cap_top = false
[sub_resource type="QuadMesh" id="QuadMesh_plvfv"]
size = Vector2(34.74, 34.74)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bi1ef"]
transparency = 2
alpha_scissor_threshold = 0.709
alpha_antialiasing_mode = 0
shading_mode = 2
specular_mode = 1
albedo_texture = ExtResource("2_1mi82")
disable_receive_shadows = true
billboard_mode = 2
[node name="Evertre" type="Node3D"]
[node name="evergreen" parent="." instance=ExtResource("1_xfn5b")]
visibility_parent = NodePath("../cutout")
[node name="shadowmesh" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 23.702, 0)
cast_shadow = 3
visibility_range_begin = 99.0
mesh = SubResource("CylinderMesh_1mi82")
[node name="cutout" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 17.7955, 0)
visibility_range_begin = 100.0
mesh = SubResource("QuadMesh_plvfv")
surface_material_override/0 = SubResource("StandardMaterial3D_bi1ef")

View file

@ -1,6 +1,7 @@
[gd_scene load_steps=4 format=3 uid="uid://dcgsrdacswacl"]
[gd_scene load_steps=5 format=3 uid="uid://dcgsrdacswacl"]
[ext_resource type="PackedScene" uid="uid://cl7a4q5m73vlw" path="res://models/player/character.blend" id="1_eqqp1"]
[ext_resource type="PackedScene" uid="uid://dy4yl1paa8whs" path="res://ui/ui.tscn" id="2_ykyjo"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_bxedw"]
radius = 0.339355
@ -15,7 +16,7 @@ script/source = "extends Camera3D
func _ready():
self.top_level = true
func _process(_delta):
func _physics_process(_delta):
var target : Vector3 = get_parent().global_position + Vector3(0.0, pivot_height, 0.0)
var diff := self.global_position - target
if abs(diff).x + abs(diff.z) > 0.1:
@ -50,4 +51,6 @@ look_target_height = 1.5
[node name="character" parent="." instance=ExtResource("1_eqqp1")]
unique_name_in_owner = true
[node name="CanvasLayer" parent="." instance=ExtResource("2_ykyjo")]
[editable path="character"]

View file

@ -7,11 +7,13 @@
size = Vector2(34.7, 34.7)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_t4bw2"]
transparency = 1
transparency = 2
alpha_scissor_threshold = 0.724
alpha_antialiasing_mode = 0
shading_mode = 2
diffuse_mode = 1
specular_mode = 2
specular_mode = 1
albedo_texture = ExtResource("2_t4bw2")
disable_receive_shadows = true
billboard_mode = 2
[sub_resource type="SphereMesh" id="SphereMesh_t4bw2"]
@ -21,15 +23,17 @@ height = 22.768
[node name="Tree" type="Node3D"]
[node name="tree" parent="." instance=ExtResource("1_n3f34")]
visibility_parent = NodePath("../MeshInstance3D")
visibility_parent = NodePath("../cutout")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
[node name="cutout" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 17.1601, 0)
visibility_range_begin = 100.0
mesh = SubResource("QuadMesh_n3f34")
surface_material_override/0 = SubResource("StandardMaterial3D_t4bw2")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 22.6292, 0)
[node name="shadowmesh" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 23.4137, 0)
cast_shadow = 3
visibility_range_begin = 99.0
mesh = SubResource("SphereMesh_t4bw2")
skeleton = NodePath("../tree")

View file

@ -36,10 +36,10 @@ func process_ahead():
var target : Vector3 = player.global_position + last_velocity
target.y = self.global_position.y
var forward : Vector3 = player.velocity.normalized()
if player.global_position.distance_squared_to(self.global_position) < target_distance * target_distance or abs((player.global_position - global_position).dot(forward.cross(Vector3.UP))) < 0.25:
if player.global_position.distance_squared_to(self.global_position) < target_distance * target_distance or abs((player.global_position - global_position).dot(forward.cross(Vector3.UP))) <= 0.1:
self.velocity = Vector3()
return
if !forward.is_zero_approx():
if !forward.is_zero_approx() and false:
last_velocity = player.velocity
forward.y = 0.0
forward = forward.normalized()
@ -47,11 +47,12 @@ func process_ahead():
self.velocity = (target - self.global_position).normalized() * speed
func process_behind():
pass
var diff : Vector3 = player.global_position - global_position
var forward := diff.normalized()
var left := Vector3.UP.cross(forward)
self.velocity = forward + left * direction * min(10.0, diff.length())
self.look_at(Vector3(player.global_position.x, global_position.y, player.global_position.z))
# self.look_at(Vector3(player.global_position.x, global_position.y, player.global_position.z))
func _physics_process(_delta : float):
self.velocity += Vector3(0, -0.25, 0)
@ -59,17 +60,20 @@ func _physics_process(_delta : float):
"
[sub_resource type="SphereShape3D" id="SphereShape3D_j6w7d"]
radius = 1.83616
radius = 1.4143
[sub_resource type="BoxShape3D" id="BoxShape3D_j6w7d"]
size = Vector3(4.29688, 3.86325, 2.76758)
size = Vector3(5.79102, 3.86325, 2.76758)
[node name="WallEnemy" type="CharacterBody3D"]
collision_layer = 2
floor_snap_length = 10.0
script = SubResource("GDScript_j6w7d")
target_distance = 4.0
detect_distance = 20.0
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.83717, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.37512, 0)
shape = SubResource("SphereShape3D_j6w7d")
[node name="AnimatableBody3D" type="AnimatableBody3D" parent="."]

View file

@ -11,7 +11,7 @@ config_version=5
[application]
config/name="going"
run/main_scene="uid://sofv1apr4467"
run/main_scene="uid://cnau7sr4mu3gf"
config/features=PackedStringArray("4.4", "Forward Plus")
config/icon="res://icon.svg"
@ -19,6 +19,7 @@ config/icon="res://icon.svg"
window/size/viewport_width=1920
window/size/viewport_height=1080
window/size/mode=3
window/size/resizable=false
window/vsync/vsync_mode=0
@ -74,3 +75,10 @@ camera/depth_of_field/depth_of_field_bokeh_shape=0
anti_aliasing/quality/screen_space_aa=1
anti_aliasing/quality/use_debanding=true
occlusion_culling/use_occlusion_culling=true
[shader_globals]
game_over_percentage={
"type": "float",
"value": 0.0
}

View file

@ -0,0 +1,33 @@
[gd_scene load_steps=2 format=3 uid="uid://cnau7sr4mu3gf"]
[sub_resource type="GDScript" id="GDScript_vue75"]
script/source = "extends Button
func _on_button_up() -> void:
self.get_tree().change_scene_to_file(\"res://scenes/valley.tscn\")
"
[node name="MainMenu" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Button" type="Button" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 722.0
offset_top = 400.0
offset_right = -721.0
offset_bottom = -399.0
grow_horizontal = 2
grow_vertical = 2
theme_override_font_sizes/font_size = 200
text = "Start"
script = SubResource("GDScript_vue75")
[connection signal="button_up" from="Button" to="Button" method="_on_button_up"]

View file

@ -1,10 +1,11 @@
[gd_scene load_steps=9 format=3 uid="uid://sofv1apr4467"]
[gd_scene load_steps=12 format=3 uid="uid://sofv1apr4467"]
[ext_resource type="PackedScene" uid="uid://5cfl3xu1861l" path="res://models/terrains/level.blend" id="1_ch7jd"]
[ext_resource type="PackedScene" uid="uid://dcgsrdacswacl" path="res://objects/player.tscn" id="2_pvuhy"]
[ext_resource type="PackedScene" uid="uid://dqjurq1nq1fle" path="res://objects/tre.tscn" id="3_lj5yw"]
[ext_resource type="PackedScene" uid="uid://cdmksnsttot3j" path="res://objects/wall_enemy.tscn" id="4_kaqos"]
[ext_resource type="PackedScene" uid="uid://dp48t6earfkm4" path="res://objects/evertre.tscn" id="5_81e57"]
[ext_resource type="PackedScene" uid="uid://cdyr4yad84cp2" path="res://models/pickups/twirly.blend" id="6_a2vvy"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_pvuhy"]
sky_top_color = Color(0.0825, 0.277292, 0.55, 1)
@ -23,13 +24,52 @@ ambient_light_source = 3
ssao_radius = 16.0
glow_enabled = true
[sub_resource type="GDScript" id="GDScript_a2vvy"]
script/source = "extends Area3D
func _on_body_entered(body: Node3D) -> void:
if body.is_class(\"PlayerBody\"):
body.set_can_jump(true)
queue_free()
GameUI.get_singleton().display_message(\"Jump by pressing F during a split-step\")
func _process(delta):
$twirly.rotate_y(delta * 2.0)
"
[sub_resource type="SphereShape3D" id="SphereShape3D_a2vvy"]
radius = 1.61546
[node name="Valley" type="Node3D"]
[node name="Player" parent="." instance=ExtResource("2_pvuhy")]
transform = Transform3D(0.999996, 0, -0.0030368, 0, 1, 0, 0.0030368, 0, 0.999996, 4.19603, 31.6645, -39.4833)
transform = Transform3D(0.999996, 0, -0.0030368, 0, 1, 0, 0.0030368, 0, 0.999996, 31.3342, 31.6645, -39.9581)
[node name="WallEnemy" parent="." instance=ExtResource("4_kaqos")]
transform = Transform3D(-0.0472111, 0, -0.998885, 0, 1, 0, 0.998885, 0, -0.0472111, -33.2398, -0.00426483, 142.026)
transform = Transform3D(-0.38249, 0, -0.923959, 0, 1, 0, 0.923959, 0, -0.38249, 135.071, -6.37696, 263.993)
[node name="WallEnemy3" parent="." instance=ExtResource("4_kaqos")]
transform = Transform3D(0.999926, 0, 0.0121468, 0, 1, 0, -0.0121468, 0, 0.999926, 168.538, -6.37696, 215.507)
[node name="WallEnemy2" parent="." instance=ExtResource("4_kaqos")]
transform = Transform3D(-0.991635, 0, 0.129073, 0, 1, 0, -0.129073, 0, -0.991635, 229.483, -6.38962, 232.319)
speed = 4.0
[node name="Label3D" type="Label3D" parent="WallEnemy2"]
transform = Transform3D(0.994593, -0.103851, 0, -4.53949e-09, -4.3475e-08, 1, -0.103851, -0.994593, -4.37114e-08, 231.324, 6.54938, 243.387)
pixel_size = 0.08
text = " [W]
A S D"
[node name="Label3D2" type="Label3D" parent="WallEnemy2"]
transform = Transform3D(0.965926, 0, 0.258819, 0, 1, 0, -0.258819, 0, 0.965926, 228.424, 8.2929, 214.064)
pixel_size = 0.025
text = "[Space] [D]"
[node name="Label3D3" type="Label3D" parent="WallEnemy2"]
transform = Transform3D(-2.98023e-08, 0, -1, 0, 1, 0, 1, 0, -2.98023e-08, 260.364, 8.2929, 215.45)
pixel_size = 0.025
text = "[Space] [A]"
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_lj5yw")
@ -82,10 +122,10 @@ transform = Transform3D(-0.583853, 0, 0.811859, 0, 1, 0, -0.811859, 0, -0.583853
transform = Transform3D(-0.806857, 0, 0.590747, 0, 1, 0, -0.590747, 0, -0.806857, 12.0918, 0.326586, 19.9047)
[node name="Node3D17" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.729256, 0, -0.684242, 0, 1, 0, 0.684242, 0, -0.729256, 25.3264, 0.0781007, 1.97371)
transform = Transform3D(-0.729256, 0, -0.684242, 0, 1, 0, 0.684242, 0, -0.729256, 25.1658, -0.570518, 3.70682)
[node name="Node3D19" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.63905, 0, -0.769166, 0, 1, 0, 0.769166, 0, -0.63905, 36.3753, 0.295401, 4.2828)
transform = Transform3D(-0.63905, 0, -0.769166, 0, 1, 0, 0.769166, 0, -0.63905, 35.7514, -0.40734, 5.82252)
[node name="Node3D21" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(0.87511, -1.61731e-08, 0.483924, -2.43482e-08, 1, 7.74511e-08, -0.483924, -7.95609e-08, 0.87511, 17.2233, 0.574241, 11.9056)
@ -349,7 +389,7 @@ transform = Transform3D(0.925203, -7.60956e-08, 0.379472, 3.51579e-08, 1, 1.1481
transform = Transform3D(0.395593, 9.15362e-08, -0.918426, 3.51579e-08, 1, 1.14811e-07, 0.918426, -7.77082e-08, 0.395593, -11.1774, -0.230842, 39.2564)
[node name="Node3D105" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.199709, -1.05476e-07, 0.979855, 3.51579e-08, 1, 1.14811e-07, -0.979855, 5.73785e-08, -0.199709, 3.23367, -0.230842, 53.8158)
transform = Transform3D(-0.199709, -1.05476e-07, 0.979855, 3.51579e-08, 1, 1.14811e-07, -0.979855, 5.73785e-08, -0.199709, 3.21507, -0.298522, 43.3237)
[node name="Node3D58" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.573291, -7.39146e-08, 0.819353, 3.51579e-08, 1, 1.14811e-07, -0.819353, 9.46265e-08, -0.573291, 41.0137, 1.1686, 34.4092)
@ -777,9 +817,6 @@ transform = Transform3D(-0.954802, 0, 0.297242, 0, 1, 0, -0.297242, 0, -0.954802
[node name="Node3D225" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.954802, 0, 0.297242, 0, 1, 0, -0.297242, 0, -0.954802, -49.3032, 12.6146, 184.871)
[node name="Node3D226" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.954802, 0, 0.297242, 0, 1, 0, -0.297242, 0, -0.954802, -48.3955, 11.2669, 178.045)
[node name="Node3D227" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.954802, 0, 0.297242, 0, 1, 0, -0.297242, 0, -0.954802, -47.6151, 8.45536, 169.048)
@ -846,9 +883,6 @@ transform = Transform3D(-0.999984, 0, -0.00563782, 0, 1, 0, 0.00563782, 0, -0.99
[node name="Node3D211" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.890832, 0, -0.454333, 0, 1, 0, 0.454333, 0, -0.890832, -39.1819, 13.7524, 202.259)
[node name="Node3D212" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -40.8661, 4.56589, 159.345)
[node name="Node3D213" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -46.8773, 3.83218, 159.091)
@ -864,9 +898,6 @@ transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225,
[node name="Node3D217" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -13.0376, 6.92232, 157.9)
[node name="Node3D218" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -23.1474, 6.80598, 161.031)
[node name="Node3D220" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -22.0954, 10.289, 171.149)
@ -877,7 +908,7 @@ transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225,
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, -1.87738, 7.83628, 154.856)
[node name="Node3D223" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, 4.71963, 11.8309, 165.954)
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, 5.2084, 11.3779, 162.47)
[node name="Node3D224" parent="level" instance=ExtResource("3_lj5yw")]
transform = Transform3D(-0.50225, 0, 0.864722, 0, 1, 0, -0.864722, 0, -0.50225, 24.9724, 13.0452, 151.413)
@ -1036,3 +1067,29 @@ shadow_opacity = 0.74
shadow_blur = 0.973
directional_shadow_blend_splits = true
directional_shadow_max_distance = 1063.4
[node name="Tree" parent="." instance=ExtResource("3_lj5yw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 269.46, 0.341235, 236.781)
[node name="Area3D" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 259.242, 1.93115, 234.094)
script = SubResource("GDScript_a2vvy")
[node name="twirly" parent="Area3D" instance=ExtResource("6_a2vvy")]
[node name="OmniLight3D" type="OmniLight3D" parent="Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.503185, 0)
light_color = Color(0.880355, 0.555272, 0, 1)
light_energy = 8.133
omni_range = 3.15575
[node name="OmniLight3D2" type="OmniLight3D" parent="Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.00915, 0)
light_color = Color(0.880355, 0.555272, 0, 1)
light_energy = 8.133
omni_range = 3.15575
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
shape = SubResource("SphereShape3D_a2vvy")
[connection signal="body_entered" from="Area3D" to="Area3D" method="_on_body_entered"]

59
project/ui/ui.tscn Normal file
View file

@ -0,0 +1,59 @@
[gd_scene load_steps=4 format=3 uid="uid://dy4yl1paa8whs"]
[ext_resource type="Texture2D" uid="uid://bglfaie21avpt" path="res://ui/vignette.png" id="1_nb4k0"]
[sub_resource type="Shader" id="Shader_ykyjo"]
code = "shader_type canvas_item;
global uniform float game_over_percentage = 0.0;
void vertex() {
// Called for every vertex the material is visible on.
}
void fragment() {
COLOR.r = COLOR.g = COLOR.b = 0.0;
COLOR.a = clamp(COLOR.a + game_over_percentage * 2.0 - 1.0, 0.0, 1.0);
}
//void light() {
// // Called for every pixel for every light affecting the CanvasItem.
// // Uncomment to replace the default light processing function with this one.
//}
"
[sub_resource type="ShaderMaterial" id="ShaderMaterial_uxov2"]
shader = SubResource("Shader_ykyjo")
[node name="CanvasLayer" type="GameUI"]
[node name="Vignette" type="TextureRect" parent="."]
material = SubResource("ShaderMaterial_uxov2")
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
texture = ExtResource("1_nb4k0")
expand_mode = 2
[node name="MessageLabel" type="RichTextLabel" parent="."]
unique_name_in_owner = true
anchors_preset = 10
anchor_right = 1.0
offset_bottom = 195.0
grow_horizontal = 2
theme_override_font_sizes/normal_font_size = 60
text = "Good Luck!"
horizontal_alignment = 1
vertical_alignment = 1
[node name="ClearMessageTimer" type="Timer" parent="MessageLabel"]
unique_name_in_owner = true
wait_time = 5.0
one_shot = true
autostart = true
ignore_time_scale = true
[connection signal="timeout" from="MessageLabel/ClearMessageTimer" to="MessageLabel" method="set_text" flags=3 binds= [""]]

BIN
project/ui/vignette.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bglfaie21avpt"
path="res://.godot/imported/vignette.png-fcc9b969d140e62ae5a80701deb118ec.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui/vignette.png"
dest_files=["res://.godot/imported/vignette.png-fcc9b969d140e62ae5a80701deb118ec.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1