Compare commits
7 Commits
3.2-8d9d58
...
3.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea5b868fc7 | ||
|
|
a6ae6f64be | ||
|
|
507b8c6cf6 | ||
|
|
e59d96ef7a | ||
|
|
19584aae6a | ||
|
|
342f27e327 | ||
|
|
4d10544dd9 |
6
.editorconfig
Normal file
@@ -0,0 +1,6 @@
|
||||
# Top-most EditorConfig file.
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Normalize EOL for all files that Git considers text files.
|
||||
* text=auto eol=lf
|
||||
6
.github/CODEOWNERS
vendored
@@ -1,6 +0,0 @@
|
||||
# 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
|
||||
18
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<!-- Please search existing issues for potential duplicates before filing yours:
|
||||
https://github.com/godotengine/godot-demo-projects/issues?q=is%3Aissue
|
||||
-->
|
||||
|
||||
**Which demo project is affected:**
|
||||
<!-- Specify the project name or path. -->
|
||||
|
||||
|
||||
**OS/device including version:**
|
||||
<!-- Specify GPU model and drivers if graphics-related. -->
|
||||
|
||||
|
||||
**Issue description:**
|
||||
<!-- What happened, and what was expected. -->
|
||||
|
||||
|
||||
**Screenshots of issue:**
|
||||
<!-- Drag in an image, or link in the form of "![]()". If not relevant, remove this section. -->
|
||||
34
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -1,34 +0,0 @@
|
||||
---
|
||||
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:
|
||||

|
||||
-->
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
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
@@ -1,24 +0,0 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
15
.github/workflows/ci.yml
vendored
@@ -1,15 +0,0 @@
|
||||
name: Continuous integration
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Lint demo projects
|
||||
run: |
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -qq dos2unix recode
|
||||
bash ./format.sh
|
||||
19
.github/workflows/static_checks.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
name: Static Checks
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
format:
|
||||
name: File formatting (file_format.sh)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -qq dos2unix recode
|
||||
|
||||
- name: File formatting checks (file_format.sh)
|
||||
run: |
|
||||
bash ./file_format.sh
|
||||
5
.gitignore
vendored
@@ -1,8 +1,12 @@
|
||||
# Godot 4+ specific ignores
|
||||
.godot/
|
||||
|
||||
# Godot-specific ignores
|
||||
.import/
|
||||
export.cfg
|
||||
export_presets.cfg
|
||||
# Dummy HTML5 export presets file for continuous integration
|
||||
!.github/dist/export_presets.cfg
|
||||
|
||||
# Imported translations (automatically generated from CSV files)
|
||||
*.translation
|
||||
@@ -14,4 +18,5 @@ mono_crash.*.json
|
||||
|
||||
# System/tool-specific ignores
|
||||
.directory
|
||||
.DS_Store
|
||||
*~
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
# 2D Demos
|
||||
|
||||
These demos are all 2D, but otherwise do not have a common theme.
|
||||
|
||||
Languages: Most have GDScript, some have
|
||||
[GDSL](https://docs.godotengine.org/en/latest/tutorials/shading/shading_reference/shading_language.html)
|
||||
|
||||
Renderers: 6 of them are GLES 3, but most are GLES 2
|
||||
@@ -13,7 +13,7 @@ func show_game_over():
|
||||
yield($MessageTimer, "timeout")
|
||||
$MessageLabel.text = "Dodge the\nCreeps"
|
||||
$MessageLabel.show()
|
||||
yield(get_tree().create_timer(1), "timeout")
|
||||
yield(get_tree().create_timer(1), 'timeout')
|
||||
$StartButton.show()
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
extends Node
|
||||
|
||||
export(PackedScene) var Mob
|
||||
export (PackedScene) var Mob
|
||||
var score
|
||||
|
||||
func _ready():
|
||||
@@ -28,13 +28,11 @@ func _on_MobTimer_timeout():
|
||||
$MobPath/MobSpawnLocation.offset = randi()
|
||||
var mob = Mob.instance()
|
||||
add_child(mob)
|
||||
var direction = $MobPath/MobSpawnLocation.rotation + TAU / 4
|
||||
var direction = $MobPath/MobSpawnLocation.rotation + PI / 2
|
||||
mob.position = $MobPath/MobSpawnLocation.position
|
||||
direction += rand_range(-TAU / 8, TAU / 8)
|
||||
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)
|
||||
# warning-ignore:return_value_discarded
|
||||
$HUD.connect("start_game", mob, "_on_start_game")
|
||||
|
||||
|
||||
func _on_ScoreTimer_timeout():
|
||||
|
||||
@@ -11,7 +11,3 @@ func _ready():
|
||||
|
||||
func _on_VisibilityNotifier2D_screen_exited():
|
||||
queue_free()
|
||||
|
||||
|
||||
func _on_start_game():
|
||||
queue_free()
|
||||
|
||||
@@ -14,7 +14,7 @@ func _process(delta):
|
||||
var velocity = Vector2()
|
||||
velocity.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
|
||||
velocity.y = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
|
||||
|
||||
|
||||
if velocity.length() > 0:
|
||||
velocity = velocity.normalized() * speed
|
||||
$AnimatedSprite.play()
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# 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
|
||||
|
||||

