Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bf94d62472 | ||
|
|
95d97d9001 |
25
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,7 +1,24 @@
|
|||||||
<!--
|
<!--
|
||||||
Please target the `master` branch in priority.
|
Only submit a pull request if all of the following conditions are met:
|
||||||
PRs can target `3.x` if the same change was done in `master`, or is not relevant there.
|
|
||||||
|
|
||||||
Relevant fixes are cherry-picked for stable branches as needed by maintainers.
|
* It must work with the latest stable Godot version. Do not submit a
|
||||||
You can mention in the description if the change is compatible with `3.x`.
|
pull request if it only works with alpha/beta builds.
|
||||||
|
|
||||||
|
* It must follow all of the Godot style guides, including the GDScript
|
||||||
|
style guide and the C# style guide.
|
||||||
|
|
||||||
|
* The demo should not be overcomplicated. Simplicity is usually preferred.
|
||||||
|
|
||||||
|
* If you are submitting a new demo, please ensure that it includes a
|
||||||
|
README file similar to the other demos.
|
||||||
|
|
||||||
|
* If you are submitting a copy of a demo translated to C# etc:
|
||||||
|
|
||||||
|
* Please ensure that there is a good reason to have this demo translated.
|
||||||
|
We don't want to have multiple copies of every single project.
|
||||||
|
|
||||||
|
* Please ensure that the code mirrors the original closely.
|
||||||
|
|
||||||
|
* In the project.godot file and in the README, include "with C#" etc in
|
||||||
|
the title, and also include a link to the original in the README.
|
||||||
-->
|
-->
|
||||||
|
|||||||
32
.github/dist/export_presets.cfg
vendored
@@ -1,41 +1,23 @@
|
|||||||
[preset.0]
|
[preset.0]
|
||||||
|
|
||||||
name="Web"
|
name="HTML5"
|
||||||
platform="Web"
|
platform="HTML5"
|
||||||
runnable=true
|
runnable=true
|
||||||
advanced_options=false
|
|
||||||
dedicated_server=false
|
|
||||||
custom_features=""
|
custom_features=""
|
||||||
export_filter="all_resources"
|
export_filter="all_resources"
|
||||||
include_filter=""
|
include_filter=""
|
||||||
exclude_filter=""
|
exclude_filter=""
|
||||||
export_path=""
|
export_path=""
|
||||||
encryption_include_filters=""
|
script_export_mode=1
|
||||||
encryption_exclude_filters=""
|
script_encryption_key=""
|
||||||
encrypt_pck=false
|
|
||||||
encrypt_directory=false
|
|
||||||
script_export_mode=2
|
|
||||||
|
|
||||||
[preset.0.options]
|
[preset.0.options]
|
||||||
|
|
||||||
custom_template/debug=""
|
custom_template/debug=""
|
||||||
custom_template/release=""
|
custom_template/release=""
|
||||||
variant/extensions_support=false
|
variant/export_type=0
|
||||||
variant/thread_support=true
|
|
||||||
vram_texture_compression/for_desktop=true
|
vram_texture_compression/for_desktop=true
|
||||||
vram_texture_compression/for_mobile=true
|
vram_texture_compression/for_mobile=false
|
||||||
html/export_icon=true
|
|
||||||
html/custom_html_shell=""
|
html/custom_html_shell=""
|
||||||
html/head_include=""
|
html/head_include=""
|
||||||
html/canvas_resize_policy=2
|
html/full_window_size=true
|
||||||
html/focus_canvas_on_start=true
|
|
||||||
html/experimental_virtual_keyboard=true
|
|
||||||
progressive_web_app/enabled=true
|
|
||||||
progressive_web_app/ensure_cross_origin_isolation_headers=true
|
|
||||||
progressive_web_app/offline_page=""
|
|
||||||
progressive_web_app/display=0
|
|
||||||
progressive_web_app/orientation=1
|
|
||||||
progressive_web_app/icon_144x144=""
|
|
||||||
progressive_web_app/icon_180x180=""
|
|
||||||
progressive_web_app/icon_512x512=""
|
|
||||||
progressive_web_app/background_color=Color(0, 0, 0, 1)
|
|
||||||
|
|||||||
45
.github/dist/footer.html
vendored
@@ -1,38 +1,19 @@
|
|||||||
<!-- The list of demos will be inserted above by the CI process. -->
|
<!-- The list of demos will be inserted above by the CI process. -->
|
||||||
</ul>
|
</ul>
|
||||||
<h2>Unavailable demos</h2>
|
<h2>Unavailable demos</h2>
|
||||||
<ul class="unsupported-demos">
|
<ul>
|
||||||
<li><code>2d/glow</code>: Not supported on the Compatibility rendering method (which the web platform always uses).</li>
|
<li><code>2d/hdr/</code>: Not supported on HTML5 yet.
|
||||||
<li><code>2d/navigation_mesh_chunks</code>: Relies on debug-only drawing functionality which is not available in projects exported in release mode.</li>
|
<li><code>3d/voxel/</code>: Not supported on HTML5 yet.
|
||||||
<li><code>2d/physics_tests</code>: Relies on debug-only drawing functionality which is not available in projects exported in release mode.</li>
|
<li><code>audio/device_changer/</code>: Not supported on HTML5 due to browser limitations.
|
||||||
<li><code>3d/labels_and_texts</code>: Does not export in headless mode due to an engine bug (font importing infinite loop).</li>
|
<li><code>loading/background_load/</code>: Not supported on HTML5 yet.
|
||||||
<li><code>3d/decals</code>: Not supported on the Compatibility rendering method (which the web platform always uses).</li>
|
<li><code>loading/multiple_threads_loading/</code>: Not supported on HTML5 yet.
|
||||||
<li><code>3d/ik</code>: Demo is not fully ported to Godot 4 yet (even though the feature works on the web).</li>
|
<li><code>loading/threads/</code>: Not supported on HTML5 yet.
|
||||||
<li><code>3d/navigation_mesh_chunks</code>: Relies on debug-only drawing functionality which is not available in projects exported in release mode.</li>
|
<li><code>misc/matrix_transform/</code>: Results are only visible in the editor.
|
||||||
<li><code>3d/occlusion_culling_mesh_lod</code>: Occlusion culling is disabled by default in web builds to decrease binary size.</li>
|
<li><code>mobile/android_iap/</code>: Only relevant on native Android.
|
||||||
<li><code>3d/particles</code>: Demo mostly showcases features that are not available in Compatibility (which the web platform always uses).</li>
|
<li><code>mobile/sensors/</code>: Not supported on HTML5 yet.
|
||||||
<li><code>3d/physical_light_camera_units</code>: Demo is not tuned for the Compatibility rendering method (which the web platform always uses).</li>
|
<li><code>mono/*/</code>: Not available yet (requires Mono-enabled HTML5 build).</li>
|
||||||
<li><code>3d/physics_tests</code>: Relies on debug-only drawing functionality which is not available in projects exported in release mode.</li>
|
<li><code>networking/*/</code>: Doesn't make sense to be hosted on a static host, as the server must be hosted on the same origin due to the browser's same-origin policy.</li>
|
||||||
<li><code>3d/variable_rate_shading</code>: Not supported on the Compatibility rendering method (which the web platform always uses)</li>
|
<li><code>plugins/*/</code>: Only effective within the editor.</li>
|
||||||
<li><code>3d/volumetric_fog</code>: Not supported on the Compatibility rendering method (which the web platform always uses)</li>
|
|
||||||
<li><code>3d/voxel</code>: Freezes after a few seconds of gameplay due to web platform-specific threading issues.</li>
|
|
||||||
<li><code>audio/bpm_sync</code>: Not functional on the web platform due to differences in the audio playback implementation.</li>
|
|
||||||
<li><code>audio/device_changer</code>: Not relevant for the web platform, as the web browser always chooses the audio output device.</li>
|
|
||||||
<li><code>audio/midi_piano</code>: Not functional on the web platform due to differences in the audio playback implementation.</li>
|
|
||||||
<li><code>audio/spectrum</code>: Not functional on the web platform due to differences in the audio playback implementation.</li>
|
|
||||||
<li><code>compute/*</code>: Not supported on the Compatibility rendering method (which the web platform always uses).</li>
|
|
||||||
<li><code>gui/msdf_font</code>: Does not export in headless mode due to an engine bug (font importing crashes).</li>
|
|
||||||
<li><code>gui/translation</code>: Does not export in headless mode due to an engine bug (font importing crashes).</li>
|
|
||||||
<li><code>loading/runtime_save_load</code>: Native filesystem access is not available on the web platform.</li>
|
|
||||||
<li><code>misc/compute_shader_heightmap</code>: Not supported on the Compatibility rendering method (which the web platform always uses).</li>
|
|
||||||
<li><code>misc/large_world_coordinates</code>: Not supported on the Compatibility rendering method (which the web platform always uses).</li>
|
|
||||||
<li><code>misc/matrix_transform</code>: Results are only visible in the editor.</li>
|
|
||||||
<li><code>mobile/android_iap</code>: Only relevant on native Android.</li>
|
|
||||||
<li><code>mobile/sensors</code>: Not supported on the web platform.</li>
|
|
||||||
<li><code>mono/*</code>: Not available yet (requires Mono-enabled HTML5 build).</li>
|
|
||||||
<li><code>networking/*</code>: Doesn't make sense to be hosted on a static host, as the server must be hosted on the same origin due to the browser's same-origin policy.</li>
|
|
||||||
<li><code>plugins/*</code>: Only effective within the editor.</li>
|
|
||||||
<li><code>xr/*</code>: Not functional on the web platform, as these demos are not designed for WebXR.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
22
.github/dist/header.html
vendored
@@ -4,15 +4,13 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Official Godot demos exported to Web</title>
|
<title>Godot demos exported to HTML5</title>
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
--background-color: #fff;
|
--background-color: #fff;
|
||||||
--text-color: #222;
|
--text-color: #222;
|
||||||
--link-color: hsl(220, 100%, 45%);
|
--link-color: hsl(220, 100%, 45%);
|
||||||
--link-visited-color: hsl(270, 100%, 55%);
|
|
||||||
--link-underline-color: hsla(220, 100%, 45%, 0.3);
|
--link-underline-color: hsla(220, 100%, 45%, 0.3);
|
||||||
--link-underline-visited-color: hsla(270, 100%, 45%, 0.3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
@@ -20,9 +18,7 @@
|
|||||||
--background-color: #222;
|
--background-color: #222;
|
||||||
--text-color: #eee;
|
--text-color: #eee;
|
||||||
--link-color: hsl(200, 100%, 70%);
|
--link-color: hsl(200, 100%, 70%);
|
||||||
--link-visited-color: hsl(250, 100%, 80%);
|
|
||||||
--link-underline-color: hsla(200, 100%, 70%, 0.3);
|
--link-underline-color: hsla(200, 100%, 70%, 0.3);
|
||||||
--link-underline-visited-color: hsla(250, 100%, 70%, 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,11 +52,6 @@
|
|||||||
text-decoration-thickness: 0.125rem;
|
text-decoration-thickness: 0.125rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:visited {
|
|
||||||
color: var(--link-visited-color);
|
|
||||||
text-decoration-color: var(--link-visited-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
a:hover {
|
||||||
filter: brightness(117.5%);
|
filter: brightness(117.5%);
|
||||||
}
|
}
|
||||||
@@ -97,9 +88,6 @@
|
|||||||
margin: 20px 10px;
|
margin: 20px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.unsupported-demos li {
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@@ -108,12 +96,12 @@
|
|||||||
<p>
|
<p>
|
||||||
This page lists
|
This page lists
|
||||||
<a href="https://github.com/godotengine/godot-demo-projects">official Godot demo projects</a>
|
<a href="https://github.com/godotengine/godot-demo-projects">official Godot demo projects</a>
|
||||||
exported to the web for testing purposes. These projects are deployed automatically
|
exported to HTML5 for testing purposes. These projects are deployed automatically
|
||||||
on every commit on the <code>master</code> branch of the repository.
|
on every commit on the <code>master</code> branch of the repository.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The web exports on this page are provided for demonstration purposes only.
|
The HTML5 exports on this page are provided for demonstration purposes only.
|
||||||
Some of these demos may not function or render correctly on the web platform,
|
Some of these demos may not function or render correctly on HTML5,
|
||||||
especially on mobile devices.
|
especially on mobile devices.
|
||||||
For best performance, it's recommended to
|
For best performance, it's recommended to
|
||||||
<a href="https://godotengine.org/download">download</a> a native editor
|
<a href="https://godotengine.org/download">download</a> a native editor
|
||||||
@@ -122,7 +110,7 @@
|
|||||||
<p>
|
<p>
|
||||||
See the
|
See the
|
||||||
<a href="https://docs.godotengine.org/en/stable/getting_started/workflow/export/exporting_for_web.html">Exporting for the Web</a>
|
<a href="https://docs.godotengine.org/en/stable/getting_started/workflow/export/exporting_for_web.html">Exporting for the Web</a>
|
||||||
documentation for information on exporting your own projects to the web.
|
documentation for information on exporting your own projects to HTML5.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>List of demos</h2>
|
<h2>List of demos</h2>
|
||||||
|
|||||||
4
.gitignore
vendored
@@ -20,7 +20,3 @@ mono_crash.*.json
|
|||||||
.directory
|
.directory
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*~
|
*~
|
||||||
*.blend1
|
|
||||||
|
|
||||||
# Jetbrains IDE files
|
|
||||||
.idea/
|
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
These demos are all 2D, but otherwise do not have a common theme.
|
These demos are all 2D, but otherwise do not have a common theme.
|
||||||
|
|
||||||
Languages: Most have GDScript, some have
|
Languages: Most have GDScript, some have
|
||||||
[Godot shader language](https://docs.godotengine.org/en/latest/tutorials/shaders/shader_reference/shading_language.html)
|
[GDSL](https://docs.godotengine.org/en/latest/tutorials/shaders/shader_reference/shading_language.html)
|
||||||
|
|
||||||
Renderers: Glow for 2D and Physics Platformer use Forward+, 2D Particles uses Mobile, and the rest use Compatibility
|
Renderers: 6 of them are GLES 3, but most are GLES 2
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ in the documentation for more information.
|
|||||||
|
|
||||||
Language: GDScript
|
Language: GDScript
|
||||||
|
|
||||||
Renderer: Compatibility
|
Renderer: GLES 2
|
||||||
|
|
||||||
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/2711
|
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/887
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://bcoiuym4nw1ua"
|
path="res://.import/bullet.png-ff1424653e10246c11e3724e402c519e.stex"
|
||||||
path="res://.godot/imported/bullet.png-ff1424653e10246c11e3724e402c519e.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://bullet.png"
|
source_file="res://bullet.png"
|
||||||
dest_files=["res://.godot/imported/bullet.png-ff1424653e10246c11e3724e402c519e.ctex"]
|
dest_files=[ "res://.import/bullet.png-ff1424653e10246c11e3724e402c519e.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=true
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -8,81 +8,86 @@ const BULLET_COUNT = 500
|
|||||||
const SPEED_MIN = 20
|
const SPEED_MIN = 20
|
||||||
const SPEED_MAX = 80
|
const SPEED_MAX = 80
|
||||||
|
|
||||||
const bullet_image := preload("res://bullet.png")
|
const bullet_image = preload("res://bullet.png")
|
||||||
|
|
||||||
var bullets := []
|
var bullets = []
|
||||||
var shape := RID()
|
var shape
|
||||||
|
|
||||||
|
|
||||||
class Bullet:
|
class Bullet:
|
||||||
var position := Vector2()
|
var position = Vector2()
|
||||||
var speed := 1.0
|
var speed = 1.0
|
||||||
# The body is stored as a RID, which is an "opaque" way to access resources.
|
# The body is stored as a RID, which is an "opaque" way to access resources.
|
||||||
# With large amounts of objects (thousands or more), it can be significantly
|
# With large amounts of objects (thousands or more), it can be significantly
|
||||||
# faster to use RIDs compared to a high-level approach.
|
# faster to use RIDs compared to a high-level approach.
|
||||||
var body := RID()
|
var body = RID()
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready():
|
||||||
shape = PhysicsServer2D.circle_shape_create()
|
randomize()
|
||||||
|
|
||||||
|
shape = Physics2DServer.circle_shape_create()
|
||||||
# Set the collision shape's radius for each bullet in pixels.
|
# Set the collision shape's radius for each bullet in pixels.
|
||||||
PhysicsServer2D.shape_set_data(shape, 8)
|
Physics2DServer.shape_set_data(shape, 8)
|
||||||
|
|
||||||
for _i in BULLET_COUNT:
|
for _i in BULLET_COUNT:
|
||||||
var bullet := Bullet.new()
|
var bullet = Bullet.new()
|
||||||
# Give each bullet its own random speed.
|
# Give each bullet its own speed.
|
||||||
bullet.speed = randf_range(SPEED_MIN, SPEED_MAX)
|
bullet.speed = rand_range(SPEED_MIN, SPEED_MAX)
|
||||||
bullet.body = PhysicsServer2D.body_create()
|
bullet.body = Physics2DServer.body_create()
|
||||||
|
|
||||||
PhysicsServer2D.body_set_space(bullet.body, get_world_2d().get_space())
|
Physics2DServer.body_set_space(bullet.body, get_world_2d().get_space())
|
||||||
PhysicsServer2D.body_add_shape(bullet.body, shape)
|
Physics2DServer.body_add_shape(bullet.body, shape)
|
||||||
# Don't make bullets check collision with other bullets to improve performance.
|
# Don't make bullets check collision with other bullets to improve performance.
|
||||||
PhysicsServer2D.body_set_collision_mask(bullet.body, 0)
|
# Their collision mask is still configured to the default value, which allows
|
||||||
|
# bullets to detect collisions with the player.
|
||||||
|
Physics2DServer.body_set_collision_layer(bullet.body, 0)
|
||||||
|
|
||||||
# Place bullets randomly on the viewport and move bullets outside the
|
# Place bullets randomly on the viewport and move bullets outside the
|
||||||
# play area so that they fade in nicely.
|
# play area so that they fade in nicely.
|
||||||
bullet.position = Vector2(
|
bullet.position = Vector2(
|
||||||
randf_range(0, get_viewport_rect().size.x) + get_viewport_rect().size.x,
|
rand_range(0, get_viewport_rect().size.x) + get_viewport_rect().size.x,
|
||||||
randf_range(0, get_viewport_rect().size.y)
|
rand_range(0, get_viewport_rect().size.y)
|
||||||
)
|
)
|
||||||
var transform2d := Transform2D()
|
var transform2d = Transform2D()
|
||||||
transform2d.origin = bullet.position
|
transform2d.origin = bullet.position
|
||||||
PhysicsServer2D.body_set_state(bullet.body, PhysicsServer2D.BODY_STATE_TRANSFORM, transform2d)
|
Physics2DServer.body_set_state(bullet.body, Physics2DServer.BODY_STATE_TRANSFORM, transform2d)
|
||||||
|
|
||||||
bullets.push_back(bullet)
|
bullets.push_back(bullet)
|
||||||
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta):
|
||||||
# Order the CanvasItem to update every frame.
|
# Order the CanvasItem to update every frame.
|
||||||
queue_redraw()
|
update()
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta):
|
||||||
var transform2d := Transform2D()
|
var transform2d = Transform2D()
|
||||||
var offset := get_viewport_rect().size.x + 16
|
var offset = get_viewport_rect().size.x + 16
|
||||||
for bullet: Bullet in bullets:
|
for bullet in bullets:
|
||||||
bullet.position.x -= bullet.speed * delta
|
bullet.position.x -= bullet.speed * delta
|
||||||
|
|
||||||
if bullet.position.x < -16:
|
if bullet.position.x < -16:
|
||||||
# Move the bullet back to the right when it left the screen.
|
# The bullet has left the screen; move it back to the right.
|
||||||
bullet.position.x = offset
|
bullet.position.x = offset
|
||||||
|
|
||||||
transform2d.origin = bullet.position
|
transform2d.origin = bullet.position
|
||||||
PhysicsServer2D.body_set_state(bullet.body, PhysicsServer2D.BODY_STATE_TRANSFORM, transform2d)
|
|
||||||
|
Physics2DServer.body_set_state(bullet.body, Physics2DServer.BODY_STATE_TRANSFORM, transform2d)
|
||||||
|
|
||||||
|
|
||||||
# Instead of drawing each bullet individually in a script attached to each bullet,
|
# Instead of drawing each bullet individually in a script attached to each bullet,
|
||||||
# we are drawing *all* the bullets at once here.
|
# we are drawing *all* the bullets at once here.
|
||||||
func _draw() -> void:
|
func _draw():
|
||||||
var offset := -bullet_image.get_size() * 0.5
|
var offset = -bullet_image.get_size() * 0.5
|
||||||
for bullet: Bullet in bullets:
|
for bullet in bullets:
|
||||||
draw_texture(bullet_image, bullet.position + offset)
|
draw_texture(bullet_image, bullet.position + offset)
|
||||||
|
|
||||||
|
|
||||||
# Perform cleanup operations (required to exit without error messages in the console).
|
# Perform cleanup operations (required to exit without error messages in the console).
|
||||||
func _exit_tree() -> void:
|
func _exit_tree():
|
||||||
for bullet: Bullet in bullets:
|
for bullet in bullets:
|
||||||
PhysicsServer2D.free_rid(bullet.body)
|
Physics2DServer.free_rid(bullet.body)
|
||||||
|
|
||||||
PhysicsServer2D.free_rid(shape)
|
Physics2DServer.free_rid(shape)
|
||||||
bullets.clear()
|
bullets.clear()
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://d3u7k0742d5ug"
|
path="res://.import/face_happy.png-38d387d31ec13459f749c93ce3d75d80.stex"
|
||||||
path="res://.godot/imported/face_happy.png-38d387d31ec13459f749c93ce3d75d80.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://face_happy.png"
|
source_file="res://face_happy.png"
|
||||||
dest_files=["res://.godot/imported/face_happy.png-38d387d31ec13459f749c93ce3d75d80.ctex"]
|
dest_files=[ "res://.import/face_happy.png-38d387d31ec13459f749c93ce3d75d80.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=true
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://8j32onnr4qo3"
|
path="res://.import/face_sad.png-0ac7165eab24f595aba17a746a66c550.stex"
|
||||||
path="res://.godot/imported/face_sad.png-0ac7165eab24f595aba17a746a66c550.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://face_sad.png"
|
source_file="res://face_sad.png"
|
||||||
dest_files=["res://.godot/imported/face_sad.png-0ac7165eab24f595aba17a746a66c550.ctex"]
|
dest_files=[ "res://.import/face_sad.png-0ac7165eab24f595aba17a746a66c550.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=true
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
BIN
2d/bullet_shower/icon.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
34
2d/bullet_shower/icon.png.import
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://icon.png"
|
||||||
|
dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=true
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
process/invert_color=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
Before Width: | Height: | Size: 6.9 KiB |
@@ -1,34 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://brwp8bimc75uu"
|
|
||||||
path="res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://icon.webp"
|
|
||||||
dest_files=["res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.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
|
|
||||||
@@ -4,34 +4,30 @@ extends Node2D
|
|||||||
# efficient than using instancing and nodes, but requires more programming and
|
# efficient than using instancing and nodes, but requires more programming and
|
||||||
# is less visual. Bullets are managed together in the `bullets.gd` script.
|
# is less visual. Bullets are managed together in the `bullets.gd` script.
|
||||||
|
|
||||||
## The number of bullets currently touched by the player.
|
# The number of bullets currently touched by the player.
|
||||||
var touching := 0
|
var touching = 0
|
||||||
|
|
||||||
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
|
onready var sprite = $AnimatedSprite
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready():
|
||||||
# The player follows the mouse cursor automatically, so there's no point
|
# The player follows the mouse cursor automatically, so there's no point
|
||||||
# in displaying the mouse cursor.
|
# in displaying the mouse cursor.
|
||||||
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
|
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
|
||||||
|
|
||||||
|
|
||||||
func _input(event: InputEvent) -> void:
|
func _input(event):
|
||||||
# Getting the movement of the mouse so the sprite can follow its position.
|
|
||||||
if event is InputEventMouseMotion:
|
if event is InputEventMouseMotion:
|
||||||
position = event.position - Vector2(0, 16)
|
position = event.position - Vector2(0, 16)
|
||||||
|
|
||||||
|
|
||||||
func _on_body_shape_entered(_body_id: RID, _body: Node2D, _body_shape_index: int, _local_shape_index: int) -> void:
|
func _on_body_shape_entered(_body_id, _body, _body_shape, _local_shape):
|
||||||
# Player got touched by a bullet so sprite changes to sad face.
|
|
||||||
touching += 1
|
touching += 1
|
||||||
if touching >= 1:
|
if touching >= 1:
|
||||||
sprite.frame = 1
|
sprite.frame = 1
|
||||||
|
|
||||||
|
|
||||||
func _on_body_shape_exited(_body_id: RID, _body: Node2D, _body_shape_index: int, _local_shape_index: int) -> void:
|
func _on_body_shape_exited(_body_id, _body, _body_shape, _local_shape):
|
||||||
touching -= 1
|
touching -= 1
|
||||||
# When non of the bullets are touching the player,
|
|
||||||
# sprite changes to happy face.
|
|
||||||
if touching == 0:
|
if touching == 0:
|
||||||
sprite.frame = 0
|
sprite.frame = 0
|
||||||
|
|||||||
@@ -6,31 +6,36 @@
|
|||||||
; [section] ; section goes between []
|
; [section] ; section goes between []
|
||||||
; param=value ; assign values to parameters
|
; param=value ; assign values to parameters
|
||||||
|
|
||||||
config_version=5
|
config_version=4
|
||||||
|
|
||||||
|
_global_script_classes=[ ]
|
||||||
|
_global_script_class_icons={
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="Bullet Shower"
|
config/name="Bullet Shower"
|
||||||
config/description="Demonstrates how to manage large amounts of objects efficiently using low-level Servers."
|
config/description="Demonstrates how to manage large amounts of objects efficiently using low-level Servers."
|
||||||
config/tags=PackedStringArray("2d", "demo", "official", "performance")
|
|
||||||
run/main_scene="res://shower.tscn"
|
run/main_scene="res://shower.tscn"
|
||||||
config/features=PackedStringArray("4.2")
|
config/icon="res://icon.png"
|
||||||
config/icon="res://icon.webp"
|
|
||||||
|
|
||||||
[debug]
|
|
||||||
|
|
||||||
gdscript/warnings/untyped_declaration=1
|
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
window/stretch/mode="canvas_items"
|
window/dpi/allow_hidpi=true
|
||||||
|
window/stretch/mode="2d"
|
||||||
window/stretch/aspect="expand"
|
window/stretch/aspect="expand"
|
||||||
|
|
||||||
[layer_names]
|
[physics]
|
||||||
|
|
||||||
2d_physics/layer_1="Player"
|
2d/cell_size=64
|
||||||
|
common/enable_pause_aware_picking=true
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
renderer/rendering_method="gl_compatibility"
|
quality/driver/driver_name="GLES2"
|
||||||
renderer/rendering_method.mobile="gl_compatibility"
|
quality/intended_usage/framebuffer_allocation=0
|
||||||
|
quality/intended_usage/framebuffer_allocation.mobile=0
|
||||||
|
vram_compression/import_etc=true
|
||||||
|
vram_compression/import_etc2=false
|
||||||
|
environment/default_clear_color=Color( 0.133333, 0.133333, 0.2, 1 )
|
||||||
|
|||||||
@@ -1,40 +1,34 @@
|
|||||||
[gd_scene load_steps=7 format=3 uid="uid://c78by7hc4fmwx"]
|
[gd_scene load_steps=7 format=2]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://bullets.gd" id="2"]
|
[ext_resource path="res://bullets.gd" type="Script" id=2]
|
||||||
[ext_resource type="Texture2D" uid="uid://d3u7k0742d5ug" path="res://face_happy.png" id="3"]
|
[ext_resource path="res://face_happy.png" type="Texture" id=3]
|
||||||
[ext_resource type="Texture2D" uid="uid://8j32onnr4qo3" path="res://face_sad.png" id="4"]
|
[ext_resource path="res://face_sad.png" type="Texture" id=4]
|
||||||
[ext_resource type="Script" path="res://player.gd" id="5"]
|
[ext_resource path="res://player.gd" type="Script" id=5]
|
||||||
|
|
||||||
[sub_resource type="SpriteFrames" id="1"]
|
[sub_resource type="SpriteFrames" id=1]
|
||||||
animations = [{
|
animations = [ {
|
||||||
"frames": [{
|
"frames": [ ExtResource( 3 ), ExtResource( 4 ) ],
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("3")
|
|
||||||
}, {
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("4")
|
|
||||||
}],
|
|
||||||
"loop": true,
|
"loop": true,
|
||||||
"name": &"default",
|
"name": "default",
|
||||||
"speed": 5.0
|
"speed": 5.0
|
||||||
}]
|
} ]
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id="2"]
|
[sub_resource type="CircleShape2D" id=2]
|
||||||
radius = 27.0
|
radius = 27.0
|
||||||
|
|
||||||
[node name="Shower" type="Node2D"]
|
[node name="Shower" type="Node2D"]
|
||||||
|
|
||||||
[node name="Bullets" type="Node2D" parent="."]
|
[node name="Bullets" type="Node2D" parent="."]
|
||||||
script = ExtResource("2")
|
script = ExtResource( 2 )
|
||||||
|
|
||||||
[node name="Player" type="Area2D" parent="."]
|
[node name="Player" type="Area2D" parent="."]
|
||||||
script = ExtResource("5")
|
script = ExtResource( 5 )
|
||||||
|
|
||||||
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Player"]
|
[node name="AnimatedSprite" type="AnimatedSprite" parent="Player"]
|
||||||
sprite_frames = SubResource("1")
|
frames = SubResource( 1 )
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Player"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="Player"]
|
||||||
shape = SubResource("2")
|
shape = SubResource( 2 )
|
||||||
|
|
||||||
[connection signal="body_shape_entered" from="Player" to="Player" method="_on_body_shape_entered"]
|
[connection signal="body_shape_entered" from="Player" to="Player" method="_on_body_shape_entered"]
|
||||||
[connection signal="body_shape_exited" from="Player" to="Player" method="_on_body_shape_exited"]
|
[connection signal="body_shape_exited" from="Player" to="Player" method="_on_body_shape_exited"]
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ func show_message(text):
|
|||||||
|
|
||||||
func show_game_over():
|
func show_game_over():
|
||||||
show_message("Game Over")
|
show_message("Game Over")
|
||||||
await $MessageTimer.timeout
|
yield($MessageTimer, "timeout")
|
||||||
$MessageLabel.text = "Dodge the\nCreeps"
|
$MessageLabel.text = "Dodge the\nCreeps"
|
||||||
$MessageLabel.show()
|
$MessageLabel.show()
|
||||||
await get_tree().create_timer(1).timeout
|
yield(get_tree().create_timer(1), "timeout")
|
||||||
$StartButton.show()
|
$StartButton.show()
|
||||||
|
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ func update_score(score):
|
|||||||
|
|
||||||
func _on_StartButton_pressed():
|
func _on_StartButton_pressed():
|
||||||
$StartButton.hide()
|
$StartButton.hide()
|
||||||
start_game.emit()
|
emit_signal("start_game")
|
||||||
|
|
||||||
|
|
||||||
func _on_MessageTimer_timeout():
|
func _on_MessageTimer_timeout():
|
||||||
58
2d/dodge_the_creeps/HUD.tscn
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
[gd_scene load_steps=7 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://HUD.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://fonts/Xolonium-Regular.ttf" type="DynamicFontData" id=2]
|
||||||
|
|
||||||
|
[sub_resource type="DynamicFont" id=1]
|
||||||
|
size = 64
|
||||||
|
font_data = ExtResource( 2 )
|
||||||
|
|
||||||
|
[sub_resource type="DynamicFont" id=2]
|
||||||
|
size = 64
|
||||||
|
font_data = ExtResource( 2 )
|
||||||
|
|
||||||
|
[sub_resource type="InputEventAction" id=3]
|
||||||
|
action = "ui_select"
|
||||||
|
|
||||||
|
[sub_resource type="ShortCut" id=4]
|
||||||
|
shortcut = SubResource( 3 )
|
||||||
|
|
||||||
|
[node name="HUD" type="CanvasLayer"]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="ScoreLabel" type="Label" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
margin_bottom = 78.0
|
||||||
|
custom_fonts/font = SubResource( 1 )
|
||||||
|
text = "0"
|
||||||
|
align = 1
|
||||||
|
|
||||||
|
[node name="MessageLabel" type="Label" parent="."]
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
margin_top = -79.5
|
||||||
|
margin_bottom = 79.5
|
||||||
|
custom_fonts/font = SubResource( 1 )
|
||||||
|
text = "Dodge the
|
||||||
|
Creeps"
|
||||||
|
align = 1
|
||||||
|
|
||||||
|
[node name="StartButton" type="Button" parent="."]
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 1.0
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
margin_left = -90.0
|
||||||
|
margin_top = -200.0
|
||||||
|
margin_right = 90.0
|
||||||
|
margin_bottom = -100.0
|
||||||
|
custom_fonts/font = SubResource( 2 )
|
||||||
|
shortcut = SubResource( 4 )
|
||||||
|
text = "Start"
|
||||||
|
|
||||||
|
[node name="MessageTimer" type="Timer" parent="."]
|
||||||
|
one_shot = true
|
||||||
|
|
||||||
|
[connection signal="pressed" from="StartButton" to="." method="_on_StartButton_pressed"]
|
||||||
|
[connection signal="timeout" from="MessageTimer" to="." method="_on_MessageTimer_timeout"]
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
@export var mob_scene: PackedScene
|
export(PackedScene) var mob_scene
|
||||||
var score
|
var score
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
randomize()
|
||||||
|
|
||||||
|
|
||||||
func game_over():
|
func game_over():
|
||||||
$ScoreTimer.stop()
|
$ScoreTimer.stop()
|
||||||
$MobTimer.stop()
|
$MobTimer.stop()
|
||||||
@@ -12,7 +16,7 @@ func game_over():
|
|||||||
|
|
||||||
|
|
||||||
func new_game():
|
func new_game():
|
||||||
get_tree().call_group(&"mobs", &"queue_free")
|
get_tree().call_group("mobs", "queue_free")
|
||||||
score = 0
|
score = 0
|
||||||
$Player.start($StartPosition.position)
|
$Player.start($StartPosition.position)
|
||||||
$StartTimer.start()
|
$StartTimer.start()
|
||||||
@@ -22,29 +26,28 @@ func new_game():
|
|||||||
|
|
||||||
|
|
||||||
func _on_MobTimer_timeout():
|
func _on_MobTimer_timeout():
|
||||||
# Create a new instance of the Mob scene.
|
|
||||||
var mob = mob_scene.instantiate()
|
|
||||||
|
|
||||||
# Choose a random location on Path2D.
|
# Choose a random location on Path2D.
|
||||||
var mob_spawn_location = get_node(^"MobPath/MobSpawnLocation")
|
var mob_spawn_location = get_node("MobPath/MobSpawnLocation")
|
||||||
mob_spawn_location.progress = randi()
|
mob_spawn_location.offset = randi()
|
||||||
|
|
||||||
# Set the mob's position to a random location.
|
# Create a Mob instance and add it to the scene.
|
||||||
mob.position = mob_spawn_location.position
|
var mob = mob_scene.instance()
|
||||||
|
add_child(mob)
|
||||||
|
|
||||||
# Set the mob's direction perpendicular to the path direction.
|
# Set the mob's direction perpendicular to the path direction.
|
||||||
var direction = mob_spawn_location.rotation + PI / 2
|
var direction = mob_spawn_location.rotation + PI / 2
|
||||||
|
|
||||||
|
# Set the mob's position to a random location.
|
||||||
|
mob.position = mob_spawn_location.position
|
||||||
|
|
||||||
# Add some randomness to the direction.
|
# Add some randomness to the direction.
|
||||||
direction += randf_range(-PI / 4, PI / 4)
|
direction += rand_range(-PI / 4, PI / 4)
|
||||||
mob.rotation = direction
|
mob.rotation = direction
|
||||||
|
|
||||||
# Choose the velocity for the mob.
|
# Choose the velocity for the mob.
|
||||||
var velocity = Vector2(randf_range(150.0, 250.0), 0.0)
|
var velocity = Vector2(rand_range(150.0, 250.0), 0.0)
|
||||||
mob.linear_velocity = velocity.rotated(direction)
|
mob.linear_velocity = velocity.rotated(direction)
|
||||||
|
|
||||||
# Spawn the mob by adding it to the Main scene.
|
|
||||||
add_child(mob)
|
|
||||||
|
|
||||||
func _on_ScoreTimer_timeout():
|
func _on_ScoreTimer_timeout():
|
||||||
score += 1
|
score += 1
|
||||||
55
2d/dodge_the_creeps/Main.tscn
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
[gd_scene load_steps=8 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://Main.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://Mob.tscn" type="PackedScene" id=2]
|
||||||
|
[ext_resource path="res://Player.tscn" type="PackedScene" id=3]
|
||||||
|
[ext_resource path="res://HUD.tscn" type="PackedScene" id=4]
|
||||||
|
[ext_resource path="res://art/House In a Forest Loop.ogg" type="AudioStream" id=5]
|
||||||
|
[ext_resource path="res://art/gameover.wav" type="AudioStream" id=6]
|
||||||
|
|
||||||
|
[sub_resource type="Curve2D" id=1]
|
||||||
|
_data = {
|
||||||
|
"points": PoolVector2Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 480, 720, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0 )
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Main" type="Node"]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
mob_scene = ExtResource( 2 )
|
||||||
|
|
||||||
|
[node name="ColorRect" type="ColorRect" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
color = Color( 0.219608, 0.372549, 0.380392, 1 )
|
||||||
|
|
||||||
|
[node name="Player" parent="." instance=ExtResource( 3 )]
|
||||||
|
|
||||||
|
[node name="MobTimer" type="Timer" parent="."]
|
||||||
|
wait_time = 0.5
|
||||||
|
|
||||||
|
[node name="ScoreTimer" type="Timer" parent="."]
|
||||||
|
|
||||||
|
[node name="StartTimer" type="Timer" parent="."]
|
||||||
|
wait_time = 2.0
|
||||||
|
one_shot = true
|
||||||
|
|
||||||
|
[node name="StartPosition" type="Position2D" parent="."]
|
||||||
|
position = Vector2( 240, 450 )
|
||||||
|
|
||||||
|
[node name="MobPath" type="Path2D" parent="."]
|
||||||
|
curve = SubResource( 1 )
|
||||||
|
|
||||||
|
[node name="MobSpawnLocation" type="PathFollow2D" parent="MobPath"]
|
||||||
|
|
||||||
|
[node name="HUD" parent="." instance=ExtResource( 4 )]
|
||||||
|
|
||||||
|
[node name="Music" type="AudioStreamPlayer" parent="."]
|
||||||
|
stream = ExtResource( 5 )
|
||||||
|
|
||||||
|
[node name="DeathSound" type="AudioStreamPlayer" parent="."]
|
||||||
|
stream = ExtResource( 6 )
|
||||||
|
|
||||||
|
[connection signal="hit" from="Player" to="." method="game_over"]
|
||||||
|
[connection signal="timeout" from="MobTimer" to="." method="_on_MobTimer_timeout"]
|
||||||
|
[connection signal="timeout" from="ScoreTimer" to="." method="_on_ScoreTimer_timeout"]
|
||||||
|
[connection signal="timeout" from="StartTimer" to="." method="_on_StartTimer_timeout"]
|
||||||
|
[connection signal="start_game" from="HUD" to="." method="new_game"]
|
||||||
10
2d/dodge_the_creeps/Mob.gd
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
extends RigidBody2D
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
$AnimatedSprite.playing = true
|
||||||
|
var mob_types = $AnimatedSprite.frames.get_animation_names()
|
||||||
|
$AnimatedSprite.animation = mob_types[randi() % mob_types.size()]
|
||||||
|
|
||||||
|
|
||||||
|
func _on_VisibilityNotifier2D_screen_exited():
|
||||||
|
queue_free()
|
||||||
54
2d/dodge_the_creeps/Mob.tscn
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
[gd_scene load_steps=10 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://Mob.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://art/enemyFlyingAlt_1.png" type="Texture" id=2]
|
||||||
|
[ext_resource path="res://art/enemyFlyingAlt_2.png" type="Texture" id=3]
|
||||||
|
[ext_resource path="res://art/enemyWalking_1.png" type="Texture" id=4]
|
||||||
|
[ext_resource path="res://art/enemyWalking_2.png" type="Texture" id=5]
|
||||||
|
[ext_resource path="res://art/enemySwimming_1.png" type="Texture" id=6]
|
||||||
|
[ext_resource path="res://art/enemySwimming_2.png" type="Texture" id=7]
|
||||||
|
|
||||||
|
[sub_resource type="SpriteFrames" id=1]
|
||||||
|
animations = [ {
|
||||||
|
"frames": [ ExtResource( 2 ), ExtResource( 3 ) ],
|
||||||
|
"loop": true,
|
||||||
|
"name": "fly",
|
||||||
|
"speed": 3.0
|
||||||
|
}, {
|
||||||
|
"frames": [ ExtResource( 6 ), ExtResource( 7 ) ],
|
||||||
|
"loop": true,
|
||||||
|
"name": "swim",
|
||||||
|
"speed": 4.0
|
||||||
|
}, {
|
||||||
|
"frames": [ ExtResource( 4 ), ExtResource( 5 ) ],
|
||||||
|
"loop": true,
|
||||||
|
"name": "walk",
|
||||||
|
"speed": 4.0
|
||||||
|
} ]
|
||||||
|
|
||||||
|
[sub_resource type="CapsuleShape2D" id=2]
|
||||||
|
radius = 35.2706
|
||||||
|
height = 23.3281
|
||||||
|
|
||||||
|
[node name="Mob" type="RigidBody2D" groups=[
|
||||||
|
"mobs",
|
||||||
|
]]
|
||||||
|
collision_mask = 0
|
||||||
|
gravity_scale = 0.0
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_group_": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="AnimatedSprite" type="AnimatedSprite" parent="."]
|
||||||
|
scale = Vector2( 0.75, 0.75 )
|
||||||
|
frames = SubResource( 1 )
|
||||||
|
animation = "walk"
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||||
|
rotation = 1.5708
|
||||||
|
shape = SubResource( 2 )
|
||||||
|
|
||||||
|
[node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."]
|
||||||
|
|
||||||
|
[connection signal="screen_exited" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_screen_exited"]
|
||||||
53
2d/dodge_the_creeps/Player.gd
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
extends Area2D
|
||||||
|
|
||||||
|
signal hit
|
||||||
|
|
||||||
|
export var speed = 400 # How fast the player will move (pixels/sec).
|
||||||
|
var screen_size # Size of the game window.
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
screen_size = get_viewport_rect().size
|
||||||
|
hide()
|
||||||
|
|
||||||
|
|
||||||
|
func _process(delta):
|
||||||
|
var velocity = Vector2.ZERO # The player's movement vector.
|
||||||
|
if Input.is_action_pressed("move_right"):
|
||||||
|
velocity.x += 1
|
||||||
|
if Input.is_action_pressed("move_left"):
|
||||||
|
velocity.x -= 1
|
||||||
|
if Input.is_action_pressed("move_down"):
|
||||||
|
velocity.y += 1
|
||||||
|
if Input.is_action_pressed("move_up"):
|
||||||
|
velocity.y -= 1
|
||||||
|
|
||||||
|
if velocity.length() > 0:
|
||||||
|
velocity = velocity.normalized() * speed
|
||||||
|
$AnimatedSprite.play()
|
||||||
|
else:
|
||||||
|
$AnimatedSprite.stop()
|
||||||
|
|
||||||
|
position += velocity * delta
|
||||||
|
position.x = clamp(position.x, 0, screen_size.x)
|
||||||
|
position.y = clamp(position.y, 0, screen_size.y)
|
||||||
|
|
||||||
|
if velocity.x != 0:
|
||||||
|
$AnimatedSprite.animation = "right"
|
||||||
|
$AnimatedSprite.flip_v = false
|
||||||
|
$AnimatedSprite.flip_h = velocity.x < 0
|
||||||
|
elif velocity.y != 0:
|
||||||
|
$AnimatedSprite.animation = "up"
|
||||||
|
$AnimatedSprite.flip_v = velocity.y > 0
|
||||||
|
|
||||||
|
|
||||||
|
func start(pos):
|
||||||
|
position = pos
|
||||||
|
show()
|
||||||
|
$CollisionShape2D.disabled = false
|
||||||
|
|
||||||
|
|
||||||
|
func _on_Player_body_entered(_body):
|
||||||
|
hide() # Player disappears after being hit.
|
||||||
|
emit_signal("hit")
|
||||||
|
# Must be deferred as we can't change physics properties on a physics callback.
|
||||||
|
$CollisionShape2D.set_deferred("disabled", true)
|
||||||
71
2d/dodge_the_creeps/Player.tscn
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
[gd_scene load_steps=13 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://Player.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://art/playerGrey_walk1.png" type="Texture" id=2]
|
||||||
|
[ext_resource path="res://art/playerGrey_walk2.png" type="Texture" id=3]
|
||||||
|
[ext_resource path="res://art/playerGrey_up1.png" type="Texture" id=4]
|
||||||
|
[ext_resource path="res://art/playerGrey_up2.png" type="Texture" id=5]
|
||||||
|
|
||||||
|
[sub_resource type="SpriteFrames" id=1]
|
||||||
|
animations = [ {
|
||||||
|
"frames": [ ExtResource( 2 ), ExtResource( 3 ) ],
|
||||||
|
"loop": true,
|
||||||
|
"name": "right",
|
||||||
|
"speed": 5.0
|
||||||
|
}, {
|
||||||
|
"frames": [ ExtResource( 4 ), ExtResource( 5 ) ],
|
||||||
|
"loop": true,
|
||||||
|
"name": "up",
|
||||||
|
"speed": 5.0
|
||||||
|
} ]
|
||||||
|
|
||||||
|
[sub_resource type="CapsuleShape2D" id=2]
|
||||||
|
radius = 26.1701
|
||||||
|
height = 14.822
|
||||||
|
|
||||||
|
[sub_resource type="Gradient" id=3]
|
||||||
|
colors = PoolColorArray( 1, 1, 1, 0.501961, 1, 1, 1, 0 )
|
||||||
|
|
||||||
|
[sub_resource type="GradientTexture" id=4]
|
||||||
|
gradient = SubResource( 3 )
|
||||||
|
|
||||||
|
[sub_resource type="Curve" id=5]
|
||||||
|
_data = [ Vector2( 0.00501098, 0.5 ), 0.0, 0.0, 0, 0, Vector2( 0.994989, 0.324 ), 0.0, 0.0, 0, 0 ]
|
||||||
|
|
||||||
|
[sub_resource type="CurveTexture" id=6]
|
||||||
|
curve = SubResource( 5 )
|
||||||
|
|
||||||
|
[sub_resource type="ParticlesMaterial" id=7]
|
||||||
|
flag_disable_z = true
|
||||||
|
gravity = Vector3( 0, 0, 0 )
|
||||||
|
initial_velocity = 1.0
|
||||||
|
orbit_velocity = 0.0
|
||||||
|
orbit_velocity_random = 0.0
|
||||||
|
scale = 0.75
|
||||||
|
scale_curve = SubResource( 6 )
|
||||||
|
color_ramp = SubResource( 4 )
|
||||||
|
|
||||||
|
[node name="Player" type="Area2D"]
|
||||||
|
z_index = 10
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_group_": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="AnimatedSprite" type="AnimatedSprite" parent="."]
|
||||||
|
scale = Vector2( 0.5, 0.5 )
|
||||||
|
frames = SubResource( 1 )
|
||||||
|
animation = "right"
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||||
|
shape = SubResource( 2 )
|
||||||
|
|
||||||
|
[node name="Trail" type="Particles2D" parent="."]
|
||||||
|
z_index = -1
|
||||||
|
amount = 10
|
||||||
|
speed_scale = 2.0
|
||||||
|
local_coords = false
|
||||||
|
process_material = SubResource( 7 )
|
||||||
|
texture = ExtResource( 2 )
|
||||||
|
|
||||||
|
[connection signal="body_entered" from="." to="." method="_on_Player_body_entered"]
|
||||||
@@ -4,17 +4,19 @@ This is a simple game where your character must move
|
|||||||
and avoid the enemies for as long as possible.
|
and avoid the enemies for as long as possible.
|
||||||
|
|
||||||
This is a finished version of the game featured in the
|
This is a finished version of the game featured in the
|
||||||
["Your first 2D game"](https://docs.godotengine.org/en/latest/getting_started/first_2d_game/index.html)
|
["Your first game"](https://docs.godotengine.org/en/latest/getting_started/step_by_step/your_first_game.html)
|
||||||
tutorial in the documentation. For more details,
|
tutorial in the documentation. For more details,
|
||||||
consider following the tutorial in the documentation.
|
consider following the tutorial in the documentation.
|
||||||
|
|
||||||
Language: GDScript
|
Language: GDScript
|
||||||
|
|
||||||
Renderer: Compatibility
|
Renderer: GLES 3 (particles are not available in GLES 2)
|
||||||
|
|
||||||
Note: There is a C# version available [here](https://github.com/godotengine/godot-demo-projects/tree/master/mono/dodge_the_creeps).
|
Note: There is a C# version available [here](https://github.com/godotengine/godot-demo-projects/tree/master/mono/dodge_the_creeps).
|
||||||
|
|
||||||
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/2712
|
Note: There is a GDNative C++ version available [here](https://github.com/godotengine/gdnative-demos/tree/master/cpp/dodge_the_creeps).
|
||||||
|
|
||||||
|
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/515
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,15 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="oggvorbisstr"
|
importer="ogg_vorbis"
|
||||||
type="AudioStreamOggVorbis"
|
type="AudioStreamOGGVorbis"
|
||||||
uid="uid://q2pf4fr8d0ks"
|
path="res://.import/House In a Forest Loop.ogg-1a6a72ae843ad792b7039931227e8d50.oggstr"
|
||||||
path="res://.godot/imported/House In a Forest Loop.ogg-1a6a72ae843ad792b7039931227e8d50.oggvorbisstr"
|
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/House In a Forest Loop.ogg"
|
source_file="res://art/House In a Forest Loop.ogg"
|
||||||
dest_files=["res://.godot/imported/House In a Forest Loop.ogg-1a6a72ae843ad792b7039931227e8d50.oggvorbisstr"]
|
dest_files=[ "res://.import/House In a Forest Loop.ogg-1a6a72ae843ad792b7039931227e8d50.oggstr" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
loop=true
|
loop=true
|
||||||
loop_offset=0
|
loop_offset=0
|
||||||
bpm=0
|
|
||||||
beat_count=0
|
|
||||||
bar_beats=4
|
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://yqglrrsx7j1f"
|
path="res://.import/enemyFlyingAlt_1.png-559f599b16c69b112c1b53f6332e9489.stex"
|
||||||
path="res://.godot/imported/enemyFlyingAlt_1.png-559f599b16c69b112c1b53f6332e9489.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/enemyFlyingAlt_1.png"
|
source_file="res://art/enemyFlyingAlt_1.png"
|
||||||
dest_files=["res://.godot/imported/enemyFlyingAlt_1.png-559f599b16c69b112c1b53f6332e9489.ctex"]
|
dest_files=[ "res://.import/enemyFlyingAlt_1.png-559f599b16c69b112c1b53f6332e9489.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://bpot8awhdn6ph"
|
path="res://.import/enemyFlyingAlt_2.png-31dc7310eda6e1b721224f3cd932c076.stex"
|
||||||
path="res://.godot/imported/enemyFlyingAlt_2.png-31dc7310eda6e1b721224f3cd932c076.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/enemyFlyingAlt_2.png"
|
source_file="res://art/enemyFlyingAlt_2.png"
|
||||||
dest_files=["res://.godot/imported/enemyFlyingAlt_2.png-31dc7310eda6e1b721224f3cd932c076.ctex"]
|
dest_files=[ "res://.import/enemyFlyingAlt_2.png-31dc7310eda6e1b721224f3cd932c076.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://5lvm88ij4jqn"
|
path="res://.import/enemySwimming_1.png-dd0e11759dc3d624c8a704f6e98a3d80.stex"
|
||||||
path="res://.godot/imported/enemySwimming_1.png-dd0e11759dc3d624c8a704f6e98a3d80.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/enemySwimming_1.png"
|
source_file="res://art/enemySwimming_1.png"
|
||||||
dest_files=["res://.godot/imported/enemySwimming_1.png-dd0e11759dc3d624c8a704f6e98a3d80.ctex"]
|
dest_files=[ "res://.import/enemySwimming_1.png-dd0e11759dc3d624c8a704f6e98a3d80.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://bng45cvsgufqc"
|
path="res://.import/enemySwimming_2.png-4c0cbc0732264c4ea3290340bd4a0a62.stex"
|
||||||
path="res://.godot/imported/enemySwimming_2.png-4c0cbc0732264c4ea3290340bd4a0a62.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/enemySwimming_2.png"
|
source_file="res://art/enemySwimming_2.png"
|
||||||
dest_files=["res://.godot/imported/enemySwimming_2.png-4c0cbc0732264c4ea3290340bd4a0a62.ctex"]
|
dest_files=[ "res://.import/enemySwimming_2.png-4c0cbc0732264c4ea3290340bd4a0a62.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://bu4221t7qpa7d"
|
path="res://.import/enemyWalking_1.png-5af6eedbe61b701677d490ffdc1e6471.stex"
|
||||||
path="res://.godot/imported/enemyWalking_1.png-5af6eedbe61b701677d490ffdc1e6471.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/enemyWalking_1.png"
|
source_file="res://art/enemyWalking_1.png"
|
||||||
dest_files=["res://.godot/imported/enemyWalking_1.png-5af6eedbe61b701677d490ffdc1e6471.ctex"]
|
dest_files=[ "res://.import/enemyWalking_1.png-5af6eedbe61b701677d490ffdc1e6471.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://booij5t7h4efb"
|
path="res://.import/enemyWalking_2.png-67c480ed60c35e95f5acb0436246b935.stex"
|
||||||
path="res://.godot/imported/enemyWalking_2.png-67c480ed60c35e95f5acb0436246b935.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/enemyWalking_2.png"
|
source_file="res://art/enemyWalking_2.png"
|
||||||
dest_files=["res://.godot/imported/enemyWalking_2.png-67c480ed60c35e95f5acb0436246b935.ctex"]
|
dest_files=[ "res://.import/enemyWalking_2.png-67c480ed60c35e95f5acb0436246b935.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="wav"
|
importer="wav"
|
||||||
type="AudioStreamWAV"
|
type="AudioStreamSample"
|
||||||
uid="uid://dw26fpygeag8o"
|
path="res://.import/gameover.wav-98c95c744b35280048c2bd093cf8a356.sample"
|
||||||
path="res://.godot/imported/gameover.wav-98c95c744b35280048c2bd093cf8a356.sample"
|
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/gameover.wav"
|
source_file="res://art/gameover.wav"
|
||||||
dest_files=["res://.godot/imported/gameover.wav-98c95c744b35280048c2bd093cf8a356.sample"]
|
dest_files=[ "res://.import/gameover.wav-98c95c744b35280048c2bd093cf8a356.sample" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -18,7 +17,5 @@ force/max_rate=false
|
|||||||
force/max_rate_hz=44100
|
force/max_rate_hz=44100
|
||||||
edit/trim=true
|
edit/trim=true
|
||||||
edit/normalize=true
|
edit/normalize=true
|
||||||
edit/loop_mode=0
|
edit/loop=false
|
||||||
edit/loop_begin=0
|
|
||||||
edit/loop_end=-1
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://b4yyoafu8bi0q"
|
path="res://.import/playerGrey_up1.png-6bd114d0a6beac91f48e3a7314d44564.stex"
|
||||||
path="res://.godot/imported/playerGrey_up1.png-6bd114d0a6beac91f48e3a7314d44564.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/playerGrey_up1.png"
|
source_file="res://art/playerGrey_up1.png"
|
||||||
dest_files=["res://.godot/imported/playerGrey_up1.png-6bd114d0a6beac91f48e3a7314d44564.ctex"]
|
dest_files=[ "res://.import/playerGrey_up1.png-6bd114d0a6beac91f48e3a7314d44564.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://bko65a0nd66st"
|
path="res://.import/playerGrey_up2.png-d6aba85f5f2675ebc7045efa7552ee79.stex"
|
||||||
path="res://.godot/imported/playerGrey_up2.png-d6aba85f5f2675ebc7045efa7552ee79.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/playerGrey_up2.png"
|
source_file="res://art/playerGrey_up2.png"
|
||||||
dest_files=["res://.godot/imported/playerGrey_up2.png-d6aba85f5f2675ebc7045efa7552ee79.ctex"]
|
dest_files=[ "res://.import/playerGrey_up2.png-d6aba85f5f2675ebc7045efa7552ee79.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://ftkxr8r4qghp"
|
path="res://.import/playerGrey_walk1.png-c4773fe7a7bf85d7ab732eb4458c2742.stex"
|
||||||
path="res://.godot/imported/playerGrey_walk1.png-c4773fe7a7bf85d7ab732eb4458c2742.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/playerGrey_walk1.png"
|
source_file="res://art/playerGrey_walk1.png"
|
||||||
dest_files=["res://.godot/imported/playerGrey_walk1.png-c4773fe7a7bf85d7ab732eb4458c2742.ctex"]
|
dest_files=[ "res://.import/playerGrey_walk1.png-c4773fe7a7bf85d7ab732eb4458c2742.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://couyhcegeihme"
|
path="res://.import/playerGrey_walk2.png-34d2d916366100182d08037c51884043.stex"
|
||||||
path="res://.godot/imported/playerGrey_walk2.png-34d2d916366100182d08037c51884043.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/playerGrey_walk2.png"
|
source_file="res://art/playerGrey_walk2.png"
|
||||||
dest_files=["res://.godot/imported/playerGrey_walk2.png-34d2d916366100182d08037c51884043.ctex"]
|
dest_files=[ "res://.import/playerGrey_walk2.png-34d2d916366100182d08037c51884043.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=false
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="font_data_dynamic"
|
|
||||||
type="FontFile"
|
|
||||||
uid="uid://cit6gwe5px1q8"
|
|
||||||
path="res://.godot/imported/Xolonium-Regular.ttf-bc2981e3069cff4c34dd7c8e2bb73fba.fontdata"
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://fonts/Xolonium-Regular.ttf"
|
|
||||||
dest_files=["res://.godot/imported/Xolonium-Regular.ttf-bc2981e3069cff4c34dd7c8e2bb73fba.fontdata"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
Rendering=null
|
|
||||||
antialiasing=1
|
|
||||||
generate_mipmaps=false
|
|
||||||
multichannel_signed_distance_field=false
|
|
||||||
msdf_pixel_range=8
|
|
||||||
msdf_size=48
|
|
||||||
allow_system_fallback=true
|
|
||||||
force_autohinter=false
|
|
||||||
hinting=1
|
|
||||||
subpixel_positioning=1
|
|
||||||
oversampling=0.0
|
|
||||||
Fallbacks=null
|
|
||||||
fallbacks=[]
|
|
||||||
Compress=null
|
|
||||||
compress=true
|
|
||||||
preload=[]
|
|
||||||
language_support={}
|
|
||||||
script_support={}
|
|
||||||
opentype_features={}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
[gd_scene load_steps=5 format=3 uid="uid://ccqoreueuxdb7"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://hud.gd" id="1"]
|
|
||||||
[ext_resource type="FontFile" uid="uid://cit6gwe5px1q8" path="res://fonts/Xolonium-Regular.ttf" id="2_2jm3i"]
|
|
||||||
|
|
||||||
[sub_resource type="InputEventAction" id="InputEventAction_fopy7"]
|
|
||||||
action = &"start_game"
|
|
||||||
|
|
||||||
[sub_resource type="Shortcut" id="4"]
|
|
||||||
events = [SubResource("InputEventAction_fopy7")]
|
|
||||||
|
|
||||||
[node name="HUD" type="CanvasLayer"]
|
|
||||||
script = ExtResource("1")
|
|
||||||
|
|
||||||
[node name="ScoreLabel" type="Label" parent="."]
|
|
||||||
anchors_preset = 10
|
|
||||||
anchor_right = 1.0
|
|
||||||
offset_bottom = 78.0
|
|
||||||
grow_horizontal = 2
|
|
||||||
theme_override_fonts/font = ExtResource("2_2jm3i")
|
|
||||||
theme_override_font_sizes/font_size = 60
|
|
||||||
text = "0"
|
|
||||||
horizontal_alignment = 1
|
|
||||||
|
|
||||||
[node name="MessageLabel" type="Label" parent="."]
|
|
||||||
anchors_preset = 14
|
|
||||||
anchor_top = 0.5
|
|
||||||
anchor_right = 1.0
|
|
||||||
anchor_bottom = 0.5
|
|
||||||
offset_top = -79.5
|
|
||||||
offset_bottom = 79.5
|
|
||||||
grow_horizontal = 2
|
|
||||||
grow_vertical = 2
|
|
||||||
theme_override_fonts/font = ExtResource("2_2jm3i")
|
|
||||||
theme_override_font_sizes/font_size = 60
|
|
||||||
text = "Dodge the
|
|
||||||
Creeps"
|
|
||||||
horizontal_alignment = 1
|
|
||||||
|
|
||||||
[node name="StartButton" type="Button" parent="."]
|
|
||||||
anchors_preset = 7
|
|
||||||
anchor_left = 0.5
|
|
||||||
anchor_top = 1.0
|
|
||||||
anchor_right = 0.5
|
|
||||||
anchor_bottom = 1.0
|
|
||||||
offset_left = -90.0
|
|
||||||
offset_top = -200.0
|
|
||||||
offset_right = 90.0
|
|
||||||
offset_bottom = -100.0
|
|
||||||
grow_horizontal = 2
|
|
||||||
grow_vertical = 0
|
|
||||||
theme_override_fonts/font = ExtResource("2_2jm3i")
|
|
||||||
theme_override_font_sizes/font_size = 60
|
|
||||||
shortcut = SubResource("4")
|
|
||||||
text = "Start"
|
|
||||||
|
|
||||||
[node name="MessageTimer" type="Timer" parent="."]
|
|
||||||
one_shot = true
|
|
||||||
|
|
||||||
[connection signal="pressed" from="StartButton" to="." method="_on_StartButton_pressed"]
|
|
||||||
[connection signal="timeout" from="MessageTimer" to="." method="_on_MessageTimer_timeout"]
|
|
||||||
BIN
2d/dodge_the_creeps/icon.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
34
2d/dodge_the_creeps/icon.png.import
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://icon.png"
|
||||||
|
dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=true
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
process/invert_color=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
Before Width: | Height: | Size: 6.9 KiB |
@@ -1,34 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://brwp8bimc75uu"
|
|
||||||
path="res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://icon.webp"
|
|
||||||
dest_files=["res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.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
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
[gd_scene load_steps=8 format=3 uid="uid://cyfwty2q3rdse"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://main.gd" id="1_0r6n5"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://rkdnhqgf2hpj" path="res://mob.tscn" id="2_50pww"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://4vwrqjegqwpj" path="res://player.tscn" id="3_veqnc"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://ccqoreueuxdb7" path="res://hud.tscn" id="4_0qnje"]
|
|
||||||
[ext_resource type="AudioStream" uid="uid://q2pf4fr8d0ks" path="res://art/House In a Forest Loop.ogg" id="5_55d8h"]
|
|
||||||
[ext_resource type="AudioStream" uid="uid://dw26fpygeag8o" path="res://art/gameover.wav" id="6_hp1r0"]
|
|
||||||
|
|
||||||
[sub_resource type="Curve2D" id="1"]
|
|
||||||
_data = {
|
|
||||||
"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 480, 720, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0)
|
|
||||||
}
|
|
||||||
point_count = 5
|
|
||||||
|
|
||||||
[node name="Main" type="Node"]
|
|
||||||
script = ExtResource("1_0r6n5")
|
|
||||||
mob_scene = ExtResource("2_50pww")
|
|
||||||
|
|
||||||
[node name="ColorRect" type="ColorRect" parent="."]
|
|
||||||
anchors_preset = 15
|
|
||||||
anchor_right = 1.0
|
|
||||||
anchor_bottom = 1.0
|
|
||||||
grow_horizontal = 2
|
|
||||||
grow_vertical = 2
|
|
||||||
color = Color(0.219608, 0.372549, 0.380392, 1)
|
|
||||||
|
|
||||||
[node name="Player" parent="." instance=ExtResource("3_veqnc")]
|
|
||||||
|
|
||||||
[node name="MobTimer" type="Timer" parent="."]
|
|
||||||
wait_time = 0.5
|
|
||||||
|
|
||||||
[node name="ScoreTimer" type="Timer" parent="."]
|
|
||||||
|
|
||||||
[node name="StartTimer" type="Timer" parent="."]
|
|
||||||
wait_time = 2.0
|
|
||||||
one_shot = true
|
|
||||||
|
|
||||||
[node name="StartPosition" type="Marker2D" parent="."]
|
|
||||||
position = Vector2(240, 450)
|
|
||||||
|
|
||||||
[node name="MobPath" type="Path2D" parent="."]
|
|
||||||
curve = SubResource("1")
|
|
||||||
|
|
||||||
[node name="MobSpawnLocation" type="PathFollow2D" parent="MobPath"]
|
|
||||||
|
|
||||||
[node name="HUD" parent="." instance=ExtResource("4_0qnje")]
|
|
||||||
|
|
||||||
[node name="Music" type="AudioStreamPlayer" parent="."]
|
|
||||||
stream = ExtResource("5_55d8h")
|
|
||||||
|
|
||||||
[node name="DeathSound" type="AudioStreamPlayer" parent="."]
|
|
||||||
stream = ExtResource("6_hp1r0")
|
|
||||||
|
|
||||||
[connection signal="hit" from="Player" to="." method="game_over"]
|
|
||||||
[connection signal="timeout" from="MobTimer" to="." method="_on_MobTimer_timeout"]
|
|
||||||
[connection signal="timeout" from="ScoreTimer" to="." method="_on_ScoreTimer_timeout"]
|
|
||||||
[connection signal="timeout" from="StartTimer" to="." method="_on_StartTimer_timeout"]
|
|
||||||
[connection signal="start_game" from="HUD" to="." method="new_game"]
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
extends RigidBody2D
|
|
||||||
|
|
||||||
func _ready():
|
|
||||||
var mob_types = Array($AnimatedSprite2D.sprite_frames.get_animation_names())
|
|
||||||
$AnimatedSprite2D.animation = mob_types.pick_random()
|
|
||||||
$AnimatedSprite2D.play()
|
|
||||||
|
|
||||||
|
|
||||||
func _on_VisibilityNotifier2D_screen_exited():
|
|
||||||
queue_free()
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
[gd_scene load_steps=10 format=3 uid="uid://rkdnhqgf2hpj"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://mob.gd" id="1"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://yqglrrsx7j1f" path="res://art/enemyFlyingAlt_1.png" id="2"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://bpot8awhdn6ph" path="res://art/enemyFlyingAlt_2.png" id="3"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://bu4221t7qpa7d" path="res://art/enemyWalking_1.png" id="4"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://booij5t7h4efb" path="res://art/enemyWalking_2.png" id="5"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://5lvm88ij4jqn" path="res://art/enemySwimming_1.png" id="6"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://bng45cvsgufqc" path="res://art/enemySwimming_2.png" id="7"]
|
|
||||||
|
|
||||||
[sub_resource type="SpriteFrames" id="1"]
|
|
||||||
animations = [{
|
|
||||||
"frames": [ExtResource( "6" ), ExtResource( "7" )],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"swim",
|
|
||||||
"speed": 4.0
|
|
||||||
}, {
|
|
||||||
"frames": [ExtResource( "2" ), ExtResource( "3" )],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"fly",
|
|
||||||
"speed": 3.0
|
|
||||||
}, {
|
|
||||||
"frames": [ExtResource( "4" ), ExtResource( "5" )],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"walk",
|
|
||||||
"speed": 4.0
|
|
||||||
}]
|
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape2D" id="2"]
|
|
||||||
radius = 37.0
|
|
||||||
height = 100.0
|
|
||||||
|
|
||||||
[node name="Mob" type="RigidDynamicBody2D" groups=["mobs"]]
|
|
||||||
collision_mask = 0
|
|
||||||
gravity_scale = 0.0
|
|
||||||
script = ExtResource( "1" )
|
|
||||||
|
|
||||||
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
|
|
||||||
scale = Vector2(0.75, 0.75)
|
|
||||||
frames = SubResource( "1" )
|
|
||||||
animation = &"walk"
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
|
||||||
rotation = 1.5708
|
|
||||||
shape = SubResource( "2" )
|
|
||||||
|
|
||||||
[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."]
|
|
||||||
|
|
||||||
[connection signal="screen_exited" from="VisibleOnScreenNotifier2D" to="." method="_on_VisibilityNotifier2D_screen_exited"]
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
extends Area2D
|
|
||||||
|
|
||||||
signal hit
|
|
||||||
|
|
||||||
@export var speed = 400 # How fast the player will move (pixels/sec).
|
|
||||||
var screen_size # Size of the game window.
|
|
||||||
|
|
||||||
func _ready():
|
|
||||||
screen_size = get_viewport_rect().size
|
|
||||||
hide()
|
|
||||||
|
|
||||||
|
|
||||||
func _process(delta):
|
|
||||||
var velocity = Vector2.ZERO # The player's movement vector.
|
|
||||||
if Input.is_action_pressed(&"move_right"):
|
|
||||||
velocity.x += 1
|
|
||||||
if Input.is_action_pressed(&"move_left"):
|
|
||||||
velocity.x -= 1
|
|
||||||
if Input.is_action_pressed(&"move_down"):
|
|
||||||
velocity.y += 1
|
|
||||||
if Input.is_action_pressed(&"move_up"):
|
|
||||||
velocity.y -= 1
|
|
||||||
|
|
||||||
if velocity.length() > 0:
|
|
||||||
velocity = velocity.normalized() * speed
|
|
||||||
$AnimatedSprite2D.play()
|
|
||||||
else:
|
|
||||||
$AnimatedSprite2D.stop()
|
|
||||||
|
|
||||||
position += velocity * delta
|
|
||||||
position = position.clamp(Vector2.ZERO, screen_size)
|
|
||||||
|
|
||||||
if velocity.x != 0:
|
|
||||||
$AnimatedSprite2D.animation = &"right"
|
|
||||||
$AnimatedSprite2D.flip_v = false
|
|
||||||
$Trail.rotation = 0
|
|
||||||
$AnimatedSprite2D.flip_h = velocity.x < 0
|
|
||||||
elif velocity.y != 0:
|
|
||||||
$AnimatedSprite2D.animation = &"up"
|
|
||||||
rotation = PI if velocity.y > 0 else 0
|
|
||||||
|
|
||||||
|
|
||||||
func start(pos):
|
|
||||||
position = pos
|
|
||||||
rotation = 0
|
|
||||||
show()
|
|
||||||
$CollisionShape2D.disabled = false
|
|
||||||
|
|
||||||
|
|
||||||
func _on_body_entered(_body):
|
|
||||||
hide() # Player disappears after being hit.
|
|
||||||
hit.emit()
|
|
||||||
# Must be deferred as we can't change physics properties on a physics callback.
|
|
||||||
$CollisionShape2D.set_deferred(&"disabled", true)
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
[gd_scene load_steps=13 format=3 uid="uid://4vwrqjegqwpj"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://player.gd" id="1"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://ftkxr8r4qghp" path="res://art/playerGrey_walk1.png" id="2"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://couyhcegeihme" path="res://art/playerGrey_walk2.png" id="3"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://b4yyoafu8bi0q" path="res://art/playerGrey_up1.png" id="4"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://bko65a0nd66st" path="res://art/playerGrey_up2.png" id="5"]
|
|
||||||
|
|
||||||
[sub_resource type="SpriteFrames" id="1"]
|
|
||||||
animations = [{
|
|
||||||
"frames": [{
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("2")
|
|
||||||
}, {
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("3")
|
|
||||||
}],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"right",
|
|
||||||
"speed": 5.0
|
|
||||||
}, {
|
|
||||||
"frames": [{
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("4")
|
|
||||||
}, {
|
|
||||||
"duration": 1.0,
|
|
||||||
"texture": ExtResource("5")
|
|
||||||
}],
|
|
||||||
"loop": true,
|
|
||||||
"name": &"up",
|
|
||||||
"speed": 5.0
|
|
||||||
}]
|
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape2D" id="2"]
|
|
||||||
radius = 27.0
|
|
||||||
height = 68.0
|
|
||||||
|
|
||||||
[sub_resource type="Gradient" id="3"]
|
|
||||||
colors = PackedColorArray(1, 1, 1, 0.501961, 1, 1, 1, 0)
|
|
||||||
|
|
||||||
[sub_resource type="GradientTexture1D" id="4"]
|
|
||||||
gradient = SubResource("3")
|
|
||||||
|
|
||||||
[sub_resource type="Curve" id="5"]
|
|
||||||
_data = [Vector2(0.00501098, 0.5), 0.0, 0.0, 0, 0, Vector2(0.994989, 0.324), 0.0, 0.0, 0, 0]
|
|
||||||
point_count = 2
|
|
||||||
|
|
||||||
[sub_resource type="CurveTexture" id="6"]
|
|
||||||
curve = SubResource("5")
|
|
||||||
|
|
||||||
[sub_resource type="ParticleProcessMaterial" id="7"]
|
|
||||||
gravity = Vector3(0, 0, 0)
|
|
||||||
scale_curve = SubResource("6")
|
|
||||||
color_ramp = SubResource("4")
|
|
||||||
|
|
||||||
[node name="Player" type="Area2D"]
|
|
||||||
z_index = 10
|
|
||||||
script = ExtResource("1")
|
|
||||||
|
|
||||||
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
|
|
||||||
scale = Vector2(0.5, 0.5)
|
|
||||||
sprite_frames = SubResource("1")
|
|
||||||
animation = &"right"
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
|
||||||
shape = SubResource("2")
|
|
||||||
|
|
||||||
[node name="Trail" type="GPUParticles2D" parent="."]
|
|
||||||
z_index = -1
|
|
||||||
amount = 10
|
|
||||||
process_material = SubResource("7")
|
|
||||||
texture = ExtResource("2")
|
|
||||||
speed_scale = 2.0
|
|
||||||
|
|
||||||
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
; [section] ; section goes between []
|
; [section] ; section goes between []
|
||||||
; param=value ; assign values to parameters
|
; param=value ; assign values to parameters
|
||||||
|
|
||||||
config_version=5
|
config_version=4
|
||||||
|
|
||||||
[application]
|
[application]
|
||||||
|
|
||||||
@@ -14,64 +14,50 @@ config/name="Dodge the Creeps"
|
|||||||
config/description="This is a simple game where your character must move
|
config/description="This is a simple game where your character must move
|
||||||
and avoid the enemies for as long as possible.
|
and avoid the enemies for as long as possible.
|
||||||
|
|
||||||
This is a finished version of the game featured in the 'Your first 2D game'
|
This is a finished version of the game featured in the 'Your first game'
|
||||||
tutorial in the documentation. For more details, consider
|
tutorial in the documentation. For more details, consider
|
||||||
following the tutorial in the documentation."
|
following the tutorial in the documentation."
|
||||||
config/tags=PackedStringArray("2d", "demo", "official")
|
run/main_scene="res://Main.tscn"
|
||||||
run/main_scene="res://main.tscn"
|
config/icon="res://icon.png"
|
||||||
config/features=PackedStringArray("4.2")
|
|
||||||
config/icon="res://icon.webp"
|
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
window/size/viewport_width=480
|
window/size/width=480
|
||||||
window/size/viewport_height=720
|
window/size/height=720
|
||||||
window/size/window_width_override=480
|
window/stretch/mode="2d"
|
||||||
window/size/window_height_override=720
|
window/stretch/aspect="keep"
|
||||||
window/stretch/mode="canvas_items"
|
|
||||||
|
|
||||||
[input]
|
[input]
|
||||||
|
|
||||||
move_left={
|
move_left={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
|
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
move_right={
|
move_right={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
|
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
move_up={
|
move_up={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
|
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
move_down={
|
move_down={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
|
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
start_game={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"echo":false,"script":null)
|
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
[rendering]
|
|
||||||
|
|
||||||
renderer/rendering_method="gl_compatibility"
|
|
||||||
renderer/rendering_method.mobile="gl_compatibility"
|
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
# Dynamic TileMap Layers
|
|
||||||
|
|
||||||
Example of how to make a fake wall using TileMap's
|
|
||||||
`_tile_data_runtime_update()` method. It shows how
|
|
||||||
to disable collisions per layer.
|
|
||||||
|
|
||||||
Language: GDScript
|
|
||||||
|
|
||||||
Renderer: Compatibility
|
|
||||||
|
|
||||||
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/2713
|
|
||||||
|
|
||||||
## Screenshots
|
|
||||||
|
|
||||||

|
|
||||||
|
Before Width: | Height: | Size: 4.3 KiB |
@@ -1,34 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://bpov140lx7at3"
|
|
||||||
path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://icon.png"
|
|
||||||
dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.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
|
|
||||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,34 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://cs8h2qyuakmko"
|
|
||||||
path="res://.godot/imported/obstacle.png-06287f6b2d26dd03335fd87ab78c2cc2.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://level/obstacle.png"
|
|
||||||
dest_files=["res://.godot/imported/obstacle.png-06287f6b2d26dd03335fd87ab78c2cc2.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
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
extends TileMapLayer
|
|
||||||
|
|
||||||
# You can have multiple layers if you make this an array.
|
|
||||||
var player_in_secret := false
|
|
||||||
var layer_alpha := 1.0
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
set_process(false)
|
|
||||||
|
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
|
||||||
if player_in_secret:
|
|
||||||
if layer_alpha > 0.3:
|
|
||||||
# Animate the layer transparency.
|
|
||||||
layer_alpha = move_toward(layer_alpha, 0.3, delta)
|
|
||||||
self_modulate = Color(1, 1, 1, layer_alpha)
|
|
||||||
else:
|
|
||||||
set_process(false)
|
|
||||||
else:
|
|
||||||
if layer_alpha < 1.0:
|
|
||||||
layer_alpha = move_toward(layer_alpha, 1.0, delta)
|
|
||||||
self_modulate = Color(1, 1, 1, layer_alpha)
|
|
||||||
else:
|
|
||||||
set_process(false)
|
|
||||||
|
|
||||||
|
|
||||||
func _use_tile_data_runtime_update(_coords: Vector2i) -> bool:
|
|
||||||
return true
|
|
||||||
|
|
||||||
|
|
||||||
func _tile_data_runtime_update(_coords: Vector2i, tile_data: TileData) -> void:
|
|
||||||
# Remove collision for secret layer.
|
|
||||||
tile_data.set_collision_polygons_count(0, 0)
|
|
||||||
|
|
||||||
|
|
||||||
func _on_secret_detector_body_entered(body: Node2D) -> void:
|
|
||||||
if body is not CharacterBody2D:
|
|
||||||
# Detect the player only.
|
|
||||||
return
|
|
||||||
|
|
||||||
player_in_secret = true
|
|
||||||
set_process(true)
|
|
||||||
|
|
||||||
|
|
||||||
func _on_secret_detector_body_exited(body: Node2D) -> void:
|
|
||||||
if body is not CharacterBody2D:
|
|
||||||
return
|
|
||||||
|
|
||||||
player_in_secret = false
|
|
||||||
set_process(true)
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
extends CharacterBody2D
|
|
||||||
|
|
||||||
const WALK_FORCE = 600
|
|
||||||
const WALK_MAX_SPEED = 200
|
|
||||||
const STOP_FORCE = 1300
|
|
||||||
const JUMP_SPEED = 200
|
|
||||||
|
|
||||||
@onready var gravity: float = ProjectSettings.get_setting("physics/2d/default_gravity")
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
|
||||||
# Horizontal movement code. First, get the player's input.
|
|
||||||
var walk := WALK_FORCE * (Input.get_axis(&"move_left", &"move_right"))
|
|
||||||
# Slow down the player if they're not trying to move.
|
|
||||||
if abs(walk) < WALK_FORCE * 0.2:
|
|
||||||
# The velocity, slowed down a bit, and then reassigned.
|
|
||||||
velocity.x = move_toward(velocity.x, 0, STOP_FORCE * delta)
|
|
||||||
else:
|
|
||||||
velocity.x += walk * delta
|
|
||||||
# Clamp to the maximum horizontal movement speed.
|
|
||||||
velocity.x = clamp(velocity.x, -WALK_MAX_SPEED, WALK_MAX_SPEED)
|
|
||||||
|
|
||||||
# Vertical movement code. Apply gravity.
|
|
||||||
velocity.y += gravity * delta
|
|
||||||
|
|
||||||
# Move based on the velocity and snap to the ground.
|
|
||||||
# TODO: This information should be set to the CharacterBody properties instead of arguments: snap, Vector2.DOWN, Vector2.UP
|
|
||||||
# TODO: Rename velocity to linear_velocity in the rest of the script.
|
|
||||||
move_and_slide()
|
|
||||||
|
|
||||||
# Check for jumping. is_on_floor() must be called after movement code.
|
|
||||||
if is_on_floor() and Input.is_action_just_pressed(&"jump"):
|
|
||||||
velocity.y = -JUMP_SPEED
|
|
||||||
|
Before Width: | Height: | Size: 502 B |
@@ -1,34 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://dfb8rr2fakwgp"
|
|
||||||
path="res://.godot/imported/player.png-1ad27fc2a62fa126eae918723933dd6f.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://player/player.png"
|
|
||||||
dest_files=["res://.godot/imported/player.png-1ad27fc2a62fa126eae918723933dd6f.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
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
[gd_scene load_steps=4 format=3 uid="uid://1o70ce0fv10w"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://player/player.gd" id="1"]
|
|
||||||
[ext_resource type="Texture2D" uid="uid://dfb8rr2fakwgp" path="res://player/player.png" id="2"]
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="1"]
|
|
||||||
size = Vector2(14, 14)
|
|
||||||
|
|
||||||
[node name="Player" type="CharacterBody2D"]
|
|
||||||
script = ExtResource("1")
|
|
||||||
|
|
||||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
|
||||||
texture = ExtResource("2")
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
|
||||||
position = Vector2(-0.315559, 0.157784)
|
|
||||||
shape = SubResource("1")
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
; Engine configuration file.
|
|
||||||
; It's best edited using the editor UI and not directly,
|
|
||||||
; since the parameters that go here are not all obvious.
|
|
||||||
;
|
|
||||||
; Format:
|
|
||||||
; [section] ; section goes between []
|
|
||||||
; param=value ; assign values to parameters
|
|
||||||
|
|
||||||
config_version=5
|
|
||||||
|
|
||||||
[application]
|
|
||||||
|
|
||||||
config/name="Dynamic TileMap Layers"
|
|
||||||
config/description="Example of how to make a kinematic character controller in 2D using
|
|
||||||
CharacterBody2D. The character moves around, is affected by moving
|
|
||||||
platforms, can jump through one-way collision platforms, etc."
|
|
||||||
config/tags=PackedStringArray("2d", "demo", "official", "tilemap")
|
|
||||||
run/main_scene="res://world.tscn"
|
|
||||||
config/features=PackedStringArray("4.3")
|
|
||||||
config/icon="res://icon.png"
|
|
||||||
|
|
||||||
[debug]
|
|
||||||
|
|
||||||
gdscript/warnings/untyped_declaration=1
|
|
||||||
|
|
||||||
[display]
|
|
||||||
|
|
||||||
window/size/viewport_width=530
|
|
||||||
window/size/viewport_height=495
|
|
||||||
window/stretch/mode="canvas_items"
|
|
||||||
window/stretch/aspect="expand"
|
|
||||||
|
|
||||||
[input]
|
|
||||||
|
|
||||||
jump={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
|
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
|
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
|
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
move_left={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
|
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
|
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
move_right={
|
|
||||||
"deadzone": 0.2,
|
|
||||||
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
|
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
|
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
[physics]
|
|
||||||
|
|
||||||
common/physics_ticks_per_second=120
|
|
||||||
2d/default_gravity=500
|
|
||||||
|
|
||||||
[rendering]
|
|
||||||
|
|
||||||
renderer/rendering_method="gl_compatibility"
|
|
||||||
renderer/rendering_method.mobile="gl_compatibility"
|
|
||||||
environment/defaults/default_clear_color=Color(0.156863, 0.133333, 0.25098, 1)
|
|
||||||
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,48 +0,0 @@
|
|||||||
[gd_scene load_steps=8 format=4 uid="uid://de7qapkqfycxl"]
|
|
||||||
|
|
||||||
[ext_resource type="Texture2D" uid="uid://cs8h2qyuakmko" path="res://level/obstacle.png" id="2"]
|
|
||||||
[ext_resource type="Script" path="res://level/tile_map.gd" id="2_q8fhk"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://1o70ce0fv10w" path="res://player/player.tscn" id="3"]
|
|
||||||
|
|
||||||
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_on5ov"]
|
|
||||||
|
|
||||||
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_vnjib"]
|
|
||||||
texture = ExtResource("2")
|
|
||||||
0:0/0 = 0
|
|
||||||
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
|
|
||||||
|
|
||||||
[sub_resource type="TileSet" id="TileSet_xqlka"]
|
|
||||||
physics_layer_0/collision_layer = 1
|
|
||||||
physics_layer_0/physics_material = SubResource("PhysicsMaterial_on5ov")
|
|
||||||
sources/0 = SubResource("TileSetAtlasSource_vnjib")
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_a2gec"]
|
|
||||||
size = Vector2(112, 48)
|
|
||||||
|
|
||||||
[node name="World" type="Node2D"]
|
|
||||||
|
|
||||||
[node name="Ground" type="TileMapLayer" parent="."]
|
|
||||||
use_parent_material = true
|
|
||||||
tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA8AAAAAAAAAAAAAABAAAAAAAAAAAAAAABEAAAAAAAAAAAAAABIAAAAAAAAAAAAAABMAAAAAAAAAAAAAABQAAAAAAAAAAAAAABUAAAAAAAAAAAAAABYAAAAAAAAAAAAAABcAAAAAAAAAAAAAABgAAAAAAAAAAAAAABkAAAAAAAAAAAAAABoAAAAAAAAAAAAAABsAAAAAAAAAAAAAABwAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAB4AAAAAAAAAAAABAAAAAAAAAAAAAAABAAEAAAAAAAAAAAABAAIAAAAAAAAAAAABAAMAAAAAAAAAAAABAAQAAAAAAAAAAAABAAUAAAAAAAAAAAABAAYAAAAAAAAAAAABAAcAAAAAAAAAAAABAAgAAAAAAAAAAAABAAkAAAAAAAAAAAABAAoAAAAAAAAAAAABAAsAAAAAAAAAAAABAAwAAAAAAAAAAAABAA0AAAAAAAAAAAABAA4AAAAAAAAAAAABAA8AAAAAAAAAAAABABAAAAAAAAAAAAABABEAAAAAAAAAAAABABIAAAAAAAAAAAABABMAAAAAAAAAAAABABQAAAAAAAAAAAABABUAAAAAAAAAAAABABYAAAAAAAAAAAABABcAAAAAAAAAAAABABgAAAAAAAAAAAABABkAAAAAAAAAAAABABoAAAAAAAAAAAABABsAAAAAAAAAAAABABwAAAAAAAAAAAABAB0AAAAAAAAAAAABAB4AAAAAAAAAAAACAAAAAAAAAAAAAAACAAEAAAAAAAAAAAACAB0AAAAAAAAAAAACAB4AAAAAAAAAAAADAAAAAAAAAAAAAAADAAEAAAAAAAAAAAADAB0AAAAAAAAAAAADAB4AAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAEAAAAAAAAAAAAEAB0AAAAAAAAAAAAEAB4AAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAEAAAAAAAAAAAAFAB0AAAAAAAAAAAAFAB4AAAAAAAAAAAAGAAAAAAAAAAAAAAAGAAEAAAAAAAAAAAAGAB0AAAAAAAAAAAAGAB4AAAAAAAAAAAAHAAAAAAAAAAAAAAAHAAEAAAAAAAAAAAAHAB0AAAAAAAAAAAAHAB4AAAAAAAAAAAAIAAAAAAAAAAAAAAAIAAEAAAAAAAAAAAAIAB0AAAAAAAAAAAAIAB4AAAAAAAAAAAAJAAAAAAAAAAAAAAAJAAEAAAAAAAAAAAAJAB0AAAAAAAAAAAAJAB4AAAAAAAAAAAAKAAAAAAAAAAAAAAAKAAEAAAAAAAAAAAAKAB0AAAAAAAAAAAAKAB4AAAAAAAAAAAALAAAAAAAAAAAAAAALAAEAAAAAAAAAAAALAB0AAAAAAAAAAAALAB4AAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAEAAAAAAAAAAAAMAB0AAAAAAAAAAAAMAB4AAAAAAAAAAAANAAAAAAAAAAAAAAANAAEAAAAAAAAAAAANAB0AAAAAAAAAAAANAB4AAAAAAAAAAAAOAAAAAAAAAAAAAAAOAAEAAAAAAAAAAAAOAB0AAAAAAAAAAAAOAB4AAAAAAAAAAAAPAAAAAAAAAAAAAAAPAAEAAAAAAAAAAAAPAB0AAAAAAAAAAAAPAB4AAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAEAAAAAAAAAAAAQAB0AAAAAAAAAAAAQAB4AAAAAAAAAAAARAAAAAAAAAAAAAAARAAEAAAAAAAAAAAARAB0AAAAAAAAAAAARAB4AAAAAAAAAAAASAAAAAAAAAAAAAAASAAEAAAAAAAAAAAASAB0AAAAAAAAAAAASAB4AAAAAAAAAAAATAAAAAAAAAAAAAAATAAEAAAAAAAAAAAATAB0AAAAAAAAAAAATAB4AAAAAAAAAAAAUAAAAAAAAAAAAAAAUAAEAAAAAAAAAAAAUAB0AAAAAAAAAAAAUAB4AAAAAAAAAAAAVAAAAAAAAAAAAAAAVAAEAAAAAAAAAAAAVAB0AAAAAAAAAAAAVAB4AAAAAAAAAAAAWAAAAAAAAAAAAAAAWAAEAAAAAAAAAAAAWAB0AAAAAAAAAAAAWAB4AAAAAAAAAAAAXAAAAAAAAAAAAAAAXAAEAAAAAAAAAAAAXAB0AAAAAAAAAAAAXAB4AAAAAAAAAAAAYAAAAAAAAAAAAAAAYAAEAAAAAAAAAAAAYAB0AAAAAAAAAAAAYAB4AAAAAAAAAAAAZAAAAAAAAAAAAAAAZAAEAAAAAAAAAAAAZAB0AAAAAAAAAAAAZAB4AAAAAAAAAAAAaAAAAAAAAAAAAAAAaAAEAAAAAAAAAAAAaAB0AAAAAAAAAAAAaAB4AAAAAAAAAAAAbAAAAAAAAAAAAAAAbAAEAAAAAAAAAAAAbAB0AAAAAAAAAAAAbAB4AAAAAAAAAAAAcAAAAAAAAAAAAAAAcAAEAAAAAAAAAAAAcAB0AAAAAAAAAAAAcAB4AAAAAAAAAAAAdAAAAAAAAAAAAAAAdAAEAAAAAAAAAAAAdAB0AAAAAAAAAAAAdAB4AAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAEAAAAAAAAAAAAeAB0AAAAAAAAAAAAeAB4AAAAAAAAAAAAfAAAAAAAAAAAAAAAfAAEAAAAAAAAAAAAfAAIAAAAAAAAAAAAfAAMAAAAAAAAAAAAfAAQAAAAAAAAAAAAfAAUAAAAAAAAAAAAfAAYAAAAAAAAAAAAfAAcAAAAAAAAAAAAfAAgAAAAAAAAAAAAfAAkAAAAAAAAAAAAfAAoAAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAwAAAAAAAAAAAAfAA0AAAAAAAAAAAAfAA4AAAAAAAAAAAAfAA8AAAAAAAAAAAAfABAAAAAAAAAAAAAfABEAAAAAAAAAAAAfABIAAAAAAAAAAAAfABMAAAAAAAAAAAAfABQAAAAAAAAAAAAfABUAAAAAAAAAAAAfABYAAAAAAAAAAAAfABcAAAAAAAAAAAAfABgAAAAAAAAAAAAfABkAAAAAAAAAAAAfABoAAAAAAAAAAAAfABsAAAAAAAAAAAAfABwAAAAAAAAAAAAfAB0AAAAAAAAAAAAfAB4AAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAEAAAAAAAAAAAAgAAIAAAAAAAAAAAAgAAMAAAAAAAAAAAAgAAQAAAAAAAAAAAAgAAUAAAAAAAAAAAAgAAYAAAAAAAAAAAAgAAcAAAAAAAAAAAAgAAgAAAAAAAAAAAAgAAkAAAAAAAAAAAAgAAoAAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAwAAAAAAAAAAAAgAA0AAAAAAAAAAAAgAA4AAAAAAAAAAAAgAA8AAAAAAAAAAAAgABAAAAAAAAAAAAAgABEAAAAAAAAAAAAgABIAAAAAAAAAAAAgABMAAAAAAAAAAAAgABQAAAAAAAAAAAAgABUAAAAAAAAAAAAgABYAAAAAAAAAAAAgABcAAAAAAAAAAAAgABgAAAAAAAAAAAAgABkAAAAAAAAAAAAgABoAAAAAAAAAAAAgABsAAAAAAAAAAAAgABwAAAAAAAAAAAAgAB0AAAAAAAAAAAAgAB4AAAAAAAAAAAAOABgAAAAAAAAAAAAPABgAAAAAAAAAAAAQABgAAAAAAAAAAAARABgAAAAAAAAAAAASABgAAAAAAAAAAAATABgAAAAAAAAAAAAUABgAAAAAAAAAAAAUABcAAAAAAAAAAAAUABYAAAAAAAAAAAATABYAAAAAAAAAAAASABYAAAAAAAAAAAARABYAAAAAAAAAAAAQABYAAAAAAAAAAAAPABYAAAAAAAAAAAAOABYAAAAAAAAAAAAOABcAAAAAAAAAAAAPABcAAAAAAAAAAAAQABcAAAAAAAAAAAARABcAAAAAAAAAAAASABcAAAAAAAAAAAATABcAAAAAAAAAAAAOABkAAAAAAAAAAAAPABkAAAAAAAAAAAAQABkAAAAAAAAAAAARABkAAAAAAAAAAAASABkAAAAAAAAAAAATABkAAAAAAAAAAAAUABkAAAAAAAAAAAA=")
|
|
||||||
tile_set = SubResource("TileSet_xqlka")
|
|
||||||
|
|
||||||
[node name="Secret" type="TileMapLayer" parent="."]
|
|
||||||
use_parent_material = true
|
|
||||||
tile_map_data = PackedByteArray("AAAOABoAAAAAAAAAAAAOABsAAAAAAAAAAAAOABwAAAAAAAAAAAAPABoAAAAAAAAAAAAPABsAAAAAAAAAAAAPABwAAAAAAAAAAAAQABoAAAAAAAAAAAAQABsAAAAAAAAAAAAQABwAAAAAAAAAAAARABoAAAAAAAAAAAARABsAAAAAAAAAAAARABwAAAAAAAAAAAASABoAAAAAAAAAAAASABsAAAAAAAAAAAASABwAAAAAAAAAAAATABoAAAAAAAAAAAATABsAAAAAAAAAAAATABwAAAAAAAAAAAAUABoAAAAAAAAAAAAUABsAAAAAAAAAAAAUABwAAAAAAAAAAAA=")
|
|
||||||
tile_set = SubResource("TileSet_xqlka")
|
|
||||||
script = ExtResource("2_q8fhk")
|
|
||||||
|
|
||||||
[node name="Camera2D" type="Camera2D" parent="."]
|
|
||||||
offset = Vector2(265, 247)
|
|
||||||
|
|
||||||
[node name="Player" parent="." instance=ExtResource("3")]
|
|
||||||
position = Vector2(120, 456)
|
|
||||||
|
|
||||||
[node name="SecretDetector" type="Area2D" parent="."]
|
|
||||||
position = Vector2(280, 440)
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="SecretDetector"]
|
|
||||||
shape = SubResource("RectangleShape2D_a2gec")
|
|
||||||
|
|
||||||
[connection signal="body_entered" from="SecretDetector" to="Secret" method="_on_secret_detector_body_entered"]
|
|
||||||
[connection signal="body_exited" from="SecretDetector" to="Secret" method="_on_secret_detector_body_exited"]
|
|
||||||
@@ -1,87 +1,60 @@
|
|||||||
[gd_scene load_steps=9 format=3 uid="uid://dmn8nkpogiwsf"]
|
[gd_scene load_steps=6 format=2]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://bpdyvy2681m3i" path="res://player/Player.tscn" id="1"]
|
[ext_resource path="res://player/Player.tscn" type="PackedScene" id=1]
|
||||||
[ext_resource type="FontFile" uid="uid://b5bspum6ffekd" path="res://fonts/SourceCodePro-Bold.ttf" id="2_r1c5f"]
|
[ext_resource path="res://fonts/source_code_pro_explanations.tres" type="DynamicFont" id=2]
|
||||||
[ext_resource type="PackedScene" uid="uid://cvi13chv8g4hj" path="res://debug/StatesStackDiplayer.tscn" id="3"]
|
[ext_resource path="res://debug/StatesStackDiplayer.tscn" type="PackedScene" id=3]
|
||||||
[ext_resource type="PackedScene" uid="uid://bq6rrfy53rfvo" path="res://debug/ControlsPanel.tscn" id="4"]
|
[ext_resource path="res://debug/ControlsPanel.tscn" type="PackedScene" id=4]
|
||||||
|
[ext_resource path="res://fonts/source_code_pro_explanations_bold.tres" type="DynamicFont" id=5]
|
||||||
[sub_resource type="Animation" id="1"]
|
|
||||||
|
|
||||||
[sub_resource type="Animation" id="2"]
|
|
||||||
length = 0.6
|
|
||||||
tracks/0/type = "value"
|
|
||||||
tracks/0/imported = false
|
|
||||||
tracks/0/enabled = true
|
|
||||||
tracks/0/path = NodePath("BodyPivot/Body:modulate")
|
|
||||||
tracks/0/interp = 1
|
|
||||||
tracks/0/loop_wrap = true
|
|
||||||
tracks/0/keys = {
|
|
||||||
"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.4),
|
|
||||||
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1),
|
|
||||||
"update": 0,
|
|
||||||
"values": [Color(1, 1, 1, 1), Color(1, 0, 0, 1), Color(1, 1, 1, 1), Color(1, 0, 0, 1), Color(1, 1, 1, 1), Color(1, 0, 0, 1), Color(1, 1, 1, 1)]
|
|
||||||
}
|
|
||||||
|
|
||||||
[sub_resource type="Animation" id="3"]
|
|
||||||
|
|
||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_qbwwp"]
|
|
||||||
_data = {
|
|
||||||
"idle": SubResource("1"),
|
|
||||||
"stagger": SubResource("2"),
|
|
||||||
"walk": SubResource("3")
|
|
||||||
}
|
|
||||||
|
|
||||||
[node name="Demo" type="Node"]
|
[node name="Demo" type="Node"]
|
||||||
|
|
||||||
[node name="Player" parent="." instance=ExtResource("1")]
|
[node name="Player" parent="." instance=ExtResource( 1 )]
|
||||||
position = Vector2(640, 400)
|
position = Vector2( 640, 400 )
|
||||||
|
|
||||||
[node name="StateMachine" parent="Player" index="0"]
|
|
||||||
start_state = NodePath("Idle")
|
|
||||||
|
|
||||||
[node name="AnimationPlayer" parent="Player" index="1"]
|
|
||||||
libraries = {
|
|
||||||
"": SubResource("AnimationLibrary_qbwwp")
|
|
||||||
}
|
|
||||||
|
|
||||||
[node name="StateNameDisplayer" parent="Player" index="5"]
|
|
||||||
theme_override_fonts/font = ExtResource("2_r1c5f")
|
|
||||||
|
|
||||||
[node name="Explanations" type="RichTextLabel" parent="."]
|
[node name="Explanations" type="RichTextLabel" parent="."]
|
||||||
anchors_preset = 15
|
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
offset_left = 10.0
|
margin_left = 10.0
|
||||||
offset_top = -370.0
|
margin_top = -370.0
|
||||||
offset_right = -10.0
|
margin_right = -10.0
|
||||||
offset_bottom = -730.0
|
margin_bottom = -730.0
|
||||||
grow_horizontal = 2
|
rect_clip_content = false
|
||||||
grow_vertical = 2
|
|
||||||
size_flags_vertical = 4
|
|
||||||
mouse_filter = 2
|
mouse_filter = 2
|
||||||
|
size_flags_vertical = 4
|
||||||
|
custom_fonts/bold_font = ExtResource( 5 )
|
||||||
|
custom_fonts/normal_font = ExtResource( 2 )
|
||||||
bbcode_enabled = true
|
bbcode_enabled = true
|
||||||
|
bbcode_text = "This example shows how to apply the State programming pattern in GDScript, including Hierarchical States, and a pushdown automaton.
|
||||||
|
|
||||||
|
States are common in games. You can use the pattern to:
|
||||||
|
|
||||||
|
1. Separate each behavior and transitions between behaviors, thus make scripts shorter and easier to manage
|
||||||
|
2. Respect the Single Responsibility Principle. Each State object represents [b]one[/b] action
|
||||||
|
3. Improve your code's structure. Look at the scene tree and FileSystem tab: without looking at the code, you'll know what the Player can or cannot do.
|
||||||
|
|
||||||
|
You can read more about States in the excellent [url=http://gameprogrammingpatterns.com/state.html]Game Programming Patterns ebook[/url]."
|
||||||
text = "This example shows how to apply the State programming pattern in GDScript, including Hierarchical States, and a pushdown automaton.
|
text = "This example shows how to apply the State programming pattern in GDScript, including Hierarchical States, and a pushdown automaton.
|
||||||
|
|
||||||
States are common in games. You can use the pattern to:
|
States are common in games. You can use the pattern to:
|
||||||
|
|
||||||
1. Separate each behavior and transitions between behaviors, thus make scripts shorter and easier to manage.
|
1. Separate each behavior and transitions between behaviors, thus make scripts shorter and easier to manage
|
||||||
2. Respect the Single Responsibility Principle. Each State object represents one action.
|
2. Respect the Single Responsibility Principle. Each State object represents one action
|
||||||
3. Improve your code's structure. Look at the scene tree and FileSystem tab: without looking at the code, you'll know what the Player can or cannot do.
|
3. Improve your code's structure. Look at the scene tree and FileSystem tab: without looking at the code, you'll know what the Player can or cannot do.
|
||||||
|
|
||||||
You can read more about States in the excellent Game Programming Patterns ebook."
|
You can read more about States in the excellent Game Programming Patterns ebook."
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_lock_": true
|
||||||
|
}
|
||||||
|
|
||||||
[node name="Control" type="Control" parent="."]
|
[node name="Control" type="Control" parent="."]
|
||||||
layout_mode = 3
|
|
||||||
anchors_preset = 15
|
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
grow_horizontal = 2
|
__meta__ = {
|
||||||
grow_vertical = 2
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
[node name="StatesStackDiplayer" parent="Control" instance=ExtResource("3")]
|
[node name="StatesStackDiplayer" parent="Control" instance=ExtResource( 3 )]
|
||||||
layout_mode = 0
|
|
||||||
|
|
||||||
[node name="ControlsPanel" parent="Control" instance=ExtResource("4")]
|
[node name="ControlsPanel" parent="Control" instance=ExtResource( 4 )]
|
||||||
layout_mode = 1
|
|
||||||
|
|
||||||
[editable path="Player"]
|
[editable path="Player"]
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ pushdown automaton.
|
|||||||
|
|
||||||
Language: GDScript
|
Language: GDScript
|
||||||
|
|
||||||
Renderer: Compatibility
|
Renderer: GLES 2
|
||||||
|
|
||||||
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/2714
|
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/516
|
||||||
|
|
||||||
## Why use a state machine
|
## Why use a state machine
|
||||||
|
|
||||||
|
|||||||
@@ -1,41 +1,41 @@
|
|||||||
[gd_scene format=3 uid="uid://bq6rrfy53rfvo"]
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://fonts/source_code_pro_explanations.tres" type="DynamicFont" id=1]
|
||||||
|
|
||||||
[node name="ControlsPanel" type="Panel"]
|
[node name="ControlsPanel" type="Panel"]
|
||||||
anchors_preset = 1
|
|
||||||
anchor_left = 1.0
|
anchor_left = 1.0
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
offset_left = -150.0
|
margin_left = -220.0
|
||||||
offset_bottom = 171.0
|
margin_bottom = 170.0
|
||||||
grow_horizontal = 0
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
[node name="HBoxContainer" type="HBoxContainer" parent="."]
|
[node name="Keys" type="Label" parent="."]
|
||||||
layout_mode = 1
|
anchor_right = 1.0
|
||||||
anchors_preset = 8
|
anchor_bottom = 1.0
|
||||||
anchor_left = 0.5
|
margin_left = 10.0
|
||||||
anchor_top = 0.5
|
margin_top = 10.0
|
||||||
anchor_right = 0.5
|
margin_right = -10.0
|
||||||
anchor_bottom = 0.5
|
margin_bottom = -10.0
|
||||||
offset_left = -56.5
|
custom_fonts/font = ExtResource( 1 )
|
||||||
offset_top = -65.0
|
text = "Shoot:
|
||||||
offset_right = 56.5
|
|
||||||
offset_bottom = 65.0
|
|
||||||
grow_horizontal = 2
|
|
||||||
grow_vertical = 2
|
|
||||||
|
|
||||||
[node name="Actions" type="Label" parent="HBoxContainer"]
|
|
||||||
layout_mode = 2
|
|
||||||
text = "Move:
|
|
||||||
Shoot:
|
|
||||||
Attack:
|
Attack:
|
||||||
Stagger:
|
Stagger:
|
||||||
Jump:
|
Jump:
|
||||||
Sprint:"
|
Sprint:"
|
||||||
|
|
||||||
[node name="Keys" type="Label" parent="HBoxContainer"]
|
[node name="Keys2" type="Label" parent="."]
|
||||||
layout_mode = 2
|
anchor_right = 1.0
|
||||||
text = "WASD
|
anchor_bottom = 1.0
|
||||||
R
|
margin_left = 10.0
|
||||||
|
margin_top = 10.0
|
||||||
|
margin_right = -10.0
|
||||||
|
margin_bottom = -10.0
|
||||||
|
custom_fonts/font = ExtResource( 1 )
|
||||||
|
text = "R
|
||||||
F
|
F
|
||||||
X
|
X
|
||||||
Space
|
Space
|
||||||
Shift"
|
Shift"
|
||||||
|
align = 2
|
||||||
|
|||||||
@@ -1,16 +1,30 @@
|
|||||||
[gd_scene format=3 uid="uid://bywptem1jb35a"]
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://fonts/source_code_pro_explanations_bold.tres" type="DynamicFont" id=1]
|
||||||
|
[ext_resource path="res://fonts/source_code_pro_explanations.tres" type="DynamicFont" id=2]
|
||||||
|
|
||||||
[node name="Explanations" type="RichTextLabel"]
|
[node name="Explanations" type="RichTextLabel"]
|
||||||
anchors_preset = 15
|
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
offset_left = 10.0
|
margin_left = 10.0
|
||||||
offset_top = -370.0
|
margin_top = -370.0
|
||||||
offset_right = -10.0
|
margin_right = -10.0
|
||||||
offset_bottom = -730.0
|
margin_bottom = -730.0
|
||||||
size_flags_vertical = 4
|
rect_clip_content = false
|
||||||
mouse_filter = 2
|
mouse_filter = 2
|
||||||
|
size_flags_vertical = 4
|
||||||
|
custom_fonts/bold_font = ExtResource( 1 )
|
||||||
|
custom_fonts/normal_font = ExtResource( 2 )
|
||||||
bbcode_enabled = true
|
bbcode_enabled = true
|
||||||
|
bbcode_text = "This example shows how to apply the State programming pattern in GDscript, including Hierarchical States, and a pushdown automaton.
|
||||||
|
|
||||||
|
States are common in games. You can use the pattern to:
|
||||||
|
|
||||||
|
1. Separate each behavior and transitions between behaviors, thus make scripts shorter and easier to manage
|
||||||
|
2. Respect the Single Responsibility Principle. Each State object represents [b]one[/b] action
|
||||||
|
3. Improve your code's structure. Look at the scene tree and FileSystem tab: without looking at the code, you'll know what the Player can or cannot do.
|
||||||
|
|
||||||
|
You can read more about States in the excellent [url=http://gameprogrammingpatterns.com/state.html]Game Programming Patterns ebook[/url]."
|
||||||
text = "This example shows how to apply the State programming pattern in GDscript, including Hierarchical States, and a pushdown automaton.
|
text = "This example shows how to apply the State programming pattern in GDscript, including Hierarchical States, and a pushdown automaton.
|
||||||
|
|
||||||
States are common in games. You can use the pattern to:
|
States are common in games. You can use the pattern to:
|
||||||
@@ -20,3 +34,6 @@ States are common in games. You can use the pattern to:
|
|||||||
3. Improve your code's structure. Look at the scene tree and FileSystem tab: without looking at the code, you'll know what the Player can or cannot do.
|
3. Improve your code's structure. Look at the scene tree and FileSystem tab: without looking at the code, you'll know what the Player can or cannot do.
|
||||||
|
|
||||||
You can read more about States in the excellent Game Programming Patterns ebook."
|
You can read more about States in the excellent Game Programming Patterns ebook."
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_lock_": true
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,41 +1,48 @@
|
|||||||
[gd_scene load_steps=3 format=3 uid="uid://cvi13chv8g4hj"]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://debug/states_stack_displayer.gd" id="1"]
|
[ext_resource path="res://debug/states_stack_displayer.gd" type="Script" id=1]
|
||||||
[ext_resource type="FontFile" uid="uid://b5bspum6ffekd" path="res://fonts/SourceCodePro-Bold.ttf" id="2_58if7"]
|
[ext_resource path="res://fonts/SourceCodePro-Bold.ttf" type="DynamicFontData" id=2]
|
||||||
|
|
||||||
|
[sub_resource type="DynamicFont" id=1]
|
||||||
|
size = 20
|
||||||
|
use_filter = true
|
||||||
|
font_data = ExtResource( 2 )
|
||||||
|
|
||||||
[node name="StatesStackDiplayer" type="Panel"]
|
[node name="StatesStackDiplayer" type="Panel"]
|
||||||
offset_right = 210.0
|
margin_right = 210.0
|
||||||
offset_bottom = 170.0
|
margin_bottom = 170.0
|
||||||
script = ExtResource("1")
|
script = ExtResource( 1 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_group_": true
|
||||||
|
}
|
||||||
|
|
||||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
[node name="Title" type="Label" parent="."]
|
||||||
layout_mode = 1
|
anchor_left = 0.5
|
||||||
anchors_preset = 15
|
anchor_right = 0.5
|
||||||
anchor_right = 1.0
|
margin_left = -105.0
|
||||||
anchor_bottom = 1.0
|
margin_right = 105.0
|
||||||
grow_horizontal = 2
|
margin_bottom = 40.0
|
||||||
grow_vertical = 2
|
custom_fonts/font = SubResource( 1 )
|
||||||
|
text = "Pushown"
|
||||||
[node name="Title" type="Label" parent="VBoxContainer"]
|
align = 1
|
||||||
layout_mode = 2
|
valign = 1
|
||||||
theme_override_fonts/font = ExtResource("2_58if7")
|
|
||||||
text = "StateStack"
|
|
||||||
uppercase = true
|
uppercase = true
|
||||||
|
|
||||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
|
[node name="States" type="Label" parent="."]
|
||||||
layout_mode = 2
|
margin_left = 20.0
|
||||||
|
margin_top = 50.0
|
||||||
[node name="Numbers" type="Label" parent="VBoxContainer/HBoxContainer"]
|
margin_right = 190.0
|
||||||
unique_name_in_owner = true
|
margin_bottom = 170.0
|
||||||
layout_mode = 2
|
custom_fonts/font = SubResource( 1 )
|
||||||
theme_override_fonts/font = ExtResource("2_58if7")
|
|
||||||
text = "1.
|
|
||||||
2."
|
|
||||||
horizontal_alignment = 2
|
|
||||||
|
|
||||||
[node name="States" type="Label" parent="VBoxContainer/HBoxContainer"]
|
|
||||||
unique_name_in_owner = true
|
|
||||||
layout_mode = 2
|
|
||||||
theme_override_fonts/font = ExtResource("2_58if7")
|
|
||||||
text = "Jump
|
text = "Jump
|
||||||
Test"
|
Test"
|
||||||
|
align = 1
|
||||||
|
|
||||||
|
[node name="Numbers" type="Label" parent="."]
|
||||||
|
margin_left = 20.0
|
||||||
|
margin_top = 50.0
|
||||||
|
margin_right = 190.0
|
||||||
|
margin_bottom = 170.0
|
||||||
|
custom_fonts/font = SubResource( 1 )
|
||||||
|
text = "1.
|
||||||
|
2."
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
extends Panel
|
extends Panel
|
||||||
|
|
||||||
@onready var fsm_node: Node = get_node(^"../../Player/StateMachine")
|
onready var fsm_node = get_node("../../Player/StateMachine")
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta):
|
||||||
var states_names := ""
|
var states_names = ""
|
||||||
var numbers := ""
|
var numbers = ""
|
||||||
var index := 0
|
var index = 0
|
||||||
|
for state in fsm_node.states_stack:
|
||||||
for state: Node in fsm_node.states_stack:
|
states_names += String(state.get_name()) + "\n"
|
||||||
states_names += String(state.name) + "\n"
|
|
||||||
numbers += str(index) + "\n"
|
numbers += str(index) + "\n"
|
||||||
index += 1
|
index += 1
|
||||||
|
$States.text = states_names
|
||||||
%States.text = states_names
|
$Numbers.text = numbers
|
||||||
%Numbers.text = numbers
|
|
||||||
|
|||||||
BIN
2d/finite_state_machine/fonts/SourceCodePro-Black.ttf
Normal file
@@ -1,33 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="font_data_dynamic"
|
|
||||||
type="FontFile"
|
|
||||||
uid="uid://b5bspum6ffekd"
|
|
||||||
path="res://.godot/imported/SourceCodePro-Bold.ttf-bf03bd9c90603419d32725fc00754bf7.fontdata"
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://fonts/SourceCodePro-Bold.ttf"
|
|
||||||
dest_files=["res://.godot/imported/SourceCodePro-Bold.ttf-bf03bd9c90603419d32725fc00754bf7.fontdata"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
Rendering=null
|
|
||||||
antialiasing=1
|
|
||||||
generate_mipmaps=false
|
|
||||||
multichannel_signed_distance_field=false
|
|
||||||
msdf_pixel_range=8
|
|
||||||
msdf_size=48
|
|
||||||
allow_system_fallback=true
|
|
||||||
force_autohinter=false
|
|
||||||
hinting=1
|
|
||||||
subpixel_positioning=1
|
|
||||||
oversampling=0.0
|
|
||||||
Fallbacks=null
|
|
||||||
fallbacks=[]
|
|
||||||
Compress=null
|
|
||||||
compress=true
|
|
||||||
preload=[]
|
|
||||||
language_support={}
|
|
||||||
script_support={}
|
|
||||||
opentype_features={}
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[gd_resource type="DynamicFont" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://fonts/SourceCodePro-Bold.ttf" type="DynamicFontData" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
|
||||||
|
size = 20
|
||||||
|
use_mipmaps = false
|
||||||
|
use_filter = true
|
||||||
|
font_data = ExtResource( 1 )
|
||||||
|
_sections_unfolded = [ "Font", "Settings" ]
|
||||||
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[gd_resource type="DynamicFont" load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://fonts/SourceCodePro-Black.ttf" type="DynamicFontData" id=1]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
|
||||||
|
size = 24
|
||||||
|
use_mipmaps = false
|
||||||
|
use_filter = true
|
||||||
|
font_data = ExtResource( 1 )
|
||||||
|
_sections_unfolded = [ "Font", "Settings" ]
|
||||||
|
|
||||||
BIN
2d/finite_state_machine/icon.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
34
2d/finite_state_machine/icon.png.import
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://icon.png"
|
||||||
|
dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=true
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
process/invert_color=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,34 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://brwp8bimc75uu"
|
|
||||||
path="res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"
|
|
||||||
metadata={
|
|
||||||
"vram_texture": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://icon.webp"
|
|
||||||
dest_files=["res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.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
|
|
||||||
@@ -1,118 +1,122 @@
|
|||||||
[gd_scene load_steps=19 format=3 uid="uid://bpdyvy2681m3i"]
|
[gd_scene load_steps=20 format=2]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://player/player_controller.gd" id="1"]
|
[ext_resource path="res://player/player_controller.gd" type="Script" id=1]
|
||||||
[ext_resource type="Script" path="res://player/player_state_machine.gd" id="2"]
|
[ext_resource path="res://player/player_state_machine.gd" type="Script" id=2]
|
||||||
[ext_resource type="Script" path="res://player/states/motion/on_ground/idle.gd" id="3"]
|
[ext_resource path="res://player/states/motion/on_ground/idle.gd" type="Script" id=3]
|
||||||
[ext_resource type="Script" path="res://player/states/motion/on_ground/move.gd" id="4"]
|
[ext_resource path="res://player/states/motion/on_ground/move.gd" type="Script" id=4]
|
||||||
[ext_resource type="Script" path="res://player/states/motion/in_air/jump.gd" id="5"]
|
[ext_resource path="res://player/states/motion/in_air/jump.gd" type="Script" id=5]
|
||||||
[ext_resource type="Script" path="res://player/states/combat/stagger.gd" id="6"]
|
[ext_resource path="res://player/states/combat/stagger.gd" type="Script" id=6]
|
||||||
[ext_resource type="Script" path="res://player/states/combat/attack.gd" id="7"]
|
[ext_resource path="res://player/states/combat/attack.gd" type="Script" id=7]
|
||||||
[ext_resource type="Script" path="res://player/states/die.gd" id="8"]
|
[ext_resource path="res://player/states/die.gd" type="Script" id=8]
|
||||||
[ext_resource type="Texture2D" uid="uid://eds33w28pilu" path="res://player/shadow.png" id="9"]
|
[ext_resource path="res://player/shadow.png" type="Texture" id=9]
|
||||||
[ext_resource type="Texture2D" uid="uid://ds53oxkqrcumd" path="res://player/body.png" id="10"]
|
[ext_resource path="res://player/body.png" type="Texture" id=10]
|
||||||
[ext_resource type="Script" path="res://player/bullet/bullet_spawner.gd" id="11"]
|
[ext_resource path="res://player/bullet/bullet_spawner.gd" type="Script" id=11]
|
||||||
[ext_resource type="Script" path="res://player/weapon/weapon_pivot.gd" id="12"]
|
[ext_resource path="res://player/weapon/weapon_pivot.gd" type="Script" id=12]
|
||||||
[ext_resource type="PackedScene" uid="uid://cdacdp11r3jua" path="res://player/weapon/Sword.tscn" id="13"]
|
[ext_resource path="res://player/weapon/Sword.tscn" type="PackedScene" id=13]
|
||||||
[ext_resource type="Script" path="res://player/states/debug/state_name_displayer.gd" id="15"]
|
[ext_resource path="res://fonts/SourceCodePro-Bold.ttf" type="DynamicFontData" id=14]
|
||||||
|
[ext_resource path="res://player/states/debug/state_name_displayer.gd" type="Script" id=15]
|
||||||
|
|
||||||
[sub_resource type="Animation" id="1"]
|
[sub_resource type="Animation" id=1]
|
||||||
|
|
||||||
[sub_resource type="Animation" id="2"]
|
[sub_resource type="Animation" id=2]
|
||||||
length = 0.6
|
length = 0.6
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
|
||||||
tracks/0/enabled = true
|
|
||||||
tracks/0/path = NodePath("BodyPivot/Body:modulate")
|
tracks/0/path = NodePath("BodyPivot/Body:modulate")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.4),
|
"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.4 ),
|
||||||
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1),
|
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [Color(1, 1, 1, 1), Color(1, 0, 0, 1), Color(1, 1, 1, 1), Color(1, 0, 0, 1), Color(1, 1, 1, 1), Color(1, 0, 0, 1), Color(1, 1, 1, 1)]
|
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 0, 0, 1 ), Color( 1, 1, 1, 1 ) ]
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="3"]
|
[sub_resource type="Animation" id=3]
|
||||||
|
|
||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_vi1hn"]
|
[sub_resource type="DynamicFont" id=4]
|
||||||
_data = {
|
size = 20
|
||||||
"idle": SubResource("1"),
|
use_filter = true
|
||||||
"stagger": SubResource("2"),
|
font_data = ExtResource( 14 )
|
||||||
"walk": SubResource("3")
|
|
||||||
|
[node name="Player" type="KinematicBody2D"]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_horizontal_guides_": [ ]
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="Player" type="CharacterBody2D"]
|
|
||||||
script = ExtResource("1")
|
|
||||||
|
|
||||||
[node name="StateMachine" type="Node" parent="."]
|
[node name="StateMachine" type="Node" parent="."]
|
||||||
script = ExtResource("2")
|
script = ExtResource( 2 )
|
||||||
|
|
||||||
[node name="Idle" type="Node" parent="StateMachine"]
|
[node name="Idle" type="Node" parent="StateMachine"]
|
||||||
script = ExtResource("3")
|
script = ExtResource( 3 )
|
||||||
|
|
||||||
[node name="Move" type="Node" parent="StateMachine"]
|
[node name="Move" type="Node" parent="StateMachine"]
|
||||||
script = ExtResource("4")
|
script = ExtResource( 4 )
|
||||||
|
|
||||||
[node name="Jump" type="Node" parent="StateMachine"]
|
[node name="Jump" type="Node" parent="StateMachine"]
|
||||||
script = ExtResource("5")
|
script = ExtResource( 5 )
|
||||||
|
|
||||||
[node name="Stagger" type="Node" parent="StateMachine"]
|
[node name="Stagger" type="Node" parent="StateMachine"]
|
||||||
script = ExtResource("6")
|
script = ExtResource( 6 )
|
||||||
|
|
||||||
[node name="Attack" type="Node" parent="StateMachine"]
|
[node name="Attack" type="Node" parent="StateMachine"]
|
||||||
script = ExtResource("7")
|
script = ExtResource( 7 )
|
||||||
|
|
||||||
[node name="Die" type="Node" parent="StateMachine"]
|
[node name="Die" type="Node" parent="StateMachine"]
|
||||||
script = ExtResource("8")
|
script = ExtResource( 8 )
|
||||||
|
|
||||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||||
libraries = {
|
anims/idle = SubResource( 1 )
|
||||||
"": SubResource("AnimationLibrary_vi1hn")
|
anims/stagger = SubResource( 2 )
|
||||||
}
|
anims/walk = SubResource( 3 )
|
||||||
|
|
||||||
[node name="Shadow" type="Sprite2D" parent="."]
|
[node name="Shadow" type="Sprite" parent="."]
|
||||||
self_modulate = Color(1, 1, 1, 0.361098)
|
self_modulate = Color( 1, 1, 1, 0.361098 )
|
||||||
position = Vector2(0, -4)
|
position = Vector2( 0, -4 )
|
||||||
texture = ExtResource("9")
|
texture = ExtResource( 9 )
|
||||||
|
|
||||||
[node name="BodyPivot" type="Marker2D" parent="."]
|
[node name="BodyPivot" type="Position2D" parent="."]
|
||||||
|
|
||||||
[node name="Body" type="Sprite2D" parent="BodyPivot"]
|
[node name="Body" type="Sprite" parent="BodyPivot"]
|
||||||
position = Vector2(0, -58)
|
position = Vector2( 0, -58 )
|
||||||
texture = ExtResource("10")
|
texture = ExtResource( 10 )
|
||||||
|
|
||||||
[node name="BulletSpawn" type="Node2D" parent="BodyPivot"]
|
[node name="BulletSpawn" type="Node2D" parent="BodyPivot"]
|
||||||
position = Vector2(0, -58)
|
position = Vector2( 0, -58 )
|
||||||
script = ExtResource("11")
|
script = ExtResource( 11 )
|
||||||
|
|
||||||
[node name="CooldownTimer" type="Timer" parent="BodyPivot/BulletSpawn"]
|
[node name="CooldownTimer" type="Timer" parent="BodyPivot/BulletSpawn"]
|
||||||
wait_time = 0.2
|
wait_time = 0.2
|
||||||
one_shot = true
|
one_shot = true
|
||||||
|
|
||||||
[node name="WeaponPivot" type="Marker2D" parent="BodyPivot"]
|
[node name="WeaponPivot" type="Position2D" parent="BodyPivot"]
|
||||||
position = Vector2(0, -58)
|
position = Vector2( 0, -58 )
|
||||||
script = ExtResource("12")
|
script = ExtResource( 12 )
|
||||||
|
|
||||||
[node name="Offset" type="Marker2D" parent="BodyPivot/WeaponPivot"]
|
[node name="Offset" type="Position2D" parent="BodyPivot/WeaponPivot"]
|
||||||
position = Vector2(110, 0)
|
position = Vector2( 110, 0 )
|
||||||
|
|
||||||
[node name="Sword" parent="BodyPivot/WeaponPivot/Offset" instance=ExtResource("13")]
|
[node name="Sword" parent="BodyPivot/WeaponPivot/Offset" instance=ExtResource( 13 )]
|
||||||
|
|
||||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
|
||||||
polygon = PackedVector2Array(-20, 0, -20, -20, 20, -20, 20, 0)
|
polygon = PoolVector2Array( -20, 0, -20, -20, 20, -20, 20, 0 )
|
||||||
|
|
||||||
[node name="StateNameDisplayer" type="Label" parent="."]
|
[node name="StateNameDisplayer" type="Label" parent="."]
|
||||||
offset_left = -109.0
|
margin_left = -109.0
|
||||||
offset_top = -180.0
|
margin_top = -172.0
|
||||||
offset_right = 110.0
|
margin_right = 110.0
|
||||||
offset_bottom = -143.0
|
margin_bottom = -138.0
|
||||||
theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
|
custom_fonts/font = SubResource( 4 )
|
||||||
theme_override_constants/outline_size = 8
|
|
||||||
theme_override_font_sizes/font_size = 24
|
|
||||||
text = "Idle"
|
text = "Idle"
|
||||||
horizontal_alignment = 1
|
align = 1
|
||||||
|
valign = 1
|
||||||
uppercase = true
|
uppercase = true
|
||||||
script = ExtResource("15")
|
script = ExtResource( 15 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
[connection signal="state_changed" from="StateMachine" to="BodyPivot/WeaponPivot/Offset/Sword" method="_on_StateMachine_state_changed"]
|
[connection signal="state_changed" from="StateMachine" to="BodyPivot/WeaponPivot/Offset/Sword" method="_on_StateMachine_state_changed"]
|
||||||
[connection signal="state_changed" from="StateMachine" to="StateNameDisplayer" method="_on_StateMachine_state_changed"]
|
[connection signal="state_changed" from="StateMachine" to="StateNameDisplayer" method="_on_StateMachine_state_changed"]
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://ds53oxkqrcumd"
|
path="res://.import/body.png-313f6363670a5852a7b7126ab476d8b1.stex"
|
||||||
path="res://.godot/imported/body.png-313f6363670a5852a7b7126ab476d8b1.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://player/body.png"
|
source_file="res://player/body.png"
|
||||||
dest_files=["res://.godot/imported/body.png-313f6363670a5852a7b7126ab476d8b1.ctex"]
|
dest_files=[ "res://.import/body.png-313f6363670a5852a7b7126ab476d8b1.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=true
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
[gd_scene load_steps=3 format=3 uid="uid://b6uru8lfx45ma"]
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://player/bullet/bullet.gd" id="1"]
|
[ext_resource path="res://player/bullet/bullet.gd" type="Script" id=1]
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id="1"]
|
[sub_resource type="CircleShape2D" id=1]
|
||||||
radius = 12.0
|
radius = 12.0
|
||||||
|
|
||||||
[node name="Bullet" type="CharacterBody2D"]
|
[node name="Bullet" type="KinematicBody2D"]
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
script = ExtResource("1")
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||||
shape = SubResource("1")
|
shape = SubResource( 1 )
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
extends CharacterBody2D
|
extends KinematicBody2D
|
||||||
|
|
||||||
var direction := Vector2()
|
var direction = Vector2()
|
||||||
@export var speed := 1000.0
|
export(float) var speed = 1000.0
|
||||||
|
|
||||||
@onready var root := get_tree().root
|
onready var root = get_tree().root
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready():
|
||||||
set_as_top_level(true)
|
set_as_toplevel(true)
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta):
|
||||||
if not root.get_visible_rect().has_point(position):
|
if not root.get_visible_rect().has_point(position):
|
||||||
queue_free()
|
queue_free()
|
||||||
|
|
||||||
var motion := direction * speed * delta
|
var motion = direction * speed * delta
|
||||||
var collision_info := move_and_collide(motion)
|
var collision_info = move_and_collide(motion)
|
||||||
if collision_info:
|
if collision_info:
|
||||||
queue_free()
|
queue_free()
|
||||||
|
|
||||||
|
|
||||||
func _draw() -> void:
|
func _draw():
|
||||||
draw_circle(Vector2(), $CollisionShape2D.shape.radius, Color.WHITE)
|
draw_circle(Vector2(), $CollisionShape2D.shape.radius, Color.white)
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
extends Node2D
|
extends Node2D
|
||||||
|
|
||||||
var bullet := preload("Bullet.tscn")
|
var bullet = preload("Bullet.tscn")
|
||||||
|
|
||||||
func _unhandled_input(event: InputEvent) -> void:
|
func _unhandled_input(event):
|
||||||
if event.is_action_pressed("fire"):
|
if event.is_action_pressed("fire"):
|
||||||
fire()
|
fire()
|
||||||
|
|
||||||
|
|
||||||
func fire() -> void:
|
func fire():
|
||||||
if not $CooldownTimer.is_stopped():
|
if not $CooldownTimer.is_stopped():
|
||||||
return
|
return
|
||||||
|
|
||||||
$CooldownTimer.start()
|
$CooldownTimer.start()
|
||||||
var new_bullet := bullet.instantiate()
|
var new_bullet = bullet.instance()
|
||||||
add_child(new_bullet)
|
add_child(new_bullet)
|
||||||
new_bullet.position = global_position
|
new_bullet.position = global_position
|
||||||
new_bullet.direction = owner.look_direction
|
new_bullet.direction = owner.look_direction
|
||||||
|
|||||||
@@ -1,28 +1,25 @@
|
|||||||
extends CharacterBody2D
|
extends KinematicBody2D
|
||||||
# The Player is a CharacterBody2D, in other words a physics-driven object.
|
# The Player is a KinematicBody2D, in other words a physics-driven object.
|
||||||
# It can move, collide with the world, etc...
|
# It can move, collide with the world, etc...
|
||||||
# The player has a state machine, but the body and the state machine are separate.
|
# The player has a state machine, but the body and the state machine are separate.
|
||||||
|
|
||||||
signal direction_changed(new_direction: Vector2)
|
signal direction_changed(new_direction)
|
||||||
|
|
||||||
var look_direction := Vector2.RIGHT:
|
var look_direction = Vector2.RIGHT setget set_look_direction
|
||||||
set(value):
|
|
||||||
look_direction = value
|
|
||||||
set_look_direction(value)
|
|
||||||
|
|
||||||
func take_damage(attacker: Node, amount: float, effect: Node = null) -> void:
|
func take_damage(attacker, amount, effect = null):
|
||||||
if is_ancestor_of(attacker):
|
if is_a_parent_of(attacker):
|
||||||
return
|
return
|
||||||
|
|
||||||
$States/Stagger.knockback_direction = (attacker.global_position - global_position).normalized()
|
$States/Stagger.knockback_direction = (attacker.global_position - global_position).normalized()
|
||||||
$Health.take_damage(amount, effect)
|
$Health.take_damage(amount, effect)
|
||||||
|
|
||||||
|
|
||||||
func set_dead(value: bool) -> void:
|
func set_dead(value):
|
||||||
set_process_input(not value)
|
set_process_input(not value)
|
||||||
set_physics_process(not value)
|
set_physics_process(not value)
|
||||||
$CollisionPolygon2D.disabled = value
|
$CollisionPolygon2D.disabled = value
|
||||||
|
|
||||||
|
|
||||||
func set_look_direction(value: Vector2) -> void:
|
func set_look_direction(value):
|
||||||
direction_changed.emit(value)
|
look_direction = value
|
||||||
|
emit_signal("direction_changed", value)
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
extends "res://state_machine/state_machine.gd"
|
extends "res://state_machine/state_machine.gd"
|
||||||
|
|
||||||
@onready var idle: Node = $Idle
|
onready var idle = $Idle
|
||||||
@onready var move: Node = $Move
|
onready var move = $Move
|
||||||
@onready var jump: Node = $Jump
|
onready var jump = $Jump
|
||||||
@onready var stagger: Node = $Stagger
|
onready var stagger = $Stagger
|
||||||
@onready var attack: Node = $Attack
|
onready var attack = $Attack
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready():
|
||||||
states_map = {
|
states_map = {
|
||||||
"idle": idle,
|
"idle": idle,
|
||||||
"move": move,
|
"move": move,
|
||||||
@@ -16,7 +16,7 @@ func _ready() -> void:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func _change_state(state_name: String) -> void:
|
func _change_state(state_name):
|
||||||
# The base state_machine interface this node extends does most of the work.
|
# The base state_machine interface this node extends does most of the work.
|
||||||
if not _active:
|
if not _active:
|
||||||
return
|
return
|
||||||
@@ -24,11 +24,10 @@ func _change_state(state_name: String) -> void:
|
|||||||
states_stack.push_front(states_map[state_name])
|
states_stack.push_front(states_map[state_name])
|
||||||
if state_name == "jump" and current_state == move:
|
if state_name == "jump" and current_state == move:
|
||||||
jump.initialize(move.speed, move.velocity)
|
jump.initialize(move.speed, move.velocity)
|
||||||
|
._change_state(state_name)
|
||||||
super._change_state(state_name)
|
|
||||||
|
|
||||||
|
|
||||||
func _unhandled_input(event: InputEvent) -> void:
|
func _unhandled_input(event):
|
||||||
# Here we only handle input that can interrupt states, attacking in this case,
|
# Here we only handle input that can interrupt states, attacking in this case,
|
||||||
# otherwise we let the state node handle it.
|
# otherwise we let the state node handle it.
|
||||||
if event.is_action_pressed("attack"):
|
if event.is_action_pressed("attack"):
|
||||||
@@ -36,5 +35,4 @@ func _unhandled_input(event: InputEvent) -> void:
|
|||||||
return
|
return
|
||||||
_change_state("attack")
|
_change_state("attack")
|
||||||
return
|
return
|
||||||
|
|
||||||
current_state.handle_input(event)
|
current_state.handle_input(event)
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://eds33w28pilu"
|
path="res://.import/shadow.png-493c4635eca1ce8bdece629560617dc7.stex"
|
||||||
path="res://.godot/imported/shadow.png-493c4635eca1ce8bdece629560617dc7.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://player/shadow.png"
|
source_file="res://player/shadow.png"
|
||||||
dest_files=["res://.godot/imported/shadow.png-493c4635eca1ce8bdece629560617dc7.ctex"]
|
dest_files=[ "res://.import/shadow.png-493c4635eca1ce8bdece629560617dc7.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=true
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
extends "res://state_machine/state.gd"
|
extends "res://state_machine/state.gd"
|
||||||
|
|
||||||
func enter() -> void:
|
func enter():
|
||||||
owner.get_node(^"AnimationPlayer").play("idle")
|
owner.get_node("AnimationPlayer").play("idle")
|
||||||
|
|
||||||
|
|
||||||
func _on_Sword_attack_finished() -> void:
|
func _on_Sword_attack_finished():
|
||||||
finished.emit("previous")
|
emit_signal("finished", "previous")
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
extends "res://state_machine/state.gd"
|
extends "res://state_machine/state.gd"
|
||||||
# The stagger state end with the stagger animation from the AnimationPlayer.
|
# The stagger state end with the stagger animation from the AnimationPlayer.
|
||||||
# The animation only affects the Body Sprite2D's modulate property so it
|
# The animation only affects the Body Sprite's modulate property so it
|
||||||
# could stack with other animations if we had two AnimationPlayer nodes.
|
# could stack with other animations if we had two AnimationPlayer nodes.
|
||||||
|
|
||||||
func enter() -> void:
|
func enter():
|
||||||
owner.get_node(^"AnimationPlayer").play("stagger")
|
owner.get_node("AnimationPlayer").play("stagger")
|
||||||
|
|
||||||
|
|
||||||
func _on_animation_finished(anim_name: String) -> void:
|
func _on_animation_finished(anim_name):
|
||||||
assert(anim_name == "stagger")
|
assert(anim_name == "stagger")
|
||||||
finished.emit("previous")
|
emit_signal("finished", "previous")
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
extends Label
|
extends Label
|
||||||
|
|
||||||
var start_position := Vector2()
|
var start_position = Vector2()
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready():
|
||||||
start_position = position
|
start_position = rect_position
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(_delta: float) -> void:
|
func _physics_process(_delta):
|
||||||
position = $"../BodyPivot".position + start_position
|
rect_position = $"../BodyPivot".position + start_position
|
||||||
|
|
||||||
|
|
||||||
func _on_StateMachine_state_changed(current_state: Node) -> void:
|
func _on_StateMachine_state_changed(current_state):
|
||||||
text = String(current_state.name)
|
text = String(current_state.get_name())
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
extends "res://state_machine/state.gd"
|
extends "res://state_machine/state.gd"
|
||||||
|
|
||||||
# Initialize the state. E.g. change the animation.
|
# Initialize the state. E.g. change the animation.
|
||||||
func enter() -> void:
|
func enter():
|
||||||
owner.set_dead(true)
|
owner.set_dead(true)
|
||||||
owner.get_node(^"AnimationPlayer").play("die")
|
owner.get_node("AnimationPlayer").play("die")
|
||||||
|
|
||||||
|
|
||||||
func _on_animation_finished(_anim_name: String) -> void:
|
func _on_animation_finished(_anim_name):
|
||||||
finished.emit("dead")
|
emit_signal("finished", "dead")
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
extends "../motion.gd"
|
extends "../motion.gd"
|
||||||
|
|
||||||
@export var base_max_horizontal_speed := 400.0
|
export(float) var base_max_horizontal_speed = 400.0
|
||||||
|
|
||||||
@export var air_acceleration := 1000.0
|
export(float) var air_acceleration = 1000.0
|
||||||
@export var air_deceleration := 2000.0
|
export(float) var air_deceleration = 2000.0
|
||||||
@export var air_steering_power := 50.0
|
export(float) var air_steering_power = 50.0
|
||||||
|
|
||||||
@export var gravity := 1600.0
|
export(float) var gravity = 1600.0
|
||||||
|
|
||||||
var enter_velocity := Vector2()
|
var enter_velocity = Vector2()
|
||||||
|
|
||||||
var max_horizontal_speed := 0.0
|
var max_horizontal_speed = 0.0
|
||||||
var horizontal_speed := 0.0
|
var horizontal_speed = 0.0
|
||||||
var horizontal_velocity := Vector2()
|
var horizontal_velocity = Vector2()
|
||||||
|
|
||||||
var vertical_speed := 0.0
|
var vertical_speed = 0.0
|
||||||
var height := 0.0
|
var height = 0.0
|
||||||
|
|
||||||
func initialize(speed: float, velocity: Vector2) -> void:
|
func initialize(speed, velocity):
|
||||||
horizontal_speed = speed
|
horizontal_speed = speed
|
||||||
if speed > 0.0:
|
if speed > 0.0:
|
||||||
max_horizontal_speed = speed
|
max_horizontal_speed = speed
|
||||||
@@ -26,8 +26,8 @@ func initialize(speed: float, velocity: Vector2) -> void:
|
|||||||
enter_velocity = velocity
|
enter_velocity = velocity
|
||||||
|
|
||||||
|
|
||||||
func enter() -> void:
|
func enter():
|
||||||
var input_direction := get_input_direction()
|
var input_direction = get_input_direction()
|
||||||
update_look_direction(input_direction)
|
update_look_direction(input_direction)
|
||||||
|
|
||||||
if input_direction:
|
if input_direction:
|
||||||
@@ -36,37 +36,36 @@ func enter() -> void:
|
|||||||
horizontal_velocity = Vector2()
|
horizontal_velocity = Vector2()
|
||||||
vertical_speed = 600.0
|
vertical_speed = 600.0
|
||||||
|
|
||||||
owner.get_node(^"AnimationPlayer").play("idle")
|
owner.get_node("AnimationPlayer").play("idle")
|
||||||
|
|
||||||
|
|
||||||
func update(delta: float) -> void:
|
func update(delta):
|
||||||
var input_direction := get_input_direction()
|
var input_direction = get_input_direction()
|
||||||
update_look_direction(input_direction)
|
update_look_direction(input_direction)
|
||||||
|
|
||||||
move_horizontally(delta, input_direction)
|
move_horizontally(delta, input_direction)
|
||||||
animate_jump_height(delta)
|
animate_jump_height(delta)
|
||||||
if height <= 0.0:
|
if height <= 0.0:
|
||||||
finished.emit("previous")
|
emit_signal("finished", "previous")
|
||||||
|
|
||||||
|
|
||||||
func move_horizontally(delta: float, direction: Vector2) -> void:
|
func move_horizontally(delta, direction):
|
||||||
if direction:
|
if direction:
|
||||||
horizontal_speed += air_acceleration * delta
|
horizontal_speed += air_acceleration * delta
|
||||||
else:
|
else:
|
||||||
horizontal_speed -= air_deceleration * delta
|
horizontal_speed -= air_deceleration * delta
|
||||||
horizontal_speed = clamp(horizontal_speed, 0, max_horizontal_speed)
|
horizontal_speed = clamp(horizontal_speed, 0, max_horizontal_speed)
|
||||||
|
|
||||||
var target_velocity := horizontal_speed * direction.normalized()
|
var target_velocity = horizontal_speed * direction.normalized()
|
||||||
var steering_velocity := (target_velocity - horizontal_velocity).normalized() * air_steering_power
|
var steering_velocity = (target_velocity - horizontal_velocity).normalized() * air_steering_power
|
||||||
horizontal_velocity += steering_velocity
|
horizontal_velocity += steering_velocity
|
||||||
|
|
||||||
owner.velocity = horizontal_velocity
|
owner.move_and_slide(horizontal_velocity)
|
||||||
owner.move_and_slide()
|
|
||||||
|
|
||||||
|
|
||||||
func animate_jump_height(delta: float) -> void:
|
func animate_jump_height(delta):
|
||||||
vertical_speed -= gravity * delta
|
vertical_speed -= gravity * delta
|
||||||
height += vertical_speed * delta
|
height += vertical_speed * delta
|
||||||
height = max(0.0, height)
|
height = max(0.0, height)
|
||||||
|
|
||||||
owner.get_node(^"BodyPivot").position.y = -height
|
owner.get_node("BodyPivot").position.y = -height
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
extends "res://state_machine/state.gd"
|
extends "res://state_machine/state.gd"
|
||||||
# Collection of important methods to handle direction and animation.
|
# Collection of important methods to handle direction and animation.
|
||||||
|
|
||||||
func handle_input(event: InputEvent) -> void:
|
func handle_input(event):
|
||||||
if event.is_action_pressed("simulate_damage"):
|
if event.is_action_pressed("simulate_damage"):
|
||||||
finished.emit("stagger")
|
emit_signal("finished", "stagger")
|
||||||
|
|
||||||
|
|
||||||
func get_input_direction() -> Vector2:
|
func get_input_direction():
|
||||||
return Vector2(
|
var input_direction = Vector2(
|
||||||
Input.get_axis(&"move_left", &"move_right"),
|
Input.get_action_strength("move_right") - Input.get_action_strength("move_left"),
|
||||||
Input.get_axis(&"move_up", &"move_down")
|
Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
|
||||||
)
|
)
|
||||||
|
return input_direction
|
||||||
|
|
||||||
|
|
||||||
func update_look_direction(direction: Vector2) -> void:
|
func update_look_direction(direction):
|
||||||
if direction and owner.look_direction != direction:
|
if direction and owner.look_direction != direction:
|
||||||
owner.look_direction = direction
|
owner.look_direction = direction
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
extends "on_ground.gd"
|
extends "on_ground.gd"
|
||||||
|
|
||||||
func enter() -> void:
|
func enter():
|
||||||
owner.get_node(^"AnimationPlayer").play("idle")
|
owner.get_node("AnimationPlayer").play("idle")
|
||||||
|
|
||||||
|
|
||||||
func handle_input(event: InputEvent) -> void:
|
func handle_input(event):
|
||||||
return super.handle_input(event)
|
return .handle_input(event)
|
||||||
|
|
||||||
|
|
||||||
func update(_delta: float) -> void:
|
func update(_delta):
|
||||||
var input_direction: Vector2 = get_input_direction()
|
var input_direction = get_input_direction()
|
||||||
if input_direction:
|
if input_direction:
|
||||||
finished.emit("move")
|
emit_signal("finished", "move")
|
||||||
|
|||||||
@@ -1,25 +1,25 @@
|
|||||||
extends "on_ground.gd"
|
extends "on_ground.gd"
|
||||||
|
|
||||||
@export var max_walk_speed := 450.0
|
export(float) var max_walk_speed = 450
|
||||||
@export var max_run_speed := 700.0
|
export(float) var max_run_speed = 700
|
||||||
|
|
||||||
func enter() -> void:
|
func enter():
|
||||||
speed = 0.0
|
speed = 0.0
|
||||||
velocity = Vector2()
|
velocity = Vector2()
|
||||||
|
|
||||||
var input_direction := get_input_direction()
|
var input_direction = get_input_direction()
|
||||||
update_look_direction(input_direction)
|
update_look_direction(input_direction)
|
||||||
owner.get_node(^"AnimationPlayer").play("walk")
|
owner.get_node("AnimationPlayer").play("walk")
|
||||||
|
|
||||||
|
|
||||||
func handle_input(event: InputEvent) -> void:
|
func handle_input(event):
|
||||||
return super.handle_input(event)
|
return .handle_input(event)
|
||||||
|
|
||||||
|
|
||||||
func update(_delta: float) -> void:
|
func update(_delta):
|
||||||
var input_direction := get_input_direction()
|
var input_direction = get_input_direction()
|
||||||
if input_direction.is_zero_approx():
|
if not input_direction:
|
||||||
finished.emit("idle")
|
emit_signal("finished", "idle")
|
||||||
update_look_direction(input_direction)
|
update_look_direction(input_direction)
|
||||||
|
|
||||||
if Input.is_action_pressed("run"):
|
if Input.is_action_pressed("run"):
|
||||||
@@ -27,17 +27,16 @@ func update(_delta: float) -> void:
|
|||||||
else:
|
else:
|
||||||
speed = max_walk_speed
|
speed = max_walk_speed
|
||||||
|
|
||||||
var collision_info := move(speed, input_direction)
|
var collision_info = move(speed, input_direction)
|
||||||
if not collision_info:
|
if not collision_info:
|
||||||
return
|
return
|
||||||
if speed == max_run_speed and collision_info.collider.is_in_group("environment"):
|
if speed == max_run_speed and collision_info.collider.is_in_group("environment"):
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
func move(p_speed: float, direction: Vector2) -> KinematicCollision2D:
|
|
||||||
owner.velocity = direction.normalized() * p_speed
|
|
||||||
owner.move_and_slide()
|
|
||||||
if owner.get_slide_collision_count() == 0:
|
|
||||||
return null
|
return null
|
||||||
|
|
||||||
|
|
||||||
|
func move(speed, direction):
|
||||||
|
velocity = direction.normalized() * speed
|
||||||
|
owner.move_and_slide(velocity, Vector2(), 5, 2)
|
||||||
|
if owner.get_slide_count() == 0:
|
||||||
|
return
|
||||||
return owner.get_slide_collision(0)
|
return owner.get_slide_collision(0)
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
extends "../motion.gd"
|
extends "../motion.gd"
|
||||||
|
|
||||||
var speed := 0.0
|
# warning-ignore-all:unused_class_variable
|
||||||
var velocity := Vector2()
|
var speed = 0.0
|
||||||
|
var velocity = Vector2()
|
||||||
|
|
||||||
func handle_input(event: InputEvent) -> void:
|
func handle_input(event):
|
||||||
if event.is_action_pressed("jump"):
|
if event.is_action_pressed("jump"):
|
||||||
finished.emit("jump")
|
emit_signal("finished", "jump")
|
||||||
return super.handle_input(event)
|
return .handle_input(event)
|
||||||
|
|||||||
@@ -1,250 +1,243 @@
|
|||||||
[gd_scene load_steps=9 format=3 uid="uid://cdacdp11r3jua"]
|
[gd_scene load_steps=8 format=2]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://player/weapon/sword.gd" id="1"]
|
[ext_resource path="res://player/weapon/sword.gd" type="Script" id=1]
|
||||||
[ext_resource type="Texture2D" uid="uid://7cfjw83v5m75" path="res://player/weapon/sword.png" id="2"]
|
[ext_resource path="res://player/weapon/sword.png" type="Texture" id=2]
|
||||||
|
|
||||||
[sub_resource type="Animation" id="1"]
|
[sub_resource type="Animation" id=1]
|
||||||
resource_name = "SETUP"
|
resource_name = "SETUP"
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
|
||||||
tracks/0/enabled = true
|
|
||||||
tracks/0/path = NodePath(".:rotation_degrees")
|
tracks/0/path = NodePath(".:rotation_degrees")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [0.0]
|
"values": [ 0.0 ]
|
||||||
}
|
}
|
||||||
tracks/1/type = "value"
|
tracks/1/type = "value"
|
||||||
tracks/1/imported = false
|
|
||||||
tracks/1/enabled = true
|
|
||||||
tracks/1/path = NodePath(".:scale")
|
tracks/1/path = NodePath(".:scale")
|
||||||
tracks/1/interp = 1
|
tracks/1/interp = 1
|
||||||
tracks/1/loop_wrap = true
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
tracks/1/keys = {
|
tracks/1/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [Vector2(1, 1)]
|
"values": [ Vector2( 1, 1 ) ]
|
||||||
}
|
}
|
||||||
tracks/2/type = "value"
|
tracks/2/type = "value"
|
||||||
tracks/2/imported = false
|
|
||||||
tracks/2/enabled = true
|
|
||||||
tracks/2/path = NodePath(".:visible")
|
tracks/2/path = NodePath(".:visible")
|
||||||
tracks/2/interp = 1
|
tracks/2/interp = 1
|
||||||
tracks/2/loop_wrap = true
|
tracks/2/loop_wrap = true
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
tracks/2/keys = {
|
tracks/2/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [true]
|
"values": [ true ]
|
||||||
}
|
}
|
||||||
tracks/3/type = "value"
|
tracks/3/type = "value"
|
||||||
tracks/3/imported = false
|
|
||||||
tracks/3/enabled = true
|
|
||||||
tracks/3/path = NodePath(".:monitoring")
|
tracks/3/path = NodePath(".:monitoring")
|
||||||
tracks/3/interp = 1
|
tracks/3/interp = 1
|
||||||
tracks/3/loop_wrap = true
|
tracks/3/loop_wrap = true
|
||||||
|
tracks/3/imported = false
|
||||||
|
tracks/3/enabled = true
|
||||||
tracks/3/keys = {
|
tracks/3/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [true]
|
"values": [ true ]
|
||||||
}
|
}
|
||||||
tracks/4/type = "value"
|
tracks/4/type = "value"
|
||||||
tracks/4/imported = false
|
|
||||||
tracks/4/enabled = true
|
|
||||||
tracks/4/path = NodePath(".:monitorable")
|
tracks/4/path = NodePath(".:monitorable")
|
||||||
tracks/4/interp = 1
|
tracks/4/interp = 1
|
||||||
tracks/4/loop_wrap = true
|
tracks/4/loop_wrap = true
|
||||||
|
tracks/4/imported = false
|
||||||
|
tracks/4/enabled = true
|
||||||
tracks/4/keys = {
|
tracks/4/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [false]
|
"values": [ false ]
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="2"]
|
[sub_resource type="Animation" id=2]
|
||||||
resource_name = "attack_circular"
|
resource_name = "attack_circular"
|
||||||
length = 0.3
|
length = 0.3
|
||||||
step = 0.05
|
step = 0.05
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
|
||||||
tracks/0/enabled = true
|
|
||||||
tracks/0/path = NodePath(".:rotation_degrees")
|
tracks/0/path = NodePath(".:rotation_degrees")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0, 0.15, 0.2),
|
"times": PoolRealArray( 0, 0.15, 0.2 ),
|
||||||
"transitions": PackedFloat32Array(0.439427, 1, 1),
|
"transitions": PoolRealArray( 0.439427, 1, 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [-100.0, 100.0, 90.0]
|
"values": [ -100.0, 100.0, 90.0 ]
|
||||||
}
|
}
|
||||||
tracks/1/type = "value"
|
tracks/1/type = "value"
|
||||||
tracks/1/imported = false
|
|
||||||
tracks/1/enabled = true
|
|
||||||
tracks/1/path = NodePath(".:scale")
|
tracks/1/path = NodePath(".:scale")
|
||||||
tracks/1/interp = 1
|
tracks/1/interp = 1
|
||||||
tracks/1/loop_wrap = true
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
tracks/1/keys = {
|
tracks/1/keys = {
|
||||||
"times": PackedFloat32Array(0, 0.05, 0.15, 0.2),
|
"times": PoolRealArray( 0, 0.05, 0.15, 0.2 ),
|
||||||
"transitions": PackedFloat32Array(1, 2.50795, 1, 1),
|
"transitions": PoolRealArray( 1, 2.50795, 1, 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [Vector2(1, 1), Vector2(1, 1.3), Vector2(1, 1), Vector2(1, 1)]
|
"values": [ Vector2( 1, 1 ), Vector2( 1, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ]
|
||||||
}
|
}
|
||||||
tracks/2/type = "value"
|
tracks/2/type = "value"
|
||||||
tracks/2/imported = false
|
|
||||||
tracks/2/enabled = true
|
|
||||||
tracks/2/path = NodePath(".:visible")
|
tracks/2/path = NodePath(".:visible")
|
||||||
tracks/2/interp = 1
|
tracks/2/interp = 1
|
||||||
tracks/2/loop_wrap = true
|
tracks/2/loop_wrap = true
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
tracks/2/keys = {
|
tracks/2/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [true]
|
"values": [ true ]
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="3"]
|
[sub_resource type="Animation" id=3]
|
||||||
length = 0.45
|
length = 0.45
|
||||||
step = 0.05
|
step = 0.05
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
|
||||||
tracks/0/enabled = true
|
|
||||||
tracks/0/path = NodePath(".:rotation_degrees")
|
tracks/0/path = NodePath(".:rotation_degrees")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0, 0.15, 0.2),
|
"times": PoolRealArray( 0, 0.15, 0.2 ),
|
||||||
"transitions": PackedFloat32Array(0.439427, 1, 1),
|
"transitions": PoolRealArray( 0.439427, 1, 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [-80.0, 85.0, 75.0]
|
"values": [ -80.0, 85.0, 75.0 ]
|
||||||
}
|
}
|
||||||
tracks/1/type = "value"
|
tracks/1/type = "value"
|
||||||
tracks/1/imported = false
|
|
||||||
tracks/1/enabled = true
|
|
||||||
tracks/1/path = NodePath(".:scale")
|
tracks/1/path = NodePath(".:scale")
|
||||||
tracks/1/interp = 1
|
tracks/1/interp = 1
|
||||||
tracks/1/loop_wrap = true
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
tracks/1/keys = {
|
tracks/1/keys = {
|
||||||
"times": PackedFloat32Array(0, 0.05, 0.15, 0.2),
|
"times": PoolRealArray( 0, 0.05, 0.15, 0.2 ),
|
||||||
"transitions": PackedFloat32Array(1, 2.50795, 1, 1),
|
"transitions": PoolRealArray( 1, 2.50795, 1, 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [Vector2(1, 1), Vector2(1, 1.3), Vector2(1, 1), Vector2(1, 1)]
|
"values": [ Vector2( 1, 1 ), Vector2( 1, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ]
|
||||||
}
|
}
|
||||||
tracks/2/type = "value"
|
tracks/2/type = "value"
|
||||||
tracks/2/imported = false
|
|
||||||
tracks/2/enabled = true
|
|
||||||
tracks/2/path = NodePath(".:visible")
|
tracks/2/path = NodePath(".:visible")
|
||||||
tracks/2/interp = 1
|
tracks/2/interp = 1
|
||||||
tracks/2/loop_wrap = true
|
tracks/2/loop_wrap = true
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
tracks/2/keys = {
|
tracks/2/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [true]
|
"values": [ true ]
|
||||||
}
|
}
|
||||||
tracks/3/type = "method"
|
tracks/3/type = "method"
|
||||||
tracks/3/imported = false
|
|
||||||
tracks/3/enabled = true
|
|
||||||
tracks/3/path = NodePath(".")
|
tracks/3/path = NodePath(".")
|
||||||
tracks/3/interp = 1
|
tracks/3/interp = 1
|
||||||
tracks/3/loop_wrap = true
|
tracks/3/loop_wrap = true
|
||||||
|
tracks/3/imported = false
|
||||||
|
tracks/3/enabled = true
|
||||||
tracks/3/keys = {
|
tracks/3/keys = {
|
||||||
"times": PackedFloat32Array(0.1, 0.25),
|
"times": PoolRealArray( 0.1, 0.25 ),
|
||||||
"transitions": PackedFloat32Array(1, 1),
|
"transitions": PoolRealArray( 1, 1 ),
|
||||||
"values": [{
|
"values": [ {
|
||||||
"args": [],
|
"args": [ ],
|
||||||
"method": &"set_attack_input_listening"
|
"method": "set_attack_input_listening"
|
||||||
}, {
|
}, {
|
||||||
"args": [],
|
"args": [ ],
|
||||||
"method": &"set_ready_for_next_attack"
|
"method": "set_ready_for_next_attack"
|
||||||
}]
|
} ]
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="4"]
|
[sub_resource type="Animation" id=4]
|
||||||
resource_name = "attack_medium"
|
resource_name = "attack_medium"
|
||||||
length = 0.5
|
length = 0.5
|
||||||
step = 0.05
|
step = 0.05
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
|
||||||
tracks/0/enabled = true
|
|
||||||
tracks/0/path = NodePath(".:rotation_degrees")
|
tracks/0/path = NodePath(".:rotation_degrees")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0.05, 0.25, 0.35),
|
"times": PoolRealArray( 0.05, 0.25, 0.35 ),
|
||||||
"transitions": PackedFloat32Array(0.439427, 1, 1),
|
"transitions": PoolRealArray( 0.439427, 1, 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [95.0, -95.0, -90.0]
|
"values": [ 95.0, -95.0, -90.0 ]
|
||||||
}
|
}
|
||||||
tracks/1/type = "value"
|
tracks/1/type = "value"
|
||||||
tracks/1/imported = false
|
|
||||||
tracks/1/enabled = true
|
|
||||||
tracks/1/path = NodePath(".:scale")
|
tracks/1/path = NodePath(".:scale")
|
||||||
tracks/1/interp = 1
|
tracks/1/interp = 1
|
||||||
tracks/1/loop_wrap = true
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
tracks/1/keys = {
|
tracks/1/keys = {
|
||||||
"times": PackedFloat32Array(0, 0.1, 0.2, 0.25),
|
"times": PoolRealArray( 0, 0.1, 0.2, 0.25 ),
|
||||||
"transitions": PackedFloat32Array(1, 2.50795, 1, 1),
|
"transitions": PoolRealArray( 1, 2.50795, 1, 1 ),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [Vector2(1, 1), Vector2(1, 1.3), Vector2(1, 1), Vector2(1, 1)]
|
"values": [ Vector2( 1, 1 ), Vector2( 1, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ]
|
||||||
}
|
}
|
||||||
tracks/2/type = "value"
|
tracks/2/type = "value"
|
||||||
tracks/2/imported = false
|
|
||||||
tracks/2/enabled = true
|
|
||||||
tracks/2/path = NodePath(".:visible")
|
tracks/2/path = NodePath(".:visible")
|
||||||
tracks/2/interp = 1
|
tracks/2/interp = 1
|
||||||
tracks/2/loop_wrap = true
|
tracks/2/loop_wrap = true
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
tracks/2/keys = {
|
tracks/2/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [true]
|
"values": [ true ]
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="5"]
|
[sub_resource type="Animation" id=5]
|
||||||
length = 0.01
|
length = 0.01
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
|
||||||
tracks/0/enabled = true
|
|
||||||
tracks/0/path = NodePath(".:visible")
|
tracks/0/path = NodePath(".:visible")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0),
|
"times": PoolRealArray( 0 ),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PoolRealArray( 1 ),
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"values": [false]
|
"values": [ false ]
|
||||||
}
|
|
||||||
|
|
||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_6cp3i"]
|
|
||||||
_data = {
|
|
||||||
"SETUP": SubResource("1"),
|
|
||||||
"attack_circular": SubResource("2"),
|
|
||||||
"attack_fast": SubResource("3"),
|
|
||||||
"attack_medium": SubResource("4"),
|
|
||||||
"idle": SubResource("5")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="Sword" type="Area2D"]
|
[node name="Sword" type="Area2D"]
|
||||||
collision_layer = 16
|
|
||||||
collision_mask = 3
|
|
||||||
input_pickable = false
|
input_pickable = false
|
||||||
monitorable = false
|
monitorable = false
|
||||||
script = ExtResource("1")
|
collision_layer = 16
|
||||||
|
collision_mask = 3
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||||
libraries = {
|
anims/SETUP = SubResource( 1 )
|
||||||
"": SubResource("AnimationLibrary_6cp3i")
|
anims/attack_circular = SubResource( 2 )
|
||||||
}
|
anims/attack_fast = SubResource( 3 )
|
||||||
|
anims/attack_medium = SubResource( 4 )
|
||||||
|
anims/idle = SubResource( 5 )
|
||||||
|
|
||||||
[node name="Sword" type="Sprite2D" parent="."]
|
[node name="Sword" type="Sprite" parent="."]
|
||||||
position = Vector2(4, 0)
|
position = Vector2( 4, 0 )
|
||||||
texture = ExtResource("2")
|
texture = ExtResource( 2 )
|
||||||
offset = Vector2(67, 0)
|
offset = Vector2( 67, 0 )
|
||||||
|
|
||||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
|
||||||
polygon = PackedVector2Array(28.0001, -15.9999, 136, -15.9995, 160, 0, 136, 16.0005, 27.9999, 16.0001)
|
polygon = PoolVector2Array( 28.0001, -15.9999, 136, -15.9995, 160, 0, 136, 16.0005, 27.9999, 16.0001 )
|
||||||
|
|||||||
@@ -2,50 +2,43 @@ extends Area2D
|
|||||||
|
|
||||||
signal attack_finished
|
signal attack_finished
|
||||||
|
|
||||||
enum States {
|
enum States { IDLE, ATTACK }
|
||||||
IDLE,
|
var state = null
|
||||||
ATTACK,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum AttackInputStates {
|
enum AttackInputStates { IDLE, LISTENING, REGISTERED }
|
||||||
IDLE,
|
var attack_input_state = AttackInputStates.IDLE
|
||||||
LISTENING,
|
var ready_for_next_attack = false
|
||||||
REGISTERED,
|
|
||||||
}
|
|
||||||
|
|
||||||
var state: States = States.IDLE
|
|
||||||
var attack_input_state := AttackInputStates.IDLE
|
|
||||||
var ready_for_next_attack := false
|
|
||||||
const MAX_COMBO_COUNT = 3
|
const MAX_COMBO_COUNT = 3
|
||||||
var combo_count := 0
|
var combo_count = 0
|
||||||
|
|
||||||
var attack_current := {}
|
var attack_current = {}
|
||||||
var combo := [{
|
var combo = [{
|
||||||
"damage": 1,
|
"damage": 1,
|
||||||
"animation": "attack_fast",
|
"animation": "attack_fast",
|
||||||
"effect": null,
|
"effect": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"damage": 1,
|
"damage": 1,
|
||||||
"animation": "attack_fast",
|
"animation": "attack_fast",
|
||||||
"effect": null,
|
"effect": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"damage": 3,
|
"damage": 3,
|
||||||
"animation": "attack_medium",
|
"animation": "attack_medium",
|
||||||
"effect": null,
|
"effect": null
|
||||||
}
|
}]
|
||||||
]
|
|
||||||
|
|
||||||
var hit_objects := []
|
var hit_objects = []
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready():
|
||||||
$AnimationPlayer.animation_finished.connect(_on_animation_finished)
|
# warning-ignore:return_value_discarded
|
||||||
body_entered.connect(_on_body_entered)
|
$AnimationPlayer.connect("animation_finished", self, "_on_animation_finished")
|
||||||
|
# warning-ignore:return_value_discarded
|
||||||
|
self.connect("body_entered", self, "_on_body_entered")
|
||||||
_change_state(States.IDLE)
|
_change_state(States.IDLE)
|
||||||
|
|
||||||
|
|
||||||
func _change_state(new_state: States) -> void:
|
func _change_state(new_state):
|
||||||
match state:
|
match state:
|
||||||
States.ATTACK:
|
States.ATTACK:
|
||||||
hit_objects = []
|
hit_objects = []
|
||||||
@@ -66,7 +59,7 @@ func _change_state(new_state: States) -> void:
|
|||||||
state = new_state
|
state = new_state
|
||||||
|
|
||||||
|
|
||||||
func _unhandled_input(event: InputEvent) -> void:
|
func _unhandled_input(event):
|
||||||
if not state == States.ATTACK:
|
if not state == States.ATTACK:
|
||||||
return
|
return
|
||||||
if attack_input_state != AttackInputStates.LISTENING:
|
if attack_input_state != AttackInputStates.LISTENING:
|
||||||
@@ -75,47 +68,46 @@ func _unhandled_input(event: InputEvent) -> void:
|
|||||||
attack_input_state = AttackInputStates.REGISTERED
|
attack_input_state = AttackInputStates.REGISTERED
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(_delta: float) -> void:
|
func _physics_process(_delta):
|
||||||
if attack_input_state == AttackInputStates.REGISTERED and ready_for_next_attack:
|
if attack_input_state == AttackInputStates.REGISTERED and ready_for_next_attack:
|
||||||
attack()
|
attack()
|
||||||
|
|
||||||
|
|
||||||
func attack() -> void:
|
func attack():
|
||||||
combo_count += 1
|
combo_count += 1
|
||||||
_change_state(States.ATTACK)
|
_change_state(States.ATTACK)
|
||||||
|
|
||||||
|
|
||||||
# Use with AnimationPlayer func track.
|
# Use with AnimationPlayer func track.
|
||||||
func set_attack_input_listening() -> void:
|
func set_attack_input_listening():
|
||||||
attack_input_state = AttackInputStates.LISTENING
|
attack_input_state = AttackInputStates.LISTENING
|
||||||
|
|
||||||
|
|
||||||
# Use with AnimationPlayer func track.
|
# Use with AnimationPlayer func track.
|
||||||
func set_ready_for_next_attack() -> void:
|
func set_ready_for_next_attack():
|
||||||
ready_for_next_attack = true
|
ready_for_next_attack = true
|
||||||
|
|
||||||
|
|
||||||
func _on_body_entered(body: Node2D) -> void:
|
func _on_body_entered(body):
|
||||||
if not body.has_node("Health"):
|
if not body.has_node("Health"):
|
||||||
return
|
return
|
||||||
if body.get_rid().get_id() in hit_objects:
|
if body.get_rid().get_id() in hit_objects:
|
||||||
return
|
return
|
||||||
|
|
||||||
hit_objects.append(body.get_rid().get_id())
|
hit_objects.append(body.get_rid().get_id())
|
||||||
body.take_damage(self, attack_current["damage"], attack_current["effect"])
|
body.take_damage(self, attack_current["damage"], attack_current["effect"])
|
||||||
|
|
||||||
|
|
||||||
func _on_animation_finished(_name: String) -> void:
|
func _on_animation_finished(_name):
|
||||||
if attack_current.is_empty():
|
if not attack_current:
|
||||||
return
|
return
|
||||||
|
|
||||||
if attack_input_state == AttackInputStates.REGISTERED and combo_count < MAX_COMBO_COUNT:
|
if attack_input_state == AttackInputStates.REGISTERED and combo_count < MAX_COMBO_COUNT:
|
||||||
attack()
|
attack()
|
||||||
else:
|
else:
|
||||||
_change_state(States.IDLE)
|
_change_state(States.IDLE)
|
||||||
attack_finished.emit()
|
emit_signal("attack_finished")
|
||||||
|
|
||||||
|
|
||||||
func _on_StateMachine_state_changed(current_state: Node) -> void:
|
func _on_StateMachine_state_changed(current_state):
|
||||||
if current_state.name == "Attack":
|
if current_state.name == "Attack":
|
||||||
attack()
|
attack()
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
[remap]
|
[remap]
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="StreamTexture"
|
||||||
uid="uid://7cfjw83v5m75"
|
path="res://.import/sword.png-fc7f0084cdf333c826eda2b33f2ec3cc.stex"
|
||||||
path="res://.godot/imported/sword.png-fc7f0084cdf333c826eda2b33f2ec3cc.ctex"
|
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -11,24 +10,25 @@ metadata={
|
|||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://player/weapon/sword.png"
|
source_file="res://player/weapon/sword.png"
|
||||||
dest_files=["res://.godot/imported/sword.png-fc7f0084cdf333c826eda2b33f2ec3cc.ctex"]
|
dest_files=[ "res://.import/sword.png-fc7f0084cdf333c826eda2b33f2ec3cc.stex" ]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=0
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/hdr_compression=1
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
flags/repeat=0
|
||||||
mipmaps/generate=false
|
flags/filter=true
|
||||||
mipmaps/limit=-1
|
flags/mipmaps=false
|
||||||
roughness/mode=0
|
flags/anisotropic=false
|
||||||
roughness/src_normal=""
|
flags/srgb=2
|
||||||
process/fix_alpha_border=true
|
process/fix_alpha_border=true
|
||||||
process/premult_alpha=false
|
process/premult_alpha=false
|
||||||
process/normal_map_invert_y=false
|
process/HDR_as_SRGB=false
|
||||||
process/hdr_as_srgb=false
|
process/invert_color=false
|
||||||
process/hdr_clamp_exposure=false
|
stream=false
|
||||||
process/size_limit=0
|
size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
extends Marker2D
|
extends Position2D
|
||||||
|
|
||||||
var z_index_start := 0
|
var z_index_start = 0
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready():
|
||||||
owner.direction_changed.connect(_on_Parent_direction_changed)
|
#warning-ignore:return_value_discarded
|
||||||
|
owner.connect("direction_changed", self, "_on_Parent_direction_changed")
|
||||||
z_index_start = z_index
|
z_index_start = z_index
|
||||||
|
|
||||||
|
|
||||||
func _on_Parent_direction_changed(direction: Vector2) -> void:
|
func _on_Parent_direction_changed(direction):
|
||||||
rotation = direction.angle()
|
rotation = direction.angle()
|
||||||
match direction:
|
match direction:
|
||||||
Vector2.UP:
|
Vector2.UP:
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
; [section] ; section goes between []
|
; [section] ; section goes between []
|
||||||
; param=value ; assign values to parameters
|
; param=value ; assign values to parameters
|
||||||
|
|
||||||
config_version=5
|
config_version=4
|
||||||
|
|
||||||
[application]
|
[application]
|
||||||
|
|
||||||
@@ -14,92 +14,88 @@ config/name="Hierarchical Finite State Machine"
|
|||||||
config/description="This example shows how to apply the State machine programming
|
config/description="This example shows how to apply the State machine programming
|
||||||
pattern in GDscript, including Hierarchical States, and a
|
pattern in GDscript, including Hierarchical States, and a
|
||||||
pushdown automaton."
|
pushdown automaton."
|
||||||
config/tags=PackedStringArray("2d", "ai", "demo", "official")
|
|
||||||
run/main_scene="res://Demo.tscn"
|
run/main_scene="res://Demo.tscn"
|
||||||
config/features=PackedStringArray("4.2")
|
config/icon="res://icon.png"
|
||||||
config/icon="res://icon.webp"
|
|
||||||
|
|
||||||
[debug]
|
|
||||||
|
|
||||||
gdscript/warnings/untyped_declaration=1
|
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
window/size/viewport_width=1280
|
window/size/width=1280
|
||||||
window/size/viewport_height=720
|
window/size/height=720
|
||||||
window/stretch/mode="canvas_items"
|
window/dpi/allow_hidpi=true
|
||||||
|
window/stretch/mode="2d"
|
||||||
window/stretch/aspect="expand"
|
window/stretch/aspect="expand"
|
||||||
|
|
||||||
|
[gdnative]
|
||||||
|
|
||||||
|
singletons=[ ]
|
||||||
|
|
||||||
[input]
|
[input]
|
||||||
|
|
||||||
move_left={
|
move_left={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":113,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
|
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
move_up={
|
move_up={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":122,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
|
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
move_right={
|
move_right={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
|
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
move_down={
|
move_down={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
|
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
fire={
|
fire={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":7,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":7,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
run={
|
run={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777237,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
jump={
|
jump={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
simulate_damage={
|
simulate_damage={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":88,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
attack={
|
attack={
|
||||||
"deadzone": 0.2,
|
"deadzone": 0.5,
|
||||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":70,"unicode":0,"echo":false,"script":null)
|
||||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":2,"pressure":0.0,"pressed":true,"script":null)
|
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":6,"pressure":0.0,"pressed":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
[physics]
|
|
||||||
|
|
||||||
common/physics_ticks_per_second=120
|
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
renderer/rendering_method="gl_compatibility"
|
quality/driver/driver_name="GLES2"
|
||||||
renderer/rendering_method.mobile="gl_compatibility"
|
vram_compression/import_etc=true
|
||||||
|
vram_compression/import_etc2=false
|
||||||
|
|||||||