Compare commits

..

169 Commits
3.0 ... 3.1

Author SHA1 Message Date
Aaron Franke
ea5b868fc7 [3.1] Simplify list of branches in the README (#1255) 2025-10-02 16:51:20 -07:00
Rémi Verschelde
a6ae6f64be Update README for new branches, matches Godot upstream
(cherry picked from commit c0180d20d1)
2023-02-28 18:37:03 +01:00
Aaron Franke
507b8c6cf6 [3.1] Update README for the new 3.3 branch 2021-11-05 10:16:20 -05:00
Aaron Franke
e59d96ef7a Merge pull request #610 from aaronfranke/3.1-readme-license-3.2
[3.1] Update README for the new 3.2 branch
2021-04-21 03:51:30 -05:00
Aaron Franke
19584aae6a [3.1] Update README for the new 3.2 branch 2021-04-04 01:16:45 -04:00
Aaron Franke
342f27e327 Merge pull request #407 from aaronfranke/3.1
Remove BPM Sync demo from the 3.1 branch
2020-02-10 19:21:38 -05:00
Aaron Franke
4d10544dd9 Remove BPM Sync demo from the 3.1 branch 2020-02-10 19:13:49 -05:00
Aaron Franke
86944d5236 Merge pull request #404 from aaronfranke/readme-license
Update README and LICENSE for Godot 3.2
2020-02-10 19:06:53 -05:00
Aaron Franke
827d67b2ab Update README and LICENSE 2020-02-09 01:36:43 -05:00
Aaron Franke
177884ff19 Merge pull request #401 from aaronfranke/2d
Update the rest of the 2D demos for Godot 3.1.2
2020-02-03 16:56:50 -05:00
Aaron Franke
87f42b77e0 Update 2D shader and SDF demos 2020-02-03 16:37:54 -05:00
Aaron Franke
b0e1cc0227 Update 2D navigation demos 2020-02-03 16:37:54 -05:00
Aaron Franke
7af4d281b9 Update 2D lighting demos
Just renaming things, these contain no script.
2020-02-03 16:37:54 -05:00
Aaron Franke
c270db0635 Remove the kinematic collision demo
Lots of demos already feature collisions with KinematicBodies
2020-02-03 16:37:54 -05:00
Aaron Franke
746928b623 Update kinematic character 2020-02-03 16:37:54 -05:00
Aaron Franke
b0b63e80f5 Update isometric demo 2020-02-03 16:37:54 -05:00
Aaron Franke
7421736568 Update hex map demo 2020-02-03 16:37:54 -05:00
Aaron Franke
db6967868f Update HDR demo 2020-02-03 16:37:54 -05:00
Aaron Franke
49a01d6f87 Update grid based movement demo 2020-02-03 16:37:54 -05:00
Aaron Franke
ff10a807d0 Update GD Paint demo 2020-02-03 16:37:54 -05:00
Aaron Franke
704ebeec81 Merge pull request #400 from aaronfranke/2d-physics-pl
Update 2D physics platformer
2020-02-03 16:33:06 -05:00
Aaron Franke
60f515eaf9 Merge pull request #399 from aaronfranke/rpg
Update 2D role playing game
2020-02-03 16:30:36 -05:00
Aaron Franke
3eeba859b1 Update 2D physics platformer 2020-02-03 04:00:44 -05:00
Aaron Franke
9218f88723 Update 2D role playing game 2020-02-03 03:57:46 -05:00
Aaron Franke
375d5d13d2 Merge pull request #397 from aaronfranke/misc
Update and improve misc demos for Godot 3.1.2
2020-02-03 03:55:36 -05:00
Aaron Franke
c9d3646d45 Merge pull request #398 from aaronfranke/fsm
Update Finite State Machine demo to Godot 3.1.2
2020-02-03 03:55:25 -05:00
Aaron Franke
9975c95065 Update Finite State Machine demo 2020-02-02 20:28:25 -05:00
Aaron Franke
c90a251445 Update the rest of the misc demos to Godot 3.1.2
I have not tested if these work, but I made minimal changes to them (only things like comments and newlines).
2020-02-02 04:53:12 -05:00
Aaron Franke
cd7c652975 Improve scene instancing demo 2020-02-02 04:53:12 -05:00
Aaron Franke
e5ee4a5971 Improve the tween demo
Significant style changes.
2020-02-02 04:53:12 -05:00
Aaron Franke
729be3461d Style fixes for open simplex noise demo 2020-02-02 04:53:12 -05:00
Aaron Franke
abf9d68bf4 Improve regex demo 2020-02-02 04:53:12 -05:00
Aaron Franke
67a490ab50 Improve pause demo 2020-02-02 04:53:12 -05:00
Aaron Franke
f07c7091fc Improve window management demo 2020-02-02 04:53:12 -05:00
Aaron Franke
ac882369bc Merge pull request #395 from aaronfranke/gui
Improve GUI demos
2020-02-02 03:13:34 -05:00
Aaron Franke
6899d44615 Merge pull request #394 from aaronfranke/pong
Update and improve all Pong demos
2020-02-01 15:55:57 -05:00
Aaron Franke
84c8d6ef69 Update and improve GUI demos 2020-02-01 15:47:44 -05:00
Aaron Franke
691f1d94d6 Merge pull request #393 from aaronfranke/viewport
Update remaining Viewport demos to Godot 3.1.2
2020-02-01 15:34:02 -05:00
Aaron Franke
cb5906aea3 Slightly improve the GUI in 3D demo 2020-02-01 03:18:53 -05:00
Aaron Franke
237a8654b0 Improve the screen capture demo 2020-02-01 03:18:53 -05:00
Aaron Franke
4f5f0ec1a9 Update all Pong demos to Godot 3.1.2 and conform to style guides 2020-02-01 03:15:27 -05:00
Aaron Franke
e3fd4c662c Update 3D in 2D demo to Godot 3.1.2 2020-01-31 15:15:57 -05:00
Aaron Franke
ff93de81bb Merge pull request #391 from aaronfranke/mono
Update and improve Mono demos and Dodge the Creeps GDScript
2020-01-31 13:01:25 -05:00
Aaron Franke
28c3103132 Merge pull request #388 from aaronfranke/material-tester
Significantly improve the material tester demo
2020-01-31 12:32:41 -05:00
Aaron Franke
958f686e12 Update Dodge the Creeps GDScript to Godot 3.1.2 2020-01-31 02:47:36 -05:00
Aaron Franke
edb8372db8 Update Dodge the Creeps C# to Godot 3.1.2 2020-01-31 02:47:36 -05:00
Aaron Franke
de57f45049 Update Pong with C# demo to Godot 3.1.2 2020-01-31 01:43:40 -05:00
Aaron Franke
4ec9d7921b Significantly improve the material tester demo 2020-01-30 21:48:59 -05:00
Aaron Franke
a5b8cd11d9 Merge pull request #385 from aaronfranke/truck-town
Update and improve Truck Town for Godot 3.1.2
2020-01-29 21:10:21 -05:00
Aaron Franke
0746c063b4 Merge pull request #384 from aaronfranke/navmesh
Update 3D navmesh demo to Godot 3.1.2
2020-01-29 21:10:04 -05:00
Aaron Franke
9e197b8c20 Merge pull request #383 from aaronfranke/platformer-3d
Update Platformer 3D demo to Godot 3.1.2
2020-01-29 21:09:54 -05:00
Aaron Franke
2afbeef96f Allow using WASD and controllers in Truck Town 2020-01-29 17:43:46 -05:00
Aaron Franke
9c17c25343 Update and improve Truck Town for Godot 3.1.2
Conform to style guide
2020-01-29 17:36:50 -05:00
Aaron Franke
357620b336 Update 3D navmesh demo to Godot 3.1.2 2020-01-29 17:07:18 -05:00
Aaron Franke
33494c4592 [3DP] Update to Godot 3.1.2
Conform to style guide, add WASD movement, add controller support
2020-01-29 17:00:07 -05:00
Aaron Franke
76d43cf23a [3DP] Convert SCN to TSCN 2020-01-29 15:58:17 -05:00
Aaron Franke
97f9632be4 Merge pull request #381 from aaronfranke/loading
Move loading demos to their own folder
2020-01-28 20:11:54 -05:00
Aaron Franke
463da9948f Update and improve background load demo 2020-01-28 14:23:24 -05:00
Aaron Franke
04d86775da Move loading demos to their own folder 2020-01-28 14:19:42 -05:00
Aaron Franke
c6922db2a1 Merge pull request #380 from aaronfranke/display-folded
Clean up editor/display_folded
2020-01-28 13:49:32 -05:00
Aaron Franke
43dcf5c1e7 Clean up editor/display_folded 2020-01-28 13:47:21 -05:00
Aaron Franke
d19c746231 Merge pull request #371 from BenjaminNavarro/master
Add dynamic split screen demo
2020-01-28 13:38:26 -05:00
Aaron Franke
aca3ea4749 Merge pull request #341 from Calinou/handle-multiple-resolutions
Handle multiple resolutions in most demos
2020-01-28 13:29:37 -05:00
Hugo Locurcio
a45b84a5ad Handle multiple resolutions in most demos
This makes demos render correctly on hiDPI displays,
while also demonstrating how to handle multiple resolutions.

The 3D in 2D demo now uses "3D No-Effects" for the 3D viewport,
which is faster to render. Thanks to this, 4× MSAA is now enabled
for a better result.

The background loading demo now uses mipmaps for better-looking images.

The material testers demo now samples mouse input in a
resolution-independent manner when panning.

Default clear colors were also changed in some projects for visual
consistency with the project's theme.
2020-01-28 19:08:03 +01:00
Benjamin Navarro
5bdd178d85 Embed WorldEnvironement scene into the main one 2020-01-28 13:32:45 +01:00
Benjamin Navarro
b93d9028a9 Coding style 2020-01-28 13:32:18 +01:00
Benjamin Navarro
566c7e15f8 Use second controller's left stick for player2 2020-01-28 13:27:55 +01:00
Aaron Franke
eb814782c6 Merge pull request #357 from pigdevstudio/pause-demo
Improve Pause demo
2020-01-27 05:33:06 -05:00
Aaron Franke
029706d4fb Merge pull request #356 from pigdevstudio/add-script-instancing
Add Ball Factory
2020-01-27 05:29:40 -05:00
Benjamin Navarro
f922bcb8c7 Add dynamic split screen demo
Answering PR reviews

Removeing class_name

_get_split_state documentation

Mentioning Voronoi split screen in README

Fixing comments

Use the same script for both players

The input map is configured to work with AZERTY and QWERTY keyboards

Use spaces for comments alignment + code style

Fix empty line and incorrect comment

Add arrow keys to control player 2

Removing most static typing as suggested for demo projects

Removing broken split origin feature

Removing the floor texture to avoid copyright issues

Changing game icon

Make Walls.gd a tool script + randomize

Fixing style

 Handle joysticks for player movement
2020-01-27 08:58:50 +01:00
Aaron Franke
2490d9ae45 Merge pull request #379 from aaronfranke/2d-in-3d
Update 2D in 3D demo to Godot 3.1.2
2020-01-26 16:55:59 -05:00
Aaron Franke
f9b9b86949 Update 2D in 3D demo to Godot 3.1.2
Conform to style guide, make positions exact, fix viewport quad
2020-01-26 16:53:20 -05:00
Aaron Franke
79f7554bc3 Merge pull request #376 from aaronfranke/plugin-demos
Update and improve plugin demos
2020-01-26 16:52:30 -05:00
Aaron Franke
7e96ba1a6a Update plugin demos 2020-01-26 02:21:24 -05:00
Aaron Franke
861f0418f0 Merge pull request #324 from talklittle/role-playing-game-3.1
Port 2d/role_playing_game to Godot 3.1
2020-01-23 00:23:47 -05:00
Aaron Franke
8a6b1f87ba Merge pull request #89 from TwistedTwigleg/gd_paint
Added a simple drawing demo (GD paint)
2020-01-22 18:51:52 -05:00
Aaron Franke
c5a37ea618 Merge pull request #323 from Calinou/2d-platformer-ultrawide
Make the Platformer 2D demo work with ultrawide displays
2020-01-22 18:50:30 -05:00
Aaron Franke
c0f4bad011 Merge pull request #337 from robspsj/extract_shaders
Extract shader code from 2D shader demos
2020-01-22 17:53:10 -05:00
Aaron Franke
7658e62636 Merge pull request #374 from aaronfranke/device-changer
Update Audio Device Changer demo to Godot 3.1.2
2020-01-22 17:37:38 -05:00
Aaron Franke
b1953be73f Update Audio Device Changer demo to Godot 3.1.2 2020-01-22 17:32:12 -05:00
Aaron Franke
5bc48e2080 Merge pull request #287 from marcelofg55/audio_device_changer
Add new Audio Device Changer demo
2020-01-22 16:32:11 -05:00
Aaron Franke
2c6df4ed79 Merge pull request #364 from Jummit/tidy
Tidy up Main.vs in the CirclePop demo
2020-01-21 21:48:16 -05:00
Aaron Franke
015cb6e64c Merge pull request #350 from aaronfranke/audio
Update Audio demos for Godot 3.1.1
2020-01-21 21:36:58 -05:00
Aaron Franke
617896737e Update Audio demos for Godot 3.1.1 2020-01-21 21:33:36 -05:00
Aaron Franke
50d5a118c9 Merge pull request #330 from aaronfranke/update-ik
Update and optimize 3D IK Demo
2020-01-21 21:24:20 -05:00
Aaron Franke
e5e20a57a1 [IK] Conform to the new GDScript style guide 2020-01-21 21:20:27 -05:00
Aaron Franke
72ff4543c8 [IK] Organize FPS into subfolder
Also, removed Wall8 so that you can't get stuck
2020-01-21 21:18:09 -05:00
Aaron Franke
f863ebe52c [IK] Refactor ik_fabrik.gd
Add static typing in many places, cache values to improve performance, use printerr, use Vector3.UP, and use linear_interpolate method
2020-01-21 21:17:09 -05:00
Aaron Franke
4ce086a745 [IK] FPS example fixes
Fix being able to lean through walls, fix walls floating slightly above the ground, aligned walls to integer grid when applicable
2020-01-21 21:16:25 -05:00
Aaron Franke
6a1fe3b48a [IK] Script fixes
Fix warnings, ensure functions are spaced
2020-01-21 21:15:42 -05:00
Aaron Franke
990042e3c5 [IK] Update to Godot 3.1
Open and save all resources
2020-01-21 21:15:31 -05:00
Aaron Franke
53fc37e64e Merge pull request #331 from aaronfranke/update-kc3d
Update and optimize 3D KC demo
2020-01-21 20:28:32 -05:00
Aaron Franke
de309f0544 Merge pull request #299 from TwistedTwigleg/gui_in_3d_fix
Rewrote most of the code in the gui_in_3d demo.
2020-01-21 20:22:37 -05:00
Aaron Franke
c101b13b27 Merge pull request #340 from aaronfranke/misc-files-templates
Funding and issue template files, and update gitignore
2020-01-21 20:18:50 -05:00
Hugo Locurcio
54ae746654 Merge pull request #370 from Calinou/material-testers-disable-etc2-import
Disable ETC2 texture compression in the Material Testers demo
2020-01-09 22:53:13 +01:00
Rémi Verschelde
1ca3204e0a hexmap: Enable Centered Texture option
See godotengine/godot#21213.
2020-01-08 09:43:10 +01:00
Hugo Locurcio
d191bf5558 Disable ETC2 texture compression in the Material Testers demo
Importing ETC2 textures is slow and requires a lot of RAM, so it
makes sense to disable it. Those who would like to run the demo
on mobile platforms can re-enable it in the Project Settings.
2020-01-04 00:19:55 +01:00
Rémi Verschelde
61ea666d69 Remove bogus draw_order values due to a pre-3.0 initialization bug
Fixes godotengine/godot#25642.
2020-01-02 11:25:16 +01:00
Jummit
ebdb732fc8 tidy up Main.vs 2019-12-07 16:58:48 +01:00
TwistedTwigleg
ee3dac1635 Fixed issue with strange tool script included in the gui in 3D demo 2019-10-20 14:33:02 -04:00
Bojidar Marinov
c34a2b423b Merge pull request #348 from texaco/master
Fix seesaw falling plank from 2d demo
2019-10-16 10:26:48 +03:00
Manolo Texaco
98e60d4ff6 Fix seesaw falling plank from 2d demo
Seesaw did stand up in 2d Demo - Physics Platformer.

Add a pillar as static body and reasign PinJoin2D nodes
2019-10-16 10:23:30 +03:00
Henrique Campos
85afe1bc9a Improved Pause demo 2019-10-07 21:19:13 -03:00
Henrique Campos
1ae9f1b549 Added Ball Factory and Removed container.png using a Polygond2D instead 2019-10-07 21:04:40 -03:00
Rémi Verschelde
d29b987235 Merge pull request #353 from hbina/fix_quat_error
Fixed casting from Basis to Quat
2019-09-26 12:36:20 +02:00
Hanif Bin Ariffin
1e44578b1e Fixed basis -> quat casting
Noticed a lot of error spat out because of unnormalized basis.
I simply followed the suggestion to use get_rotation_quat() instead of using constructor of Quat(x).
2019-09-23 19:09:40 -04:00
TwistedTwigleg
61ea89e836 Made minor changes to GUI in 3D demo script 2019-08-29 13:26:51 -04:00
TwistedTwigleg
0d40b69c19 Minor changes to GD_Paint demo 2019-08-29 13:17:15 -04:00
Rémi Verschelde
9b2da1fa2f Merge pull request #343 from Faless/websocket/initial
Add 3 WebSocket demos
2019-08-22 14:34:03 +02:00
Roberto Proença
36c9ecdfa8 Extract shader code from 2D shader demos 2019-07-31 13:15:42 -03:00
Fabio Alessandrelli
359ef78ee0 Add WebSocket high level multiplayer demo. 2019-07-28 15:25:36 +02:00
Fabio Alessandrelli
e9f02ff05f Add Websocket chat demo 2019-07-28 14:20:57 +02:00
Fabio Alessandrelli
949a9428eb Add websocket minimal demo 2019-07-28 14:13:19 +02:00
Hugo Locurcio
974e506371 Make the Platformer 2D demo work with ultrawide displays
This makes it possible to fill the whole viewport when playing on
a 21:9 monitor or a 19:9 smartphone.
2019-07-20 11:33:05 +02:00
Aaron Franke
3bf7046184 FUNDING, issue template files, and update gitignore
The mono_crash ignore is because they generated anytime there was a crash. The rest of the files mirror the main Godot repo.
2019-07-19 18:07:46 -04:00
Aaron Franke
a2e7bf2b36 [KC3D] Improvements and fixes
WASD movement, script improvements, move Cubio to its own scene, capitalize nodes, better win text, fix GDScript warnings
2019-07-11 13:31:06 -04:00
Aaron Franke
fa09138422 [KC3D] Convert scn to tscn and res to tres 2019-07-11 13:31:06 -04:00
Rémi Verschelde
c2d2718cca Merge pull request #339 from Faless/mp/bomber_fix_pr
Use p2p in multiplayer bomber player exchange.
2019-07-11 08:33:15 +02:00
Fabio Alessandrelli
38bfaba92d Use p2p in multiplayer bomber player exchange.
We used to broadcast player info on connect and have the server relay it
to other clients.
With this approach, each peer (including server) sends its own info once
to other peers as soon as they connects.
When a new player connects, it is notified of all the already connected
peers by the `network_peer_connected` signal.
Any already connected peer is also notified of the newly connected peer
by the same signal.
2019-07-10 18:29:44 +02:00
Rémi Verschelde
85f36d6b3b Merge pull request #338 from kjav/master
Fixed typo in overlay instructions
2019-07-08 07:10:05 +02:00
Sam
bee90f6bd7 Fixed typo in overlay instructions 2019-07-06 00:59:21 +01:00
Rémi Verschelde
e691f98c18 Merge pull request #302 from kkmzero/patch-1
Automatic brake/reverse
2019-07-04 12:03:05 +02:00
Rémi Verschelde
99f6e67d40 Merge pull request #335 from Faless/webrtc/initial
Add two WebRTC demo
2019-06-19 14:27:39 +02:00
TwistedTwigleg
2c5b4a48d0 Made changes to gd_paint demo based on feedback by aaronfranke 2019-06-15 11:52:41 -04:00
TwistedTwigleg
82d9684caf Made changes to the gui in 3D demo based on suggestions by aaronfranke 2019-06-15 11:38:09 -04:00
TwistedTwigleg
a527318768 Updated demo to work with Godot 3.1 with changes in the demo rewrite PR. Changed comments according to discussion in merged PR 2019-06-15 11:38:09 -04:00
Wagner Ferreira
7e37b4162f Renamed to lowercase to follow conventions 2019-06-15 11:38:09 -04:00
Wagner Ferreira
9adc81ce7f Added extra rewriting in the code to improve mouse drag
* Made the whole block a separated scene to demonstrate it can work across multiple instances.
* Dropped the Area.input_event and did everything manually with raycasting.
* Made quad_mesh_size automatically pick the quad size, avoiding the extra setup.
* Changed from PlaneMesh to QuadMesh. Now everyting can start with 0 rotation.
* The function will keep handling input when the mouse is outside of the area to avoid orphan clicks, but stop when the click is released.
* Changed some variable and function names to make sense with the code changes.
* Added an extra function to deal with billboard mode. But is not perfect, specially with scaling and Y-billboard + camera tilting.
2019-06-15 11:38:09 -04:00
TwistedTwigleg
092cf6fc03 Rewrote most of the code in the gui_in_3d demo. Now the demo supports viewports of different sizes, different sized quads, and has comments explaining what the code is doing 2019-06-15 11:38:09 -04:00
Fabio Alessandrelli
2a57c64c30 Add webrtc signaling example 2019-06-14 06:15:22 +02:00
Fabio Alessandrelli
0bbe5ef586 Add minimal connection demos 2019-06-14 04:14:53 +02:00
Rémi Verschelde
0db440bb55 Merge pull request #274 from Calinou/optimize-images
Optimize all images using `oxipng -o6 --strip all --zopfli`
2019-06-14 00:16:48 +02:00
Hugo Locurcio
184b0fe5f8 Optimize all images using oxipng -o6 --strip all --zopfli 2019-06-11 16:40:50 +02:00
Rémi Verschelde
6a9bb96ebd Merge pull request #332 from t-karcher/visual-script-patch
Visual Script demos converted to and tested with V3.1
2019-06-11 12:25:06 +02:00
Rémi Verschelde
4bb717c59f Merge pull request #220 from Calinou/increase-sky-radiance-size
Increase sky radiance size to 128 (from 64) in the Material Tester demo
2019-06-10 15:31:21 +02:00
Rémi Verschelde
f83706d306 Merge pull request #286 from williamd1k0/improve-godette-sprite
Improve Godette sprite in sprite_shaders demo
2019-06-10 10:49:21 +02:00
TwistedTwigleg
7ad43829ef Updated project to work with the latest version of Godot. Reworked the code so it is cleaner and easier to understand. Updated comments within code according to changes 2019-06-09 18:44:01 -04:00
Hugo Locurcio
7f41a74a98 Increase sky radiance size to 128 (from 64) in the Material Tester demo
This makes reflections look nicer, especially on materials with low
roughness values.
2019-06-05 13:38:52 +02:00
Andrew Shu
11425f2a6a Port 2d/role_playing_game to Godot 3.1
1. Renamed `CELL_TYPES` enums to `CellType`
2. Fixed references, old: `turn_combat_system/actors/Actor.gd`, new: `turn_combat/combatants/Combatant.gd`
3. Fixed references, old: `turn_combat_system/actors/health/Health.tscn`, new: `turn_combat/combatants/health/Health.tscn`
4. Fixed bug in `grid_movement/pawns/Actor.gd` extending lowercase `pawn.gd`; changed to `Pawn.gd`
5. Renamed lowercase `grid_movement/pawns/actor.gd` to capital `Actor.gd` for consistency
6. Fixed some unused local variables warnings

Other changes are from engine, after opening and saving all scenes.
2019-06-04 16:45:41 -07:00
Thomas Karcher
626b9178bb Converted to and tested with V3.1 2019-06-04 21:25:25 +02:00
Rémi Verschelde
47be86af93 Merge pull request #319 from wscalf/master
Updated rotation of Quad to be right side up
2019-06-03 21:31:54 +02:00
Rémi Verschelde
61c03933e4 Merge pull request #328 from t-karcher/patch-1
More projects converted to and tested with Godot 3.1
2019-06-03 21:17:03 +02:00
Thomas Karcher
1cfb3ee621 Small bugfix in 3D platformer
Gravity vector is zero in the first few frames, leading to errors in follow-up calculations expecting a normalized  vector. Fixed by assigning a default gravity in case those cases.
2019-05-15 21:57:35 +02:00
Thomas Karcher
39590fadd3 2D RPG converted to and tested with V3.1 2019-05-15 21:34:26 +02:00
Thomas Karcher
d21936b32d 3D projects converted to and tested with Godot 3.1 2019-05-15 19:26:16 +02:00
Thomas Karcher
d9a4d21e16 Updated latest Godot version (3.1) in README.md 2019-05-14 15:33:44 +02:00
Rémi Verschelde
b9bca13221 Merge pull request #326 from DevinPentecost/opensimplexnoise
Adding OpenSimplexNoise Viewer demo
2019-05-10 11:15:47 +02:00
Devin Pentecost
19c4d7311f Adding example NoiseTexture usage, as an example
Set the use_noise_texture flag to true to use it instead.
2019-05-08 21:58:10 -07:00
Devin Pentecost
27727fdde5 Adding OpenSimplexNoise Viewer demo 2019-05-04 23:50:24 -07:00
Juan Linietsky
ceefc33fe4 Improved tutorial for sync audio with music, use two approaches. 2019-04-27 15:26:48 -03:00
Juan Linietsky
e22a46f301 Add a BPM sync tutorial. 2019-04-27 14:14:17 -03:00
Juan Linietsky
c819e3b276 Demos for sound generation and audio spectrum analysis. 2019-04-10 12:26:55 -03:00
Rémi Verschelde
56a2b28c53 Merge pull request #322 from bojidar-bg/321-navigation-reach-end
Fix navigation demo not reaching the final point
2019-04-08 16:43:38 +02:00
Bojidar Marinov
55d1deeeac Fix navigation demo not reaching the final point
Fixes #321
2019-04-08 16:46:00 +03:00
William Scalf
cc0b002e6e Updated rotation of Quad to be right side up 2019-03-23 18:06:43 -04:00
Rémi Verschelde
17e80079e3 Merge pull request #318 from cbscribe/dodge_31_updates
Update Dodge demo to match 3.1 docs
2019-03-16 17:45:24 -07:00
Chris Bradfield
961c71d003 Update Dodge demo to match 3.1 docs 2019-03-16 17:26:56 -07:00
Rémi Verschelde
1a5517ae1a MicRecord: Improve UI for mobile, add status label 2019-03-08 15:39:49 +01:00
Rémi Verschelde
63392a3574 Port 3D kinematic char and materials tester to Godot 3.1 2019-03-07 23:36:30 +01:00
TestDotCom
2fb80980b9 2d/physics_platformer works flawlessly on Godot 3.1 beta 8 (#312)
* 2d/physics_platformer works flawlessly on Godot 3.1 beta 8
* fix warnings for inferred node type
* every script has a class_name
* formatted code for better clarity
* each files has its own subfolder
* bullet collisions and shooting have to be executed from call_deferred

* PascalCase naming for nodes
2019-03-04 12:12:33 +01:00
TestDotCom
81441c42b7 2d/platformer works flawlessly on Godot 3.1 beta 8 (#310)
* 2d/platformer works flawlessly on Godot 3.1 beta 8
* fix warnings for inferred node type
* every script has a class_name
* formatted code for better clarity
* each files has its own subfolder

* As suggested by @akien-mga
* states are back to const instead of enum
* class_name comes after extends
* better code style

* PascalCase for nodes
2019-03-04 12:12:08 +01:00
Rémi Verschelde
cfcc0f3964 Port misc and plugin demos to Godot 3.1 2019-02-26 15:13:08 +01:00
Rémi Verschelde
a38b315064 Port audio, gui, mono, networking and viewport demos to Godot 3.1 2019-02-26 14:50:18 +01:00
Rémi Verschelde
faae60ac2f Port 2D demos to Godot 3.1
Opened them, saved all scenes, ran the project. Did necessary fixes here and there,
fixed some warnings (but some remain in bigger demos).

Did not port JRPG demo yet (#306) nor the two platformer demos.
2019-02-26 14:22:02 +01:00
Ivan Kmeťo
bded14a506 Automatic brake/reverse
Value fwd_mps converts global velocity into a velocity vector which is rotated to cars local coordinate system (in this example x-axis).
Then if key "ui_down" is pressed and the fwd_mps value is greater or equal to -1 (which seems to be very good spot and represents car still moving forward but nearly standing still) the car reverses (negative engine_force_value). If this condition isn't met (which means the car is moving forward) then the car brakes.

Tested and working on Godot 3.1 Beta 3.

Suggestions:
In this case, if you want something more realistic, the -engine_force_value can be much lower because no car reverses in same speed as it goes forward but for the sake of demo project I left it as it is.

Created for my own project with help of user wombatstampede from godotdevelopers.org/forum
2019-02-06 05:59:45 +01:00
Toshio Araki
a6ce6dbf4c Updated 2D pathfinding for version 3.1 (#301) 2019-01-29 09:00:43 +01:00
Marcelo Fernandez
db411004b5 Add new Audio Device Changer demo 2018-10-08 22:23:23 -03:00
William Tumeo
765ca64680 Improve Godette sprite in sprite_shaders demo 2018-10-02 00:58:08 -03:00
TwistedTwigleg
a159361a2f Added a simple drawing example to help show how to use the drawing functions
in CanvasItem to make a simple MS paint like program.
2017-11-03 14:23:07 -04:00
1427 changed files with 25227 additions and 27260 deletions

View File

@@ -1,16 +1,6 @@
# Top-most EditorConfig file.
root = true
# Unix-style newlines with a newline ending every file.
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
[*.cs]
csharp_space_after_cast = false
indent_size = 4
[*.csproj]
insert_final_newline = false
indent_size = 2

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
patreon: godotengine
custom: https://godotengine.org/donate

18
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,18 @@
<!-- Please search existing issues for potential duplicates before filing yours:
https://github.com/godotengine/godot-demo-projects/issues?q=is%3Aissue
-->
**Which demo project is affected:**
<!-- Specify the project name or path. -->
**OS/device including version:**
<!-- Specify GPU model and drivers if graphics-related. -->
**Issue description:**
<!-- What happened, and what was expected. -->
**Screenshots of issue:**
<!-- Drag in an image, or link in the form of "![]()". If not relevant, remove this section. -->

View File

@@ -7,19 +7,24 @@ func show_message(text):
$MessageLabel.show()
$MessageTimer.start()
func show_game_over():
show_message("Game Over")
yield($MessageTimer, "timeout")
$StartButton.show()
$MessageLabel.text = "Dodge the\nCreeps!"
$MessageLabel.text = "Dodge the\nCreeps"
$MessageLabel.show()
yield(get_tree().create_timer(1), 'timeout')
$StartButton.show()
func update_score(score):
$ScoreLabel.text = str(score)
func _on_StartButton_pressed():
$StartButton.hide()
emit_signal("start_game")
func _on_MessageTimer_timeout():
$MessageLabel.hide()

View File

@@ -1,126 +1,57 @@
[gd_scene load_steps=6 format=2]
[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
use_mipmaps = false
use_filter = false
font_data = ExtResource( 2 )
_sections_unfolded = [ "Font", "Settings" ]
[sub_resource type="DynamicFont" id=2]
size = 72
use_mipmaps = false
use_filter = false
size = 64
font_data = ExtResource( 2 )
_sections_unfolded = [ "Font", "Settings" ]
[sub_resource type="DynamicFont" id=3]
[sub_resource type="InputEventAction" id=3]
action = "ui_select"
size = 48
use_mipmaps = false
use_filter = false
font_data = ExtResource( 2 )
_sections_unfolded = [ "Font", "Settings" ]
[sub_resource type="ShortCut" id=4]
shortcut = SubResource( 3 )
[node name="HUD" type="CanvasLayer"]
layer = 1
offset = Vector2( 0, 0 )
rotation = 0.0
scale = Vector2( 1, 1 )
transform = Transform2D( 1, 0, 0, 1, 0, 0 )
script = ExtResource( 1 )
[node name="ScoreLabel" type="Label" parent="." index="0"]
anchor_left = 0.5
anchor_top = 0.0
anchor_right = 0.5
anchor_bottom = 0.0
margin_left = -25.0
margin_right = 25.0
margin_bottom = 100.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
[node name="ScoreLabel" type="Label" parent="."]
anchor_right = 1.0
margin_bottom = 78.0
custom_fonts/font = SubResource( 1 )
text = "0"
align = 1
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
_sections_unfolded = [ "Anchor", "Margin", "custom_fonts" ]
[node name="MessageLabel" type="Label" parent="." index="1"]
anchor_left = 0.5
[node name="MessageLabel" type="Label" parent="."]
anchor_top = 0.5
anchor_right = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
margin_left = -200.0
margin_top = -150.0
margin_right = 200.0
margin_bottom = 50.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
custom_fonts/font = SubResource( 2 )
margin_top = -79.5
margin_bottom = 79.5
custom_fonts/font = SubResource( 1 )
text = "Dodge the
Creeps!"
Creeps"
align = 1
valign = 1
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
_sections_unfolded = [ "Anchor", "Margin", "custom_fonts" ]
[node name="MessageTimer" type="Timer" parent="." index="2"]
process_mode = 1
wait_time = 2.0
one_shot = true
autostart = false
[node name="StartButton" type="Button" parent="." index="3"]
[node name="StartButton" type="Button" parent="."]
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_left = -100.0
margin_left = -90.0
margin_top = -200.0
margin_right = 100.0
margin_right = 90.0
margin_bottom = -100.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
focus_mode = 2
mouse_filter = 0
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 1
custom_fonts/font = SubResource( 3 )
toggle_mode = false
enabled_focus_mode = 2
shortcut = null
group = null
custom_fonts/font = SubResource( 2 )
shortcut = SubResource( 4 )
text = "Start"
flat = false
align = 1
_sections_unfolded = [ "Anchor", "Margin", "Visibility", "custom_fonts" ]
[connection signal="timeout" from="MessageTimer" to="." method="_on_MessageTimer_timeout"]
[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"]

View File

@@ -6,37 +6,40 @@ var score
func _ready():
randomize()
func new_game():
score = 0
$HUD.update_score(score)
$Player.start($StartPosition.position)
$StartTimer.start()
$HUD.show_message("Get Ready")
$Music.play()
func game_over():
$DeathSound.play()
$Music.stop()
$ScoreTimer.stop()
$MobTimer.stop()
$HUD.show_game_over()
$Music.stop()
$DeathSound.play()
func new_game():
score = 0
$Player.start($StartPosition.position)
$StartTimer.start()
$HUD.update_score(score)
$HUD.show_message("Get Ready")
$Music.play()
func _on_MobTimer_timeout():
# choose a random location on the Path2D
$MobPath/MobSpawnLocation.set_offset(randi())
$MobPath/MobSpawnLocation.offset = randi()
var mob = Mob.instance()
add_child(mob)
var direction = $MobPath/MobSpawnLocation.rotation + PI/2
var direction = $MobPath/MobSpawnLocation.rotation + PI / 2
mob.position = $MobPath/MobSpawnLocation.position
# add some randomness to the direction
direction += rand_range(-PI/4, PI/4)
direction += rand_range(-PI / 4, PI / 4)
mob.rotation = direction
mob.set_linear_velocity(Vector2(rand_range(mob.MIN_SPEED, mob.MAX_SPEED), 0).rotated(direction))
mob.linear_velocity = Vector2(rand_range(mob.min_speed, mob.max_speed), 0).rotated(direction)
func _on_StartTimer_timeout():
$MobTimer.start()
$ScoreTimer.start()
func _on_ScoreTimer_timeout():
score += 1
$HUD.update_score(score)
func _on_StartTimer_timeout():
$MobTimer.start()
$ScoreTimer.start()

View File

@@ -8,105 +8,47 @@
[ext_resource path="res://art/gameover.wav" type="AudioStream" id=6]
[sub_resource type="Curve2D" id=1]
bake_interval = 5.0
_data = {
"points": PoolVector2Array( 0, 0, 0, 0, 1.70602, 3.56798, 0, 0, 0, 0, 482.263, 3.26522, 0, 0, 0, 0, 480.489, 729.458, 0, 0, 0, 0, 0.794434, 732.118, 0, 0, 0, 0, 1.97066, 3.83263 )
"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" index="0"]
[node name="Main" type="Node"]
script = ExtResource( 1 )
Mob = ExtResource( 2 )
[node name="ColorRect" type="ColorRect" parent="." index="0"]
[node name="ColorRect" type="ColorRect" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
color = Color( 0.219608, 0.372549, 0.380392, 1 )
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 486.0
margin_bottom = 734.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 0
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 1
color = Color( 0.253451, 0.425288, 0.429412, 1 )
[node name="Player" parent="." instance=ExtResource( 3 )]
[node name="Player" parent="." index="1" instance=ExtResource( 3 )]
[node name="MobTimer" type="Timer" parent="." index="2"]
process_mode = 1
[node name="MobTimer" type="Timer" parent="."]
wait_time = 0.5
one_shot = false
autostart = false
[node name="ScoreTimer" type="Timer" parent="." index="3"]
[node name="ScoreTimer" type="Timer" parent="."]
process_mode = 1
wait_time = 1.0
one_shot = false
autostart = false
[node name="StartTimer" type="Timer" parent="." index="4"]
process_mode = 1
[node name="StartTimer" type="Timer" parent="."]
wait_time = 2.0
one_shot = true
autostart = false
[node name="StartPosition" type="Position2D" parent="." index="5"]
[node name="StartPosition" type="Position2D" parent="."]
position = Vector2( 240, 450 )
_sections_unfolded = [ "Transform" ]
[node name="HUD" parent="." index="6" instance=ExtResource( 4 )]
transform = Transform2D( 1, 0, 0, 1, 0, 0 )
[node name="Music" type="AudioStreamPlayer" parent="." index="7"]
stream = ExtResource( 5 )
volume_db = -8.0
autoplay = false
mix_target = 0
bus = "Master"
[node name="DeathSound" type="AudioStreamPlayer" parent="." index="8"]
stream = ExtResource( 6 )
volume_db = -5.0
autoplay = false
mix_target = 0
bus = "Master"
[node name="MobPath" type="Path2D" parent="." index="9"]
[node name="MobPath" type="Path2D" parent="."]
curve = SubResource( 1 )
[node name="MobSpawnLocation" type="PathFollow2D" parent="MobPath" index="0"]
[node name="MobSpawnLocation" type="PathFollow2D" parent="MobPath"]
position = Vector2( 1.70602, 3.56798 )
rotation = -0.000630111
offset = 0.0
h_offset = 0.0
v_offset = 0.0
rotate = true
cubic_interp = true
loop = true
lookahead = 4.0
[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"]

View File

@@ -1,11 +1,13 @@
extends RigidBody2D
export (int) var MIN_SPEED
export (int) var MAX_SPEED
#warning-ignore-all:unused_class_variable
export var min_speed = 150
export var max_speed = 250
var mob_types = ["walk", "swim", "fly"]
func _ready():
$AnimatedSprite.animation = mob_types[randi() % mob_types.size()]
func _on_Visibility_screen_exited():
func _on_VisibilityNotifier2D_screen_exited():
queue_free()

View File

@@ -1,25 +1,24 @@
[gd_scene load_steps=10 format=2]
[ext_resource path="res://Mob.gd" type="Script" id=1]
[ext_resource path="res://art/enemyWalking_1.png" type="Texture" id=2]
[ext_resource path="res://art/enemyWalking_2.png" type="Texture" id=3]
[ext_resource path="res://art/enemyFlyingAlt_1.png" type="Texture" id=4]
[ext_resource path="res://art/enemyFlyingAlt_2.png" type="Texture" id=5]
[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": "walk",
"speed": 4.0
"name": "fly",
"speed": 3.0
}, {
"frames": [ ExtResource( 4 ), ExtResource( 5 ) ],
"loop": true,
"name": "fly",
"speed": 3.0
"name": "walk",
"speed": 4.0
}, {
"frames": [ ExtResource( 6 ), ExtResource( 7 ) ],
"loop": true,
@@ -28,55 +27,27 @@ animations = [ {
} ]
[sub_resource type="CapsuleShape2D" id=2]
custom_solver_bias = 0.0
radius = 34.8222
height = 28.8308
radius = 35.2706
height = 23.3281
[node name="Mob" type="RigidBody2D"]
input_pickable = true
collision_layer = 1
collision_mask = 0
mode = 0
mass = 1.0
friction = 1.0
bounce = 0.0
gravity_scale = 0.0
custom_integrator = false
continuous_cd = 0
contacts_reported = 0
contact_monitor = false
sleeping = false
can_sleep = true
linear_velocity = Vector2( 0, 0 )
linear_damp = 0.1
angular_velocity = 0.0
angular_damp = 1.0
script = ExtResource( 1 )
_sections_unfolded = [ "Angular", "Collision", "Transform" ]
__meta__ = {
"_edit_group_": true
}
MIN_SPEED = 150
MAX_SPEED = 250
[node name="AnimatedSprite" type="AnimatedSprite" parent="." index="0"]
[node name="AnimatedSprite" type="AnimatedSprite" parent="."]
scale = Vector2( 0.75, 0.75 )
frames = SubResource( 1 )
animation = "swim"
animation = "walk"
frame = 1
playing = true
_sections_unfolded = [ "Transform" ]
[node name="Collision" type="CollisionShape2D" parent="." index="1"]
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
rotation = 1.5708
shape = SubResource( 2 )
_sections_unfolded = [ "Transform", "Visibility" ]
[node name="Visibility" type="VisibilityNotifier2D" parent="." index="2"]
rect = Rect2( -10, -10, 20, 20 )
[node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."]
[connection signal="screen_exited" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_screen_exited"]

View File

@@ -2,40 +2,27 @@ extends Area2D
signal hit
export (int) var SPEED
var velocity = Vector2()
var screensize
export var speed = 400
var screen_size
func _ready():
screen_size = get_viewport_rect().size
hide()
screensize = get_viewport_rect().size
func start(pos):
position = pos
show()
$Collision.disabled = false
func _process(delta):
velocity = Vector2()
if Input.is_action_pressed("ui_right"):
velocity.x += 1
if Input.is_action_pressed("ui_left"):
velocity.x -= 1
if Input.is_action_pressed("ui_down"):
velocity.y += 1
if Input.is_action_pressed("ui_up"):
velocity.y -= 1
var velocity = Vector2()
velocity.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
velocity.y = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
if velocity.length() > 0:
velocity = velocity.normalized() * SPEED
velocity = velocity.normalized() * speed
$AnimatedSprite.play()
$Trail.emitting = true
else:
$AnimatedSprite.stop()
$Trail.emitting = false
position += velocity * delta
position.x = clamp(position.x, 0, screensize.x)
position.y = clamp(position.y, 0, screensize.y)
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"
@@ -45,10 +32,14 @@ func _process(delta):
$AnimatedSprite.animation = "up"
$AnimatedSprite.flip_v = velocity.y > 0
func _on_Player_body_entered( body ):
$Collision.disabled = true
func start(pos):
position = pos
show()
$CollisionShape2D.disabled = false
func _on_Player_body_entered(_body):
hide()
emit_signal("hit")
$CollisionShape2D.set_deferred("disabled", true)

View File

@@ -7,7 +7,6 @@
[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,
@@ -21,125 +20,51 @@ animations = [ {
} ]
[sub_resource type="CapsuleShape2D" id=2]
custom_solver_bias = 0.0
radius = 26.5155
height = 13.8847
radius = 26.1701
height = 14.822
[sub_resource type="Gradient" id=3]
offsets = PoolRealArray( 0, 1 )
colors = PoolColorArray( 1, 1, 1, 0.523804, 1, 1, 1, 0 )
colors = PoolColorArray( 1, 1, 1, 0.501961, 1, 1, 1, 0 )
[sub_resource type="GradientTexture" id=4]
flags = 4
gradient = SubResource( 3 )
width = 2048
[sub_resource type="Curve" id=5]
min_value = 0.0
max_value = 1.0
bake_resolution = 100
_data = [ Vector2( 0, 0.446289 ), 0.0, 0.0, 0, 0, Vector2( 1, 0.306641 ), 0.0, 0.0, 0, 0 ]
_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]
flags = 4
width = 2048
curve = SubResource( 5 )
[sub_resource type="ParticlesMaterial" id=7]
render_priority = 0
trail_divisor = 1
emission_shape = 0
flag_align_y = false
flag_rotate_y = false
flag_disable_z = true
spread = 45.0
flatness = 0.0
gravity = Vector3( 0, 0, 0 )
initial_velocity = 1.0
initial_velocity_random = 0.0
angular_velocity = 1.56945e-43
angular_velocity_random = 0.0
orbit_velocity = 0.0
orbit_velocity_random = 0.0
linear_accel = 0.0
linear_accel_random = 0.0
radial_accel = 0.0
radial_accel_random = 0.0
tangential_accel = 0.0
tangential_accel_random = 0.0
damping = 0.0
damping_random = 0.0
angle = 0.0
angle_random = 0.0
scale = 1.0
scale_random = 0.0
scale = 0.75
scale_curve = SubResource( 6 )
color_ramp = SubResource( 4 )
hue_variation = 0.0
hue_variation_random = 0.0
anim_speed = 0.0
anim_speed_random = 0.0
anim_offset = 0.0
anim_offset_random = 0.0
anim_loop = false
_sections_unfolded = [ "Color", "Gravity", "Scale" ]
[node name="Player" type="Area2D"]
input_pickable = true
gravity_vec = Vector2( 0, 1 )
gravity = 98.0
linear_damp = 0.1
angular_damp = 1.0
audio_bus_override = false
audio_bus_name = "Master"
z_index = 10
script = ExtResource( 1 )
_sections_unfolded = [ "Transform" ]
__meta__ = {
"_edit_group_": true
}
SPEED = 400
[node name="AnimatedSprite" type="AnimatedSprite" parent="." index="0"]
[node name="AnimatedSprite" type="AnimatedSprite" parent="."]
scale = Vector2( 0.5, 0.5 )
frames = SubResource( 1 )
animation = "right"
_sections_unfolded = [ "Region", "Transform", "Z" ]
[node name="Collision" type="CollisionShape2D" parent="." index="1"]
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource( 2 )
[node name="Trail" type="Particles2D" parent="." index="2"]
show_behind_parent = true
emitting = true
[node name="Trail" type="Particles2D" parent="."]
z_index = -1
amount = 10
lifetime = 1.0
one_shot = false
preprocess = 0.0
speed_scale = 2.0
explosiveness = 0.0
randomness = 0.0
fixed_fps = 0
fract_delta = true
visibility_rect = Rect2( -100, -100, 200, 200 )
local_coords = false
draw_order = 0
process_material = SubResource( 7 )
texture = ExtResource( 4 )
normal_map = null
h_frames = 1
v_frames = 1
_sections_unfolded = [ "Drawing", "Process Material", "Textures", "Time", "Transform", "Visibility" ]
texture = ExtResource( 2 )
[connection signal="body_entered" from="." to="." method="_on_Player_body_entered"]

View File

@@ -6,7 +6,8 @@ path="res://.import/House In a Forest Loop.ogg-1a6a72ae843ad792b7039931227e8d50.
[deps]
source_md5="c395b0cc351a71713417cf862282849f"
source_file="res://art/House In a Forest Loop.ogg"
dest_files=[ "res://.import/House In a Forest Loop.ogg-1a6a72ae843ad792b7039931227e8d50.oggstr" ]
[params]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/enemyFlyingAlt_1.png-559f599b16c69b112c1b53f6332e9489.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="64d9fdc23f76112a64a283673e3fd8dd"
source_file="res://art/enemyFlyingAlt_1.png"
dest_files=[ "res://.import/enemyFlyingAlt_1.png-559f599b16c69b112c1b53f6332e9489.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=false
@@ -22,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/enemyFlyingAlt_2.png-31dc7310eda6e1b721224f3cd932c076.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="5281b0d2b947deb09cbf95ecf9628ae7"
source_file="res://art/enemyFlyingAlt_2.png"
dest_files=[ "res://.import/enemyFlyingAlt_2.png-31dc7310eda6e1b721224f3cd932c076.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=false
@@ -22,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/enemySwimming_1.png-dd0e11759dc3d624c8a704f6e98a3d80.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="5e557d1bd564dd553650de1c38746ed9"
source_file="res://art/enemySwimming_1.png"
dest_files=[ "res://.import/enemySwimming_1.png-dd0e11759dc3d624c8a704f6e98a3d80.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=false
@@ -22,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/enemySwimming_2.png-4c0cbc0732264c4ea3290340bd4a0a62.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="d04b001ba2f4ac6884fdbe44b55fa656"
source_file="res://art/enemySwimming_2.png"
dest_files=[ "res://.import/enemySwimming_2.png-4c0cbc0732264c4ea3290340bd4a0a62.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=false
@@ -22,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/enemyWalking_1.png-5af6eedbe61b701677d490ffdc1e6471.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="0e417b74e72f5d8f4aca0e557a735643"
source_file="res://art/enemyWalking_1.png"
dest_files=[ "res://.import/enemyWalking_1.png-5af6eedbe61b701677d490ffdc1e6471.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=false
@@ -22,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/enemyWalking_2.png-67c480ed60c35e95f5acb0436246b935.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="838f40a8b77a0cb387dc5e5aff6bd8d5"
source_file="res://art/enemyWalking_2.png"
dest_files=[ "res://.import/enemyWalking_2.png-67c480ed60c35e95f5acb0436246b935.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=false
@@ -22,6 +27,7 @@ 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

View File

@@ -6,7 +6,8 @@ path="res://.import/gameover.wav-98c95c744b35280048c2bd093cf8a356.sample"
[deps]
source_md5="fe94a3a7558cff917a5500a1298fdcac"
source_file="res://art/gameover.wav"
dest_files=[ "res://.import/gameover.wav-98c95c744b35280048c2bd093cf8a356.sample" ]
[params]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/playerGrey_up1.png-6bd114d0a6beac91f48e3a7314d44564.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="f84241d41055080a3393c9a8619f172b"
source_file="res://art/playerGrey_up1.png"
dest_files=[ "res://.import/playerGrey_up1.png-6bd114d0a6beac91f48e3a7314d44564.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=false
@@ -22,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/playerGrey_up2.png-d6aba85f5f2675ebc7045efa7552ee79.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="57618c302a312d248705c7f045978765"
source_file="res://art/playerGrey_up2.png"
dest_files=[ "res://.import/playerGrey_up2.png-d6aba85f5f2675ebc7045efa7552ee79.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=false
@@ -22,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/playerGrey_walk1.png-c4773fe7a7bf85d7ab732eb4458c2742.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="7892ed98ba910fbda0d37266127e96bb"
source_file="res://art/playerGrey_walk1.png"
dest_files=[ "res://.import/playerGrey_walk1.png-c4773fe7a7bf85d7ab732eb4458c2742.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=false
@@ -22,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/playerGrey_walk2.png-34d2d916366100182d08037c51884043.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="9fc73e1224a6b16d8fb5d0f667e3aed2"
source_file="res://art/playerGrey_walk2.png"
dest_files=[ "res://.import/playerGrey_walk2.png-34d2d916366100182d08037c51884043.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=false
@@ -22,7 +27,8 @@ 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=false
detect_3d=true
svg/scale=1.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/set3_tiles.png-7dd06b1fc0bcfaa06e9dd732f61382a2.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="eef34d896b231438a2d97707c0ab06a2"
source_file="res://art/set3_tiles.png"
dest_files=[ "res://.import/set3_tiles.png-7dd06b1fc0bcfaa06e9dd732f61382a2.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=false
@@ -22,6 +27,7 @@ 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

View File

@@ -2,101 +2,6 @@
[sub_resource type="ProceduralSky" id=1]
radiance_size = 4
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
sky_curve = 0.25
sky_energy = 1.0
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
ground_curve = 0.01
ground_energy = 1.0
sun_color = Color( 1, 1, 1, 1 )
sun_latitude = 35.0
sun_longitude = 0.0
sun_angle_min = 1.0
sun_angle_max = 100.0
sun_curve = 0.05
sun_energy = 16.0
texture_size = 2
[resource]
background_mode = 2
background_sky = SubResource( 1 )
background_sky_custom_fov = 0.0
background_color = Color( 0, 0, 0, 1 )
background_energy = 1.0
background_canvas_max_layer = 0
ambient_light_color = Color( 0, 0, 0, 1 )
ambient_light_energy = 1.0
ambient_light_sky_contribution = 0.0
fog_enabled = false
fog_color = Color( 0.5, 0.6, 0.7, 1 )
fog_sun_color = Color( 1, 0.9, 0.7, 1 )
fog_sun_amount = 0.0
fog_depth_enabled = true
fog_depth_begin = 10.0
fog_depth_curve = 1.0
fog_transmit_enabled = false
fog_transmit_curve = 1.0
fog_height_enabled = false
fog_height_min = 0.0
fog_height_max = 100.0
fog_height_curve = 1.0
tonemap_mode = 0
tonemap_exposure = 1.0
tonemap_white = 1.0
auto_exposure_enabled = false
auto_exposure_scale = 0.4
auto_exposure_min_luma = 0.05
auto_exposure_max_luma = 8.0
auto_exposure_speed = 0.5
ss_reflections_enabled = false
ss_reflections_max_steps = 64
ss_reflections_fade_in = 0.15
ss_reflections_fade_out = 2.0
ss_reflections_depth_tolerance = 0.2
ss_reflections_roughness = true
ssao_enabled = false
ssao_radius = 1.0
ssao_intensity = 1.0
ssao_radius2 = 0.0
ssao_intensity2 = 1.0
ssao_bias = 0.01
ssao_light_affect = 0.0
ssao_color = Color( 0, 0, 0, 1 )
ssao_quality = 0
ssao_blur = 1
ssao_edge_sharpness = 4.0
dof_blur_far_enabled = false
dof_blur_far_distance = 10.0
dof_blur_far_transition = 5.0
dof_blur_far_amount = 0.1
dof_blur_far_quality = 1
dof_blur_near_enabled = false
dof_blur_near_distance = 2.0
dof_blur_near_transition = 1.0
dof_blur_near_amount = 0.1
dof_blur_near_quality = 1
glow_enabled = false
glow_levels/1 = false
glow_levels/2 = false
glow_levels/3 = true
glow_levels/4 = false
glow_levels/5 = true
glow_levels/6 = false
glow_levels/7 = false
glow_intensity = 0.8
glow_strength = 1.0
glow_bloom = 0.0
glow_blend_mode = 2
glow_hdr_threshold = 1.0
glow_hdr_scale = 2.0
glow_bicubic_upscale = false
adjustment_enabled = false
adjustment_brightness = 1.0
adjustment_contrast = 1.0
adjustment_saturation = 1.0
_sections_unfolded = [ "Background" ]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -3,16 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
metadata={
"vram_texture": false
}
[deps]
source_md5="7b0d811088c13a3b6d79f9895b9f2935"
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
@@ -22,6 +27,7 @@ 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

View File

@@ -6,7 +6,11 @@
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=3
config_version=4
_global_script_classes=[ ]
_global_script_class_icons={
}
[application]
@@ -18,11 +22,41 @@ config/icon="res://icon.png"
window/size/width=480
window/size/height=720
window/size/resizable=false
[gdnative]
[input]
singletons=[ ]
move_left={
"deadzone": 0.5,
"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,"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(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
]
}
move_right={
"deadzone": 0.5,
"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,"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(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
]
}
move_up={
"deadzone": 0.5,
"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,"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(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
]
}
move_down={
"deadzone": 0.5,
"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,"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(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
]
}
[rendering]

View File

@@ -1,21 +1,25 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://player/Player.tscn" type="PackedScene" id=1]
[ext_resource path="res://debug/StatesStackDiplayer.tscn" type="PackedScene" id=2]
[ext_resource path="res://debug/ControlsPanel.tscn" type="PackedScene" id=3]
[ext_resource path="res://debug/Explanations.tscn" type="PackedScene" id=4]
[ext_resource path="res://debug/Explanations.tscn" type="PackedScene" id=2]
[ext_resource path="res://debug/StatesStackDiplayer.tscn" type="PackedScene" id=3]
[ext_resource path="res://debug/ControlsPanel.tscn" type="PackedScene" id=4]
[node name="Demo" type="Node"]
[node name="Player" parent="." index="0" instance=ExtResource( 1 )]
[node name="Player" parent="." instance=ExtResource( 1 )]
editor/display_folded = true
[node name="Explanations" parent="." instance=ExtResource( 2 )]
[node name="StatesStackDiplayer" parent="." index="1" instance=ExtResource( 2 )]
[node name="Control" type="Control" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ControlsPanel" parent="." index="2" instance=ExtResource( 3 )]
[node name="Explanations" parent="." index="3" instance=ExtResource( 4 )]
[node name="StatesStackDiplayer" parent="Control" instance=ExtResource( 3 )]
[node name="ControlsPanel" parent="Control" instance=ExtResource( 4 )]
[editable path="Player"]

View File

@@ -1,77 +1,41 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=2 format=2]
[ext_resource path="res://debug/top_level_ui.gd" type="Script" id=1]
[ext_resource path="res://fonts/source_code_pro_explanations.tres" type="DynamicFont" id=2]
[node name="ControlsPanel" type="Panel" index="0"]
[ext_resource path="res://fonts/source_code_pro_explanations.tres" type="DynamicFont" id=1]
[node name="ControlsPanel" type="Panel"]
anchor_left = 1.0
anchor_top = 0.0
anchor_right = 1.0
anchor_bottom = 0.0
margin_left = -220.0
margin_bottom = 170.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 0
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 1
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Keys" type="Label" parent="." index="0"]
anchor_left = 0.0
anchor_top = 0.0
[node name="Keys" type="Label" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 10.0
margin_top = 10.0
margin_right = -10.0
margin_bottom = -10.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
custom_fonts/font = ExtResource( 2 )
custom_fonts/font = ExtResource( 1 )
text = "Shoot:
Attack:
Stagger:
Jump:
Sprint:"
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
_sections_unfolded = [ "BBCode", "custom_fonts" ]
[node name="Keys2" type="Label" parent="." index="1"]
anchor_left = 0.0
anchor_top = 0.0
[node name="Keys2" type="Label" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 10.0
margin_top = 10.0
margin_right = -10.0
margin_bottom = -10.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
custom_fonts/font = ExtResource( 2 )
custom_fonts/font = ExtResource( 1 )
text = "R
F
X
Space
Shift"
align = 2
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
_sections_unfolded = [ "BBCode", "custom_fonts" ]

View File

@@ -1,25 +1,17 @@
[gd_scene load_steps=4 format=2]
[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]
[ext_resource path="res://debug/top_level_ui.gd" type="Script" id=3]
[node name="Explanations" type="RichTextLabel"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 10.0
margin_top = -370.0
margin_right = -10.0
margin_bottom = -730.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
custom_fonts/bold_font = ExtResource( 1 )
custom_fonts/normal_font = ExtResource( 2 )
@@ -33,10 +25,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.
You can read more about States in the excellent [url=http://gameprogrammingpatterns.com/state.html]Game Programming Patterns ebook[/url]."
visible_characters = -1
percent_visible = 1.0
meta_underlined = true
tab_size = 4
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:
@@ -46,14 +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.
You can read more about States in the excellent Game Programming Patterns ebook."
scroll_active = true
scroll_following = false
selection_enabled = false
override_selected_font_color = false
script = ExtResource( 3 )
_sections_unfolded = [ "BBCode", "custom_fonts" ]
__meta__ = {
"_edit_lock_": true
}

View File

@@ -3,106 +3,46 @@
[ext_resource path="res://debug/states_stack_displayer.gd" type="Script" id=1]
[ext_resource path="res://fonts/SourceCodePro-Bold.ttf" type="DynamicFontData" id=2]
[sub_resource type="DynamicFont" id=1]
size = 20
use_mipmaps = false
use_filter = true
font_data = ExtResource( 2 )
_sections_unfolded = [ "Font", "Settings" ]
[node name="StatesStackDiplayer" type="Panel"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
margin_right = 210.0
margin_bottom = 170.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 0
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 1
script = ExtResource( 1 )
__meta__ = {
"_edit_group_": true
}
[node name="Title" type="Label" parent="." index="0"]
[node name="Title" type="Label" parent="."]
anchor_left = 0.5
anchor_top = 0.0
anchor_right = 0.5
anchor_bottom = 0.0
margin_left = -105.0
margin_right = 105.0
margin_bottom = 40.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
custom_fonts/font = SubResource( 1 )
text = "Pushown"
align = 1
valign = 1
uppercase = true
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
_sections_unfolded = [ "custom_fonts" ]
[node name="States" type="Label" parent="." index="1"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
[node name="States" type="Label" parent="."]
margin_left = 20.0
margin_top = 50.0
margin_right = 190.0
margin_bottom = 170.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
custom_fonts/font = SubResource( 1 )
text = "Jump
Test"
align = 1
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
_sections_unfolded = [ "custom_fonts" ]
[node name="Numbers" type="Label" parent="." index="2"]
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
[node name="Numbers" type="Label" parent="."]
margin_left = 20.0
margin_top = 50.0
margin_right = 190.0
margin_bottom = 170.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
custom_fonts/font = SubResource( 1 )
text = "1.
2."
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
_sections_unfolded = [ "custom_fonts" ]

View File

@@ -1,18 +1,14 @@
extends Panel
onready var fsm_node = get_node("../Player/StateMachine")
onready var fsm_node = get_node("../../Player/StateMachine")
func _ready():
set_as_toplevel(true)
func _process(delta):
var states_names = ''
var numbers = ''
func _process(_delta):
var states_names = ""
var numbers = ""
var index = 0
for state in fsm_node.states_stack:
states_names += state.get_name() + '\n'
numbers += str(index) + '\n'
index += 1
$States.text = states_names
$Numbers.text = numbers

View File

@@ -1,5 +0,0 @@
tool
extends Control
func _ready():
set_as_toplevel(true)

View File

@@ -1,101 +1,13 @@
[gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1]
radiance_size = 4
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
sky_curve = 0.25
sky_energy = 1.0
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
ground_curve = 0.01
ground_energy = 1.0
sun_color = Color( 1, 1, 1, 1 )
sun_latitude = 35.0
sun_longitude = 0.0
sun_angle_min = 1.0
sun_angle_max = 100.0
sun_curve = 0.05
sun_energy = 16.0
texture_size = 2
[resource]
background_mode = 2
background_sky = SubResource( 1 )
background_sky_custom_fov = 0.0
background_color = Color( 0, 0, 0, 1 )
background_energy = 1.0
background_canvas_max_layer = 0
ambient_light_color = Color( 0, 0, 0, 1 )
ambient_light_energy = 1.0
ambient_light_sky_contribution = 1.0
fog_enabled = false
fog_color = Color( 0.5, 0.6, 0.7, 1 )
fog_sun_color = Color( 1, 0.9, 0.7, 1 )
fog_sun_amount = 0.0
fog_depth_enabled = true
fog_depth_begin = 10.0
fog_depth_curve = 1.0
fog_transmit_enabled = false
fog_transmit_curve = 1.0
fog_height_enabled = false
fog_height_min = 0.0
fog_height_max = 100.0
fog_height_curve = 1.0
tonemap_mode = 0
tonemap_exposure = 1.0
tonemap_white = 1.0
auto_exposure_enabled = false
auto_exposure_scale = 0.4
auto_exposure_min_luma = 0.05
auto_exposure_max_luma = 8.0
auto_exposure_speed = 0.5
ss_reflections_enabled = false
ss_reflections_max_steps = 64
ss_reflections_fade_in = 0.15
ss_reflections_fade_out = 2.0
ss_reflections_depth_tolerance = 0.2
ss_reflections_roughness = true
ssao_enabled = false
ssao_radius = 1.0
ssao_intensity = 1.0
ssao_radius2 = 0.0
ssao_intensity2 = 1.0
ssao_bias = 0.01
ssao_light_affect = 0.0
ssao_color = Color( 0, 0, 0, 1 )
ssao_quality = 0
ssao_blur = 3
ssao_edge_sharpness = 4.0
dof_blur_far_enabled = false
dof_blur_far_distance = 10.0
dof_blur_far_transition = 5.0
dof_blur_far_amount = 0.1
dof_blur_far_quality = 1
dof_blur_near_enabled = false
dof_blur_near_distance = 2.0
dof_blur_near_transition = 1.0
dof_blur_near_amount = 0.1
dof_blur_near_quality = 1
glow_enabled = false
glow_levels/1 = false
glow_levels/2 = false
glow_levels/3 = true
glow_levels/4 = false
glow_levels/5 = true
glow_levels/6 = false
glow_levels/7 = false
glow_intensity = 0.8
glow_strength = 1.0
glow_bloom = 0.0
glow_blend_mode = 2
glow_hdr_threshold = 1.0
glow_hdr_scale = 2.0
glow_bicubic_upscale = false
adjustment_enabled = false
adjustment_brightness = 1.0
adjustment_contrast = 1.0
adjustment_saturation = 1.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -3,6 +3,9 @@
importer="texture"
type="StreamTexture"
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
metadata={
"vram_texture": false
}
[deps]
@@ -14,6 +17,7 @@ dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
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
@@ -23,6 +27,7 @@ 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

View File

@@ -18,15 +18,8 @@
[sub_resource type="Animation" id=1]
length = 1.0
loop = false
step = 0.1
[sub_resource type="Animation" id=2]
length = 0.6
loop = false
step = 0.1
tracks/0/type = "value"
tracks/0/path = NodePath("BodyPivot/Body:modulate")
tracks/0/interp = 1
@@ -42,159 +35,87 @@ tracks/0/keys = {
[sub_resource type="Animation" id=3]
length = 1.0
loop = false
step = 0.1
[sub_resource type="DynamicFont" id=4]
size = 20
use_mipmaps = false
use_filter = true
font_data = ExtResource( 14 )
_sections_unfolded = [ "Font", "Settings" ]
[node name="Player" type="KinematicBody2D" index="0"]
[node name="Player" type="KinematicBody2D"]
position = Vector2( 628.826, 391.266 )
input_pickable = false
collision_layer = 1
collision_mask = 1
collision/safe_margin = 0.08
script = ExtResource( 1 )
_sections_unfolded = [ "Visibility" ]
__meta__ = {
"_edit_horizontal_guides_": [ ]
}
[node name="StateMachine" type="Node" parent="." index="0"]
[node name="StateMachine" type="Node" parent="."]
script = ExtResource( 2 )
START_STATE = NodePath("Idle")
[node name="Idle" type="Node" parent="StateMachine" index="0"]
[node name="Idle" type="Node" parent="StateMachine"]
script = ExtResource( 3 )
[node name="Move" type="Node" parent="StateMachine" index="1"]
[node name="Move" type="Node" parent="StateMachine"]
script = ExtResource( 4 )
MAX_WALK_SPEED = 450
MAX_RUN_SPEED = 700
[node name="Jump" type="Node" parent="StateMachine" index="2"]
[node name="Jump" type="Node" parent="StateMachine"]
script = ExtResource( 5 )
BASE_MAX_HORIZONTAL_SPEED = 400.0
AIR_ACCELERATION = 1000.0
AIR_DECCELERATION = 2000.0
AIR_STEERING_POWER = 50.0
JUMP_HEIGHT = 120.0
JUMP_DURATION = 0.8
GRAVITY = 1600.0
[node name="Stagger" type="Node" parent="StateMachine" index="3"]
[node name="Stagger" type="Node" parent="StateMachine"]
script = ExtResource( 6 )
[node name="Attack" type="Node" parent="StateMachine" index="4"]
[node name="Attack" type="Node" parent="StateMachine"]
script = ExtResource( 7 )
[node name="Die" type="Node" parent="StateMachine" index="5"]
[node name="Die" type="Node" parent="StateMachine"]
script = ExtResource( 8 )
[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="1"]
root_node = NodePath("..")
autoplay = ""
playback_process_mode = 1
playback_default_blend_time = 0.0
playback_speed = 1.0
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
anims/idle = SubResource( 1 )
anims/stagger = SubResource( 2 )
anims/walk = SubResource( 3 )
blend_times = [ ]
[node name="Shadow" type="Sprite" parent="." index="2"]
[node name="Shadow" type="Sprite" parent="."]
self_modulate = Color( 1, 1, 1, 0.361098 )
position = Vector2( 0, -4 )
texture = ExtResource( 9 )
_sections_unfolded = [ "Visibility" ]
[node name="BodyPivot" type="Position2D" parent="." index="3"]
[node name="Body" type="Sprite" parent="BodyPivot" index="0"]
[node name="BodyPivot" type="Position2D" parent="."]
[node name="Body" type="Sprite" parent="BodyPivot"]
position = Vector2( 0, -58.8242 )
texture = ExtResource( 10 )
[node name="BulletSpawn" type="Node2D" parent="BodyPivot" index="1"]
editor/display_folded = true
[node name="BulletSpawn" type="Node2D" parent="BodyPivot"]
position = Vector2( 1.17401, -61.266 )
script = ExtResource( 11 )
_sections_unfolded = [ "Transform" ]
[node name="CooldownTimer" type="Timer" parent="BodyPivot/BulletSpawn" index="0"]
process_mode = 1
[node name="CooldownTimer" type="Timer" parent="BodyPivot/BulletSpawn"]
wait_time = 0.2
one_shot = true
autostart = false
[node name="WeaponPivot" type="Position2D" parent="BodyPivot" index="2"]
[node name="WeaponPivot" type="Position2D" parent="BodyPivot"]
position = Vector2( 1.17401, -61.266 )
script = ExtResource( 12 )
[node name="Offset" type="Position2D" parent="BodyPivot/WeaponPivot" index="0"]
[node name="Offset" type="Position2D" parent="BodyPivot/WeaponPivot"]
position = Vector2( 110, 0 )
[node name="Sword" parent="BodyPivot/WeaponPivot/Offset" index="0" instance=ExtResource( 13 )]
[node name="Sword" parent="BodyPivot/WeaponPivot/Offset" instance=ExtResource( 13 )]
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="." index="4"]
build_mode = 0
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
polygon = PoolVector2Array( -20, 0, -20, -20, 20, -20, 20, 0 )
[node name="StateNameDisplayer" type="Label" parent="." index="5"]
editor/display_folded = true
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
[node name="StateNameDisplayer" type="Label" parent="."]
margin_left = -109.0
margin_top = -172.0
margin_right = 110.0
margin_bottom = -138.0
rect_pivot_offset = Vector2( 0, 0 )
rect_clip_content = false
mouse_filter = 2
mouse_default_cursor_shape = 0
size_flags_horizontal = 1
size_flags_vertical = 4
custom_fonts/font = SubResource( 4 )
text = "Test"
align = 1
valign = 1
uppercase = true
percent_visible = 1.0
lines_skipped = 0
max_lines_visible = -1
script = ExtResource( 15 )
_sections_unfolded = [ "Rect", "custom_fonts" ]
[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="animation_finished" from="AnimationPlayer" to="StateMachine" method="_on_animation_finished"]
[connection signal="attack_finished" from="BodyPivot/WeaponPivot/Offset/Sword" to="StateMachine/Attack" method="_on_Sword_attack_finished"]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -3,6 +3,9 @@
importer="texture"
type="StreamTexture"
path="res://.import/body.png-313f6363670a5852a7b7126ab476d8b1.stex"
metadata={
"vram_texture": false
}
[deps]
@@ -14,6 +17,7 @@ dest_files=[ "res://.import/body.png-313f6363670a5852a7b7126ab476d8b1.stex" ]
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
@@ -23,6 +27,7 @@ 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

View File

@@ -2,24 +2,13 @@
[ext_resource path="res://player/bullet/bullet.gd" type="Script" id=1]
[sub_resource type="CircleShape2D" id=1]
custom_solver_bias = 0.0
radius = 12.0
[node name="Bullet" type="KinematicBody2D"]
input_pickable = false
collision_layer = 2
collision_mask = 2
collision/safe_margin = 0.08
script = ExtResource( 1 )
_sections_unfolded = [ "Collision", "collision" ]
SPEED = 1000.0
[node name="CollisionShape2D" type="CollisionShape2D" parent="." index="0"]
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource( 1 )

View File

@@ -1,9 +1,7 @@
extends KinematicBody2D
var direction = Vector2()
export(float) var SPEED = 1000.0
export(float) var speed = 1000.0
func _ready():
set_as_toplevel(true)
@@ -13,7 +11,7 @@ func _physics_process(delta):
if is_outside_view_bounds():
queue_free()
var motion = direction * SPEED * delta
var motion = direction * speed * delta
var collision_info = move_and_collide(motion)
if collision_info:
queue_free()
@@ -21,8 +19,8 @@ func _physics_process(delta):
func is_outside_view_bounds():
return position.x > OS.get_screen_size().x or position.x < 0.0 \
or position.y > OS.get_screen_size().y or position.y < 0.0
or position.y > OS.get_screen_size().y or position.y < 0.0
func _draw():
draw_circle(Vector2(), $CollisionShape2D.shape.radius, Color('#ffffff'))
draw_circle(Vector2(), $CollisionShape2D.shape.radius, Color.white)

View File

@@ -6,6 +6,7 @@ func _input(event):
if event.is_action_pressed("fire"):
fire(owner.look_direction)
func fire(direction):
if not $CooldownTimer.is_stopped():
return

View File

@@ -1,25 +1,25 @@
"""
The Player is a KinematicBody2D, in other words a physics-driven object.
It can move, collide with the world...
It HAS a state machine, but the body and the state machine are separate.
"""
extends KinematicBody2D
# The Player is a KinematicBody2D, in other words a physics-driven object.
# It can move, collide with the world, etc...
# The player has a state machine, but the body and the state machine are separate.
signal direction_changed(new_direction)
var look_direction = Vector2(1, 0) setget set_look_direction
var look_direction = Vector2.RIGHT setget set_look_direction
func take_damage(attacker, amount, effect=null):
if self.is_a_parent_of(attacker):
func take_damage(attacker, amount, effect = null):
if is_a_parent_of(attacker):
return
$States/Stagger.knockback_direction = (attacker.global_position - global_position).normalized()
$Health.take_damage(amount, effect)
func set_dead(value):
set_process_input(not value)
set_physics_process(not value)
$CollisionPolygon2D.disabled = value
func set_look_direction(value):
look_direction = value
emit_signal("direction_changed", value)

View File

@@ -9,10 +9,9 @@ func _ready():
"attack": $Attack,
}
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:
return
if state_name in ["stagger", "jump", "attack"]:
@@ -21,11 +20,10 @@ func _change_state(state_name):
$Jump.initialize($Move.speed, $Move.velocity)
._change_state(state_name)
func _input(event):
"""
Here we only handle input that can interrupt states, attacking in this case
otherwise we let the state node handle it
"""
# Here we only handle input that can interrupt states, attacking in this case,
# otherwise we let the state node handle it.
if event.is_action_pressed("attack"):
if current_state in [$Attack, $Stagger]:
return

Binary file not shown.

Before

Width:  |  Height:  |  Size: 967 B

After

Width:  |  Height:  |  Size: 765 B

View File

@@ -3,6 +3,9 @@
importer="texture"
type="StreamTexture"
path="res://.import/shadow.png-493c4635eca1ce8bdece629560617dc7.stex"
metadata={
"vram_texture": false
}
[deps]
@@ -14,6 +17,7 @@ dest_files=[ "res://.import/shadow.png-493c4635eca1ce8bdece629560617dc7.stex" ]
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
@@ -23,6 +27,7 @@ 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

View File

@@ -3,5 +3,6 @@ extends "res://state_machine/state.gd"
func enter():
owner.get_node("AnimationPlayer").play("idle")
func _on_Sword_attack_finished():
emit_signal("finished", "previous")

View File

@@ -1,15 +1,12 @@
"""
The stagger state end with the stagger animation from the AnimationPlayer
The animation only affects the Body Sprite"s modulate property so
it could stack with other animations if we had two AnimationPlayer nodes
"""
extends "res://state_machine/state.gd"
var knockback_direction = Vector2()
# The stagger state end with the stagger animation from the AnimationPlayer.
# The animation only affects the Body Sprite's modulate property so it
# could stack with other animations if we had two AnimationPlayer nodes.
func enter():
owner.get_node("AnimationPlayer").play("stagger")
func _on_animation_finished(anim_name):
assert anim_name == "stagger"
assert(anim_name == "stagger")
emit_signal("finished", "previous")

View File

@@ -5,8 +5,10 @@ var start_position = Vector2()
func _ready():
start_position = rect_position
func _physics_process(delta):
func _physics_process(_delta):
rect_position = $"../BodyPivot".position + start_position
func _on_StateMachine_state_changed(current_state):
text = current_state.get_name()

View File

@@ -1,10 +1,10 @@
extends "res://state_machine/state.gd"
# Initialize the state. E.g. change the animation
# Initialize the state. E.g. change the animation.
func enter():
owner.set_dead(true)
owner.get_node("AnimationPlayer").play("die")
func _on_animation_finished(anim_name):
func _on_animation_finished(_anim_name):
emit_signal("finished", "dead")

View File

@@ -1,15 +1,12 @@
extends "../motion.gd"
export(float) var BASE_MAX_HORIZONTAL_SPEED = 400.0
export(float) var base_max_horizontal_speed = 400.0
export(float) var AIR_ACCELERATION = 1000.0
export(float) var AIR_DECCELERATION = 2000.0
export(float) var AIR_STEERING_POWER = 50.0
export(float) var air_acceleration = 1000.0
export(float) var air_deceleration = 2000.0
export(float) var air_steering_power = 50.0
export(float) var JUMP_HEIGHT = 120.0
export(float) var JUMP_DURATION = 0.8
export(float) var GRAVITY = 1600.0
export(float) var gravity = 1600.0
var enter_velocity = Vector2()
@@ -22,7 +19,7 @@ var height = 0.0
func initialize(speed, velocity):
horizontal_speed = speed
max_horizontal_speed = speed if speed > 0.0 else BASE_MAX_HORIZONTAL_SPEED
max_horizontal_speed = speed if speed > 0.0 else base_max_horizontal_speed
enter_velocity = velocity
func enter():
@@ -45,19 +42,19 @@ func update(delta):
func move_horizontally(delta, direction):
if direction:
horizontal_speed += AIR_ACCELERATION * delta
horizontal_speed += air_acceleration * delta
else:
horizontal_speed -= AIR_DECCELERATION * delta
horizontal_speed -= air_deceleration * delta
horizontal_speed = clamp(horizontal_speed, 0, max_horizontal_speed)
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
owner.move_and_slide(horizontal_velocity)
func animate_jump_height(delta):
vertical_speed -= GRAVITY * delta
vertical_speed -= gravity * delta
height += vertical_speed * delta
height = max(0.0, height)

View File

@@ -1,16 +1,18 @@
# Collection of important methods to handle direction and animation
extends "res://state_machine/state.gd"
# Collection of important methods to handle direction and animation.
func handle_input(event):
if event.is_action_pressed("simulate_damage"):
emit_signal("finished", "stagger")
func get_input_direction():
var input_direction = Vector2()
input_direction.x = int(Input.is_action_pressed("move_right")) - int(Input.is_action_pressed("move_left"))
input_direction.y = int(Input.is_action_pressed("move_down")) - int(Input.is_action_pressed("move_up"))
input_direction.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
input_direction.y = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
return input_direction
func update_look_direction(direction):
if direction and owner.look_direction != direction:
owner.look_direction = direction

View File

@@ -3,10 +3,12 @@ extends "on_ground.gd"
func enter():
owner.get_node("AnimationPlayer").play("idle")
func handle_input(event):
return .handle_input(event)
func update(delta):
func update(_delta):
var input_direction = get_input_direction()
if input_direction:
emit_signal("finished", "move")

View File

@@ -1,7 +1,7 @@
extends "on_ground.gd"
export(float) var MAX_WALK_SPEED = 450
export(float) var MAX_RUN_SPEED = 700
export(float) var max_walk_speed = 450
export(float) var max_run_speed = 700
func enter():
speed = 0.0
@@ -11,22 +11,25 @@ func enter():
update_look_direction(input_direction)
owner.get_node("AnimationPlayer").play("walk")
func handle_input(event):
return .handle_input(event)
func update(delta):
func update(_delta):
var input_direction = get_input_direction()
if not input_direction:
emit_signal("finished", "idle")
update_look_direction(input_direction)
speed = MAX_RUN_SPEED if Input.is_action_pressed("run") else MAX_WALK_SPEED
speed = max_run_speed if Input.is_action_pressed("run") else max_walk_speed
var collision_info = move(speed, input_direction)
if not collision_info:
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 null
func move(speed, direction):
velocity = direction.normalized() * speed
owner.move_and_slide(velocity, Vector2(), 5, 2)

View File

@@ -1,5 +1,6 @@
extends "../motion.gd"
# warning-ignore-all:unused_class_variable
var speed = 0.0
var velocity = Vector2()

View File

@@ -4,11 +4,7 @@
[ext_resource path="res://player/weapon/sword.png" type="Texture" id=2]
[sub_resource type="Animation" id=1]
resource_name = "SETUP"
length = 1.0
loop = false
step = 0.1
tracks/0/type = "value"
tracks/0/path = NodePath(".:rotation_degrees")
tracks/0/interp = 1
@@ -71,10 +67,8 @@ tracks/4/keys = {
}
[sub_resource type="Animation" id=2]
resource_name = "attack_circular"
length = 0.3
loop = false
step = 0.05
tracks/0/type = "value"
tracks/0/path = NodePath(".:rotation_degrees")
@@ -114,9 +108,7 @@ tracks/2/keys = {
}
[sub_resource type="Animation" id=3]
length = 0.45
loop = false
step = 0.05
tracks/0/type = "value"
tracks/0/path = NodePath(".:rotation_degrees")
@@ -173,10 +165,8 @@ tracks/3/keys = {
}
[sub_resource type="Animation" id=4]
resource_name = "attack_medium"
length = 0.5
loop = false
step = 0.05
tracks/0/type = "value"
tracks/0/path = NodePath(".:rotation_degrees")
@@ -216,10 +206,7 @@ tracks/2/keys = {
}
[sub_resource type="Animation" id=5]
length = 0.01
loop = false
step = 0.1
tracks/0/type = "value"
tracks/0/path = NodePath(".:visible")
tracks/0/interp = 1
@@ -234,45 +221,23 @@ tracks/0/keys = {
}
[node name="Sword" type="Area2D"]
input_pickable = false
gravity_vec = Vector2( 0, 1 )
gravity = 98.0
linear_damp = 0.1
angular_damp = 1.0
monitorable = false
collision_layer = 16
collision_mask = 3
audio_bus_override = false
audio_bus_name = "Master"
script = ExtResource( 1 )
_sections_unfolded = [ "Transform" ]
[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="0"]
root_node = NodePath("..")
autoplay = ""
playback_process_mode = 1
playback_default_blend_time = 0.0
playback_speed = 1.0
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
anims/SETUP = SubResource( 1 )
anims/attack_circular = SubResource( 2 )
anims/attack_fast = SubResource( 3 )
anims/attack_medium = SubResource( 4 )
anims/idle = SubResource( 5 )
blend_times = [ ]
_sections_unfolded = [ "Playback Options" ]
[node name="sword" type="Sprite" parent="." index="1"]
[node name="Sword" type="Sprite" parent="."]
position = Vector2( 4, 0 )
texture = ExtResource( 2 )
offset = Vector2( 67, 0 )
_sections_unfolded = [ "Offset", "Transform" ]
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="." index="2"]
build_mode = 0
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
polygon = PoolVector2Array( 28.0001, -15.9999, 136, -15.9995, 160, 0, 136, 16.0005, 27.9999, 16.0001 )

View File

@@ -2,101 +2,112 @@ extends Area2D
signal attack_finished
enum STATES { IDLE, ATTACK }
enum States { IDLE, ATTACK }
var state = null
enum ATTACK_INPUT_STATES { IDLE, LISTENING, REGISTERED }
var attack_input_state = ATTACK_INPUT_STATES.IDLE
enum AttackInputStates { IDLE, LISTENING, REGISTERED }
var attack_input_state = AttackInputStates.IDLE
var ready_for_next_attack = false
const MAX_COMBO_COUNT = 3
var combo_count = 0
var attack_current = {}
var combo = [{
'damage': 1,
'animation': 'attack_fast',
'effect': null
"damage": 1,
"animation": "attack_fast",
"effect": null
},
{
'damage': 1,
'animation': 'attack_fast',
'effect': null
"damage": 1,
"animation": "attack_fast",
"effect": null
},
{
'damage': 3,
'animation': 'attack_medium',
'effect': null
"damage": 3,
"animation": "attack_medium",
"effect": null
}]
var hit_objects = []
func _ready():
$AnimationPlayer.connect('animation_finished', self, "_on_animation_finished")
# warning-ignore:return_value_discarded
$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):
match state:
STATES.ATTACK:
States.ATTACK:
hit_objects = []
attack_input_state = ATTACK_INPUT_STATES.LISTENING
attack_input_state = AttackInputStates.LISTENING
ready_for_next_attack = false
match new_state:
STATES.IDLE:
States.IDLE:
combo_count = 0
$AnimationPlayer.stop()
visible = false
monitoring = false
STATES.ATTACK:
States.ATTACK:
attack_current = combo[combo_count -1]
$AnimationPlayer.play(attack_current['animation'])
$AnimationPlayer.play(attack_current["animation"])
visible = true
monitoring = true
state = new_state
func _input(event):
if not state == STATES.ATTACK:
return
if attack_input_state != ATTACK_INPUT_STATES.LISTENING:
return
if event.is_action_pressed('attack'):
attack_input_state = ATTACK_INPUT_STATES.REGISTERED
func _physics_process(delta):
if attack_input_state == ATTACK_INPUT_STATES.REGISTERED and ready_for_next_attack:
func _input(event):
if not state == States.ATTACK:
return
if attack_input_state != AttackInputStates.LISTENING:
return
if event.is_action_pressed("attack"):
attack_input_state = AttackInputStates.REGISTERED
func _physics_process(_delta):
if attack_input_state == AttackInputStates.REGISTERED and ready_for_next_attack:
attack()
func attack():
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():
attack_input_state = ATTACK_INPUT_STATES.LISTENING
attack_input_state = AttackInputStates.LISTENING
# use with AnimationPlayer func track
# Use with AnimationPlayer func track.
func set_ready_for_next_attack():
ready_for_next_attack = true
func _on_body_entered(body):
if not body.has_node('Health'):
if not body.has_node("Health"):
return
if body.get_rid().get_id() in hit_objects:
return
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):
func _on_animation_finished(_name):
if not attack_current:
return
if attack_input_state == ATTACK_INPUT_STATES.REGISTERED and combo_count < MAX_COMBO_COUNT:
if attack_input_state == AttackInputStates.REGISTERED and combo_count < MAX_COMBO_COUNT:
attack()
else:
_change_state(STATES.IDLE)
_change_state(States.IDLE)
emit_signal("attack_finished")
func _on_StateMachine_state_changed(current_state):
if current_state.name == "Attack":
attack()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -3,6 +3,9 @@
importer="texture"
type="StreamTexture"
path="res://.import/sword.png-fc7f0084cdf333c826eda2b33f2ec3cc.stex"
metadata={
"vram_texture": false
}
[deps]
@@ -14,6 +17,7 @@ dest_files=[ "res://.import/sword.png-fc7f0084cdf333c826eda2b33f2ec3cc.stex" ]
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
@@ -23,6 +27,7 @@ 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

View File

@@ -3,13 +3,15 @@ extends Position2D
var z_index_start = 0
func _ready():
owner.connect("direction_changed", self, '_on_Parent_direction_changed')
#warning-ignore:return_value_discarded
owner.connect("direction_changed", self, "_on_Parent_direction_changed")
z_index_start = z_index
func _on_Parent_direction_changed(direction):
rotation = direction.angle()
match direction:
Vector2(0, -1):
Vector2.UP:
z_index = z_index_start - 1
_:
z_index = z_index_start

View File

@@ -6,7 +6,11 @@
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=3
config_version=4
_global_script_classes=[ ]
_global_script_class_icons={
}
[application]
@@ -18,10 +22,8 @@ config/icon="res://icon.png"
window/size/width=1280
window/size/height=720
window/size/test_width=1280
window/size/test_height=720
window/stretch/mode="2d"
window/stretch/aspect="keep"
window/stretch/aspect="expand"
[gdnative]
@@ -29,35 +31,68 @@ singletons=[ ]
[input]
move_left=[ 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)
move_left={
"deadzone": 0.5,
"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,"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(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
]
move_up=[ 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)
}
move_up={
"deadzone": 0.5,
"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,"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(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
]
move_right=[ 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)
}
move_right={
"deadzone": 0.5,
"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,"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(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
]
move_down=[ 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)
}
move_down={
"deadzone": 0.5,
"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,"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(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
]
fire=[ 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":2,"pressure":0.0,"pressed":false,"script":null)
]
run=[ 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)
}
fire={
"deadzone": 0.5,
"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)
]
jump=[ 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)
}
run={
"deadzone": 0.5,
"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)
]
}
jump={
"deadzone": 0.5,
"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)
]
simulate_damage=[ 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)
}
simulate_damage={
"deadzone": 0.5,
"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)
]
attack=[ 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)
}
attack={
"deadzone": 0.5,
"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":6,"pressure":0.0,"pressed":false,"script":null)
]
}
[rendering]

View File

@@ -1,25 +1,28 @@
"""
Base interface for all states: it doesn't do anything in itself
but forces us to pass the right arguments to the methods below
and makes sure every State object had all of these methods.
"""
extends Node
# Base interface for all states: it doesn't do anything by itself,
# but forces us to pass the right arguments to the methods below
# and makes sure every State object had all of these methods.
# warning-ignore:unused_signal
signal finished(next_state_name)
# Initialize the state. E.g. change the animation
# Initialize the state. E.g. change the animation.
func enter():
return
pass
# Clean up the state. Reinitialize values like a timer
# Clean up the state. Reinitialize values like a timer.
func exit():
return
pass
func handle_input(event):
return
func update(delta):
return
func handle_input(_event):
pass
func _on_animation_finished(anim_name):
return
func update(_delta):
pass
func _on_animation_finished(_anim_name):
pass

View File

@@ -1,21 +1,17 @@
"""
Base interface for a generic state machine
It handles initializing, setting the machine active or not
delegating _physics_process, _input calls to the State nodes,
and changing the current/active state.
See the PlayerV2 scene for an example on how to use it
"""
extends Node
# Base interface for a generic state machine.
# It handles initializing, setting the machine active or not
# delegating _physics_process, _input calls to the State nodes,
# and changing the current/active state.
# See the PlayerV2 scene for an example on how to use it.
signal state_changed(current_state)
"""
You must set a starting node from the inspector or on
the node that inherits from this state machine interface
If you don't the game will crash (on purpose, so you won't
forget to initialize the state machine)
"""
export(NodePath) var START_STATE
# You must set a starting node from the inspector or on
# the node that inherits from this state machine interface.
# If you don't the game will crash (on purpose, so you won't
# forget to initialize the state machine).
export(NodePath) var start_state
var states_map = {}
var states_stack = []
@@ -23,18 +19,20 @@ var current_state = null
var _active = false setget set_active
func _ready():
if not START_STATE:
START_STATE = get_child(0).get_path()
if not start_state:
start_state = get_child(0).get_path()
for child in get_children():
child.connect("finished", self, "_change_state")
initialize(START_STATE)
initialize(start_state)
func initialize(start_state):
func initialize(initial_state):
set_active(true)
states_stack.push_front(get_node(start_state))
states_stack.push_front(get_node(initial_state))
current_state = states_stack[0]
current_state.enter()
func set_active(value):
_active = value
set_physics_process(value)
@@ -43,17 +41,21 @@ func set_active(value):
states_stack = []
current_state = null
func _input(event):
current_state.handle_input(event)
func _physics_process(delta):
current_state.update(delta)
func _on_animation_finished(anim_name):
if not _active:
return
current_state._on_animation_finished(anim_name)
func _change_state(state_name):
if not _active:
return

249
2d/gd_paint/PaintControl.gd Normal file
View File

@@ -0,0 +1,249 @@
extends Control
# A constant for whether or not we're needing to undo a shape.
const UNDO_MODE_SHAPE = -2
# A constant for whether or not we can undo.
const UNDO_NONE = -1
# How large is the image (it's actually the size of DrawingAreaBG, because that's our background canvas).
const IMAGE_SIZE = Vector2(930, 720)
# Enums for the various modes and brush shapes that can be applied.
enum BrushModes {
PENCIL, ERASER, CIRCLE_SHAPE, RECTANGLE_SHAPE
}
enum BrushShapes {
RECTANGLE, CIRCLE
}
# The top-left position of the canvas.
var TL_node
# A list to hold all of the dictionaries that make up each brush.
var brush_data_list = []
# A boolean to hold whether or not the mouse is inside the drawing area, the mouse position last _process call
# and the position of the mouse when the left mouse button was pressed.
var is_mouse_in_drawing_area = false
var last_mouse_pos = Vector2()
var mouse_click_start_pos = null
# A boolean to tell whether we've set undo_elements_list_num, which holds the size of draw_elements_list
# before a new stroke is added (unless the current brush mode is 'rectangle shape' or 'circle shape', in
# which case we do things a litte differently. See the undo_stroke function for more details).
var undo_set = false
var undo_element_list_num = -1
# The current brush settings: The mode, size, color, and shape we have currently selected.
var brush_mode = BrushModes.PENCIL
var brush_size = 32
var brush_color = Color.black
var brush_shape = BrushShapes.CIRCLE;
# The color of the background. We need this for the eraser (see the how we handle the eraser
# in the _draw function for more details).
var bg_color = Color.white
func _ready():
# Get the top left position node. We need this to find out whether or not the mouse is inside the canvas.
TL_node = get_node("TLPos")
set_process(true)
func _process(_delta):
var mouse_pos = get_viewport().get_mouse_position()
# Check if the mouse is currently inside the canvas/drawing-area.
is_mouse_in_drawing_area = false
if mouse_pos.x > TL_node.global_position.x:
if mouse_pos.y > TL_node.global_position.y:
is_mouse_in_drawing_area = true
if Input.is_mouse_button_pressed(BUTTON_LEFT):
# If we do not have a position for when the mouse was first clicked, then this must
# be the first time is_mouse_button_pressed has been called since the mouse button was
# released, so we need to store the position.
if mouse_click_start_pos == null:
mouse_click_start_pos = mouse_pos
# If the mouse is inside the canvas and the mouse is 1px away from the position of the mouse last _process call.
if check_if_mouse_is_inside_canvas():
if mouse_pos.distance_to(last_mouse_pos) >= 1:
# If we are in pencil or eraser mode, then we need to draw.
if brush_mode == BrushModes.PENCIL or brush_mode == BrushModes.ERASER:
# If undo has not been set, meaning we've started a new stroke, then store the size of the
# draw_elements_list so we can undo from this point in time.
if undo_set == false:
undo_set = true
undo_element_list_num = brush_data_list.size()
# Add the brush object to draw_elements_array.
add_brush(mouse_pos, brush_mode)
else:
# We've finished our stroke, so we can set a new undo (if a new storke is made).
undo_set = false
# If the mouse is inside the canvas.
if check_if_mouse_is_inside_canvas():
# If we're using either the circle shape mode, or the rectangle shape mode, then
# add the brush object to draw_elements_array.
if brush_mode == BrushModes.CIRCLE_SHAPE or brush_mode == BrushModes.RECTANGLE_SHAPE:
add_brush(mouse_pos, brush_mode)
# We handle undo's differently than either pencil or eraser mode, so we need to set undo
# element_list_num to -2 so we can tell if we need to undo a shape. See undo_stroke for details.
undo_element_list_num = UNDO_MODE_SHAPE
# Since we've released the left mouse, we need to get a new mouse_click_start_pos next time
#is_mouse_button_pressed is true.
mouse_click_start_pos = null
# Store mouse_pos as last_mouse_pos now that we're done with _process.
last_mouse_pos = mouse_pos
func check_if_mouse_is_inside_canvas():
# Make sure we have a mouse click starting position.
if mouse_click_start_pos != null:
# Make sure the mouse click starting position is inside the canvas.
# This is so if we start out click outside the canvas (say chosing a color from the color picker)
# and then move our mouse back into the canvas, it won't start painting.
if mouse_click_start_pos.x > TL_node.global_position.x:
if mouse_click_start_pos.y > TL_node.global_position.y:
# Make sure the current mouse position is inside the canvas.
if is_mouse_in_drawing_area:
return true
return false
func undo_stroke():
# Only undo a stroke if we have one.
if undo_element_list_num == UNDO_NONE:
return
# If we are undoing a shape, then we can just remove the latest brush.
if undo_element_list_num == UNDO_MODE_SHAPE:
if brush_data_list.size() > 0:
brush_data_list.remove(brush_data_list.size() - 1)
# Now that we've undone a shape, we cannot undo again until another stoke is added.
undo_element_list_num = UNDO_NONE
# NOTE: if we only had shape brushes, then we could remove the above line and could let the user
# undo until we have a empty element list.
# Otherwise we're removing a either a pencil stroke or a eraser stroke.
else:
# Figure out how many elements/brushes we've added in the last stroke.
var elements_to_remove = brush_data_list.size() - undo_element_list_num
# Remove all of the elements we've added this in the last stroke.
#warning-ignore:unused_variable
for elment_num in range(0, elements_to_remove):
brush_data_list.pop_back()
# Now that we've undone a stoke, we cannot undo again until another stoke is added.
undo_element_list_num = UNDO_NONE
# Redraw the brushes
update()
func add_brush(mouse_pos, type):
# Make new brush dictionary that will hold all of the data we need for the brush.
var new_brush = {}
# Populate the dictionary with values based on the global brush variables.
# We will override these as needed if the brush is a rectange or circle.
new_brush.brush_type = type
new_brush.brush_pos = mouse_pos
new_brush.brush_shape = brush_shape
new_brush.brush_size = brush_size
new_brush.brush_color = brush_color
# If the new bursh is a rectangle shape, we need to calculate the top left corner of the rectangle and the
# bottom right corner of the rectangle.
if type == BrushModes.RECTANGLE_SHAPE:
var TL_pos = Vector2()
var BR_pos = Vector2()
# Figure out the left and right positions of the corners and assign them to the proper variable.
if mouse_pos.x < mouse_click_start_pos.x:
TL_pos.x = mouse_pos.x
BR_pos.x = mouse_click_start_pos.x
else:
TL_pos.x = mouse_click_start_pos.x
BR_pos.x = mouse_pos.x
# Figure out the top and bottom positions of the corners and assign them to the proper variable.
if mouse_pos.y < mouse_click_start_pos.y:
TL_pos.y = mouse_pos.y
BR_pos.y = mouse_click_start_pos.y
else:
TL_pos.y = mouse_click_start_pos.y
BR_pos.y = mouse_pos.y
# Assign the positions to the brush.
new_brush.brush_pos = TL_pos
new_brush.brush_shape_rect_pos_BR = BR_pos
# If the brush isa circle shape, then we need to calculate the radius of the circle.
if type == BrushModes.CIRCLE_SHAPE:
# Get the center point inbetween the mouse position and the position of the mouse when we clicked.
var center_pos = Vector2((mouse_pos.x + mouse_click_start_pos.x) / 2, (mouse_pos.y + mouse_click_start_pos.y) / 2)
# Assign the brush position to the center point, and calculate the radius of the circle using the distance from
# the center to the top/bottom positon of the mouse.
new_brush.brush_pos = center_pos
new_brush.brush_shape_circle_radius = center_pos.distance_to(Vector2(center_pos.x, mouse_pos.y))
# Add the brush and update/draw all of the brushes.
brush_data_list.append(new_brush)
update()
func _draw():
# Go through all of the brushes in brush_data_list.
for brush in brush_data_list:
match brush.brush_type:
BrushModes.PENCIL:
# If the brush shape is a rectangle, then we need to make a Rect2 so we can use draw_rect.
# Draw_rect draws a rectagle at the top left corner, using the scale for the size.
# So we offset the position by half of the brush size so the rectangle's center is at mouse position.
if brush.brush_shape == BrushShapes.RECTANGLE:
var rect = Rect2(brush.brush_pos - Vector2(brush.brush_size / 2, brush.brush_size / 2), Vector2(brush.brush_size, brush.brush_size))
draw_rect(rect, brush.brush_color)
# If the brush shape is a circle, then we draw a circle at the mouse position,
# making the radius half of brush size (so the circle is brush size pixels in diameter).
elif brush.brush_shape == BrushShapes.CIRCLE:
draw_circle(brush.brush_pos, brush.brush_size / 2, brush.brush_color)
BrushModes.ERASER:
# NOTE: this is a really cheap way of erasing that isn't really erasing!
# However, this gives similar results in a fairy simple way!
# Erasing works exactly the same was as pencil does for both the rectangle shape and the circle shape,
# but instead of using brush.brush_color, we instead use bg_color instead.
if brush.brush_shape == BrushShapes.RECTANGLE:
var rect = Rect2(brush.brush_pos - Vector2(brush.brush_size / 2, brush.brush_size / 2), Vector2(brush.brush_size, brush.brush_size))
draw_rect(rect, bg_color)
elif brush.brush_shape == BrushShapes.CIRCLE:
draw_circle(brush.brush_pos, brush.brush_size / 2, bg_color)
BrushModes.RECTANGLE_SHAPE:
# We make a Rect2 with the postion at the top left. To get the size we take the bottom right position
# and subtract the top left corner's position.
var rect = Rect2(brush.brush_pos, brush.brush_shape_rect_pos_BR - brush.brush_pos)
draw_rect(rect, brush.brush_color)
BrushModes.CIRCLE_SHAPE:
# We simply draw a circle using stored in brush.
draw_circle(brush.brush_pos, brush.brush_shape_circle_radius, brush.brush_color)
func save_picture(path):
# Wait a couple frames so the save dialog isn't in the way.
yield (get_tree(), "idle_frame")
yield (get_tree(), "idle_frame")
# Get the viewport image.
var img = get_viewport().get_texture().get_data()
# Crop the image so we only have canvas area.
var cropped_image = img.get_rect(Rect2(TL_node.global_position, IMAGE_SIZE))
# Flip the image on the Y-axis (it's flipped upside down by default).
cropped_image.flip_y()
# Save the image with the passed in path we got from the save dialog.
cropped_image.save_png(path)

BIN
2d/gd_paint/PaintTools.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/PaintTools.png-636e86a6d210b52282c946752bbcc6f1.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://PaintTools.png"
dest_files=[ "res://.import/PaintTools.png-636e86a6d210b52282c946752bbcc6f1.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

220
2d/gd_paint/Paint_root.tscn Normal file
View File

@@ -0,0 +1,220 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://PaintControl.gd" type="Script" id=1]
[ext_resource path="res://ToolsPanel.gd" type="Script" id=2]
[ext_resource path="res://PaintTools.png" type="Texture" id=3]
[sub_resource type="StyleBoxFlat" id=1]
bg_color = Color( 1, 1, 1, 1 )
[node name="PaintRoot" type="Control"]
margin_right = 40.0
margin_bottom = 40.0
[node name="DrawingAreaBG" type="Panel" parent="."]
margin_left = 350.0
margin_right = 1280.0
margin_bottom = 720.0
custom_styles/panelf = SubResource( 1 )
custom_styles/panel = SubResource( 1 )
custom_styles/panelnc = SubResource( 1 )
[node name="PaintControl" type="Control" parent="."]
margin_right = 40.0
margin_bottom = 40.0
script = ExtResource( 1 )
[node name="TLPos" type="Position2D" parent="PaintControl"]
position = Vector2( 350, 0 )
[node name="ToolsPanel" type="Panel" parent="."]
margin_right = 350.0
margin_bottom = 720.0
script = ExtResource( 2 )
[node name="LabelTools" type="Label" parent="ToolsPanel"]
margin_left = 20.0
margin_top = 10.0
margin_right = 330.0
margin_bottom = 24.0
text = "Selected tool: Pencil"
align = 1
[node name="ButtonToolPencil" type="Button" parent="ToolsPanel"]
margin_left = 40.0
margin_top = 40.0
margin_right = 100.0
margin_bottom = 100.0
[node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonToolPencil"]
position = Vector2( 30, 30 )
scale = Vector2( 2.5, 2.5 )
texture = ExtResource( 3 )
region_enabled = true
region_rect = Rect2( 0, 0, 16, 16 )
[node name="ButtonToolEraser" type="Button" parent="ToolsPanel"]
margin_left = 110.0
margin_top = 40.0
margin_right = 170.0
margin_bottom = 100.0
[node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonToolEraser"]
position = Vector2( 30, 30 )
scale = Vector2( 2.5, 2.5 )
texture = ExtResource( 3 )
region_enabled = true
region_rect = Rect2( 16, 0, 16, 16 )
[node name="ButtonToolRectangle" type="Button" parent="ToolsPanel"]
margin_left = 180.0
margin_top = 40.0
margin_right = 240.0
margin_bottom = 100.0
[node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonToolRectangle"]
position = Vector2( 30, 30 )
scale = Vector2( 2.5, 2.5 )
texture = ExtResource( 3 )
region_enabled = true
region_rect = Rect2( 0, 16, 16, 16 )
[node name="ButtonToolCircle" type="Button" parent="ToolsPanel"]
margin_left = 250.0
margin_top = 40.0
margin_right = 310.0
margin_bottom = 100.0
[node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonToolCircle"]
position = Vector2( 30, 30 )
scale = Vector2( 2.5, 2.5 )
texture = ExtResource( 3 )
region_enabled = true
region_rect = Rect2( 16, 16, 16, 16 )
[node name="LabelBrushColor" type="Label" parent="ToolsPanel"]
margin_left = 20.0
margin_top = 120.0
margin_right = 330.0
margin_bottom = 134.0
text = "Current color"
align = 1
[node name="ColorPickerBrush" type="ColorPickerButton" parent="ToolsPanel"]
margin_left = 20.0
margin_top = 140.0
margin_right = 330.0
margin_bottom = 190.0
[node name="BrushSettings" type="Control" parent="ToolsPanel"]
margin_top = 200.0
margin_right = 350.0
margin_bottom = 375.0
[node name="LabelBrushSize" type="Label" parent="ToolsPanel/BrushSettings"]
margin_left = 20.0
margin_top = 10.0
margin_right = 330.0
margin_bottom = 24.0
text = "Brush size: 32px"
align = 1
[node name="HScrollBarBrushSize" type="HScrollBar" parent="ToolsPanel/BrushSettings"]
margin_left = 20.0
margin_top = 30.0
margin_right = 330.0
margin_bottom = 60.0
min_value = 2.0
step = 1.0
value = 32.0
[node name="LabelBrushShape" type="Label" parent="ToolsPanel/BrushSettings"]
margin_left = 20.0
margin_top = 80.0
margin_right = 330.0
margin_bottom = 94.0
text = "Brush shape: Circle"
align = 1
[node name="ButtonShapeBox" type="Button" parent="ToolsPanel/BrushSettings"]
editor/display_folded = true
margin_left = 100.0
margin_top = 100.0
margin_right = 160.0
margin_bottom = 160.0
[node name="Sprite" type="Sprite" parent="ToolsPanel/BrushSettings/ButtonShapeBox"]
position = Vector2( 30, 30 )
scale = Vector2( 2.5, 2.5 )
texture = ExtResource( 3 )
region_enabled = true
region_rect = Rect2( 0, 16, 16, 16 )
[node name="ButtonShapeCircle" type="Button" parent="ToolsPanel/BrushSettings"]
editor/display_folded = true
margin_left = 190.0
margin_top = 100.0
margin_right = 250.0
margin_bottom = 160.0
[node name="Sprite" type="Sprite" parent="ToolsPanel/BrushSettings/ButtonShapeCircle"]
position = Vector2( 30, 30 )
scale = Vector2( 2.5, 2.5 )
texture = ExtResource( 3 )
region_enabled = true
region_rect = Rect2( 16, 16, 16, 16 )
[node name="LabelBackgroundColor" type="Label" parent="ToolsPanel"]
margin_left = 20.0
margin_top = 400.0
margin_right = 330.0
margin_bottom = 414.0
text = "Background color"
align = 1
[node name="ColorPickerBackground" type="ColorPickerButton" parent="ToolsPanel"]
margin_left = 20.0
margin_top = 420.0
margin_right = 330.0
margin_bottom = 470.0
color = Color( 1, 1, 1, 1 )
edit_alpha = false
[node name="LabelStats" type="Label" parent="ToolsPanel"]
modulate = Color( 0.414062, 0.414062, 0.414062, 1 )
margin_left = 20.0
margin_top = 590.0
margin_right = 330.0
margin_bottom = 604.0
text = "Brush objects: 00000"
align = 1
[node name="ButtonUndo" type="Button" parent="ToolsPanel"]
margin_left = 10.0
margin_top = 520.0
margin_right = 340.0
margin_bottom = 560.0
text = "Undo last stroke"
[node name="ButtonSave" type="Button" parent="ToolsPanel"]
margin_left = 10.0
margin_top = 620.0
margin_right = 340.0
margin_bottom = 660.0
text = "Save picture"
[node name="ButtonClear" type="Button" parent="ToolsPanel"]
margin_left = 10.0
margin_top = 670.0
margin_right = 340.0
margin_bottom = 710.0
text = "Clear picture"
[node name="SaveFileDialog" type="FileDialog" parent="."]
margin_right = 600.0
margin_bottom = 400.0
resizable = true
access = 2
filters = PoolStringArray( "*.png" )
current_dir = "/home/aaronfranke/workspace/godot-demo-projects/2d/gd_paint"
current_path = "/home/aaronfranke/workspace/godot-demo-projects/2d/gd_paint/"

116
2d/gd_paint/ToolsPanel.gd Normal file
View File

@@ -0,0 +1,116 @@
extends Panel
var paint_control
onready var brush_settings = $BrushSettings
onready var label_tools = $LabelTools
onready var label_brush_size = $BrushSettings/LabelBrushSize
onready var label_brush_shape = $BrushSettings/LabelBrushShape
onready var label_stats = $LabelStats
var save_dialog
func _ready():
# Get PaintControl and SaveFileDialog.
paint_control = get_parent().get_node("PaintControl")
save_dialog = get_parent().get_node("SaveFileDialog")
# warning-ignore-all:return_value_discarded
# Assign all of the needed signals for the oppersation buttons.
$ButtonUndo.connect("pressed", self, "button_pressed", ["undo_stroke"])
$ButtonSave.connect("pressed", self, "button_pressed", ["save_picture"])
$ButtonClear.connect("pressed", self, "button_pressed", ["clear_picture"])
# Assign all of the needed signals for the brush buttons.
$ButtonToolPencil.connect("pressed", self, "button_pressed", ["mode_pencil"])
$ButtonToolEraser.connect("pressed", self, "button_pressed", ["mode_eraser"])
$ButtonToolRectangle.connect("pressed", self, "button_pressed", ["mode_rectangle"])
$ButtonToolCircle.connect("pressed", self, "button_pressed", ["mode_circle"])
$BrushSettings/ButtonShapeBox.connect("pressed", self, "button_pressed", ["shape_rectangle"])
$BrushSettings/ButtonShapeCircle.connect("pressed", self, "button_pressed", ["shape_circle"])
# Assign all of the needed signals for the other brush settings (and ColorPickerBackground).
$ColorPickerBrush.connect("color_changed", self, "brush_color_changed")
$ColorPickerBackground.connect("color_changed", self, "background_color_changed")
$BrushSettings/HScrollBarBrushSize.connect("value_changed", self, "brush_size_changed")
# Assign the 'file_selected' signal in SaveFileDialog.
save_dialog.connect("file_selected", self, "save_file_selected")
# Set physics process so we can update the status label.
set_physics_process(true)
func _physics_process(_delta):
# Update the status label with the newest brush element count.
label_stats.text = "Brush objects: " + String(paint_control.brush_data_list.size())
func button_pressed(button_name):
# If a brush mode button is pressed.
var tool_name = null
var shape_name = null
if button_name == "mode_pencil":
paint_control.brush_mode = paint_control.BrushModes.PENCIL
brush_settings.modulate = Color(1, 1, 1, 1)
tool_name = "Pencil"
elif button_name == "mode_eraser":
paint_control.brush_mode = paint_control.BrushModes.ERASER
brush_settings.modulate = Color(1, 1, 1, 1)
tool_name = "Eraser"
elif button_name == "mode_rectangle":
paint_control.brush_mode = paint_control.BrushModes.RECTANGLE_SHAPE
brush_settings.modulate = Color(1, 1, 1, 0.5)
tool_name = "Rectangle shape"
elif button_name == "mode_circle":
paint_control.brush_mode = paint_control.BrushModes.CIRCLE_SHAPE
brush_settings.modulate = Color(1, 1, 1, 0.5)
tool_name = "Circle shape"
# If a brush shape button is pressed
elif button_name == "shape_rectangle":
paint_control.brush_shape = paint_control.BrushShapes.RECTANGLE
shape_name = "Rectangle"
elif button_name == "shape_circle":
paint_control.brush_shape = paint_control.BrushShapes.CIRCLE
shape_name = "Circle";
# If a opperation button is pressed
elif button_name == "clear_picture":
paint_control.brush_data_list = []
paint_control.update()
elif button_name == "save_picture":
save_dialog.popup_centered()
elif button_name == "undo_stroke":
paint_control.undo_stroke()
# Update the labels (in case the brush mode or brush shape has changed).
if tool_name != null:
label_tools.text = "Selected tool: " + tool_name
if shape_name != null:
label_brush_shape.text = "Brush shape: " + shape_name
func brush_color_changed(color):
# Change the brush color to whatever color the color picker is.
paint_control.brush_color = color
func background_color_changed(color):
# Change the background color to whatever colorthe background color picker is.
get_parent().get_node("DrawingAreaBG").modulate = color
paint_control.bg_color = color
# Because of how the eraser works we also need to redraw the paint control.
paint_control.update()
func brush_size_changed(value):
# Change the size of the brush, and update the label to reflect the new value.
paint_control.brush_size = ceil(value)
label_brush_size.text = "Brush size: " + String(ceil(value)) + "px"
func save_file_selected(path):
# Call save_picture in paint_control, passing in the path we recieved from SaveFileDialog.
paint_control.save_picture(path)

View File

@@ -0,0 +1,14 @@
[gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1]
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
sky_curve = 0.25
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
ground_curve = 0.01
sun_energy = 16.0
[resource]
background_mode = 2
background_sky = SubResource( 1 )

BIN
2d/gd_paint/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 884 B

View File

@@ -3,6 +3,9 @@
importer="texture"
type="StreamTexture"
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
metadata={
"vram_texture": false
}
[deps]

34
2d/gd_paint/project.godot Normal file
View File

@@ -0,0 +1,34 @@
; 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=4
_global_script_classes=[ ]
_global_script_class_icons={
}
[application]
config/name="GD Paint"
run/main_scene="res://Paint_root.tscn"
config/icon="res://icon.png"
[display]
window/size/width=1280
window/size/height=720
window/stretch/mode="2d"
window/stretch/aspect="keep"
[gdnative]
singletons=[ ]
[rendering]
environment/default_environment="res://default_env.tres"

File diff suppressed because one or more lines are too long

View File

@@ -1,101 +1,13 @@
[gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1]
radiance_size = 4
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
sky_curve = 0.25
sky_energy = 1.0
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
ground_curve = 0.01
ground_energy = 1.0
sun_color = Color( 1, 1, 1, 1 )
sun_latitude = 35.0
sun_longitude = 0.0
sun_angle_min = 1.0
sun_angle_max = 100.0
sun_curve = 0.05
sun_energy = 16.0
texture_size = 2
[resource]
background_mode = 2
background_sky = SubResource( 1 )
background_sky_custom_fov = 0.0
background_color = Color( 0, 0, 0, 1 )
background_energy = 1.0
background_canvas_max_layer = 0
ambient_light_color = Color( 0, 0, 0, 1 )
ambient_light_energy = 1.0
ambient_light_sky_contribution = 1.0
fog_enabled = false
fog_color = Color( 0.5, 0.6, 0.7, 1 )
fog_sun_color = Color( 1, 0.9, 0.7, 1 )
fog_sun_amount = 0.0
fog_depth_enabled = true
fog_depth_begin = 10.0
fog_depth_curve = 1.0
fog_transmit_enabled = false
fog_transmit_curve = 1.0
fog_height_enabled = false
fog_height_min = 0.0
fog_height_max = 100.0
fog_height_curve = 1.0
tonemap_mode = 0
tonemap_exposure = 1.0
tonemap_white = 1.0
auto_exposure_enabled = false
auto_exposure_scale = 0.4
auto_exposure_min_luma = 0.05
auto_exposure_max_luma = 8.0
auto_exposure_speed = 0.5
ss_reflections_enabled = false
ss_reflections_max_steps = 64
ss_reflections_fade_in = 0.15
ss_reflections_fade_out = 2.0
ss_reflections_depth_tolerance = 0.2
ss_reflections_roughness = true
ssao_enabled = false
ssao_radius = 1.0
ssao_intensity = 1.0
ssao_radius2 = 0.0
ssao_intensity2 = 1.0
ssao_bias = 0.01
ssao_light_affect = 0.0
ssao_color = Color( 0, 0, 0, 1 )
ssao_quality = 0
ssao_blur = 3
ssao_edge_sharpness = 4.0
dof_blur_far_enabled = false
dof_blur_far_distance = 10.0
dof_blur_far_transition = 5.0
dof_blur_far_amount = 0.1
dof_blur_far_quality = 1
dof_blur_near_enabled = false
dof_blur_near_distance = 2.0
dof_blur_near_transition = 1.0
dof_blur_near_amount = 0.1
dof_blur_near_quality = 1
glow_enabled = false
glow_levels/1 = false
glow_levels/2 = false
glow_levels/3 = true
glow_levels/4 = false
glow_levels/5 = true
glow_levels/6 = false
glow_levels/7 = false
glow_intensity = 0.8
glow_strength = 1.0
glow_bloom = 0.0
glow_blend_mode = 2
glow_hdr_threshold = 1.0
glow_hdr_scale = 2.0
glow_bicubic_upscale = false
adjustment_enabled = false
adjustment_brightness = 1.0
adjustment_contrast = 1.0
adjustment_saturation = 1.0

View File

@@ -1,6 +1,6 @@
extends TileMap
enum CELL_TYPES { EMPTY = -1, ACTOR, OBSTACLE, OBJECT}
enum CellType { EMPTY = -1, ACTOR, OBSTACLE, OBJECT }
func _ready():
for child in get_children():
@@ -19,18 +19,18 @@ func request_move(pawn, direction):
var cell_target_type = get_cellv(cell_target)
match cell_target_type:
EMPTY:
CellType.EMPTY:
return update_pawn_position(pawn, cell_start, cell_target)
OBJECT:
CellType.OBJECT:
var object_pawn = get_cell_pawn(cell_target)
object_pawn.queue_free()
return update_pawn_position(pawn, cell_start, cell_target)
ACTOR:
CellType.ACTOR:
var pawn_name = get_cell_pawn(cell_target).name
print("Cell %s contains %s" % [cell_target, pawn_name])
func update_pawn_position(pawn, cell_start, cell_target):
set_cellv(cell_target, pawn.type)
set_cellv(cell_start, EMPTY)
set_cellv(cell_start, CellType.EMPTY)
return map_to_world(cell_target) + cell_size / 2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -3,20 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.png"
source_md5="3280104cdf8f7a9be38f70f9ff95cf50"
dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
dest_md5="df9a76b96b1fde8b55778a269d647ca3"
[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
@@ -26,6 +27,7 @@ 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

View File

@@ -4,10 +4,8 @@
[ext_resource path="res://pawns/sprites/character.png" type="Texture" id=2]
[sub_resource type="Animation" id=1]
resource_name = "bump"
length = 0.1
loop = false
step = 0.01
tracks/0/type = "value"
tracks/0/path = NodePath("Pivot/Sprite:position")
@@ -23,10 +21,8 @@ tracks/0/keys = {
}
[sub_resource type="Animation" id=2]
resource_name = "walk"
length = 0.25
loop = false
step = 0.05
tracks/0/type = "value"
tracks/0/path = NodePath("Pivot/Sprite:self_modulate")
@@ -65,47 +61,24 @@ tracks/2/keys = {
"values": [ Vector2( 1, 1 ), Vector2( 1.20007, 0.917384 ), Vector2( 0.916712, 1.13495 ), Vector2( 1, 1 ) ]
}
[node name="Actor" type="Node2D" index="0"]
[node name="Actor" type="Node2D"]
position = Vector2( 32, 32 )
z_index = 1
script = ExtResource( 1 )
_sections_unfolded = [ "Offset", "Transform", "Z Index" ]
__meta__ = {
"_edit_group_": true
}
type = 0
[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="0"]
root_node = NodePath("..")
autoplay = ""
playback_process_mode = 1
playback_default_blend_time = 0.0
playback_speed = 1.0
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
anims/bump = SubResource( 1 )
anims/walk = SubResource( 2 )
blend_times = [ ]
[node name="Tween" type="Tween" parent="." index="1"]
[node name="Tween" type="Tween" parent="."]
repeat = false
playback_process_mode = 1
playback_speed = 1.0
playback/active = false
playback/repeat = false
playback/speed = 1.0
[node name="Pivot" type="Position2D" parent="." index="2"]
_sections_unfolded = [ "Transform" ]
[node name="Sprite" type="Sprite" parent="Pivot" index="0"]
[node name="Pivot" type="Position2D" parent="."]
[node name="Sprite" type="Sprite" parent="Pivot"]
position = Vector2( 1.43051e-06, -1.90735e-06 )
texture = ExtResource( 2 )
centered = false
offset = Vector2( -32, -32 )
_sections_unfolded = [ "Transform", "Visibility" ]

View File

@@ -1,18 +1,18 @@
extends "pawn.gd"
onready var Grid = get_parent()
onready var grid = get_parent()
func _ready():
update_look_direction(Vector2(1, 0))
update_look_direction(Vector2.RIGHT)
func _process(delta):
func _process(_delta):
var input_direction = get_input_direction()
if not input_direction:
return
update_look_direction(input_direction)
var target_position = Grid.request_move(self, input_direction)
var target_position = grid.request_move(self, input_direction)
if target_position:
move_to(target_position)
else:
@@ -21,8 +21,8 @@ func _process(delta):
func get_input_direction():
return Vector2(
int(Input.is_action_pressed("ui_right")) - int(Input.is_action_pressed("ui_left")),
int(Input.is_action_pressed("ui_down")) - int(Input.is_action_pressed("ui_up"))
Input.get_action_strength("move_right") - Input.get_action_strength("move_left"),
Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
)

View File

@@ -1,4 +1,5 @@
extends Node2D
enum CELL_TYPES { ACTOR, OBSTACLE, OBJECT }
export(CELL_TYPES) var type = ACTOR
enum CellType { ACTOR, OBSTACLE, OBJECT }
#warning-ignore:unused_class_variable
export(CellType) var type = CellType.ACTOR

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 899 B

View File

@@ -3,20 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/character.png-98ed16816c5b464731c4fa68fe5b8613.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://pawns/sprites/character.png"
source_md5="03a1bf4fdd91e5a89e323e1a956b8b2e"
dest_files=[ "res://.import/character.png-98ed16816c5b464731c4fa68fe5b8613.stex" ]
dest_md5="dc0e808a19cb41bd3e4b8af9a1a2878e"
[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
@@ -26,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 787 B

View File

@@ -3,20 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/character_grey.png-a95d64c2e947e85f04dd1c6474e46965.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://pawns/sprites/character_grey.png"
source_md5="b2fc93bb6418bd5a1aeb9d4b23281b7d"
dest_files=[ "res://.import/character_grey.png-a95d64c2e947e85f04dd1c6474e46965.stex" ]
dest_md5="119083c34b0b039b9f6742e1aa84bcd1"
[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
@@ -26,6 +27,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -3,20 +3,21 @@
importer="texture"
type="StreamTexture"
path="res://.import/star.png-4f164f82cf41ace82182660f1be8e68d.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://pawns/sprites/star.png"
source_md5="c9eed33ac490155814b63a96281718bc"
dest_files=[ "res://.import/star.png-4f164f82cf41ace82182660f1be8e68d.stex" ]
dest_md5="b5e67be995733c89f151fdfd57ade882"
[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
@@ -26,6 +27,7 @@ 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

View File

@@ -6,7 +6,11 @@
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=3
config_version=4
_global_script_classes=[ ]
_global_script_class_icons={
}
[application]
@@ -18,6 +22,43 @@ config/icon="res://icon.png"
window/size/width=1280
window/size/height=720
window/stretch/mode="2d"
window/stretch/aspect="expand"
[input]
move_right={
"deadzone": 0.5,
"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":68,"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":16777233,"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(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
]
}
move_left={
"deadzone": 0.5,
"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":65,"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":16777231,"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(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
]
}
move_down={
"deadzone": 0.5,
"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":83,"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":16777234,"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(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
]
}
move_up={
"deadzone": 0.5,
"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":87,"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":16777232,"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(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
]
}
[rendering]

View File

@@ -6,22 +6,14 @@
[node name="Node2D" type="Node2D"]
[node name="Actor" type="Sprite" parent="." index="0"]
[node name="Actor" type="Sprite" parent="."]
position = Vector2( 32, 32 )
texture = ExtResource( 1 )
_sections_unfolded = [ "Visibility" ]
[node name="Obstacle" type="Sprite" parent="." index="1"]
[node name="Obstacle" type="Sprite" parent="."]
position = Vector2( 96, 32 )
texture = ExtResource( 2 )
_sections_unfolded = [ "Visibility" ]
[node name="Object" type="Sprite" parent="." index="2"]
[node name="Object" type="Sprite" parent="."]
position = Vector2( 160, 32 )
texture = ExtResource( 3 )
_sections_unfolded = [ "Visibility" ]

Some files were not shown because too many files have changed in this diff Show More