Compare commits

..

223 Commits

Author SHA1 Message Date
Aaron Franke
57baf0a1b5 Merge pull request #453 from aaronfranke/plugin-proj
Refactor the plugin demos to be inside of a project and add main screen plugin demo
2020-03-31 03:12:26 -04:00
Aaron Franke
a0a87c3bea Add a main screen plugin to the plugin demos 2020-03-25 23:29:55 -04:00
Aaron Franke
51c0f3abb8 Refactor the plugin demos to be inside of a project for convenience 2020-03-25 23:28:42 -04:00
LaBodilsen
8464543a23 simplifying steering to a single line with move_toward (#451)
* simplyfied the steering to a single line with lerp

Replaced:
	if steer_target < steer_angle:
		steer_angle -= STEER_SPEED * delta
		if steer_target > steer_angle:
			steer_angle = steer_target
	elif steer_target > steer_angle:
		steer_angle += STEER_SPEED * delta
		if steer_target < steer_angle:
			steer_angle = steer_target
	
	steering = steer_angle
with
	steering = lerp(steering, steer_target, STEER_SPEED)

and lowered STEER_SPEED to 0.2

* Update vehicle.gd

* added space around *
2020-03-25 13:46:42 -04:00
Rémi Verschelde
e95cbac634 Merge pull request #450 from aaronfranke/travis
Add a formatting script for local checking and for Travis CI
2020-03-25 09:12:38 +01:00
Aaron Franke
eab59a6d2e Merge pull request #452 from aaronfranke/issue-templates
Remove duplicate issue templates
2020-03-23 04:58:06 -04:00
Aaron Franke
474f246096 Remove duplicate issue templates 2020-03-23 04:57:24 -04:00
Aaron Franke
a12f54cfef Update issue templates 2020-03-23 04:51:27 -04:00
Aaron Franke
7e09d2fec7 Commit files changed by the formatting script 2020-03-19 20:30:40 -04:00
Aaron Franke
7ba8b9930d Add a formatting script for Travis CI 2020-03-19 20:30:33 -04:00
Aaron Franke
ec28f44e3c Merge pull request #449 from aaronfranke/description
Add descriptions to all projects with README files
2020-03-17 19:12:03 -04:00
Aaron Franke
f9e7456b70 Add descriptions to all projects with README files
These show up in the project manager when hovering over projects.
2020-03-16 20:50:53 -04:00
Aaron Franke
93b1f689f2 Merge pull request #447 from aaronfranke/multitouch
Multitouch View tweaks
2020-03-15 12:05:55 -04:00
Aaron Franke
c0880343bc Merge pull request #446 from aaronfranke/dodge-the-attributions
Move Dodge the Creeps license information into the README files
2020-03-15 12:05:18 -04:00
Aaron Franke
43dfa363c3 Merge pull request #445 from aaronfranke/kc2d
Organize and simplify the Kinematic Character 2D demo
2020-03-15 12:04:51 -04:00
Aaron Franke
699abade3a Merge pull request #448 from aaronfranke/mult-thread-load
Style tweaks and add import files to multiple threads loading demo
2020-03-15 12:04:26 -04:00
Aaron Franke
1ef6b121e3 Style tweaks and add import files to multiple threads loading demo 2020-03-15 04:37:34 -04:00
Vitaliy
5f7072a18d Multiple-threads loading (#425)
Add Multiple-threads loading demo
2020-03-15 04:25:18 -04:00
Aaron Franke
bc949bd47e Multitouch View tweaks 2020-03-14 03:07:16 -04:00
Aaron Franke
38d44dbb70 Move Dodge the Creeps license information into the README files 2020-03-14 01:58:57 -04:00
Aaron Franke
022ec69810 Organize and simplify the Kinematic Character 2D demo 2020-03-14 01:39:19 -04:00
Aaron Franke
f3c8885d8f Merge pull request #444 from aaronfranke/truck-town-tres
Convert materials to tres format in Truck Town
2020-03-13 15:12:15 -04:00
Aaron Franke
b103db5e50 Convert materials to tres format in Truck Town 2020-03-13 06:19:13 -04:00
Aaron Franke
671e1299e6 Merge pull request #443 from aaronfranke/2d-nav-poly-tweak
Tweak 2D navigation polygon demo camera and remove RPG unused files
2020-03-13 05:43:08 -04:00
Aaron Franke
bb61e49397 Tweak 2D navigation polygon demo camera and remove RPG unused files 2020-03-12 22:04:42 -04:00
Aaron Franke
69f21ce4c7 Merge pull request #442 from aaronfranke/dodge-the-csproj
Fix C# project files for Dodge the Creeps
2020-03-12 21:14:04 -04:00
Aaron Franke
d189a2b05a Fix C# project files for Dodge the Creeps 2020-03-12 20:44:42 -04:00
Aaron Franke
82fe29b90b Merge pull request #441 from aaronfranke/issue-template
Improve the issue template and add a PR template
2020-03-11 22:32:30 -04:00
Aaron Franke
ff483e2b71 Improve the issue template and add a PR template
Improve the comments in the issue template, and the PR template is entirely one comment.
2020-03-11 18:52:44 -04:00
Aaron Franke
758f38db67 Merge pull request #436 from aaronfranke/astar-kinematic
Some changes to Astar and Kinematic Character 3D
2020-03-10 16:16:15 -04:00
Aaron Franke
5caa78ef58 Some changes to kinematic character 3D 2020-03-10 07:23:55 -04:00
Aaron Franke
13f6e015bd Some changes to Astar code 2020-03-10 06:48:50 -04:00
Aaron Franke
db2941bed4 Merge pull request #435 from Calinou/fix-hfsm-comment
Fix incorrect comment in hierarchical FSM demo script
2020-03-09 10:22:16 -04:00
Aaron Franke
9553549a61 Merge pull request #432 from aaronfranke/readme
Add README files to many demos
2020-03-09 10:21:53 -04:00
Hugo Locurcio
222f94444a Fix incorrect comment in hierarchical FSM demo script
This closes #433.
2020-03-09 15:00:56 +01:00
Aaron Franke
9b4cac5782 Add README files to most of the misc demos
The Android ones can wait for later
2020-03-09 05:39:32 -04:00
Aaron Franke
fea5db8ed2 Add README files to loading and multiplayer demos 2020-03-09 05:06:17 -04:00
Aaron Franke
9e3ffe456b Add README files to GUI demos 2020-03-09 04:26:24 -04:00
Aaron Franke
8cdddc87ce Add README files to audio demos 2020-03-09 03:54:32 -04:00
Aaron Franke
da280ec220 Add README to and fix Circle Pop demo
Circle Pop gets its own commit since I found a bug that had to be fixed
2020-03-09 03:54:32 -04:00
Aaron Franke
f2a18910aa Add README files to Viewport demos 2020-03-09 03:54:32 -04:00
Aaron Franke
2eaedf8064 Add README files to demos with multiple versions 2020-03-09 03:54:32 -04:00
Aaron Franke
7e0032eb8e Add README files to 3D demos 2020-03-09 03:54:32 -04:00
Aaron Franke
a24ac796b6 Add README files to 2D demos 2020-03-09 03:54:32 -04:00
Aaron Franke
9809601e40 Merge pull request #431 from aaronfranke/no-grid
Remove the grid based movement demo
2020-03-09 03:54:12 -04:00
Aaron Franke
9b6109e44d Merge pull request #428 from aaronfranke/splitscreen
Add a splitscreen mode to the 2D platformer.
2020-03-07 19:56:52 -05:00
Aaron Franke
2ea2b02b68 Remove grid based movement demo
I don't think there's a point to this since we also have the JRPG demo.
2020-03-07 19:54:03 -05:00
Aaron Franke
ebc435074b [2D Platformer] Add a splitscreen mode 2020-03-06 23:00:11 -05:00
Aaron Franke
f5f72e6d3e [2D Platformer] Move Player out of Level, set limits in a script 2020-03-06 18:17:33 -05:00
Aaron Franke
e11fa006d6 Merge pull request #427 from aaronfranke/joypad
Refactor the Joypads demo
2020-03-06 18:17:01 -05:00
Aaron Franke
5322be1a54 Refactor the Joypads demo 2020-03-05 20:50:16 -05:00
Aaron Franke
18679efd75 Merge pull request #426 from aaronfranke/gles2
Convert most demos to GLES 2 and update to Godot 3.2
2020-03-05 20:49:11 -05:00
Aaron Franke
aea4010bc8 Convert most demos to GLES 2
Also fix Viewport error in 3D scaling demo, add an icon to Multiplayer Bomber, and rename BPM sync files.
2020-03-04 20:59:12 -05:00
Aaron Franke
db7c9f162f Open and save 3D IK demo in Godot 3.2 2020-03-04 20:59:12 -05:00
Aaron Franke
c72f65ed36 Update C# demos to Godot 3.2 2020-03-04 20:30:30 -05:00
Aaron Franke
424ad342ad Merge pull request #315 from aaronfranke/2point5d
Add 2.5D Demo Projects
2020-03-02 22:03:53 -05:00
Aaron Franke
841eb1fa37 Add icon for the 2.5D editor viewport 2020-03-01 22:29:44 -05:00
Aaron Franke
1671b4e30e Add music and set physics engine to Bullet 2020-03-01 17:14:11 -05:00
Aaron Franke
c7cc72b705 Add screenshots and tweak README files 2020-03-01 04:43:32 -05:00
Aaron Franke
d1ba41da5d 2.5D Editor Viewport for Mono C# 2020-03-01 04:37:41 -05:00
Aaron Franke
cc68af17af 2.5D Editor Viewport for GDScript 2020-03-01 04:36:44 -05:00
Aaron Franke
7e539cd182 2.5D Demo Project for GDScript
Co-authored-by: Stephen Agbete (Steph155) <bgsteph15@mail.com>
2020-02-29 22:39:32 -05:00
Aaron Franke
722ea9bc01 2.5D Demo Project for Mono C#
Co-authored-by: Stephen Agbete (Steph155) <bgsteph15@mail.com>
2020-02-29 22:39:20 -05:00
Aaron Franke
ca761cff87 Merge pull request #424 from Calinou/readme-add-scan-instructions
Add instructions on importing all projects at once in the README
2020-02-24 02:08:05 -05:00
Aaron Franke
5809089e9e Merge pull request #419 from aaronfranke/multiplayer
Update networking and multiplayer demos
2020-02-20 16:39:23 -05:00
Hugo Locurcio
abe1b0f367 Add instructions on importing all projects at once in the README
This may be helpful to newcomers; see #423.
2020-02-20 22:11:57 +01:00
Aaron Franke
b310877037 Update other networking demos, with style fixes 2020-02-20 15:13:21 -05:00
Aaron Franke
984a731502 Update multiplayer bomber demo 2020-02-20 15:13:21 -05:00
Aaron Franke
de8a79b35b Merge pull request #421 from aaronfranke/platform-3d-animtree
Update Platformer 3D to use AnimationTree and organize into subfolders
2020-02-20 15:12:24 -05:00
Aaron Franke
399de3e954 Organize 3D platformer demo files 2020-02-19 19:09:55 -05:00
Aaron Franke
486d582802 Update 3D platformer to use AnimationTree 2020-02-19 18:55:14 -05:00
Aaron Franke
001e51d2d3 Merge pull request #413 from Calinou/add-viewport-3d-scaling-demo
Add a viewport 3D scaling demo
2020-02-19 15:22:11 -05:00
Hugo Locurcio
b927ea3c63 Add a viewport 3D scaling demo
This demo shows how to scale the 3D viewport rendering without
affecting 2D elements such as the HUD. It also demonstrates how to
toggle filtering on a viewport by using TextureRect to display the
ViewportTexture delivered by the Viewport node.
2020-02-19 21:13:20 +01:00
Aaron Franke
f6c4a0000f Merge pull request #416 from aaronfranke/platformer-tweaks
Tweak the 2D platformer demos, particularly Physics Platformer
2020-02-19 15:08:35 -05:00
Aaron Franke
853565d1be Tweak the platformer demos, particularly physics platformer 2020-02-19 00:37:59 -05:00
Aaron Franke
073640ffcc Merge pull request #414 from aaronfranke/2d-3.2
Update 2D demos for 3.2 and convert many to GLES 2
2020-02-18 23:37:37 -05:00
Aaron Franke
545d63cd2d Merge pull request #412 from NetroScript/fixing-Sprites-at-2x-Resolution
Changing the art assets for the 2D platformers to "real" pixel art (instead of 2x upscaled)
2020-02-18 23:33:07 -05:00
Aaron Franke
c215c62df1 Convert many 2D projects to GLES 2 2020-02-17 21:29:54 -05:00
Aaron Franke
dda0bd7e20 Update other 2D demos for Godot 3.2 2020-02-17 21:29:54 -05:00
Aaron Franke
35bd408367 Update and improve isometric demo for 3.2
Also tweak hex map demo
2020-02-17 20:29:08 -05:00
Aaron Franke
ac179c6745 Merge pull request #382 from TwistedTwigleg/Godot_3_2_IK_Fix
Fixed GDScript IK demo so it works with Godot 3.2
2020-02-17 18:34:54 -05:00
TwistedTwigleg
2136c99672 Fixed up LookAt IK code so it better follows the style guide. Touched up a bunch of the comments 2020-02-17 14:45:02 -05:00
TwistedTwigleg
fdb0d77e88 Fixed style issues in IK Demo. Added a bit of static typing hints to the LookAt IK file to better fit the rest of the scripts 2020-02-17 12:14:36 -05:00
NetroScript
fbe6286656 for the 2d platformer demos changing the asset resolution from 2x upscaled to "true" pixel art, also adjusting values likes positions 2020-02-17 17:05:10 +01:00
Aaron Franke
ef98347469 Merge pull request #358 from pigdevstudio/input-remap-revamp
Revamp Input Remap demo simplifying it
2020-02-17 05:57:24 -05:00
Aaron Franke
07e696661c Merge pull request #392 from Calinou/tweak-3d-settings
Tweak 3D settings in various demos
2020-02-17 04:10:43 -05:00
TwistedTwigleg
1c9c754b79 Fixed SkeletonIK issue in Godot IK Demo. Now the joints should not act crazy 2020-02-16 11:43:21 -05:00
Hugo Locurcio
da374bccda Tweak 3D settings in various demos
- Use 4× MSAA for a better visual appearance.
- Use "3D Without Effects" framebuffer allocation when possible
  for better performance.
- Disable Glow in the 3D Kinematic Character demo for better
  performance. Increase the DirectionalLight strength to compensate.
- Use a non-linear attenuation for the OmniLight in the
  Window Management demo (and increase its range to compensate).
2020-02-15 23:32:00 +01:00
Aaron Franke
05801f9389 Merge pull request #411 from aaronfranke/vs-3.2
Update VisualScript demos for Godot 3.2
2020-02-12 19:59:29 -05:00
Aaron Franke
da157f6d0e Update VisualScript demos for Godot 3.2 2020-02-12 19:31:23 -05:00
Aaron Franke
13ca65800d Merge pull request #405 from NathanLovato/feature/2d-platformer-remake
Remake the 2d platformer demo
2020-02-12 19:30:46 -05:00
Henrique Campos
a76d9471f4 Add a simplified version of input remapping 2020-02-12 19:42:12 -03:00
Aaron Franke
d8546ece42 Add screenshots 2020-02-12 16:36:17 -05:00
Aaron Franke
8d48b7f994 Tweak background and organize clouds 2020-02-12 15:51:56 -05:00
Aaron Franke
c117eb1847 Minor style tweaks 2020-02-12 15:30:42 -05:00
Nathan Lovato
77800b3f15 Add more clouds to cover wide and thin window sizes 2020-02-12 07:53:43 -06:00
Nathan Lovato
332cd3bb38 Remove return type hint 2020-02-12 07:48:21 -06:00
Nathan Lovato
75df35b165 Improve background tiling, move parallax layers vertically 2020-02-12 07:47:56 -06:00
Nathan Lovato
bebf8e8249 Fix background disappearing when scaling the window
Use the keep_height aspect ratio option as in the original demo. This prevents
seeing the clear color when making the window tall
Change the ParallaxBackground scene so mirrored sections don't disappear on wide windows
2020-02-11 22:18:48 -06:00
Nathan Lovato
bd6da6a610 Limit the window size 2020-02-11 22:08:01 -06:00
Nathan Lovato
ab04b998fc Update the platformer demo's readme 2020-02-11 21:56:15 -06:00
Nathan Lovato
263bfd8bd3 Add README to the 2D platformer 2020-02-11 18:22:26 -06:00
Nathan Lovato
9ee778bd5d Address requested changes in the review
Remove unused spawn input action
Add support for the gamepad's left stick for movement
Use the project settings to store the gravity value project-wide
Remove type hints
2020-02-11 17:24:57 -06:00
Aaron Franke
2372fd155f Merge pull request #366 from aaronfranke/matrix-transform
Add Matrix Transform demo
2020-02-11 03:53:07 -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
Nathan Lovato
e323bead2e Remake the 2d/platformer demo from scratch
This Godot project is a complete rewrite of the official Platformer 2D demo. This is part of a proposal to improve and harmonize the official demo projects. We want to:

- Teach good programming practices with Godot.
- Bring demos to a higher quality standard.
- Unify the code in the demos.

See the [open issue](https://github.com/godotengine/godot-demo-projects/issues/390) for more information.

This new demo showcases features from the original, and works with Godot 3.2.

Co-authored-by: Johnny Goss <me@johnnygoss.dev>
2020-02-04 21:50:54 -06: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
TwistedTwigleg
2e681e132a IK demo: Fixed bug in FABRIK IK that would cause the right arm to freak out by changing the middle joint code. 2020-01-29 17:52:25 -05:00
Aaron Franke
2afbeef96f Allow using WASD and controllers in Truck Town 2020-01-29 17:43:46 -05:00
TwistedTwigleg
40bcc0f55f Added SkeletonIK example to IK demo. Updated the anchors on all of the UI so it can scale to any sized window. Removed the project settings keeping the aspect ratio the same 2020-01-29 17:37:04 -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
TwistedTwigleg
59e85689ba IK Demo - Removed code that straightens the FABRIK chain when the target is out of reach because it was not working, and instead just run the FABRIK chain even if the target is out of reach. This straightens the arms like expected and simplifies the code. Moved the camera back in both the look_at_ik and fabrik_ik scenes 2020-01-29 14:13:50 -05:00
TwistedTwigleg
fd6e157596 Minor typo and style fixes for the IK demo 2020-01-29 13:43:54 -05:00
TwistedTwigleg
3dbd79217d Fixed GDScript IK demo so it works with Godot 3.2 2020-01-29 13:19:14 -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
Aaron Franke
21e6dc8576 Add Matrix Transform demo 2020-01-08 15:37:29 -05: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
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
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
Roberto Proença
36c9ecdfa8 Extract shader code from 2D shader demos 2019-07-31 13:15:42 -03: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
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
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
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
Marcelo Fernandez
db411004b5 Add new Audio Device Changer demo 2018-10-08 22:23:23 -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
1627 changed files with 31677 additions and 17005 deletions

6
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,6 @@
# Lines starting with '#' are comments.
# Each line is a file pattern followed by one or more owners.
# Owners can be @users, @org/teams or emails
/misc/2.5d @aaronfranke
/mono/2.5d @aaronfranke

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

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

34
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View File

@@ -0,0 +1,34 @@
---
name: Bug Report
about: Report a bug with one of the demo projects.
title: ''
labels: bug
assignees: ''
---
<!--
Please search existing issues for potential duplicates before filing yours:
https://github.com/godotengine/godot-demo-projects/issues?q=is%3Aissue
Only submit an issue if it is reproducible with the latest stable Godot version.
-->
**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, what was expected, and what went wrong. -->
**Screenshots of issue:**
<!--
This section is optional.
Drag in an image, or post an image with a link in the form of:
![Alt Text Here](https://pbs.twimg.com/media/DW5AJnZVAAM1805?format=jpg)
-->

View File

@@ -0,0 +1,19 @@
---
name: Feature / Enhancement Request
about: Adding new features or improving existing ones.
title: ''
labels: enhancement
assignees: ''
---
<!--
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. -->
**Description:**

24
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,24 @@
<!--
Only submit a pull request if all of the following conditions are met:
* It must work with the latest stable Godot version. Do not submit a
pull request if it only works with alpha/beta builds.
* It must follow all of the Godot style guides, including the GDScript
style guide and the C# style guide.
* The demo should not be overcomplicated. Simplicity is usually preferred.
* If you are submitting a new demo, please ensure that it includes a
README file similar to the other demos.
* If you are submitting a copy of a demo translated to C# etc:
* Please ensure that there is a good reason to have this demo translated.
We don't want to have multiple copies of every single project.
* Please ensure that the code mirrors the original closely.
* In the project.godot file and in the README, include "with C#" etc in
the title, and also include a link to the original in the README.
-->

1
.gitignore vendored
View File

@@ -5,6 +5,7 @@ export_presets.cfg
# Mono-specific ignores
.mono/
mono_crash.*.json
# System/tool-specific ignores
.directory

18
.travis.yml Normal file
View File

@@ -0,0 +1,18 @@
dist: bionic
stages:
- build
matrix:
include:
- name: Static checks (format.sh)
stage: build
os: linux
addons:
apt:
packages:
- dos2unix
- recode
script:
- bash ./format.sh

View File

@@ -1,7 +0,0 @@
extends Button
func _on_Button_pressed() -> void:
if Input.is_mouse_button_pressed(BUTTON_LEFT):
print("Left mouse button")
if Input.is_mouse_button_pressed(BUTTON_RIGHT):
print("Right mouse button")

View File

@@ -7,6 +7,7 @@ func show_message(text):
$MessageLabel.show()
$MessageTimer.start()
func show_game_over():
show_message("Game Over")
yield($MessageTimer, "timeout")
@@ -15,12 +16,15 @@ func show_game_over():
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()
$MessageLabel.hide()

View File

@@ -4,21 +4,17 @@
[ext_resource path="res://fonts/Xolonium-Regular.ttf" type="DynamicFontData" id=2]
[sub_resource type="DynamicFont" id=1]
size = 64
font_data = ExtResource( 2 )
[sub_resource type="DynamicFont" id=2]
size = 64
font_data = ExtResource( 2 )
[sub_resource type="InputEventAction" id=3]
action = "ui_select"
[sub_resource type="ShortCut" id=4]
shortcut = SubResource( 3 )
[node name="HUD" type="CanvasLayer"]
@@ -57,6 +53,5 @@ text = "Start"
[node name="MessageTimer" type="Timer" parent="."]
one_shot = true
[connection signal="pressed" from="StartButton" to="." method="_on_StartButton_pressed"]
[connection signal="timeout" from="MessageTimer" to="." method="_on_MessageTimer_timeout"]

View File

@@ -6,6 +6,7 @@ var score
func _ready():
randomize()
func game_over():
$ScoreTimer.stop()
$MobTimer.stop()
@@ -13,6 +14,7 @@ func game_over():
$Music.stop()
$DeathSound.play()
func new_game():
score = 0
$Player.start($StartPosition.position)
@@ -21,20 +23,23 @@ func new_game():
$HUD.show_message("Get Ready")
$Music.play()
func _on_MobTimer_timeout():
$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
direction += rand_range(-PI/4, PI/4)
direction += rand_range(-PI / 4, PI / 4)
mob.rotation = direction
mob.linear_velocity = Vector2(rand_range(mob.min_speed, mob.max_speed), 0).rotated(direction)
func _on_ScoreTimer_timeout():
score += 1
$HUD.update_score(score)
func _on_StartTimer_timeout():
$MobTimer.start()
$ScoreTimer.start()
$ScoreTimer.start()

View File

@@ -9,7 +9,7 @@
[sub_resource type="Curve2D" id=1]
_data = {
"points": PoolVector2Array( 0, 0, 0, 0, -0.901337, 0.225891, 0, 0, 0, 0, 480.262, 1.29041, 0, 0, 0, 0, 481.327, 700.681, 0, 0, 0, 0, 0.163177, 698.552, 0, 0, 0, 0, -0.901337, 0.225891 )
"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"]
@@ -19,7 +19,7 @@ Mob = ExtResource( 2 )
[node name="ColorRect" type="ColorRect" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
color = Color( 0.223529, 0.317647, 0.368627, 1 )
color = Color( 0.219608, 0.372549, 0.380392, 1 )
[node name="Player" parent="." instance=ExtResource( 3 )]
@@ -39,8 +39,6 @@ position = Vector2( 240, 450 )
curve = SubResource( 1 )
[node name="MobSpawnLocation" type="PathFollow2D" parent="MobPath"]
position = Vector2( -0.901337, 0.225891 )
rotation = 0.00221238
[node name="HUD" parent="." instance=ExtResource( 4 )]
@@ -49,7 +47,6 @@ 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"]

View File

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

View File

@@ -1,20 +1,19 @@
[gd_scene load_steps=10 format=2]
[ext_resource path="res://Mob.gd" type="Script" id=1]
[ext_resource path="res://art/enemySwimming_1.png" type="Texture" id=2]
[ext_resource path="res://art/enemySwimming_2.png" type="Texture" id=3]
[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/enemyFlyingAlt_1.png" type="Texture" id=6]
[ext_resource path="res://art/enemyFlyingAlt_2.png" type="Texture" id=7]
[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": "swim",
"speed": 4.0
"name": "fly",
"speed": 3.0
}, {
"frames": [ ExtResource( 4 ), ExtResource( 5 ) ],
"loop": true,
@@ -23,12 +22,11 @@ animations = [ {
}, {
"frames": [ ExtResource( 6 ), ExtResource( 7 ) ],
"loop": true,
"name": "fly",
"speed": 3.0
"name": "swim",
"speed": 4.0
} ]
[sub_resource type="CapsuleShape2D" id=2]
radius = 35.2706
height = 23.3281
@@ -44,6 +42,7 @@ __meta__ = {
scale = Vector2( 0.75, 0.75 )
frames = SubResource( 1 )
animation = "walk"
frame = 1
playing = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
@@ -51,5 +50,4 @@ rotation = 1.5708
shape = SubResource( 2 )
[node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."]
[connection signal="screen_exited" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_screen_exited"]

View File

@@ -3,23 +3,18 @@ extends Area2D
signal hit
export var speed = 400
var extents
var screen_size
func _ready():
screen_size = get_viewport_rect().size
hide()
func _process(delta):
var 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_up"):
velocity.y -= 1
if Input.is_action_pressed("ui_down"):
velocity.y += 1
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
$AnimatedSprite.play()
@@ -37,12 +32,14 @@ func _process(delta):
$AnimatedSprite.animation = "up"
$AnimatedSprite.flip_v = velocity.y > 0
func _on_Player_body_entered(body):
hide()
emit_signal("hit")
$CollisionShape2D.set_deferred("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

@@ -1,4 +1,4 @@
[gd_scene load_steps=8 format=2]
[gd_scene load_steps=13 format=2]
[ext_resource path="res://Player.gd" type="Script" id=1]
[ext_resource path="res://art/playerGrey_walk1.png" type="Texture" id=2]
@@ -23,7 +23,30 @@ animations = [ {
radius = 26.1701
height = 14.822
[sub_resource type="Gradient" id=3]
colors = PoolColorArray( 1, 1, 1, 0.501961, 1, 1, 1, 0 )
[sub_resource type="GradientTexture" id=4]
gradient = SubResource( 3 )
[sub_resource type="Curve" id=5]
_data = [ Vector2( 0.00501098, 0.5 ), 0.0, 0.0, 0, 0, Vector2( 0.994989, 0.324 ), 0.0, 0.0, 0, 0 ]
[sub_resource type="CurveTexture" id=6]
curve = SubResource( 5 )
[sub_resource type="ParticlesMaterial" id=7]
flag_disable_z = true
gravity = Vector3( 0, 0, 0 )
initial_velocity = 1.0
orbit_velocity = 0.0
orbit_velocity_random = 0.0
scale = 0.75
scale_curve = SubResource( 6 )
color_ramp = SubResource( 4 )
[node name="Player" type="Area2D"]
z_index = 10
script = ExtResource( 1 )
__meta__ = {
"_edit_group_": true
@@ -37,4 +60,11 @@ animation = "right"
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource( 2 )
[node name="Trail" type="Particles2D" parent="."]
z_index = -1
amount = 10
speed_scale = 2.0
local_coords = false
process_material = SubResource( 7 )
texture = ExtResource( 2 )
[connection signal="body_entered" from="." to="." method="_on_Player_body_entered"]

View File

@@ -0,0 +1,27 @@
# Dodge the Creeps
This is a simple game where your character must move
and avoid the enemies for as long as possible.
This is a finished version of the game featured in the
["Your first game"](https://docs.godotengine.org/en/latest/getting_started/step_by_step/your_first_game.html)
tutorial in the documentation. For more details,
consider following the tutorial in the documentation.
Language: GDScript
Renderer: GLES 3 (particles are not available in GLES 2)
Note: There is a C# version available [here](https://github.com/godotengine/godot-demo-projects/tree/master/mono/dodge_the_creeps).
## Screenshots
![GIF from the documentation](https://docs.godotengine.org/en/latest/_images/dodge_preview.gif)
## Licenses
`art/House In a Forest Loop.ogg` Copyright &copy; 2012 [HorrorPen](https://opengameart.org/users/horrorpen), [CC-BY 3.0: Attribution](http://creativecommons.org/licenses/by/3.0/). Source: https://opengameart.org/content/loop-house-in-a-forest
Images are from "Abstract Platformer". Copyright &copy; 2010-2020 kenney.nl, [CC0 1.0 Universal](http://creativecommons.org/publicdomain/zero/1.0/). Source: https://www.kenney.nl/assets/abstract-platformer
Font is "Xolonium". Copyright &copy; 2011-2016 Severin Meyer <sev.ch@web.de>, with Reserved Font Name Xolonium, SIL open font license version 1.1. Details are in `fonts/LICENSE.txt`.

View File

@@ -1,2 +0,0 @@
"Abstract Platformer" by kenney.nl is licensed under http://creativecommons.org/publicdomain/zero/1.0/
"House in a Forest Loop" by https://opengameart.org/users/horrorpen is licensed under http://creativecommons.org/licenses/by/3.0/

View File

@@ -5,4 +5,3 @@
[resource]
background_mode = 2
background_sky = SubResource( 1 )

View File

@@ -1,94 +1,94 @@
Copyright 2011-2016 Severin Meyer <sev.ch@web.de>,
with Reserved Font Name Xolonium.
This Font Software is licensed under the SIL Open Font License,
Version 1.1. This license is copied below, and is also available
with a FAQ at <http://scripts.sil.org/OFL>
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Copyright 2011-2016 Severin Meyer <sev.ch@web.de>,
with Reserved Font Name Xolonium.
This Font Software is licensed under the SIL Open Font License,
Version 1.1. This license is copied below, and is also available
with a FAQ at <http://scripts.sil.org/OFL>
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -16,6 +16,12 @@ _global_script_class_icons={
[application]
config/name="Dodge the Creeps"
config/description="This is a simple game where your character must move
and avoid the enemies for as long as possible.
This is a finished version of the game featured in the 'Your first game'
tutorial in the documentation, but ported to C#. For more details,
consider following the tutorial in the documentation."
run/main_scene="res://Main.tscn"
config/icon="res://icon.png"
@@ -24,6 +30,41 @@ config/icon="res://icon.png"
window/size/width=480
window/size/height=720
[input]
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]
environment/default_environment="res://default_env.tres"

View File

@@ -1,20 +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="." instance=ExtResource( 1 )]
editor/display_folded = true
[node name="StatesStackDiplayer" parent="." instance=ExtResource( 2 )]
[node name="Explanations" parent="." instance=ExtResource( 2 )]
[node name="ControlsPanel" parent="." instance=ExtResource( 3 )]
[node name="Control" type="Control" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Explanations" parent="." instance=ExtResource( 4 )]
[node name="StatesStackDiplayer" parent="Control" instance=ExtResource( 3 )]
[node name="ControlsPanel" parent="Control" instance=ExtResource( 4 )]
[editable path="Player"]

View File

@@ -0,0 +1,30 @@
# Hierarchical Finite State Machine
This example shows how to apply the State machine programming
pattern in GDscript, including Hierarchical States, and a
pushdown automaton.
Language: GDScript
Renderer: GLES 2
## Why use a state machine
States are common in games. You can use the pattern to:
1. Separate each behavior and transitions between behaviors,
thus make scripts shorter and easier to manage.
2. Respect the Single Responsibility Principle.
Each State object represents one action.
3. Improve your code's structure. Look at the scene tree and
FileSystem tab: without looking at the code, you'll know
what the Player can or cannot do.
You can read more about States in the excellent
[Game Programming Patterns ebook](https://gameprogrammingpatterns.com/state.html).
## Screenshots
![Screenshot](screenshots/fsm-attack.png)

View File

@@ -1,14 +1,15 @@
[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]
[ext_resource path="res://fonts/source_code_pro_explanations.tres" type="DynamicFont" id=1]
[node name="ControlsPanel" type="Panel"]
anchor_left = 1.0
anchor_right = 1.0
margin_left = -220.0
margin_bottom = 170.0
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Keys" type="Label" parent="."]
anchor_right = 1.0
@@ -17,7 +18,7 @@ margin_left = 10.0
margin_top = 10.0
margin_right = -10.0
margin_bottom = -10.0
custom_fonts/font = ExtResource( 2 )
custom_fonts/font = ExtResource( 1 )
text = "Shoot:
Attack:
Stagger:
@@ -31,11 +32,10 @@ margin_left = 10.0
margin_top = 10.0
margin_right = -10.0
margin_bottom = -10.0
custom_fonts/font = ExtResource( 2 )
custom_fonts/font = ExtResource( 1 )
text = "R
F
X
Space
Shift"
align = 2

View File

@@ -1,8 +1,7 @@
[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_right = 1.0
@@ -35,8 +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."
script = ExtResource( 3 )
__meta__ = {
"_edit_lock_": true
}

View File

@@ -46,4 +46,3 @@ margin_bottom = 170.0
custom_fonts/font = SubResource( 1 )
text = "1.
2."

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

@@ -11,4 +11,3 @@ ground_curve = 0.01
[resource]
background_mode = 2
background_sky = SubResource( 1 )

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

@@ -49,7 +49,6 @@ __meta__ = {
[node name="StateMachine" type="Node" parent="."]
script = ExtResource( 2 )
START_STATE = NodePath("Idle")
[node name="Idle" type="Node" parent="StateMachine"]
script = ExtResource( 3 )
@@ -86,7 +85,6 @@ position = Vector2( 0, -58.8242 )
texture = ExtResource( 10 )
[node name="BulletSpawn" type="Node2D" parent="BodyPivot"]
editor/display_folded = true
position = Vector2( 1.17401, -61.266 )
script = ExtResource( 11 )
@@ -107,7 +105,6 @@ position = Vector2( 110, 0 )
polygon = PoolVector2Array( -20, 0, -20, -20, 20, -20, 20, 0 )
[node name="StateNameDisplayer" type="Label" parent="."]
editor/display_folded = true
margin_left = -109.0
margin_top = -172.0
margin_right = 110.0
@@ -118,8 +115,7 @@ align = 1
valign = 1
uppercase = true
script = ExtResource( 15 )
[connection signal="state_changed" from="StateMachine" to="BodyPivot/WeaponPivot/Offset/Sword" method="_on_StateMachine_state_changed"]
[connection signal="state_changed" from="StateMachine" to="StateNameDisplayer" method="_on_StateMachine_state_changed"]
[connection signal="state_changed" from="StateMachine" to="BodyPivot/WeaponPivot/Offset/Sword" 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"]

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

@@ -12,4 +12,3 @@ script = ExtResource( 1 )
[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

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

@@ -234,11 +234,10 @@ anims/attack_fast = SubResource( 3 )
anims/attack_medium = SubResource( 4 )
anims/idle = SubResource( 5 )
[node name="sword" type="Sprite" parent="."]
[node name="Sword" type="Sprite" parent="."]
position = Vector2( 4, 0 )
texture = ExtResource( 2 )
offset = Vector2( 67, 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()

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

@@ -15,7 +15,10 @@ _global_script_class_icons={
[application]
config/name="Hierarchical Finite State Machine example"
config/name="Hierarchical Finite State Machine"
config/description="This example shows how to apply the State machine programming
pattern in GDscript, including Hierarchical States, and a
pushdown automaton."
run/main_scene="res://Demo.tscn"
config/icon="res://icon.png"
@@ -23,10 +26,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]
@@ -39,6 +40,7 @@ move_left={
"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={
@@ -46,6 +48,7 @@ move_up={
"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={
@@ -53,6 +56,7 @@ move_right={
"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={
@@ -60,18 +64,19 @@ move_down={
"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={
"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":2,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":7,"pressure":0.0,"pressed":false,"script":null)
]
}
run={
"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":7,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null)
]
}
jump={
@@ -83,14 +88,17 @@ jump={
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={
"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]
quality/driver/driver_name="GLES2"
environment/default_environment="res://default_env.tres"

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

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,16 @@
"""
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 should 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 default to
# the first state in the state machine's children.
export(NodePath) var start_state
var states_map = {}
var states_stack = []
@@ -23,18 +18,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,29 +40,33 @@ 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
current_state.exit()
if state_name == "previous":
states_stack.pop_front()
else:
states_stack[0] = states_map[state_name]
current_state = states_stack[0]
emit_signal("state_changed", current_state)
if state_name != "previous":
current_state.enter()

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 == true:
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

@@ -2,15 +2,15 @@
importer="texture"
type="StreamTexture"
path="res://.import/experiment.hdr-9c87b674db59b87ae6c71d507945718a.stex"
path="res://.import/PaintTools.png-636e86a6d210b52282c946752bbcc6f1.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://experiment.hdr"
dest_files=[ "res://.import/experiment.hdr-9c87b674db59b87ae6c71d507945718a.stex" ]
source_file="res://PaintTools.png"
dest_files=[ "res://.import/PaintTools.png-636e86a6d210b52282c946752bbcc6f1.stex" ]
[params]

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

@@ -0,0 +1,222 @@
[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
__meta__ = {
"_edit_use_anchors_": false
}
[node name="DrawingAreaBG" type="Panel" parent="."]
margin_left = 350.0
margin_right = 1280.0
margin_bottom = 720.0
custom_styles/panel = SubResource( 1 )
[node name="PaintControl" type="Control" parent="."]
margin_right = 40.0
margin_bottom = 40.0
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[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"]
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"]
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/"

13
2d/gd_paint/README.md Normal file
View File

@@ -0,0 +1,13 @@
# GD Paint
GD Paint is a simple image editor made using Godot and GDScript.
It supports different types of "brushes": a basic pen/pencil
and eraser, as well as a rectangle and a circle brush.
Language: GDScript
Renderer: GLES 2
## Screenshots
![Screenshot](screenshots/gdpaint.png)

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

@@ -7,8 +7,8 @@ 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

@@ -15,15 +15,25 @@ _global_script_class_icons={
[application]
config/name="DodgeTheCreepsCS"
run/main_scene="res://Main.tscn"
config/name="GD Paint"
config/description="GD Paint is a simple image editor made using Godot and GDScript.
It supports different types of 'brushes': a basic pen/pencil
and eraser, as well as a rectangle and a circle brush."
run/main_scene="res://Paint_root.tscn"
config/icon="res://icon.png"
[display]
window/size/width=480
window/size/width=1280
window/size/height=720
window/stretch/mode="2d"
window/stretch/aspect="keep"
[gdnative]
singletons=[ ]
[rendering]
quality/driver/driver_name="GLES2"
environment/default_environment="res://default_env.tres"

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@@ -1,56 +0,0 @@
[gd_scene load_steps=8 format=2]
[ext_resource path="res://tilesets/grid_lines/grid_lines_tileset.tres" type="TileSet" id=1]
[ext_resource path="res://tilesets/grid/grid_tileset.tres" type="TileSet" id=2]
[ext_resource path="res://grid/grid.gd" type="Script" id=3]
[ext_resource path="res://pawns/Actor.tscn" type="PackedScene" id=4]
[ext_resource path="res://pawns/pawn.gd" type="Script" id=5]
[ext_resource path="res://pawns/sprites/character_grey.png" type="Texture" id=6]
[ext_resource path="res://pawns/sprites/star.png" type="Texture" id=7]
[node name="Game" type="Node"]
[node name="GridLines" type="TileMap" parent="."]
modulate = Color( 1, 1, 1, 0.271059 )
z_index = -1
z_as_relative = false
tile_set = ExtResource( 1 )
format = 1
tile_data = PoolIntArray( 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 0, 13, 0, 0, 14, 0, 0, 15, 0, 0, 16, 0, 0, 65536, 0, 0, 65537, 0, 0, 65538, 0, 0, 65539, 0, 0, 65540, 0, 0, 65541, 0, 0, 65542, 0, 0, 65543, 0, 0, 65544, 0, 0, 65545, 0, 0, 65546, 0, 0, 65547, 0, 0, 65548, 0, 0, 65549, 0, 0, 65550, 0, 0, 65551, 0, 0, 65552, 0, 0, 131072, 0, 0, 131073, 0, 0, 131074, 0, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 0, 0, 131086, 0, 0, 131087, 0, 0, 131088, 0, 0, 196608, 0, 0, 196609, 0, 0, 196610, 0, 0, 196611, 0, 0, 196612, 0, 0, 196613, 0, 0, 196614, 0, 0, 196615, 0, 0, 196616, 0, 0, 196617, 0, 0, 196618, 0, 0, 196619, 0, 0, 196620, 0, 0, 196621, 0, 0, 196622, 0, 0, 196623, 0, 0, 196624, 0, 0, 262144, 0, 0, 262145, 0, 0, 262146, 0, 0, 262147, 0, 0, 262148, 0, 0, 262149, 0, 0, 262150, 0, 0, 262151, 0, 0, 262152, 0, 0, 262153, 0, 0, 262154, 0, 0, 262155, 0, 0, 262156, 0, 0, 262157, 0, 0, 262158, 0, 0, 262159, 0, 0, 262160, 0, 0, 327680, 0, 0, 327681, 0, 0, 327682, 0, 0, 327683, 0, 0, 327684, 0, 0, 327685, 0, 0, 327686, 0, 0, 327687, 0, 0, 327688, 0, 0, 327689, 0, 0, 327690, 0, 0, 327691, 0, 0, 327692, 0, 0, 327693, 0, 0, 327694, 0, 0, 327695, 0, 0, 327696, 0, 0, 393216, 0, 0, 393217, 0, 0, 393218, 0, 0, 393219, 0, 0, 393220, 0, 0, 393221, 0, 0, 393222, 0, 0, 393223, 0, 0, 393224, 0, 0, 393225, 0, 0, 393226, 0, 0, 393227, 0, 0, 393228, 0, 0, 393229, 0, 0, 393230, 0, 0, 393231, 0, 0, 393232, 0, 0, 458752, 0, 0, 458753, 0, 0, 458754, 0, 0, 458755, 0, 0, 458756, 0, 0, 458757, 0, 0, 458758, 0, 0, 458759, 0, 0, 458760, 0, 0, 458761, 0, 0, 458762, 0, 0, 458763, 0, 0, 458764, 0, 0, 458765, 0, 0, 458766, 0, 0, 458767, 0, 0, 458768, 0, 0, 524288, 0, 0, 524289, 0, 0, 524290, 0, 0, 524291, 0, 0, 524292, 0, 0, 524293, 0, 0, 524294, 0, 0, 524295, 0, 0, 524296, 0, 0, 524297, 0, 0, 524298, 0, 0, 524299, 0, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 0, 0, 589829, 0, 0, 589830, 0, 0, 589831, 0, 0, 589832, 0, 0, 589833, 0, 0, 589834, 0, 0, 589835, 0, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0 )
__meta__ = {
"_edit_lock_": true
}
[node name="Grid" type="TileMap" parent="."]
tile_set = ExtResource( 2 )
format = 1
tile_data = PoolIntArray( 18, 1, 0, 19, 1, 0, 65554, 1, 0, 65555, 1, 0, 131090, 1, 0, 131091, 1, 0, 196615, 1, 0, 196616, 1, 0, 196617, 1, 0, 196626, 1, 0, 196627, 1, 0, 262151, 1, 0, 262162, 1, 0, 262163, 1, 0, 327687, 1, 0, 327688, 1, 0, 327689, 1, 0, 327698, 1, 0, 327699, 1, 0, 393234, 1, 0, 393235, 1, 0, 458753, 1, 0, 458754, 1, 0, 458770, 1, 0, 458771, 1, 0, 524289, 1, 0, 524290, 1, 0, 524306, 1, 0, 524307, 1, 0, 589825, 1, 0, 589826, 1, 0, 589827, 1, 0, 589828, 1, 0, 589829, 1, 0, 589830, 1, 0, 589831, 1, 0, 589842, 1, 0, 589843, 1, 0, 655360, 1, 0, 655361, 1, 0, 655362, 1, 0, 655363, 1, 0, 655364, 1, 0, 655365, 1, 0, 655366, 1, 0, 655367, 1, 0, 655368, 1, 0, 655369, 1, 0, 655370, 1, 0, 655371, 1, 0, 655372, 1, 0, 655373, 1, 0, 655374, 1, 0, 655375, 1, 0, 655376, 1, 0, 655377, 1, 0, 655378, 1, 0, 655379, 1, 0, 720896, 1, 0, 720897, 1, 0, 720898, 1, 0, 720899, 1, 0, 720900, 1, 0, 720901, 1, 0, 720902, 1, 0, 720903, 1, 0, 720904, 1, 0, 720905, 1, 0, 720906, 1, 0, 720907, 1, 0, 720908, 1, 0, 720909, 1, 0, 720910, 1, 0, 720911, 1, 0, 720912, 1, 0, 720913, 1, 0, 720914, 1, 0, 720915, 1, 0 )
script = ExtResource( 3 )
__meta__ = {
"_edit_lock_": true
}
[node name="Actor" parent="Grid" instance=ExtResource( 4 )]
editor/display_folded = true
position = Vector2( 416, 288 )
[node name="Actor2" type="Node2D" parent="Grid"]
editor/display_folded = true
position = Vector2( 480, 480 )
z_index = 1
script = ExtResource( 5 )
[node name="Sprite" type="Sprite" parent="Grid/Actor2"]
texture = ExtResource( 6 )
[node name="Object" type="Node2D" parent="Grid"]
editor/display_folded = true
position = Vector2( 544, 288 )
script = ExtResource( 5 )
type = 2
[node name="Sprite" type="Sprite" parent="Grid/Object"]
texture = ExtResource( 7 )
[editable path="Grid/Actor"]

View File

@@ -1,36 +0,0 @@
extends TileMap
enum CellType { EMPTY = -1, ACTOR, OBSTACLE, OBJECT}
func _ready():
for child in get_children():
set_cellv(world_to_map(child.position), child.type)
func get_cell_pawn(coordinates):
for node in get_children():
if world_to_map(node.position) == coordinates:
return(node)
func request_move(pawn, direction):
var cell_start = world_to_map(pawn.position)
var cell_target = cell_start + direction
var cell_target_type = get_cellv(cell_target)
match cell_target_type:
CellType.EMPTY:
return update_pawn_position(pawn, cell_start, cell_target)
CellType.OBJECT:
var object_pawn = get_cell_pawn(cell_target)
object_pawn.queue_free()
return update_pawn_position(pawn, cell_start, cell_target)
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, CellType.EMPTY)
return map_to_world(cell_target) + cell_size / 2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,85 +0,0 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://pawns/actor.gd" type="Script" id=1]
[ext_resource path="res://pawns/sprites/character.png" type="Texture" id=2]
[sub_resource type="Animation" id=1]
resource_name = "bump"
length = 0.1
step = 0.01
tracks/0/type = "value"
tracks/0/path = NodePath("Pivot/Sprite:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.02, 0.04, 0.06, 0.08, 0.1 ),
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ),
"update": 0,
"values": [ Vector2( 0, 0 ), Vector2( -1.5, -9 ), Vector2( 6.5, 2.5 ), Vector2( -11.5, 8.5 ), Vector2( 4, -5 ), Vector2( 0, 0 ) ]
}
[sub_resource type="Animation" id=2]
resource_name = "walk"
length = 0.25
step = 0.05
tracks/0/type = "value"
tracks/0/path = NodePath("Pivot/Sprite:self_modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = false
tracks/0/keys = {
"times": PoolRealArray( 0, 0.1, 0.25 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 0.9375, 0, 1 ), Color( 1, 1, 1, 1 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("Pivot/Sprite:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.1, 0.15, 0.25 ),
"transitions": PoolRealArray( 1, 0.303143, 2.61003, 1 ),
"update": 0,
"values": [ Vector2( 1.43051e-06, -1.90735e-06 ), Vector2( 1.43051e-06, -1.90735e-06 ), Vector2( 0, -20 ), Vector2( 1.43051e-06, -1.90735e-06 ) ]
}
tracks/2/type = "value"
tracks/2/path = NodePath("Pivot/Sprite:scale")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/keys = {
"times": PoolRealArray( 0, 0.05, 0.15, 0.25 ),
"transitions": PoolRealArray( 1, 0.354553, 1, 1 ),
"update": 0,
"values": [ Vector2( 1, 1 ), Vector2( 1.20007, 0.917384 ), Vector2( 0.916712, 1.13495 ), Vector2( 1, 1 ) ]
}
[node name="Actor" type="Node2D"]
position = Vector2( 32, 32 )
z_index = 1
script = ExtResource( 1 )
__meta__ = {
"_edit_group_": true
}
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
anims/bump = SubResource( 1 )
anims/walk = SubResource( 2 )
[node name="Tween" type="Tween" parent="."]
[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 )

View File

@@ -1,55 +0,0 @@
extends "pawn.gd"
onready var Grid = get_parent()
func _ready():
update_look_direction(Vector2(1, 0))
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)
if target_position:
move_to(target_position)
else:
bump()
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"))
)
func update_look_direction(direction):
$Pivot/Sprite.rotation = direction.angle()
func move_to(target_position):
set_process(false)
$AnimationPlayer.play("walk")
# Move the node to the target cell instantly,
# and animate the sprite moving from the start to the target cell
var move_direction = (target_position - position).normalized()
$Tween.interpolate_property($Pivot, "position", - move_direction * 32, Vector2(), $AnimationPlayer.current_animation_length, Tween.TRANS_LINEAR, Tween.EASE_IN)
position = target_position
$Tween.start()
# Stop the function execution until the animation finished
yield($AnimationPlayer, "animation_finished")
set_process(true)
func bump():
set_process(false)
$AnimationPlayer.play("bump")
yield($AnimationPlayer, "animation_finished")
set_process(true)

View File

@@ -1,4 +0,0 @@
extends Node2D
enum CellType { ACTOR, OBSTACLE, OBJECT }
export(CellType) var type = CellType.ACTOR

Binary file not shown.

Before

Width:  |  Height:  |  Size: 899 B

View File

@@ -1,31 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/character.png-98ed16816c5b464731c4fa68fe5b8613.stex"
[deps]
source_file="res://pawns/sprites/character.png"
dest_files=[ "res://.import/character.png-98ed16816c5b464731c4fa68fe5b8613.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 787 B

View File

@@ -1,31 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/character_grey.png-a95d64c2e947e85f04dd1c6474e46965.stex"
[deps]
source_file="res://pawns/sprites/character_grey.png"
dest_files=[ "res://.import/character_grey.png-a95d64c2e947e85f04dd1c6474e46965.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,31 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/star.png-4f164f82cf41ace82182660f1be8e68d.stex"
[deps]
source_file="res://pawns/sprites/star.png"
dest_files=[ "res://.import/star.png-4f164f82cf41ace82182660f1be8e68d.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

View File

@@ -1,20 +0,0 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://tilesets/grid/actor.png" type="Texture" id=1]
[ext_resource path="res://tilesets/grid/obstacle.png" type="Texture" id=2]
[ext_resource path="res://tilesets/grid/object.png" type="Texture" id=3]
[node name="Node2D" type="Node2D"]
[node name="Actor" type="Sprite" parent="."]
position = Vector2( 32, 32 )
texture = ExtResource( 1 )
[node name="Obstacle" type="Sprite" parent="."]
position = Vector2( 96, 32 )
texture = ExtResource( 2 )
[node name="Object" type="Sprite" parent="."]
position = Vector2( 160, 32 )
texture = ExtResource( 3 )

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,31 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/actor.png-6a88af8a7bcb079732153877dfb0db8b.stex"
[deps]
source_file="res://tilesets/grid/actor.png"
dest_files=[ "res://.import/actor.png-6a88af8a7bcb079732153877dfb0db8b.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

View File

@@ -1,37 +0,0 @@
[gd_resource type="TileSet" load_steps=4 format=2]
[ext_resource path="res://tilesets/grid/actor.png" type="Texture" id=1]
[ext_resource path="res://tilesets/grid/obstacle.png" type="Texture" id=2]
[ext_resource path="res://tilesets/grid/object.png" type="Texture" id=3]
[resource]
0/name = "Actor"
0/texture = ExtResource( 1 )
0/tex_offset = Vector2( 0, 0 )
0/modulate = Color( 1, 1, 1, 1 )
0/region = Rect2( 0, 0, 64, 64 )
0/is_autotile = false
0/occluder_offset = Vector2( 32, 32 )
0/navigation_offset = Vector2( 32, 32 )
0/shapes = [ ]
1/name = "Obstacle"
1/texture = ExtResource( 2 )
1/tex_offset = Vector2( 0, 0 )
1/modulate = Color( 1, 1, 1, 1 )
1/region = Rect2( 0, 0, 64, 64 )
1/is_autotile = false
1/occluder_offset = Vector2( 32, 32 )
1/navigation_offset = Vector2( 32, 32 )
1/shapes = [ ]
2/name = "Object"
2/texture = ExtResource( 3 )
2/tex_offset = Vector2( 0, 0 )
2/modulate = Color( 1, 1, 1, 1 )
2/region = Rect2( 0, 0, 64, 64 )
2/is_autotile = false
2/occluder_offset = Vector2( 32, 32 )
2/navigation_offset = Vector2( 32, 32 )
2/shapes = [ ]
_sections_unfolded = [ "0", "1" ]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,31 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/object.png-3e89ebfb3424e8759914732b2b0130c1.stex"
[deps]
source_file="res://tilesets/grid/object.png"
dest_files=[ "res://.import/object.png-3e89ebfb3424e8759914732b2b0130c1.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 522 B

View File

@@ -1,31 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/obstacle.png-9f01dd1d06d7b99515918b65b46bd6c1.stex"
[deps]
source_file="res://tilesets/grid/obstacle.png"
dest_files=[ "res://.import/obstacle.png-9f01dd1d06d7b99515918b65b46bd6c1.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

View File

@@ -1,10 +0,0 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://tilesets/grid_lines/grid_lines.png" type="Texture" id=1]
[node name="TileSet" type="Node2D"]
[node name="Grass" type="Sprite" parent="."]
position = Vector2( 32, 32 )
texture = ExtResource( 1 )

Binary file not shown.

Before

Width:  |  Height:  |  Size: 530 B

View File

@@ -1,31 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/grid_lines.png-beef853b47aa830c8383e5f6cc4d03ce.stex"
[deps]
source_file="res://tilesets/grid_lines/grid_lines.png"
dest_files=[ "res://.import/grid_lines.png-beef853b47aa830c8383e5f6cc4d03ce.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

View File

@@ -1,16 +0,0 @@
[gd_resource type="TileSet" load_steps=2 format=2]
[ext_resource path="res://tilesets/grid_lines/grid_lines.png" type="Texture" id=1]
[resource]
0/name = "Grass"
0/texture = ExtResource( 1 )
0/tex_offset = Vector2( 0, 0 )
0/modulate = Color( 1, 1, 1, 1 )
0/region = Rect2( 0, 0, 64, 64 )
0/is_autotile = false
0/occluder_offset = Vector2( 32, 32 )
0/navigation_offset = Vector2( 32, 32 )
0/shapes = [ ]

16
2d/hdr/README.md Normal file
View File

@@ -0,0 +1,16 @@
# HDR for 2D
Simple demo how to use High Dynamic Range (HDR) in a 2D game,
via the WorldEnvironment node.
Just slide the cave image left and right to observe the HDR effect at work.
Language: GDScript
Renderer: GLES 3 (HDR is not available in GLES 2)
## Screenshots
![Screenshot](screenshots/left.png)
![Screenshot](screenshots/right.png)

View File

@@ -1,17 +1,16 @@
extends Node2D
# Member variables
const CAVE_LIMIT = 1000
onready var cave = $Cave
func _input(event):
if event is InputEventMouseMotion and event.button_mask&1:
if event is InputEventMouseMotion and event.button_mask > 0:
var rel_x = event.relative.x
var cavepos = $cave.position
var cavepos = cave.position
cavepos.x += rel_x
if cavepos.x < -CAVE_LIMIT:
cavepos.x = -CAVE_LIMIT
elif cavepos.x > 0:
cavepos.x = 0
$cave.position = cavepos
cave.position = cavepos

View File

@@ -19,29 +19,38 @@ glow_strength = 0.88
glow_blend_mode = 0
glow_bicubic_upscale = true
[node name="hdr" type="Node2D"]
[node name="BeachCave" type="Node2D"]
script = ExtResource( 1 )
[node name="beach" type="Sprite" parent="."]
[node name="Beach" type="Sprite" parent="."]
modulate = Color( 2, 2, 2, 1 )
self_modulate = Color( 2, 2, 2, 1 )
texture = ExtResource( 2 )
centered = false
region_enabled = true
region_rect = Rect2( 0, 0, 3840, 720 )
[node name="cave" type="Sprite" parent="."]
[node name="Cave" type="Sprite" parent="."]
self_modulate = Color( 0.233166, 0.221219, 0.23582, 1 )
scale = Vector2( 1.2, 1 )
texture = ExtResource( 3 )
centered = false
[node name="environment" type="WorldEnvironment" parent="."]
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource( 1 )
[node name="Camera2D" type="Camera2D" parent="."]
offset = Vector2( 540, 360 )
current = true
[node name="Label" type="Label" parent="."]
margin_right = 40.0
margin_bottom = 13.0
margin_left = 10.0
margin_top = 10.0
margin_right = 135.0
margin_bottom = 24.0
size_flags_horizontal = 2
size_flags_vertical = 0
custom_colors/font_color = Color( 0.213955, 0.205626, 0.20313, 1 )
text = "Drag Left and Right"
text = "Drag Left and Right"
__meta__ = {
"_edit_use_anchors_": false
}

View File

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

View File

@@ -3,6 +3,9 @@
importer="texture"
type="StreamTexture"
path="res://.import/ocean_beach.png-b571ab5468cc775a520aaa47efbed607.stex"
metadata={
"vram_texture": false
}
[deps]
@@ -16,7 +19,7 @@ compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/repeat=2
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false

View File

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

View File

@@ -16,6 +16,10 @@ _global_script_class_icons={
[application]
config/name="HDR for 2D"
config/description="Simple demo how to use High Dynamic Range (HDR) in a 2D game,
via the WorldEnvironment node.
Just slide the cave image left and right to observe the HDR effect at work."
run/main_scene="res://beach_cave.tscn"
config/icon="res://icon.png"
run/name=""
@@ -24,6 +28,8 @@ run/name=""
window/size/width=1080
window/size/height=720
window/stretch/mode="2d"
window/stretch/aspect="expand"
[gdnative]
@@ -32,3 +38,7 @@ singletons=[ ]
[rasterizer]
blur_buffer_size=128
[rendering]
environment/default_clear_color=Color( 0.05, 0.0453, 0.0265, 1 )

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