feat: TEST DAY TEST DAY TEST DAY
|
@ -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"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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
After Width: | Height: | Size: 70 KiB |
77
materials/vignette.svg
Normal 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
|
@ -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
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,17 +131,21 @@ 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()};
|
||||
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()
|
||||
);
|
||||
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 {
|
||||
|
@ -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>();
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.4 MiB |
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 2.6 MiB |
BIN
project/models/pickups/twirly.blend
Normal file
53
project/models/pickups/twirly.blend.import
Normal 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
|
BIN
project/models/pickups/twirly.blend1
Normal file
Before Width: | Height: | Size: 3.6 MiB After Width: | Height: | Size: 3.8 MiB |
|
@ -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
|
||||
|
|
Before Width: | Height: | Size: 3.9 MiB After Width: | Height: | Size: 3.4 MiB |
|
@ -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")
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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="."]
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
33
project/scenes/main_menu.tscn
Normal 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"]
|
|
@ -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
|
@ -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
After Width: | Height: | Size: 80 KiB |
34
project/ui/vignette.png.import
Normal 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
|