|
||||
|
||||
## Copying
|
||||
|
||||
`art/House In a Forest Loop.ogg` Copyright © 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". Created in 2016 by 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 © 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`.
|
||||
2
2d/dodge_the_creeps/attributions.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
"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/
|
||||
@@ -10,18 +10,11 @@ config_version=4
|
||||
|
||||
_global_script_classes=[ ]
|
||||
_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"
|
||||
|
||||
@@ -64,3 +57,7 @@ move_down={
|
||||
, 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"
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
# 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
|
||||
|
||||

|
||||
@@ -7,8 +7,8 @@ func _process(_delta):
|
||||
var numbers = ""
|
||||
var index = 0
|
||||
for state in fsm_node.states_stack:
|
||||
states_names += state.get_name() + "\n"
|
||||
numbers += str(index) + "\n"
|
||||
states_names += state.get_name() + '\n'
|
||||
numbers += str(index) + '\n'
|
||||
index += 1
|
||||
$States.text = states_names
|
||||
$Numbers.text = numbers
|
||||
|
||||
13
2d/finite_state_machine/default_env.tres
Normal file
@@ -0,0 +1,13 @@
|
||||
[gd_resource type="Environment" load_steps=2 format=2]
|
||||
|
||||
[sub_resource type="ProceduralSky" id=1]
|
||||
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
|
||||
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
|
||||
sky_curve = 0.25
|
||||
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
|
||||
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
|
||||
ground_curve = 0.01
|
||||
|
||||
[resource]
|
||||
background_mode = 2
|
||||
background_sky = SubResource( 1 )
|
||||
@@ -115,7 +115,7 @@ align = 1
|
||||
valign = 1
|
||||
uppercase = true
|
||||
script = ExtResource( 15 )
|
||||
[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="state_changed" from="StateMachine" to="StateNameDisplayer" method="_on_StateMachine_state_changed"]
|
||||
[connection signal="animation_finished" from="AnimationPlayer" to="StateMachine" method="_on_animation_finished"]
|
||||
[connection signal="attack_finished" from="BodyPivot/WeaponPivot/Offset/Sword" to="StateMachine/Attack" method="_on_Sword_attack_finished"]
|
||||
|
||||
@@ -3,14 +3,12 @@ extends KinematicBody2D
|
||||
var direction = Vector2()
|
||||
export(float) var speed = 1000.0
|
||||
|
||||
onready var root = get_tree().root
|
||||
|
||||
func _ready():
|
||||
set_as_toplevel(true)
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
if not root.get_visible_rect().has_point(position):
|
||||
if is_outside_view_bounds():
|
||||
queue_free()
|
||||
|
||||
var motion = direction * speed * delta
|
||||
@@ -19,5 +17,10 @@ func _physics_process(delta):
|
||||
queue_free()
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
func _draw():
|
||||
draw_circle(Vector2(), $CollisionShape2D.shape.radius, Color.white)
|
||||
|
||||
@@ -2,7 +2,7 @@ extends Node2D
|
||||
|
||||
var bullet = preload("Bullet.tscn")
|
||||
|
||||
func _unhandled_input(event):
|
||||
func _input(event):
|
||||
if event.is_action_pressed("fire"):
|
||||
fire(owner.look_direction)
|
||||
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
extends "res://state_machine/state_machine.gd"
|
||||
|
||||
onready var idle = $Idle
|
||||
onready var move = $Move
|
||||
onready var jump = $Jump
|
||||
onready var stagger = $Stagger
|
||||
onready var attack = $Attack
|
||||
|
||||
func _ready():
|
||||
states_map = {
|
||||
"idle": idle,
|
||||
"move": move,
|
||||
"jump": jump,
|
||||
"stagger": stagger,
|
||||
"attack": attack,
|
||||
"idle": $Idle,
|
||||
"move": $Move,
|
||||
"jump": $Jump,
|
||||
"stagger": $Stagger,
|
||||
"attack": $Attack,
|
||||
}
|
||||
|
||||
|
||||
@@ -22,16 +16,16 @@ func _change_state(state_name):
|
||||
return
|
||||
if state_name in ["stagger", "jump", "attack"]:
|
||||
states_stack.push_front(states_map[state_name])
|
||||
if state_name == "jump" and current_state == move:
|
||||
jump.initialize(move.speed, move.velocity)
|
||||
if state_name == "jump" and current_state == $Move:
|
||||
$Jump.initialize($Move.speed, $Move.velocity)
|
||||
._change_state(state_name)
|
||||
|
||||
|
||||
func _unhandled_input(event):
|
||||
func _input(event):
|
||||
# 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]:
|
||||
if current_state in [$Attack, $Stagger]:
|
||||
return
|
||||
_change_state("attack")
|
||||
return
|
||||
|
||||
@@ -22,7 +22,6 @@ func initialize(speed, velocity):
|
||||
max_horizontal_speed = speed if speed > 0.0 else base_max_horizontal_speed
|
||||
enter_velocity = velocity
|
||||
|
||||
|
||||
func enter():
|
||||
var input_direction = get_input_direction()
|
||||
update_look_direction(input_direction)
|
||||
@@ -32,7 +31,6 @@ func enter():
|
||||
|
||||
owner.get_node("AnimationPlayer").play("idle")
|
||||
|
||||
|
||||
func update(delta):
|
||||
var input_direction = get_input_direction()
|
||||
update_look_direction(input_direction)
|
||||
@@ -42,7 +40,6 @@ func update(delta):
|
||||
if height <= 0.0:
|
||||
emit_signal("finished", "previous")
|
||||
|
||||
|
||||
func move_horizontally(delta, direction):
|
||||
if direction:
|
||||
horizontal_speed += air_acceleration * delta
|
||||
@@ -56,7 +53,6 @@ func move_horizontally(delta, direction):
|
||||
|
||||
owner.move_and_slide(horizontal_velocity)
|
||||
|
||||
|
||||
func animate_jump_height(delta):
|
||||
vertical_speed -= gravity * delta
|
||||
height += vertical_speed * delta
|
||||
|
||||
@@ -7,10 +7,9 @@ func handle_input(event):
|
||||
|
||||
|
||||
func get_input_direction():
|
||||
var input_direction = Vector2(
|
||||
Input.get_action_strength("move_right") - Input.get_action_strength("move_left"),
|
||||
Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
|
||||
)
|
||||
var input_direction = Vector2()
|
||||
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
|
||||
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ func _change_state(new_state):
|
||||
state = new_state
|
||||
|
||||
|
||||
func _unhandled_input(event):
|
||||
func _input(event):
|
||||
if not state == States.ATTACK:
|
||||
return
|
||||
if attack_input_state != AttackInputStates.LISTENING:
|
||||
|
||||
@@ -10,15 +10,11 @@ config_version=4
|
||||
|
||||
_global_script_classes=[ ]
|
||||
_global_script_class_icons={
|
||||
|
||||
}
|
||||
|
||||
[application]
|
||||
|
||||
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."
|
||||
config/name="Hierarchical Finite State Machine example"
|
||||
run/main_scene="res://Demo.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
@@ -100,4 +96,4 @@ attack={
|
||||
|
||||
[rendering]
|
||||
|
||||
quality/driver/driver_name="GLES2"
|
||||
environment/default_environment="res://default_env.tres"
|
||||
|
||||
|
Before Width: | Height: | Size: 31 KiB |
@@ -7,9 +7,10 @@ extends Node
|
||||
|
||||
signal state_changed(current_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.
|
||||
# You must set a starting node from the inspector or on
|
||||
# the node that inherits from this state machine interface.
|
||||
# If you don't the game will crash (on purpose, so you won't
|
||||
# forget to initialize the state machine).
|
||||
export(NodePath) var start_state
|
||||
var states_map = {}
|
||||
|
||||
@@ -21,9 +22,7 @@ func _ready():
|
||||
if not start_state:
|
||||
start_state = get_child(0).get_path()
|
||||
for child in get_children():
|
||||
var err = child.connect("finished", self, "_change_state")
|
||||
if err:
|
||||
printerr(err)
|
||||
child.connect("finished", self, "_change_state")
|
||||
initialize(start_state)
|
||||
|
||||
|
||||
@@ -43,7 +42,7 @@ func set_active(value):
|
||||
current_state = null
|
||||
|
||||
|
||||
func _unhandled_input(event):
|
||||
func _input(event):
|
||||
current_state.handle_input(event)
|
||||
|
||||
|
||||
|
||||
@@ -51,20 +51,20 @@ func _ready():
|
||||
|
||||
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:
|
||||
@@ -77,11 +77,11 @@ func _process(_delta):
|
||||
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
|
||||
@@ -94,7 +94,7 @@ func _process(_delta):
|
||||
# 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
|
||||
|
||||
@@ -108,7 +108,7 @@ func check_if_mouse_is_inside_canvas():
|
||||
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:
|
||||
if is_mouse_in_drawing_area:
|
||||
return true
|
||||
return false
|
||||
|
||||
@@ -117,17 +117,17 @@ 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.
|
||||
@@ -136,7 +136,7 @@ func undo_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
|
||||
|
||||
@@ -147,7 +147,7 @@ func undo_stroke():
|
||||
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
|
||||
@@ -155,13 +155,13 @@ func add_brush(mouse_pos, type):
|
||||
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
|
||||
@@ -169,7 +169,7 @@ func add_brush(mouse_pos, type):
|
||||
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
|
||||
@@ -177,11 +177,11 @@ func add_brush(mouse_pos, type):
|
||||
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.
|
||||
@@ -190,7 +190,7 @@ func add_brush(mouse_pos, type):
|
||||
# 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()
|
||||
@@ -214,7 +214,7 @@ func _draw():
|
||||
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:
|
||||
@@ -232,16 +232,18 @@ func _draw():
|
||||
draw_circle(brush.brush_pos, brush.brush_shape_circle_radius, brush.brush_color)
|
||||
|
||||
|
||||
|
||||
func save_picture(path):
|
||||
# Wait until the frame has finished before getting the texture.
|
||||
yield(VisualServer, "frame_post_draw")
|
||||
|
||||
# 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)
|
||||
|
Before Width: | Height: | Size: 440 B After Width: | Height: | Size: 440 B |
@@ -2,15 +2,15 @@
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/obstacle.png-06287f6b2d26dd03335fd87ab78c2cc2.stex"
|
||||
path="res://.import/PaintTools.png-636e86a6d210b52282c946752bbcc6f1.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://level/obstacle.png"
|
||||
dest_files=[ "res://.import/obstacle.png-06287f6b2d26dd03335fd87ab78c2cc2.stex" ]
|
||||
source_file="res://PaintTools.png"
|
||||
dest_files=[ "res://.import/PaintTools.png-636e86a6d210b52282c946752bbcc6f1.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
[gd_scene load_steps=5 format=2]
|
||||
|
||||
[ext_resource path="res://paint_control.gd" type="Script" id=1]
|
||||
[ext_resource path="res://tools_panel.gd" type="Script" id=2]
|
||||
[ext_resource path="res://paint_tools.png" type="Texture" id=3]
|
||||
[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 )
|
||||
@@ -10,23 +10,19 @@ 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/panelf = SubResource( 1 )
|
||||
custom_styles/panel = SubResource( 1 )
|
||||
custom_styles/panelnc = SubResource( 1 )
|
||||
|
||||
[node name="PaintControl" type="Control" parent="."]
|
||||
margin_right = 40.0
|
||||
margin_bottom = 40.0
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TLPos" type="Position2D" parent="PaintControl"]
|
||||
position = Vector2( 350, 0 )
|
||||
@@ -141,6 +137,7 @@ text = "Brush shape: Circle"
|
||||
align = 1
|
||||
|
||||
[node name="ButtonShapeBox" type="Button" parent="ToolsPanel/BrushSettings"]
|
||||
editor/display_folded = true
|
||||
margin_left = 100.0
|
||||
margin_top = 100.0
|
||||
margin_right = 160.0
|
||||
@@ -154,6 +151,7 @@ region_enabled = true
|
||||
region_rect = Rect2( 0, 16, 16, 16 )
|
||||
|
||||
[node name="ButtonShapeCircle" type="Button" parent="ToolsPanel/BrushSettings"]
|
||||
editor/display_folded = true
|
||||
margin_left = 190.0
|
||||
margin_top = 100.0
|
||||
margin_right = 250.0
|
||||
@@ -1,13 +0,0 @@
|
||||
# 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
|
||||
|
||||

|
||||
@@ -1,16 +1,20 @@
|
||||
extends Panel
|
||||
|
||||
onready var brush_settings = $BrushSettings
|
||||
onready var label_brush_size = brush_settings.get_node(@"LabelBrushSize")
|
||||
onready var label_brush_shape = brush_settings.get_node(@"LabelBrushShape")
|
||||
onready var label_stats = $LabelStats
|
||||
onready var label_tools = $LabelTools
|
||||
var paint_control
|
||||
|
||||
onready var _parent = get_parent()
|
||||
onready var save_dialog = _parent.get_node(@"SaveFileDialog")
|
||||
onready var paint_control = _parent.get_node(@"PaintControl")
|
||||
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"])
|
||||
@@ -30,7 +34,7 @@ func _ready():
|
||||
$ColorPickerBackground.connect("color_changed", self, "background_color_changed")
|
||||
$BrushSettings/HScrollBarBrushSize.connect("value_changed", self, "brush_size_changed")
|
||||
|
||||
# Assign the "file_selected" signal in SaveFileDialog.
|
||||
# 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.
|
||||
@@ -46,7 +50,7 @@ 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)
|
||||
@@ -80,7 +84,7 @@ func button_pressed(button_name):
|
||||
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
|
||||
14
2d/gd_paint/default_env.tres
Normal file
@@ -0,0 +1,14 @@
|
||||
[gd_resource type="Environment" load_steps=2 format=2]
|
||||
|
||||
[sub_resource type="ProceduralSky" id=1]
|
||||
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
|
||||
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
|
||||
sky_curve = 0.25
|
||||
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
|
||||
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
|
||||
ground_curve = 0.01
|
||||
sun_energy = 16.0
|
||||
|
||||
[resource]
|
||||
background_mode = 2
|
||||
background_sky = SubResource( 1 )
|
||||
@@ -10,16 +10,12 @@ config_version=4
|
||||
|
||||
_global_script_classes=[ ]
|
||||
_global_script_class_icons={
|
||||
|
||||
}
|
||||
|
||||
[application]
|
||||
|
||||
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"
|
||||
run/main_scene="res://Paint_root.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[display]
|
||||
@@ -35,4 +31,4 @@ singletons=[ ]
|
||||
|
||||
[rendering]
|
||||
|
||||
quality/driver/driver_name="GLES2"
|
||||
environment/default_environment="res://default_env.tres"
|
||||
|
||||
|
Before Width: | Height: | Size: 59 KiB |
56
2d/grid_based_movement/Game.tscn
Normal file
13
2d/grid_based_movement/default_env.tres
Normal file
@@ -0,0 +1,13 @@
|
||||
[gd_resource type="Environment" load_steps=2 format=2]
|
||||
|
||||
[sub_resource type="ProceduralSky" id=1]
|
||||
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
|
||||
sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
|
||||
sky_curve = 0.25
|
||||
ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
|
||||
ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
|
||||
ground_curve = 0.01
|
||||
|
||||
[resource]
|
||||
background_mode = 2
|
||||
background_sky = SubResource( 1 )
|
||||
36
2d/grid_based_movement/grid/grid.gd
Normal file
@@ -0,0 +1,36 @@
|
||||
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
|
||||
BIN
2d/grid_based_movement/icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
84
2d/grid_based_movement/pawns/Actor.tscn
Normal file
@@ -0,0 +1,84 @@
|
||||
[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 )
|
||||
55
2d/grid_based_movement/pawns/actor.gd
Normal file
@@ -0,0 +1,55 @@
|
||||
extends "pawn.gd"
|
||||
|
||||
onready var grid = get_parent()
|
||||
|
||||
func _ready():
|
||||
update_look_direction(Vector2.RIGHT)
|
||||
|
||||
|
||||
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(
|
||||
Input.get_action_strength("move_right") - Input.get_action_strength("move_left"),
|
||||
Input.get_action_strength("move_down") - Input.get_action_strength("move_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)
|
||||
5
2d/grid_based_movement/pawns/pawn.gd
Normal file
@@ -0,0 +1,5 @@
|
||||
extends Node2D
|
||||
|
||||
enum CellType { ACTOR, OBSTACLE, OBJECT }
|
||||
#warning-ignore:unused_class_variable
|
||||
export(CellType) var type = CellType.ACTOR
|
||||
BIN
2d/grid_based_movement/pawns/sprites/character.png
Normal file
|
After Width: | Height: | Size: 899 B |
34
2d/grid_based_movement/pawns/sprites/character.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/character.png-98ed16816c5b464731c4fa68fe5b8613.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[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
|
||||
BIN
2d/grid_based_movement/pawns/sprites/character_grey.png
Normal file
|
After Width: | Height: | Size: 787 B |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/character_grey.png-a95d64c2e947e85f04dd1c6474e46965.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://pawns/sprites/character_grey.png"
|
||||
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
|
||||
BIN
2d/grid_based_movement/pawns/sprites/star.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
@@ -2,15 +2,15 @@
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
|
||||
path="res://.import/star.png-4f164f82cf41ace82182660f1be8e68d.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://icon.png"
|
||||
dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
|
||||
source_file="res://pawns/sprites/star.png"
|
||||
dest_files=[ "res://.import/star.png-4f164f82cf41ace82182660f1be8e68d.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
65
2d/grid_based_movement/project.godot
Normal file
@@ -0,0 +1,65 @@
|
||||
; Engine configuration file.
|
||||
; It's best edited using the editor UI and not directly,
|
||||
; since the parameters that go here are not all obvious.
|
||||
;
|
||||
; Format:
|
||||
; [section] ; section goes between []
|
||||
; param=value ; assign values to parameters
|
||||
|
||||
config_version=4
|
||||
|
||||
_global_script_classes=[ ]
|
||||
_global_script_class_icons={
|
||||
}
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Grid Movement"
|
||||
run/main_scene="res://Game.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[display]
|
||||
|
||||
window/size/width=1280
|
||||
window/size/height=720
|
||||
window/stretch/mode="2d"
|
||||
window/stretch/aspect="expand"
|
||||
|
||||
[input]
|
||||
|
||||
move_right={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
|
||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
|
||||
]
|
||||
}
|
||||
move_left={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
|
||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
|
||||
]
|
||||
}
|
||||
move_down={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
|
||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
|
||||
]
|
||||
}
|
||||
move_up={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
|
||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[rendering]
|
||||
|
||||
environment/default_environment="res://default_env.tres"
|
||||
19
2d/grid_based_movement/tilesets/grid/GridTiles.tscn
Normal file
@@ -0,0 +1,19 @@
|
||||
[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 )
|
||||
BIN
2d/grid_based_movement/tilesets/grid/actor.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
@@ -2,15 +2,15 @@
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/godot.png-a942b208c71d1b44958f34d302d011ec.stex"
|
||||
path="res://.import/actor.png-6a88af8a7bcb079732153877dfb0db8b.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/cube/godot.png"
|
||||
dest_files=[ "res://.import/godot.png-a942b208c71d1b44958f34d302d011ec.stex" ]
|
||||
source_file="res://tilesets/grid/actor.png"
|
||||
dest_files=[ "res://.import/actor.png-6a88af8a7bcb079732153877dfb0db8b.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
37
2d/grid_based_movement/tilesets/grid/grid_tileset.tres
Normal file
@@ -0,0 +1,37 @@
|
||||
[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" ]
|
||||
|
||||
BIN
2d/grid_based_movement/tilesets/grid/object.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
@@ -2,15 +2,15 @@
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/player.png-1ad27fc2a62fa126eae918723933dd6f.stex"
|
||||
path="res://.import/object.png-3e89ebfb3424e8759914732b2b0130c1.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://player/player.png"
|
||||
dest_files=[ "res://.import/player.png-1ad27fc2a62fa126eae918723933dd6f.stex" ]
|
||||
source_file="res://tilesets/grid/object.png"
|
||||
dest_files=[ "res://.import/object.png-3e89ebfb3424e8759914732b2b0130c1.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
BIN
2d/grid_based_movement/tilesets/grid/obstacle.png
Normal file
|
After Width: | Height: | Size: 522 B |
@@ -2,15 +2,15 @@
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/princess.png-359cb1d8a4fd115119b22ac7899e2787.stex"
|
||||
path="res://.import/obstacle.png-9f01dd1d06d7b99515918b65b46bd6c1.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://level/princess.png"
|
||||
dest_files=[ "res://.import/princess.png-359cb1d8a4fd115119b22ac7899e2787.stex" ]
|
||||
source_file="res://tilesets/grid/obstacle.png"
|
||||
dest_files=[ "res://.import/obstacle.png-9f01dd1d06d7b99515918b65b46bd6c1.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
[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 )
|
||||
BIN
2d/grid_based_movement/tilesets/grid_lines/grid_lines.png
Normal file
|
After Width: | Height: | Size: 530 B |
@@ -2,15 +2,15 @@
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/long_obstacle.png-d70ee394f796e1de9a423783aa84ec5d.stex"
|
||||
path="res://.import/grid_lines.png-beef853b47aa830c8383e5f6cc4d03ce.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://level/long_obstacle.png"
|
||||
dest_files=[ "res://.import/long_obstacle.png-d70ee394f796e1de9a423783aa84ec5d.stex" ]
|
||||
source_file="res://tilesets/grid_lines/grid_lines.png"
|
||||
dest_files=[ "res://.import/grid_lines.png-beef853b47aa830c8383e5f6cc4d03ce.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
[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 = [ ]
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
# 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
|
||||
|
||||

|
||||
|
||||

|
||||
@@ -4,7 +4,7 @@ const CAVE_LIMIT = 1000
|
||||
|
||||
onready var cave = $Cave
|
||||
|
||||
func _unhandled_input(event):
|
||||
func _input(event):
|
||||
if event is InputEventMouseMotion and event.button_mask > 0:
|
||||
var rel_x = event.relative.x
|
||||
var cavepos = cave.position
|
||||
|
||||
@@ -10,16 +10,11 @@ config_version=4
|
||||
|
||||
_global_script_classes=[ ]
|
||||
_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=""
|
||||
|
||||
|
Before Width: | Height: | Size: 406 KiB |
|
Before Width: | Height: | Size: 192 KiB |
@@ -1,11 +0,0 @@
|
||||
# Hexagonal Game
|
||||
|
||||
Very simple demo showing a hexagonal TileMap and TileSet.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
@@ -10,15 +10,14 @@ config_version=4
|
||||
|
||||
_global_script_classes=[ ]
|
||||
_global_script_class_icons={
|
||||
|
||||
}
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Hexagonal Game"
|
||||
config/description="Very simple demo showing a hexagonal TileMap and TileSet."
|
||||
run/main_scene="res://map.tscn"
|
||||
config/icon="res://icon.png"
|
||||
run/name=""
|
||||
|
||||
[display]
|
||||
|
||||
@@ -66,5 +65,4 @@ move_up={
|
||||
|
||||
[rendering]
|
||||
|
||||
quality/driver/driver_name="GLES2"
|
||||
environment/default_clear_color=Color( 0.172549, 0.219608, 0.129412, 1 )
|
||||
|
||||
|
Before Width: | Height: | Size: 401 KiB |
@@ -1,13 +1,12 @@
|
||||
extends KinematicBody2D
|
||||
|
||||
const MOTION_SPEED = 160 # Pixels/second.
|
||||
const TAN30DEG = tan(deg2rad(30))
|
||||
const MOTION_SPEED = 160 # Pixels/second
|
||||
|
||||
func _physics_process(_delta):
|
||||
var motion = Vector2()
|
||||
motion.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
|
||||
motion.y = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
|
||||
motion.y *= TAN30DEG
|
||||
motion.y *= 0.5
|
||||
motion = motion.normalized() * MOTION_SPEED
|
||||
#warning-ignore:return_value_discarded
|
||||
move_and_slide(motion)
|
||||
|
||||
@@ -9,7 +9,7 @@ radius = 16.0
|
||||
[node name="Troll" type="KinematicBody2D"]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="Sprite2D" type="Sprite" parent="."]
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
# Instancing Demo
|
||||
|
||||
A demo showing how to use scene instancing to
|
||||
make many duplicates of the same object.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

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

|
||||
@@ -10,9 +10,8 @@ mode = 1
|
||||
tile_set = ExtResource( 1 )
|
||||
cell_size = Vector2( 128, 64 )
|
||||
cell_tile_origin = 1
|
||||
centered_textures = true
|
||||
format = 1
|
||||
tile_data = PoolIntArray( -917493, 0, 0, -917492, 0, 0, -917491, 0, 0, -917490, 0, 0, -851957, 0, 0, -851956, 0, 0, -851955, 0, 0, -851954, 0, 0, -786421, 0, 0, -786420, 1, 0, -786419, 0, -1200553578, -786418, 0, 0, -720885, 0, 0, -720884, 0, 0, -720883, 0, -1200553578, -720882, 0, 0, -655349, 0, 0, -655348, 1, 0, -655347, 0, -1200553578, -655346, 0, 0, -589813, 0, 0, -589812, 1, 0, -589811, 0, -1200553578, -589810, 0, 0, -524277, 0, 0, -524276, 0, 0, -524275, 1, -1200553578, -524274, 0, 0, -458747, 0, 0, -458746, 0, 0, -458745, 0, 0, -458744, 0, 0, -458743, 0, 0, -458742, 0, 0, -458741, 0, 0, -458740, 0, 0, -458739, 0, -1200553578, -458738, 0, 0, -393211, 0, 0, -393210, 0, 0, -393209, 0, 0, -393208, 0, 0, -393207, 0, 0, -393206, 0, 0, -393205, 0, 0, -393204, 0, 0, -393203, 0, -1200553578, -393202, 0, 0, -327675, 0, 0, -327674, 0, 0, -327673, 0, -1200553578, -327672, 1, -1200553578, -327671, 1, -1200553578, -327670, 1, 0, -327669, 1, 0, -327668, 1, 0, -327667, 0, -1200553578, -327666, 0, 0, -262139, 0, 0, -262138, 0, 0, -262137, 0, -1200553578, -262136, 0, -1200553578, -262135, 0, -1200553578, -262134, 0, -1200553578, -262133, 0, -1200553578, -262132, 0, -1200553578, -262131, 0, -1200553578, -262130, 0, 0, -196603, 0, 0, -196602, 0, 0, -196601, 0, -1200553578, -196600, 0, -1200553578, -196599, 0, 0, -196598, 0, 0, -196597, 0, 0, -196596, 0, 0, -196595, 0, 0, -196594, 0, 0, -131067, 0, 0, -131066, 0, 0, -131065, 0, -1200553578, -131064, 0, -1200553578, -131063, 0, 0, -65531, 0, 0, -65530, 0, 0, -65529, 0, -1200553578, -65528, 0, -1200553578, -65527, 0, 0, 5, 0, 0, 6, 0, 0, 7, 1, -1200553578, 8, 0, -1200553578, 9, 0, 0, 65541, 0, 0, 65542, 0, 0, 65543, 0, -1200553578, 65544, 0, -1200553578, 65545, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, -1200553578, 131080, 0, -1200553578, 131081, 0, 0, 196613, 0, 0, 196614, 0, 0, 196615, 0, 0, 196616, 0, 0 )
|
||||
tile_data = PoolIntArray( -851956, 0, -1200553578, -851955, 0, -1200553578, -851954, 0, -1200553578, -786420, 1, -1200553578, -786419, 0, -1200553578, -786418, 0, -1200553578, -720884, 0, -1200553578, -720883, 0, -1200553578, -720882, 0, -1200553578, -655348, 1, -1200553578, -655347, 0, -1200553578, -655346, 0, -1200553578, -589812, 1, -1200553578, -589811, 0, -1200553578, -589810, 0, -1200553578, -524276, 0, -1200553578, -524275, 1, -1200553578, -524274, 0, -1200553578, -458740, 0, -1200553578, -458739, 0, -1200553578, -458738, 0, -1200553578, -393210, 0, -1200553578, -393209, 0, -1200553578, -393208, 0, -1200553578, -393207, 0, -1200553578, -393206, 0, -1200553578, -393205, 0, -1200553578, -393204, 0, -1200553578, -393203, 0, -1200553578, -393202, 0, -1200553578, -327674, 0, -1200553578, -327673, 0, -1200553578, -327672, 1, -1200553578, -327671, 1, -1200553578, -327670, 1, -1200553578, -327669, 1, -1200553578, -327668, 1, -1200553578, -327667, 0, -1200553578, -327666, 0, -1200553578, -262138, 0, -1200553578, -262137, 0, -1200553578, -262136, 0, -1200553578, -262135, 0, -1200553578, -262134, 0, -1200553578, -262133, 0, -1200553578, -262132, 0, -1200553578, -262131, 0, -1200553578, -262130, 0, -1200553578, -196602, 0, -1200553578, -196601, 0, -1200553578, -196600, 0, -1200553578, -196599, 0, -1200553578, -196598, 0, -1200553578, -196597, 0, -1200553578, -196596, 0, -1200553578, -196595, 0, -1200553578, -196594, 0, -1200553578, -131066, 0, -1200553578, -131065, 0, -1200553578, -131064, 0, -1200553578, -131063, 0, -1200553578, -65530, 0, -1200553578, -65529, 0, -1200553578, -65528, 0, -1200553578, -65527, 0, -1200553578, 6, 0, -1200553578, 7, 1, -1200553578, 8, 0, -1200553578, 9, 0, -1200553578, 65542, 0, -1200553578, 65543, 0, -1200553578, 65544, 0, -1200553578, 65545, 0, -1200553578, 131078, 0, -1200553578, 131079, 0, -1200553578, 131080, 0, -1200553578, 131081, 0, -1200553578, 196614, 0, -1200553578, 196615, 0, -1200553578, 196616, 0, -1200553578 )
|
||||
|
||||
[node name="Walls" type="TileMap" parent="."]
|
||||
mode = 1
|
||||
@@ -20,9 +19,8 @@ tile_set = ExtResource( 1 )
|
||||
cell_size = Vector2( 128, 64 )
|
||||
cell_tile_origin = 1
|
||||
cell_y_sort = true
|
||||
centered_textures = true
|
||||
format = 1
|
||||
tile_data = PoolIntArray( -917493, 2, -1200553578, -917492, 2, -1200553578, -917491, 2, -1200553578, -917490, 2, -1200553578, -917489, 2, -1200553578, -851957, 2, -1200553578, -851956, 3, -1200553578, -851954, 3, -1200553578, -851953, 2, -1200553578, -786421, 2, -1200553578, -786420, 3, -1200553578, -786418, 3, -1200553578, -786417, 2, -1200553578, -720885, 2, -1200553578, -720881, 2, -1200553578, -655349, 2, -1200553578, -655348, 2, -1200553578, -655346, 3, -1200553578, -655345, 2, -1200553578, -589813, 2, -1200553578, -589809, 2, -1200553578, -524277, 2, -1200553578, -524273, 2, -1200553578, -458747, 2, -1200553578, -458746, 2, -1200553578, -458745, 2, -1200553578, -458744, 536870916, -1200553578, -458743, 536870916, -1200553578, -458742, 2, 0, -458741, 2, 0, -458740, 2, 0, -458738, 2, 0, -458737, 2, -1200553578, -393211, 2, -1200553578, -393209, 3, -1200553578, -393201, 2, -1200553578, -327675, 4, -1200553578, -327665, 2, -1200553578, -262139, 4, -1200553578, -262129, 2, -1200553578, -196603, 2, 0, -196601, 3, 0, -196593, 2, -1200553578, -131067, 2, 0, -131062, 2, -1200553578, -131061, 2, -1200553578, -131060, 2, -1200553578, -131059, 2, -1200553578, -131058, 2, -1200553578, -131057, 2, -1200553578, -65531, 2, 0, -65530, 2, 0, -65527, 2, -1200553578, -65526, 2, -1200553578, 5, 2, -1200553578, 10, 2, 0, 65541, 2, -1200553578, 65546, 2, 0, 131077, 2, -1200553578, 131081, 3, 0, 131082, 2, 0, 196613, 2, -1200553578, 196618, 2, 0, 262149, 2, -1200553578, 262150, 2, -1200553578, 262151, 2, -1200553578, 262152, 2, 0, 262153, 2, 0, 262154, 2, 0 )
|
||||
tile_data = PoolIntArray( -917493, 2, -1200553578, -917492, 2, -1200553578, -917491, 2, -1200553578, -917490, 2, -1200553578, -917489, 2, -1200553578, -851957, 2, -1200553578, -851956, 3, -1200553578, -851954, 3, -1200553578, -851953, 2, -1200553578, -786421, 2, -1200553578, -786420, 3, -1200553578, -786418, 3, -1200553578, -786417, 2, -1200553578, -720885, 2, -1200553578, -720881, 2, -1200553578, -655349, 2, -1200553578, -655348, 2, -1200553578, -655346, 3, -1200553578, -655345, 2, -1200553578, -589813, 2, -1200553578, -589809, 2, -1200553578, -524277, 2, -1200553578, -524273, 2, -1200553578, -458747, 2, -1200553578, -458746, 2, -1200553578, -458745, 2, -1200553578, -458744, 536870916, -1200553578, -458743, 536870916, -1200553578, -458742, 2, -1200553578, -458741, 2, -1200553578, -458740, 2, -1200553578, -458738, 2, -1200553578, -458737, 2, -1200553578, -393211, 2, -1200553578, -393209, 3, -1200553578, -393205, 3, -1200553578, -393201, 2, -1200553578, -327675, 4, -1200553578, -327665, 2, -1200553578, -262139, 4, -1200553578, -262129, 2, -1200553578, -196603, 2, 0, -196601, 3, 0, -196593, 2, -1200553578, -131067, 2, 0, -131062, 2, -1200553578, -131061, 2, -1200553578, -131060, 2, -1200553578, -131059, 2, -1200553578, -131058, 2, -1200553578, -131057, 2, -1200553578, -65531, 2, 0, -65530, 2, 0, -65527, 2, -1200553578, -65526, 2, -1200553578, 5, 2, -1200553578, 10, 2, 0, 65541, 2, -1200553578, 65546, 2, 0, 131077, 2, -1200553578, 131081, 3, 0, 131082, 2, 0, 196613, 2, -1200553578, 196618, 2, 0, 262149, 2, -1200553578, 262150, 2, -1200553578, 262151, 2, -1200553578, 262152, 2, -1200553578, 262153, 2, -1200553578, 262154, 2, -1200553578 )
|
||||
|
||||
[node name="Troll" parent="Walls" instance=ExtResource( 2 )]
|
||||
position = Vector2( 368.142, 347.007 )
|
||||
|
||||
@@ -10,16 +10,11 @@ config_version=4
|
||||
|
||||
_global_script_classes=[ ]
|
||||
_global_script_class_icons={
|
||||
|
||||
}
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Isometric Game"
|
||||
config/description="This demo shows a traditional isometric view with depth sorting.
|
||||
|
||||
A character can move around the level and will also slide around objects,
|
||||
as well as be occluded when standing in front or behind them."
|
||||
run/main_scene="res://dungeon.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
@@ -78,5 +73,4 @@ use_pixel_snap=true
|
||||
|
||||
[rendering]
|
||||
|
||||
quality/driver/driver_name="GLES2"
|
||||
environment/default_clear_color=Color( 0.0784314, 0.105882, 0.145098, 1 )
|
||||
|
||||
|
Before Width: | Height: | Size: 440 KiB |
@@ -3,103 +3,80 @@
|
||||
[ext_resource path="res://isotiles.png" type="Texture" id=1]
|
||||
|
||||
[sub_resource type="ConvexPolygonShape2D" id=1]
|
||||
points = PoolVector2Array( 0, -32, 64, 0, 0, 32, -64, 0 )
|
||||
points = PoolVector2Array( -4, -30, 60, 2, -4, 34, -68, 2 )
|
||||
|
||||
[sub_resource type="ConvexPolygonShape2D" id=2]
|
||||
points = PoolVector2Array( -24, -12, -10, -22, 10, -22, 24, -12, 24, 2, 10, 12, -10, 12, -24, 2 )
|
||||
points = PoolVector2Array( -4, -22, 12, -22, 28, -6, 4, 10, -4, 10, -20, -6 )
|
||||
|
||||
[sub_resource type="ConvexPolygonShape2D" id=3]
|
||||
points = PoolVector2Array( -40, 16, 24, -16, 40, -8, -24, 24 )
|
||||
points = PoolVector2Array( -21.905, 23.3748, 50.095, -8.62516, 66.095, -0.62516, -5.90501, 31.3748 )
|
||||
|
||||
[resource]
|
||||
0/name = "Base"
|
||||
0/texture = ExtResource( 1 )
|
||||
0/tex_offset = Vector2( 0, 0 )
|
||||
0/tex_offset = Vector2( -66, -42 )
|
||||
0/modulate = Color( 1, 1, 1, 1 )
|
||||
0/region = Rect2( 28, 75, 135, 105 )
|
||||
0/region = Rect2( 28, 92, 132, 84 )
|
||||
0/tile_mode = 0
|
||||
0/occluder_offset = Vector2( 67.5, 52.5 )
|
||||
0/navigation_offset = Vector2( 67.5, 52.5 )
|
||||
0/shape_offset = Vector2( 0, 0 )
|
||||
0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
|
||||
0/shape_one_way = false
|
||||
0/shape_one_way_margin = 0.0
|
||||
0/occluder_offset = Vector2( 0, 0 )
|
||||
0/navigation_offset = Vector2( 0, 0 )
|
||||
0/shapes = [ ]
|
||||
0/z_index = 0
|
||||
1/name = "Base2"
|
||||
1/texture = ExtResource( 1 )
|
||||
1/tex_offset = Vector2( 0, 0 )
|
||||
1/tex_offset = Vector2( -66, -42 )
|
||||
1/modulate = Color( 1, 1, 1, 1 )
|
||||
1/region = Rect2( 221, 75, 135, 105 )
|
||||
1/region = Rect2( 220, 92, 132, 84 )
|
||||
1/tile_mode = 0
|
||||
1/occluder_offset = Vector2( 67.5, 52.5 )
|
||||
1/navigation_offset = Vector2( 67.5, 52.5 )
|
||||
1/shape_offset = Vector2( 0, 0 )
|
||||
1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
|
||||
1/shape_one_way = false
|
||||
1/shape_one_way_margin = 0.0
|
||||
1/occluder_offset = Vector2( 0, 0 )
|
||||
1/navigation_offset = Vector2( 0, 0 )
|
||||
1/shapes = [ ]
|
||||
1/z_index = 0
|
||||
2/name = "Wall"
|
||||
2/texture = ExtResource( 1 )
|
||||
2/tex_offset = Vector2( 0, -32 )
|
||||
2/tex_offset = Vector2( -69.3109, -99.8051 )
|
||||
2/modulate = Color( 1, 1, 1, 1 )
|
||||
2/region = Rect2( 28, 220, 140, 140 )
|
||||
2/region = Rect2( 28, 220, 132, 136 )
|
||||
2/tile_mode = 0
|
||||
2/occluder_offset = Vector2( 70, 70 )
|
||||
2/navigation_offset = Vector2( 70, 70 )
|
||||
2/shape_offset = Vector2( 70, 70 )
|
||||
2/shape_transform = Transform2D( 1, 0, 0, 1, 70, 70 )
|
||||
2/shape = SubResource( 1 )
|
||||
2/shape_one_way = false
|
||||
2/shape_one_way_margin = 1.0
|
||||
2/occluder_offset = Vector2( 0, 0 )
|
||||
2/navigation_offset = Vector2( 0, 0 )
|
||||
2/shapes = [ {
|
||||
"autotile_coord": Vector2( 0, 0 ),
|
||||
"one_way": false,
|
||||
"one_way_margin": 1.0,
|
||||
"shape": SubResource( 1 ),
|
||||
"shape_transform": Transform2D( 1, 0, 0, 1, 70, 70 )
|
||||
"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
|
||||
} ]
|
||||
2/z_index = 0
|
||||
3/name = "Column"
|
||||
3/texture = ExtResource( 1 )
|
||||
3/tex_offset = Vector2( 0, -32 )
|
||||
3/tex_offset = Vector2( -69.5632, -100.446 )
|
||||
3/modulate = Color( 1, 1, 1, 1 )
|
||||
3/region = Rect2( 259, 241, 55, 95 )
|
||||
3/region = Rect2( 220, 220, 132, 136 )
|
||||
3/tile_mode = 0
|
||||
3/occluder_offset = Vector2( 27.5, 47.5 )
|
||||
3/navigation_offset = Vector2( 27.5, 47.5 )
|
||||
3/shape_offset = Vector2( 29.5, 47.5 )
|
||||
3/shape_transform = Transform2D( 1, 0, 0, 1, 29.5, 47.5 )
|
||||
3/shape = SubResource( 2 )
|
||||
3/shape_one_way = false
|
||||
3/shape_one_way_margin = 1.0
|
||||
3/occluder_offset = Vector2( 0, 0 )
|
||||
3/navigation_offset = Vector2( 0, 0 )
|
||||
3/shapes = [ {
|
||||
"autotile_coord": Vector2( 0, 0 ),
|
||||
"one_way": false,
|
||||
"one_way_margin": 1.0,
|
||||
"shape": SubResource( 2 ),
|
||||
"shape_transform": Transform2D( 1, 0, 0, 1, 29.5, 47.5 )
|
||||
"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
|
||||
} ]
|
||||
3/z_index = 0
|
||||
4/name = "Door1"
|
||||
4/texture = ExtResource( 1 )
|
||||
4/tex_offset = Vector2( 0, -25 )
|
||||
4/tex_offset = Vector2( -50.3623, -90.8164 )
|
||||
4/modulate = Color( 1, 1, 1, 1 )
|
||||
4/region = Rect2( 54, 426, 85, 110 )
|
||||
4/region = Rect2( 24, 408, 132, 136 )
|
||||
4/tile_mode = 0
|
||||
4/occluder_offset = Vector2( 42.5, 55 )
|
||||
4/navigation_offset = Vector2( 42.5, 55 )
|
||||
4/shape_offset = Vector2( 42.5, 55 )
|
||||
4/shape_transform = Transform2D( 1, 0, 0, 1, 42.5, 55 )
|
||||
4/shape = SubResource( 3 )
|
||||
4/shape_one_way = false
|
||||
4/shape_one_way_margin = 1.0
|
||||
4/occluder_offset = Vector2( 0, 0 )
|
||||
4/navigation_offset = Vector2( 0, 0 )
|
||||
4/shapes = [ {
|
||||
"autotile_coord": Vector2( 0, 0 ),
|
||||
"one_way": false,
|
||||
"one_way_margin": 1.0,
|
||||
"shape": SubResource( 3 ),
|
||||
"shape_transform": Transform2D( 1, 0, 0, 1, 42.5, 55 )
|
||||
"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
|
||||
} ]
|
||||
4/z_index = 0
|
||||
|
||||
@@ -5,49 +5,56 @@
|
||||
[node name="TilesetEdit" type="Node2D"]
|
||||
|
||||
[node name="Base" type="Sprite" parent="."]
|
||||
position = Vector2( 150.049, 61.1264 )
|
||||
texture = ExtResource( 1 )
|
||||
centered = false
|
||||
offset = Vector2( -66, -42 )
|
||||
region_enabled = true
|
||||
region_rect = Rect2( 28, 75, 135, 105 )
|
||||
region_rect = Rect2( 28, 92, 132, 84 )
|
||||
|
||||
[node name="Base2" type="Sprite" parent="."]
|
||||
position = Vector2( 200, 0 )
|
||||
position = Vector2( 257.013, 124.86 )
|
||||
texture = ExtResource( 1 )
|
||||
centered = false
|
||||
offset = Vector2( -66, -42 )
|
||||
region_enabled = true
|
||||
region_rect = Rect2( 221, 75, 135, 105 )
|
||||
region_rect = Rect2( 220, 92, 132, 84 )
|
||||
|
||||
[node name="Wall" type="Sprite" parent="."]
|
||||
position = Vector2( 400, 0 )
|
||||
position = Vector2( 421.311, 137.805 )
|
||||
texture = ExtResource( 1 )
|
||||
offset = Vector2( 0, -32 )
|
||||
centered = false
|
||||
offset = Vector2( -69.3109, -99.8051 )
|
||||
region_enabled = true
|
||||
region_rect = Rect2( 28, 220, 140, 140 )
|
||||
region_rect = Rect2( 28, 220, 132, 136 )
|
||||
|
||||
[node name="StaticBody2D" type="StaticBody2D" parent="Wall"]
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Wall/StaticBody2D"]
|
||||
polygon = PoolVector2Array( -64, 0, 0, 32, 64, 0, 0, -32 )
|
||||
[node name="collision" type="CollisionPolygon2D" parent="Wall/StaticBody2D"]
|
||||
polygon = PoolVector2Array( -68, 2, -4, 34, 60, 2, -4, -30 )
|
||||
|
||||
[node name="Column" type="Sprite" parent="."]
|
||||
position = Vector2( 600, 0 )
|
||||
position = Vector2( 359.563, 266.446 )
|
||||
texture = ExtResource( 1 )
|
||||
offset = Vector2( 0, -32 )
|
||||
centered = false
|
||||
offset = Vector2( -69.5632, -100.446 )
|
||||
region_enabled = true
|
||||
region_rect = Rect2( 259, 241, 55, 95 )
|
||||
region_rect = Rect2( 220, 220, 132, 136 )
|
||||
|
||||
[node name="StaticBody2D" type="StaticBody2D" parent="Column"]
|
||||
[node name="StaticBody" type="StaticBody2D" parent="Column"]
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Column/StaticBody2D"]
|
||||
position = Vector2( 2, 0 )
|
||||
polygon = PoolVector2Array( -24, 2, -10, 12, 10, 12, 24, 2, 24, -12, 10, -22, -10, -22, -24, -12 )
|
||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Column/StaticBody"]
|
||||
polygon = PoolVector2Array( -20, -6, -4, 10, 4, 10, 28, -6, 12, -22, -4, -22 )
|
||||
|
||||
[node name="Door1" type="Sprite" parent="."]
|
||||
position = Vector2( 800, 0 )
|
||||
position = Vector2( -24.1548, 142.216 )
|
||||
texture = ExtResource( 1 )
|
||||
offset = Vector2( 0, -25 )
|
||||
centered = false
|
||||
offset = Vector2( -50.3623, -90.8164 )
|
||||
region_enabled = true
|
||||
region_rect = Rect2( 54, 426, 85, 110 )
|
||||
region_rect = Rect2( 24, 408, 132, 136 )
|
||||
|
||||
[node name="StaticBody2D" type="StaticBody2D" parent="Door1"]
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Door1/StaticBody2D"]
|
||||
polygon = PoolVector2Array( -24, 24, 40, -8, 24, -16, -40, 16 )
|
||||
polygon = PoolVector2Array( -5.90501, 31.3748, 66.095, -0.62516, 50.095, -8.62516, -21.905, 23.3748 )
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
extends KinematicBody2D
|
||||
|
||||
const MOTION_SPEED = 160 # Pixels/second.
|
||||
const MOTION_SPEED = 160 # Pixels/second
|
||||
|
||||
func _physics_process(_delta):
|
||||
var motion = Vector2()
|
||||
motion.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
|
||||
motion.y = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
|
||||
motion.y /= 2
|
||||
motion.y *= 0.5
|
||||
motion = motion.normalized() * MOTION_SPEED
|
||||
#warning-ignore:return_value_discarded
|
||||
move_and_slide(motion)
|
||||
|
||||
@@ -10,10 +10,11 @@ radius = 16.0
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
position = Vector2( -4, -28 )
|
||||
position = Vector2( -3.94334, -36.924 )
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
position = Vector2( -0.342697, -0.980721 )
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[node name="Camera2D" type="Camera2D" parent="."]
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
# Kinematic Character 2D
|
||||
|
||||
Example of how to make a kinematic character controller in 2D using
|
||||
[`KinematicBody2D`](https://docs.godotengine.org/en/latest/classes/class_kinematicbody2d.html).
|
||||
The character moves around, is affected by moving platforms,
|
||||
can jump through one-way collision platforms, etc.
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
@@ -2,15 +2,15 @@
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/button.png-e6ddd405c0968c9fb68dca7b600a69a3.stex"
|
||||
path="res://.import/circle.png-10953cad44a8947fbdd4128a631e9e52.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://menu/button.png"
|
||||
dest_files=[ "res://.import/button.png-e6ddd405c0968c9fb68dca7b600a69a3.stex" ]
|
||||
source_file="res://circle.png"
|
||||
dest_files=[ "res://.import/circle.png-10953cad44a8947fbdd4128a631e9e52.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
extends Node
|
||||
|
||||
func _on_body_entered(body):
|
||||
if body.name == "Player":
|
||||
$"../WinText".show()
|
||||
|
Before Width: | Height: | Size: 480 B After Width: | Height: | Size: 480 B |
@@ -2,15 +2,15 @@
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/paint_tools.png-224b64b7ddb26189a369199f6d686b79.stex"
|
||||
path="res://.import/long_obstacle.png-1b33440a15b4db156b2a9ec7e9a2a80e.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://paint_tools.png"
|
||||
dest_files=[ "res://.import/paint_tools.png-224b64b7ddb26189a369199f6d686b79.stex" ]
|
||||
source_file="res://long_obstacle.png"
|
||||
dest_files=[ "res://.import/long_obstacle.png-1b33440a15b4db156b2a9ec7e9a2a80e.stex" ]
|
||||
|
||||
[params]
|
||||
|
||||