Merge pull request #432 from aaronfranke/readme
Add README files to many demos
19
2d/dodge_the_creeps/README.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Dodge the Creeps
|
||||
|
||||
This is a simple game where your character must move
|
||||
and avoid the enemies for as long as possible.
|
||||
|
||||
This is a finished version of the game featured in the
|
||||
["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,
|
||||
consider following the tutorial in the documentation.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
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).
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
30
2d/finite_state_machine/README.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Hierarchical Finite State Machine
|
||||
|
||||
This example shows how to apply the State machine programming
|
||||
pattern in GDscript, including Hierarchical States, and a
|
||||
pushdown automaton.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Why use a state machine
|
||||
|
||||
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 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.
|
||||
|
||||
You can read more about States in the excellent
|
||||
[Game Programming Patterns ebook](https://gameprogrammingpatterns.com/state.html).
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Hierarchical Finite State Machine example"
|
||||
config/name="Hierarchical Finite State Machine"
|
||||
run/main_scene="res://Demo.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
2d/finite_state_machine/screenshots/.gdignore
Normal file
BIN
2d/finite_state_machine/screenshots/fsm-attack.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
13
2d/gd_paint/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# GD Paint
|
||||
|
||||
GD Paint is a simple image editor made using Godot and GDScript.
|
||||
It supports different types of "brushes": a basic pen/pencil
|
||||
and eraser, as well as a rectangle and a circle brush.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
0
2d/gd_paint/screenshots/.gdignore
Normal file
BIN
2d/gd_paint/screenshots/gdpaint.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
16
2d/hdr/README.md
Normal file
@@ -0,0 +1,16 @@
|
||||
# HDR for 2D
|
||||
|
||||
Simple demo how to use High Dynamic Range (HDR) in a 2D game,
|
||||
via the WorldEnvironment node.
|
||||
|
||||
Just slide the cave image left and right to observe the HDR effect at work.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3 (HDR is not available in GLES 2)
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
0
2d/hdr/screenshots/.gdignore
Normal file
BIN
2d/hdr/screenshots/left.png
Normal file
|
After Width: | Height: | Size: 406 KiB |
BIN
2d/hdr/screenshots/right.png
Normal file
|
After Width: | Height: | Size: 192 KiB |
11
2d/hexagonal_map/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Hexagonal Game
|
||||
|
||||
Very simple demo showing a hexagonal TileMap and TileSet.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
0
2d/hexagonal_map/screenshots/.gdignore
Normal file
BIN
2d/hexagonal_map/screenshots/hex.png
Normal file
|
After Width: | Height: | Size: 401 KiB |
24
2d/isometric/README.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Isometric Game
|
||||
|
||||
This demo shows a traditional isometric view with depth sorting.
|
||||
|
||||
A character can move around the level and will also slide around objects,
|
||||
as well as be occluded when standing in front or behind them.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## How does it work?
|
||||
|
||||
The level uses a [`TileMap`](https://docs.godotengine.org/en/latest/classes/class_tilemap.html#class-tilemap)
|
||||
in which the tiles have different vertical offsets.
|
||||
The walls, doors, and pillars each have
|
||||
[`StaticBody2D`](https://docs.godotengine.org/en/latest/classes/class_staticbody2d.html)
|
||||
and [`CollisionPolygon2D`](https://docs.godotengine.org/en/latest/classes/class_collisionpolygon2d.html)
|
||||
at their base. The player also has a collider at its base,
|
||||
which makes the player collide with the level.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
0
2d/isometric/screenshots/.gdignore
Normal file
BIN
2d/isometric/screenshots/isometric.png
Normal file
|
After Width: | Height: | Size: 440 KiB |
14
2d/kinematic_character/README.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# Kinematic Character
|
||||
|
||||
Example of how to make a kinematic character controller in 2D using
|
||||
[`KinematicBody2D`](https://docs.godotengine.org/en/latest/classes/class_kinematicbody2d.html).
|
||||
The character moves around, is affected by moving platforms,
|
||||
can jump through one-way collision platforms, etc.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
0
2d/kinematic_character/screenshots/.gdignore
Normal file
BIN
2d/kinematic_character/screenshots/kinematic.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
11
2d/light2d_as_mask/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# 2D Lights as Mask
|
||||
|
||||
Example of how to use 2D lights to mask objects on screen.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Using Lights as Mask"
|
||||
config/name="2D Lights as Mask"
|
||||
run/main_scene="res://lightmask.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
2d/light2d_as_mask/screenshots/.gdignore
Normal file
BIN
2d/light2d_as_mask/screenshots/mask.png
Normal file
|
After Width: | Height: | Size: 253 KiB |
13
2d/lights_and_shadows/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# 2D Lights and Shadows
|
||||
|
||||
Simple demo of 2D lights and shadows, using
|
||||
[`Light2D`](https://docs.godotengine.org/en/latest/classes/class_light2d.html)
|
||||
and [`LightOccluder2D`](https://docs.godotengine.org/en/latest/classes/class_lightoccluder2d.html).
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="2D Lighting"
|
||||
config/name="2D Lights and Shadows"
|
||||
run/main_scene="res://light_shadows.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
2d/lights_and_shadows/screenshots/.gdignore
Normal file
BIN
2d/lights_and_shadows/screenshots/lights.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
15
2d/navigation/README.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Navigation Polygon 2D
|
||||
|
||||
Example of using 2D navigation using a
|
||||
[`NavigationPolygon`](https://docs.godotengine.org/en/latest/classes/class_navigationpolygon.html)
|
||||
in a [`NavigationPolygonInstance`](https://docs.godotengine.org/en/latest/classes/class_navigationpolygoninstance.html) node.
|
||||
It uses the 2D navigation API to request a path between two points,
|
||||
and then traverses the resulting path.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Navigation Polygon (2D)"
|
||||
config/name="Navigation Polygon 2D"
|
||||
run/main_scene="res://level.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
2d/navigation/screenshots/.gdignore
Normal file
BIN
2d/navigation/screenshots/navigation.png
Normal file
|
After Width: | Height: | Size: 205 KiB |
12
2d/navigation_astar/README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Grid-based Navigation with Astar
|
||||
|
||||
This is an example of using AStar for navigation in 2D,
|
||||
complete with Steering Behaviors in order to smooth the movement out.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Grid-based pathfinding with Astar"
|
||||
config/name="Grid-based Pathfinding with Astar"
|
||||
run/main_scene="res://Game.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
2d/navigation_astar/screenshots/.gdignore
Normal file
BIN
2d/navigation_astar/screenshots/nav_astar.png
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
18
2d/particles/README.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# 2D Particles
|
||||
|
||||
This demo showcases how 2D particle systems work in Godot.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3 (particles are not available in GLES 2)
|
||||
|
||||
## How does it work?
|
||||
|
||||
It uses [`Particles2D`](https://docs.godotengine.org/en/latest/classes/class_particles2d.html) nodes
|
||||
with [`ParticlesMaterial`](https://docs.godotengine.org/en/latest/classes/class_particlesmaterial.html)
|
||||
materials. Note that `ParticlesMaterial` is agnostic between 2D and 3D,
|
||||
so when used in 2D, the "Disable Z" flag should be enabled.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Particle Systems"
|
||||
config/name="2D Particles"
|
||||
run/main_scene="res://particles.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
2d/particles/screenshots/.gdignore
Normal file
BIN
2d/particles/screenshots/particles.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
28
2d/physics_platformer/README.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Physics Platformer
|
||||
|
||||
This demo uses [`RigidBody2D`](https://docs.godotengine.org/en/latest/classes/class_rigidbody2d.html)
|
||||
for the player and enemies.
|
||||
These character controllers are more powerful than
|
||||
[`KinematicBody2D`](https://docs.godotengine.org/en/latest/classes/class_kinematicbody2d.html),
|
||||
but can be more difficult to handle, as they require
|
||||
manual modification of the RigidBody velocity.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3 (particles are not available in GLES 2)
|
||||
|
||||
## How does it work?
|
||||
|
||||
The player and enemies use dynamic character
|
||||
controllers for movement, made with
|
||||
[`RigidBody2D`](https://docs.godotengine.org/en/latest/classes/class_rigidbody2d.html),
|
||||
which means that they can perfectly interact with physics
|
||||
(there is a see-saw, and you can even ride enemies).
|
||||
Because of this, all movement must be done in sync with
|
||||
the physics engine, inside of `_integrate_forces()`.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
0
2d/physics_platformer/screenshots/.gdignore
Normal file
BIN
2d/physics_platformer/screenshots/beginning.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
2d/physics_platformer/screenshots/seesaw-riding.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
@@ -8,9 +8,13 @@ You will find most of the demo’s content in the `Level.tscn` scene. You can op
|
||||
|
||||
We invite you to open the demo's GDScript files in the editor as they contain a lot of comments that explain how each class works.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3 (particles are not available in GLES 2)
|
||||
|
||||
## Features
|
||||
|
||||
- Side-scrolling player controller.
|
||||
- Side-scrolling player controller using [`KinematicBody2D`](https://docs.godotengine.org/en/latest/classes/class_kinematicbody2d.html).
|
||||
- Can walk on and snap to slopes.
|
||||
- Can shoot, including while jumping.
|
||||
- Enemies that crawl on the floor and change direction when they encounter an obstacle.
|
||||
@@ -26,4 +30,5 @@ We invite you to open the demo's GDScript files in the editor as they contain a
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
24
2d/pong/README.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Pong with GDScript
|
||||
|
||||
A simple Pong game. This demo shows best practices
|
||||
for game development in Godot, including
|
||||
[signals](https://docs.godotengine.org/en/latest/getting_started/step_by_step/signals.html).
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
Note: There is a C# version available [here](https://github.com/godotengine/godot-demo-projects/tree/master/mono/pong).
|
||||
|
||||
Note: There is a VisualScript version available [here](https://github.com/godotengine/godot-demo-projects/tree/master/visual_script/pong).
|
||||
|
||||
## How does it work?
|
||||
|
||||
The walls, paddle, and ball are all
|
||||
[`Area2D`](https://docs.godotengine.org/en/latest/classes/class_area2d.html)
|
||||
nodes. When the ball touches the walls or the paddles,
|
||||
they emit signals and modify the ball.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
0
2d/pong/screenshots/.gdignore
Normal file
BIN
2d/pong/screenshots/pong.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
@@ -2,6 +2,6 @@ extends Area2D
|
||||
|
||||
export var _bounce_direction = 1
|
||||
|
||||
func _on_area_entered( area ):
|
||||
func _on_area_entered(area):
|
||||
if area.name == "Ball":
|
||||
area.direction = (area.direction + Vector2(0, _bounce_direction)).normalized()
|
||||
|
||||
15
2d/role_playing_game/README.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Role Playing Game
|
||||
|
||||
This shows a method of creating grid-based movement with Godot
|
||||
and GDScript. It also includes a simple JRPG-style dialogue and
|
||||
battle system on top of it.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
0
2d/role_playing_game/screenshots/.gdignore
Normal file
BIN
2d/role_playing_game/screenshots/battle.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
2d/role_playing_game/screenshots/object.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
14
2d/screen_space_shaders/README.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# Screen Space Shaders
|
||||
|
||||
Several examples of full screen 2D shader processing.
|
||||
Many common full-res effects are implemented here for reference.
|
||||
|
||||
Language: [GDSL](https://docs.godotengine.org/en/latest/tutorials/shading/shading_reference/shading_language.html) and GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Screen-Space Shaders"
|
||||
config/name="Screen Space Shaders"
|
||||
run/main_scene="res://screen_shaders.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
2d/screen_space_shaders/screenshots/.gdignore
Normal file
BIN
2d/screen_space_shaders/screenshots/old_film.png
Normal file
|
After Width: | Height: | Size: 416 KiB |
BIN
2d/screen_space_shaders/screenshots/whirl.png
Normal file
|
After Width: | Height: | Size: 863 KiB |
13
2d/sdf_font/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# SDF Font
|
||||
|
||||
This is a demo of Signed Distance Field fonts in Godot.
|
||||
The technique used allows the text to remain clear
|
||||
under arbitrary zooms and rotations.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3 (this effect is not available in GLES 2)
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 4.0 KiB |
0
2d/sdf_font/screenshots/.gdignore
Normal file
BIN
2d/sdf_font/screenshots/sdf.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
12
2d/sprite_shaders/README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Sprite Shaders
|
||||
|
||||
This is a sample consisting of different shaders applied to some sprites.
|
||||
Effects include outlines, blurs, distorts, shadows, glows, and more.
|
||||
|
||||
Language: [GDSL](https://docs.godotengine.org/en/latest/tutorials/shading/shading_reference/shading_language.html)
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
0
2d/sprite_shaders/screenshots/.gdignore
Normal file
BIN
2d/sprite_shaders/screenshots/sprite.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
22
3d/ik/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# 3D Inverse Kinematics
|
||||
|
||||
This is an example of different Inverse Kinematic algorithms
|
||||
implemented in Godot. It contains four scenes, showing
|
||||
different ways they can be used.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3
|
||||
|
||||
## How does it work?
|
||||
|
||||
This demo shows how to implement IK using two different methods. One uses the
|
||||
[`SkeletonIK`](https://docs.godotengine.org/en/latest/classes/class_skeletonik.html)
|
||||
node which is built into Godot. The other method is using a script
|
||||
called FABRIK (inside of the SADE plugin) for inverse kinematics.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="3D IK"
|
||||
config/name="3D Inverse Kinematics"
|
||||
run/main_scene="res://look_at_ik.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
3d/ik/screenshots/.gdignore
Normal file
BIN
3d/ik/screenshots/cube.png
Normal file
|
After Width: | Height: | Size: 222 KiB |
BIN
3d/ik/screenshots/fps_gun.png
Normal file
|
After Width: | Height: | Size: 195 KiB |
21
3d/kinematic_character/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# 3D Kinematic Character
|
||||
|
||||
Kinematic character demo for 3D using a cube for the character.
|
||||
This is similar to the 2D platformer demo.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3
|
||||
|
||||
## How does it work?
|
||||
|
||||
This demo uses a [`KinematicBody`](https://docs.godotengine.org/en/latest/classes/class_kinematicbody.html)
|
||||
for the player, and [`StaticBody`](https://docs.godotengine.org/en/latest/classes/class_staticbody.html)
|
||||
for the level. Each has colliders, the player moves itself via
|
||||
`move_and_slide()` in `_physics_process()`, and collides with the level.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
0
3d/kinematic_character/screenshots/.gdignore
Normal file
BIN
3d/kinematic_character/screenshots/editor.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
3d/kinematic_character/screenshots/ingame.png
Normal file
|
After Width: | Height: | Size: 337 KiB |
17
3d/material_testers/README.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# Material Testers
|
||||
|
||||
This demo includes many sphere-like objects with complex materials,
|
||||
for the purpose of showcasing Godot's rendering capabilities.
|
||||
|
||||
This demo was featured at the beginning of the
|
||||
[Godot 3.0 trailer](https://www.youtube.com/watch?v=XptlVErsL-o).
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Material Tester"
|
||||
config/name="Material Testers"
|
||||
run/main_scene="res://material_tester.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
@@ -36,4 +36,3 @@ multithread/thread_rid_pool_prealloc=60
|
||||
|
||||
vram_compression/import_etc2=false
|
||||
quality/filters/msaa=2
|
||||
environment/default_environment="res://default_env.tres"
|
||||
|
||||
0
3d/material_testers/screenshots/.gdignore
Normal file
BIN
3d/material_testers/screenshots/mirror.png
Normal file
|
After Width: | Height: | Size: 507 KiB |
BIN
3d/material_testers/screenshots/stones.png
Normal file
|
After Width: | Height: | Size: 408 KiB |
14
3d/navmesh/README.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# 3D Navigation Mesh
|
||||
|
||||
Navigation mesh demo for 3D scenes, with a character
|
||||
able to pathfind around a complex 3D environment.
|
||||
The navigation path is drawn using a line.
|
||||
Code is provided for polyline following in 3D.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -15,7 +15,7 @@ _global_script_class_icons={
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Navmesh Demo"
|
||||
config/name="3D Navigation Mesh"
|
||||
run/main_scene="res://navmesh.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
|
||||
0
3d/navmesh/screenshots/.gdignore
Normal file
BIN
3d/navmesh/screenshots/nav.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
16
3d/platformer/README.md
Normal file
@@ -0,0 +1,16 @@
|
||||
# 3D Platformer
|
||||
|
||||
3D Platformer demo using a
|
||||
[`KinematicBody`](https://docs.godotengine.org/en/latest/classes/class_kinematicbody.html).
|
||||
It uses similar code to the 2D platformer, but implemented in 3D.
|
||||
It also features audio reverberation (it sounds echo-y).
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 3
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
0
3d/platformer/screenshots/.gdignore
Normal file
BIN
3d/platformer/screenshots/face.png
Normal file
|
After Width: | Height: | Size: 424 KiB |
BIN
3d/platformer/screenshots/shoot.png
Normal file
|
After Width: | Height: | Size: 623 KiB |
27
3d/truck_town/README.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Truck Town
|
||||
|
||||
This is a demo implementing different types of trucks of
|
||||
varying complexity using vehicle physics.
|
||||
|
||||
Do not be surprised if everything is bouncy and glitchy,
|
||||
Godot's physics system is not polished and will likely be
|
||||
reworked in the future.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## How does it work?
|
||||
|
||||
The base vehicle uses a
|
||||
[`VehicleBody`](https://docs.godotengine.org/en/latest/classes/class_vehiclebody.html)
|
||||
node. The trailer truck is tied together using a
|
||||
[`ConeJointTwist`](https://docs.godotengine.org/en/latest/classes/class_conetwistjoint.html)
|
||||
node, and the tow truck is tried together using a chain made of
|
||||
[`RigidBody`](https://docs.godotengine.org/en/latest/classes/class_rigidbody.html)
|
||||
nodes which are pinned together using
|
||||
[`PinJoint`](https://docs.godotengine.org/en/latest/classes/class_pinjoint.html) nodes.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
0
3d/truck_town/screenshots/.gdignore
Normal file
BIN
3d/truck_town/screenshots/tow.png
Normal file
|
After Width: | Height: | Size: 409 KiB |
18
audio/bpm_sync/README.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# Audio BPM Sync
|
||||
|
||||
A demo of how to sync the audio playback with the time for a consistent BPM.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## How does it work?
|
||||
|
||||
For the sound clock, it uses methods in
|
||||
[`AudioServer`](https://docs.godotengine.org/en/latest/classes/class_audioserver.html)
|
||||
to sync the audio playback.
|
||||
For the system clock, it uses `OS.get_ticks_usec()`.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -7,10 +7,12 @@ var playing = false
|
||||
const COMPENSATE_FRAMES = 2
|
||||
const COMPENSATE_HZ = 60.0
|
||||
|
||||
const SYNC_SOURCE_SYSTEM_CLOCK = 0
|
||||
const SYNC_SOURCE_SOUND_CLOCK = 1
|
||||
enum SyncSource {
|
||||
SYSTEM_CLOCK,
|
||||
SOUND_CLOCK,
|
||||
}
|
||||
|
||||
var sync_source = SYNC_SOURCE_SYSTEM_CLOCK
|
||||
var sync_source = SyncSource.SYSTEM_CLOCK
|
||||
|
||||
# Used by system clock.
|
||||
var time_begin
|
||||
@@ -25,16 +27,16 @@ func strsec(secs):
|
||||
|
||||
|
||||
func _process(_delta):
|
||||
if (!playing or !$Player.playing):
|
||||
if !playing or !$Player.playing:
|
||||
return
|
||||
|
||||
var time = 0.0
|
||||
if (sync_source == SYNC_SOURCE_SYSTEM_CLOCK):
|
||||
if sync_source == SyncSource.SYSTEM_CLOCK:
|
||||
# Obtain from ticks.
|
||||
time = (OS.get_ticks_usec() - time_begin) / 1000000.0
|
||||
# Compensate.
|
||||
time -= time_delay
|
||||
elif (sync_source == SYNC_SOURCE_SOUND_CLOCK):
|
||||
elif sync_source == SyncSource.SOUND_CLOCK:
|
||||
time = $Player.get_playback_position() + AudioServer.get_time_since_last_mix() - AudioServer.get_output_latency() + (1 / COMPENSATE_HZ) * COMPENSATE_FRAMES
|
||||
|
||||
var beat = int(time * BPM / 60.0)
|
||||
@@ -44,7 +46,7 @@ func _process(_delta):
|
||||
|
||||
|
||||
func _on_PlaySystem_pressed():
|
||||
sync_source = SYNC_SOURCE_SYSTEM_CLOCK
|
||||
sync_source = SyncSource.SYSTEM_CLOCK
|
||||
time_begin = OS.get_ticks_usec()
|
||||
time_delay = AudioServer.get_time_to_next_mix() + AudioServer.get_output_latency()
|
||||
playing = true
|
||||
@@ -52,6 +54,6 @@ func _on_PlaySystem_pressed():
|
||||
|
||||
|
||||
func _on_PlaySound_pressed():
|
||||
sync_source = SYNC_SOURCE_SOUND_CLOCK
|
||||
sync_source = SyncSource.SOUND_CLOCK
|
||||
playing = true
|
||||
$Player.play()
|
||||
|
||||
BIN
audio/bpm_sync/icon.png
Normal file
|
After Width: | Height: | Size: 921 B |
34
audio/bpm_sync/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
|
||||
@@ -17,6 +17,7 @@ _global_script_class_icons={
|
||||
|
||||
config/name="BPM Sync Demo"
|
||||
run/main_scene="res://bpm_sync.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[rendering]
|
||||
|
||||
|
||||
0
audio/bpm_sync/screenshots/.gdignore
Normal file
BIN
audio/bpm_sync/screenshots/bpm.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
@@ -1,36 +1,37 @@
|
||||
extends Control
|
||||
|
||||
onready var itemList = get_node("ItemList")
|
||||
onready var item_list = get_node("ItemList")
|
||||
|
||||
|
||||
func _ready():
|
||||
for item in AudioServer.get_device_list():
|
||||
itemList.add_item(item)
|
||||
item_list.add_item(item)
|
||||
|
||||
var device = AudioServer.get_device()
|
||||
for i in range(itemList.get_item_count()):
|
||||
if device == itemList.get_item_text(i):
|
||||
itemList.select(i)
|
||||
for i in range(item_list.get_item_count()):
|
||||
if device == item_list.get_item_text(i):
|
||||
item_list.select(i)
|
||||
break
|
||||
|
||||
|
||||
func _process(_delta):
|
||||
var speakerMode = "Stereo"
|
||||
var speaker_mode_text = "Stereo"
|
||||
var speaker_mode = AudioServer.get_speaker_mode()
|
||||
|
||||
if AudioServer.get_speaker_mode() == AudioServer.SPEAKER_SURROUND_31:
|
||||
speakerMode = "Surround 3.1"
|
||||
elif AudioServer.get_speaker_mode() == AudioServer.SPEAKER_SURROUND_51:
|
||||
speakerMode = "Surround 5.1"
|
||||
elif AudioServer.get_speaker_mode() == AudioServer.SPEAKER_SURROUND_71:
|
||||
speakerMode = "Surround 7.1"
|
||||
if speaker_mode == AudioServer.SPEAKER_SURROUND_31:
|
||||
speaker_mode_text = "Surround 3.1"
|
||||
elif speaker_mode == AudioServer.SPEAKER_SURROUND_51:
|
||||
speaker_mode_text = "Surround 5.1"
|
||||
elif speaker_mode == AudioServer.SPEAKER_SURROUND_71:
|
||||
speaker_mode_text = "Surround 7.1"
|
||||
|
||||
$DeviceInfo.text = "Current Device: " + AudioServer.get_device() + "\n"
|
||||
$DeviceInfo.text += "Speaker Mode: " + speakerMode
|
||||
$DeviceInfo.text += "Speaker Mode: " + speaker_mode_text
|
||||
|
||||
|
||||
func _on_Button_button_down():
|
||||
for item in itemList.get_selected_items():
|
||||
var device = itemList.get_item_text(item)
|
||||
for item in item_list.get_selected_items():
|
||||
var device = item_list.get_item_text(item)
|
||||
AudioServer.set_device(device)
|
||||
|
||||
|
||||
|
||||
18
audio/device_changer/README.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# Audio Device Changer
|
||||
|
||||
This is a demo showing how the audio output device can be changed from Godot.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## How does it work?
|
||||
|
||||
It uses the `set_device()` method in
|
||||
[`AudioServer`](https://docs.godotengine.org/en/latest/classes/class_audioserver.html)
|
||||
to change the audio device.
|
||||
The list of devices is populated using `get_device_list()`.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||