From 8689a4732a085ae5d6dd032e286709f664b161d3 Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Fri, 26 Oct 2018 16:06:27 +0300 Subject: [PATCH] Initial commit In this commit I add a human character, a traveler that can move around a tiny world made of a single screen so far. :) Materials used so far: * 'HeartBeast' video lesons: https://goo.gl/3DtqPn * The very informative and rich documentation of Godot itself! For the Gamepad I used wonderful addon by fiaful: https://github.com/fiaful/Gamepad The beautiful arts are from "Open Pixel Project": https://openpixelproject.itch.io --- .gitignore | 1 + addons/Gamepad/Gamepad.gd | 17 + addons/Gamepad/GamepadArea.gd | 99 ++++ addons/Gamepad/GamepadButton.gd | 295 ++++++++++ addons/Gamepad/GamepadButtonTemplate.tscn | 101 ++++ addons/Gamepad/GamepadContainer.gd | 163 ++++++ addons/Gamepad/GamepadPaddle.gd | 408 +++++++++++++ addons/Gamepad/GamepadPaddleTemplate.tscn | 125 ++++ addons/Gamepad/GamepadStick.gd | 546 ++++++++++++++++++ addons/Gamepad/GamepadStickTemplate.tscn | 118 ++++ addons/Gamepad/icons/area.png | Bin 0 -> 413 bytes addons/Gamepad/icons/area.png.import | 29 + addons/Gamepad/icons/button.png | Bin 0 -> 727 bytes addons/Gamepad/icons/button.png.import | 29 + addons/Gamepad/icons/container.png | Bin 0 -> 530 bytes addons/Gamepad/icons/container.png.import | 29 + addons/Gamepad/icons/paddle.png | Bin 0 -> 615 bytes addons/Gamepad/icons/paddle.png.import | 29 + addons/Gamepad/icons/stick.png | Bin 0 -> 600 bytes addons/Gamepad/icons/stick.png.import | 29 + addons/Gamepad/plugin.cfg | 7 + assets/Gamepad/big_circle.png | Bin 0 -> 3779 bytes assets/Gamepad/big_circle.png.import | 29 + assets/Gamepad/button_a.png | Bin 0 -> 2532 bytes assets/Gamepad/button_a.png.import | 29 + assets/Gamepad/button_b.png | Bin 0 -> 2488 bytes assets/Gamepad/button_b.png.import | 29 + assets/Gamepad/button_fire.png | Bin 0 -> 2881 bytes assets/Gamepad/button_fire.png.import | 29 + assets/Gamepad/button_l.png | Bin 0 -> 2193 bytes assets/Gamepad/button_l.png.import | 29 + assets/Gamepad/button_r.png | Bin 0 -> 2398 bytes assets/Gamepad/button_r.png.import | 29 + assets/Gamepad/button_target.png | Bin 0 -> 3124 bytes assets/Gamepad/button_target.png.import | 29 + assets/Gamepad/button_x.png | Bin 0 -> 2592 bytes assets/Gamepad/button_x.png.import | 29 + assets/Gamepad/button_y.png | Bin 0 -> 2424 bytes assets/Gamepad/button_y.png.import | 29 + assets/Gamepad/cross_dark.png | Bin 0 -> 1751 bytes assets/Gamepad/cross_dark.png.import | 29 + assets/Gamepad/cross_light.png | Bin 0 -> 1669 bytes assets/Gamepad/cross_light.png.import | 29 + assets/Gamepad/cursor_dark.png | Bin 0 -> 383 bytes assets/Gamepad/cursor_dark.png.import | 29 + assets/Gamepad/cursor_light.png | Bin 0 -> 374 bytes assets/Gamepad/cursor_light.png.import | 29 + assets/Gamepad/diagonal_dark.png | Bin 0 -> 2517 bytes assets/Gamepad/diagonal_dark.png.import | 29 + assets/Gamepad/diagonal_int_dark.png | Bin 0 -> 829 bytes assets/Gamepad/diagonal_int_dark.png.import | 29 + assets/Gamepad/diagonal_int_light.png | Bin 0 -> 809 bytes assets/Gamepad/diagonal_int_light.png.import | 29 + assets/Gamepad/diagonal_light.png | Bin 0 -> 2605 bytes assets/Gamepad/diagonal_light.png.import | 29 + assets/Gamepad/left_right_dark.png | Bin 0 -> 1122 bytes assets/Gamepad/left_right_dark.png.import | 29 + assets/Gamepad/left_right_light.png | Bin 0 -> 1115 bytes assets/Gamepad/left_right_light.png.import | 29 + assets/Gamepad/omni_dark.png | Bin 0 -> 4732 bytes assets/Gamepad/omni_dark.png.import | 29 + assets/Gamepad/omni_int_dark.png | Bin 0 -> 4212 bytes assets/Gamepad/omni_int_dark.png.import | 29 + assets/Gamepad/omni_int_light.png | Bin 0 -> 3740 bytes assets/Gamepad/omni_int_light.png.import | 29 + assets/Gamepad/omni_light.png | Bin 0 -> 4331 bytes assets/Gamepad/omni_light.png.import | 29 + assets/Gamepad/omni_square_dark.png | Bin 0 -> 1169 bytes assets/Gamepad/omni_square_dark.png.import | 29 + assets/Gamepad/omni_square_int_dark.png | Bin 0 -> 1233 bytes .../Gamepad/omni_square_int_dark.png.import | 29 + assets/Gamepad/omni_square_int_light.png | Bin 0 -> 1165 bytes .../Gamepad/omni_square_int_light.png.import | 29 + assets/Gamepad/omni_square_light.png | Bin 0 -> 1243 bytes assets/Gamepad/omni_square_light.png.import | 29 + assets/Gamepad/paddle_dark.png | Bin 0 -> 6613 bytes assets/Gamepad/paddle_dark.png.import | 29 + assets/Gamepad/paddle_light.png | Bin 0 -> 5309 bytes assets/Gamepad/paddle_light.png.import | 29 + assets/Gamepad/small_circle.png | Bin 0 -> 834 bytes assets/Gamepad/small_circle.png.import | 29 + assets/Gamepad/up_down_dark.png | Bin 0 -> 1303 bytes assets/Gamepad/up_down_dark.png.import | 29 + assets/Gamepad/up_down_light.png | Bin 0 -> 1295 bytes assets/Gamepad/up_down_light.png.import | 29 + characters/player/script/player.gd | 63 ++ characters/player/sprite/Idle0.png | Bin 0 -> 1615 bytes characters/player/sprite/Idle0.png.import | 29 + characters/player/sprite/Jump0.png | Bin 0 -> 883 bytes characters/player/sprite/Jump0.png.import | 29 + characters/player/sprite/Jump1.png | Bin 0 -> 807 bytes characters/player/sprite/Jump1.png.import | 29 + characters/player/sprite/Jump3.png | Bin 0 -> 794 bytes characters/player/sprite/Jump3.png.import | 29 + characters/player/sprite/Jump4.png | Bin 0 -> 830 bytes characters/player/sprite/Jump4.png.import | 29 + characters/player/sprite/Run0.png | Bin 0 -> 867 bytes characters/player/sprite/Run0.png.import | 29 + characters/player/sprite/Run1.png | Bin 0 -> 792 bytes characters/player/sprite/Run1.png.import | 29 + characters/player/sprite/Run2.png | Bin 0 -> 674 bytes characters/player/sprite/Run2.png.import | 29 + characters/player/sprite/Run3.png | Bin 0 -> 735 bytes characters/player/sprite/Run3.png.import | 29 + characters/player/sprite/Run4.png | Bin 0 -> 729 bytes characters/player/sprite/Run4.png.import | 29 + characters/player/sprite/Run7.png | Bin 0 -> 651 bytes characters/player/sprite/Run7.png.import | 29 + default_env.tres | 101 ++++ export_presets.cfg | 250 ++++++++ icon.png | Bin 0 -> 3498 bytes icon.png.import | 29 + levels/world1/JungleDirtTiles.tscn | 291 ++++++++++ levels/world1/JungleDirtTileset.tres | 138 +++++ levels/world1/script/world1.gd | 16 + levels/world1/sprite/JungleDirtTileSet.png | Bin 0 -> 5816 bytes .../sprite/JungleDirtTileSet.png.import | 29 + levels/world1/world1.tscn | 258 +++++++++ project.godot | 32 + 119 files changed, 4479 insertions(+) create mode 100644 .gitignore create mode 100644 addons/Gamepad/Gamepad.gd create mode 100644 addons/Gamepad/GamepadArea.gd create mode 100644 addons/Gamepad/GamepadButton.gd create mode 100644 addons/Gamepad/GamepadButtonTemplate.tscn create mode 100644 addons/Gamepad/GamepadContainer.gd create mode 100644 addons/Gamepad/GamepadPaddle.gd create mode 100644 addons/Gamepad/GamepadPaddleTemplate.tscn create mode 100644 addons/Gamepad/GamepadStick.gd create mode 100644 addons/Gamepad/GamepadStickTemplate.tscn create mode 100644 addons/Gamepad/icons/area.png create mode 100644 addons/Gamepad/icons/area.png.import create mode 100644 addons/Gamepad/icons/button.png create mode 100644 addons/Gamepad/icons/button.png.import create mode 100644 addons/Gamepad/icons/container.png create mode 100644 addons/Gamepad/icons/container.png.import create mode 100644 addons/Gamepad/icons/paddle.png create mode 100644 addons/Gamepad/icons/paddle.png.import create mode 100644 addons/Gamepad/icons/stick.png create mode 100644 addons/Gamepad/icons/stick.png.import create mode 100644 addons/Gamepad/plugin.cfg create mode 100644 assets/Gamepad/big_circle.png create mode 100644 assets/Gamepad/big_circle.png.import create mode 100644 assets/Gamepad/button_a.png create mode 100644 assets/Gamepad/button_a.png.import create mode 100644 assets/Gamepad/button_b.png create mode 100644 assets/Gamepad/button_b.png.import create mode 100644 assets/Gamepad/button_fire.png create mode 100644 assets/Gamepad/button_fire.png.import create mode 100644 assets/Gamepad/button_l.png create mode 100644 assets/Gamepad/button_l.png.import create mode 100644 assets/Gamepad/button_r.png create mode 100644 assets/Gamepad/button_r.png.import create mode 100644 assets/Gamepad/button_target.png create mode 100644 assets/Gamepad/button_target.png.import create mode 100644 assets/Gamepad/button_x.png create mode 100644 assets/Gamepad/button_x.png.import create mode 100644 assets/Gamepad/button_y.png create mode 100644 assets/Gamepad/button_y.png.import create mode 100644 assets/Gamepad/cross_dark.png create mode 100644 assets/Gamepad/cross_dark.png.import create mode 100644 assets/Gamepad/cross_light.png create mode 100644 assets/Gamepad/cross_light.png.import create mode 100644 assets/Gamepad/cursor_dark.png create mode 100644 assets/Gamepad/cursor_dark.png.import create mode 100644 assets/Gamepad/cursor_light.png create mode 100644 assets/Gamepad/cursor_light.png.import create mode 100644 assets/Gamepad/diagonal_dark.png create mode 100644 assets/Gamepad/diagonal_dark.png.import create mode 100644 assets/Gamepad/diagonal_int_dark.png create mode 100644 assets/Gamepad/diagonal_int_dark.png.import create mode 100644 assets/Gamepad/diagonal_int_light.png create mode 100644 assets/Gamepad/diagonal_int_light.png.import create mode 100644 assets/Gamepad/diagonal_light.png create mode 100644 assets/Gamepad/diagonal_light.png.import create mode 100644 assets/Gamepad/left_right_dark.png create mode 100644 assets/Gamepad/left_right_dark.png.import create mode 100644 assets/Gamepad/left_right_light.png create mode 100644 assets/Gamepad/left_right_light.png.import create mode 100644 assets/Gamepad/omni_dark.png create mode 100644 assets/Gamepad/omni_dark.png.import create mode 100644 assets/Gamepad/omni_int_dark.png create mode 100644 assets/Gamepad/omni_int_dark.png.import create mode 100644 assets/Gamepad/omni_int_light.png create mode 100644 assets/Gamepad/omni_int_light.png.import create mode 100644 assets/Gamepad/omni_light.png create mode 100644 assets/Gamepad/omni_light.png.import create mode 100644 assets/Gamepad/omni_square_dark.png create mode 100644 assets/Gamepad/omni_square_dark.png.import create mode 100644 assets/Gamepad/omni_square_int_dark.png create mode 100644 assets/Gamepad/omni_square_int_dark.png.import create mode 100644 assets/Gamepad/omni_square_int_light.png create mode 100644 assets/Gamepad/omni_square_int_light.png.import create mode 100644 assets/Gamepad/omni_square_light.png create mode 100644 assets/Gamepad/omni_square_light.png.import create mode 100644 assets/Gamepad/paddle_dark.png create mode 100644 assets/Gamepad/paddle_dark.png.import create mode 100644 assets/Gamepad/paddle_light.png create mode 100644 assets/Gamepad/paddle_light.png.import create mode 100644 assets/Gamepad/small_circle.png create mode 100644 assets/Gamepad/small_circle.png.import create mode 100644 assets/Gamepad/up_down_dark.png create mode 100644 assets/Gamepad/up_down_dark.png.import create mode 100644 assets/Gamepad/up_down_light.png create mode 100644 assets/Gamepad/up_down_light.png.import create mode 100644 characters/player/script/player.gd create mode 100644 characters/player/sprite/Idle0.png create mode 100644 characters/player/sprite/Idle0.png.import create mode 100644 characters/player/sprite/Jump0.png create mode 100644 characters/player/sprite/Jump0.png.import create mode 100644 characters/player/sprite/Jump1.png create mode 100644 characters/player/sprite/Jump1.png.import create mode 100644 characters/player/sprite/Jump3.png create mode 100644 characters/player/sprite/Jump3.png.import create mode 100644 characters/player/sprite/Jump4.png create mode 100644 characters/player/sprite/Jump4.png.import create mode 100644 characters/player/sprite/Run0.png create mode 100644 characters/player/sprite/Run0.png.import create mode 100644 characters/player/sprite/Run1.png create mode 100644 characters/player/sprite/Run1.png.import create mode 100644 characters/player/sprite/Run2.png create mode 100644 characters/player/sprite/Run2.png.import create mode 100644 characters/player/sprite/Run3.png create mode 100644 characters/player/sprite/Run3.png.import create mode 100644 characters/player/sprite/Run4.png create mode 100644 characters/player/sprite/Run4.png.import create mode 100644 characters/player/sprite/Run7.png create mode 100644 characters/player/sprite/Run7.png.import create mode 100644 default_env.tres create mode 100644 export_presets.cfg create mode 100644 icon.png create mode 100644 icon.png.import create mode 100644 levels/world1/JungleDirtTiles.tscn create mode 100644 levels/world1/JungleDirtTileset.tres create mode 100644 levels/world1/script/world1.gd create mode 100644 levels/world1/sprite/JungleDirtTileSet.png create mode 100644 levels/world1/sprite/JungleDirtTileSet.png.import create mode 100644 levels/world1/world1.tscn create mode 100644 project.godot diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3a96203 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.import/ diff --git a/addons/Gamepad/Gamepad.gd b/addons/Gamepad/Gamepad.gd new file mode 100644 index 0000000..876a0ff --- /dev/null +++ b/addons/Gamepad/Gamepad.gd @@ -0,0 +1,17 @@ +tool +extends EditorPlugin + +func _enter_tree(): + # 120 - 80 - 70 (colora) + add_custom_type("GamepadContainer", "Control", preload("GamepadContainer.gd"), preload("icons/container.png")) + add_custom_type("GamepadArea", "Control", preload("GamepadArea.gd"), preload("icons/area.png")) + add_custom_type("GamepadStick", "Control", preload("GamepadStick.gd"), preload("icons/stick.png")) + add_custom_type("GamepadPaddle", "Control", preload("GamepadPaddle.gd"), preload("icons/paddle.png")) + add_custom_type("GamepadButton", "Control", preload("GamepadButton.gd"), preload("icons/button.png")) + +func _exit_tree(): + remove_custom_type("GamepadContainer") + remove_custom_type("GamepadArea") + remove_custom_type("GamepadStick") + remove_custom_type("GamepadPaddle") + remove_custom_type("GamepadButton") diff --git a/addons/Gamepad/GamepadArea.gd b/addons/Gamepad/GamepadArea.gd new file mode 100644 index 0000000..818209c --- /dev/null +++ b/addons/Gamepad/GamepadArea.gd @@ -0,0 +1,99 @@ +###[ INFO ]###################################################################################################### + +# Component: GamepadArea +# Author: Francesco Iafulli (fiaful) +# E-mail: fiaful@hotmail.com +# Version: 1.0 +# Last modify: 2018-07-20 + +# What is this: +# E' un nodo facoltativo. Le sue funzioni sono 2 (una esclude l'altra): +# - consentire agli elementi del gamepad di essere visualizzati solo quando lo schermo viene toccato e nel punto +# in cui viene toccato, ed essere invisibili il restante tempo +# - raggruppare oggetti sempre visibili del gamepad in modo da poter essere disabilitati in maniera cumulativa + +# Requirements: +# - il parent di questo nodo deve essere di tipo GamepadContainer, altrimenti gli eventi non verranno intercettati +# - l'area di questo oggetto deve essere estesa a tutta la zona che si desidera avere sesibile per la visualizzazione +# dell'oggetto del gamepad in maniera dinamica -oppure- deve essere estesa in modo da poter contenere tutti +# gli oggetti che si desidera abilitare/disabilitare contemporaneamente +# - dovrà essere contenuto un solo oggetto se questo deve essere visualizzato in maniera dinamica, altrimenti +# tutti gli oggetti che si desirea abilitare/disabilitare contemporaneamente dovranno essere qui contenuti + +# To do: +# - gestire una eventuale visualizzazione dell'area al tocco qualora lo si desideri + +# Changelog: +# +# + +###[ BEGIN ]##################################################################################################### + +extends Control + +###[ CONSTS ]#################################################################################################### + +# è utilizzato per discriminare se questo nodo è un'area (viene controllata la presenza di questa costante, se c'è il nodo +# è di tipo GamepadArea, altrimenti no +const is_area = true + +###[ EXPORTED VARIABLES ]######################################################################################## + +# indica se l'intera area (e gli oggetti in essa contenuti) devono essere disabilitati (se true, nessuno degli oggetti +# contenuti riceverà i tocchi dell'utente) +export var disabled = false + +# questa proprietà contiene il nome dell'oggetto (che viene restituito nell'oggetto finger) +export var gamepad_type = "AREA 0" + +###[ METHODS ]################################################################################################### + +# dal GamepadContainer viene richiamato questo metodo se l'utente tocca quest'area +func handle_down_event(event, finger): + # se l'oggetto è disabilitato esco, non propagando l'evento agli oggetti contenuti + if disabled: + return + # altrimenti per ogni oggetto contenuto + for child in get_children(): + # se l'oggetto è un oggetto del gamepad + if child.has_method("handle_down_event"): + # aggiorno l'oggetto associato all'istanza corrente di finger + finger.set_finger(finger.index, child, finger.position) + # quindi chiedo all'oggetto contenuto di gestire l'evento + child.handle_down_event(event, finger) + +func handle_up_event(event, finger): + # se l'oggetto è disabilitato esco, non propagando l'evento agli oggetti contenuti + if disabled: + return + # altrimenti per ogni oggetto contenuto + for child in get_children(): + # se l'oggetto è un oggetto del gamepad + if child.has_method("handle_up_event"): + # aggiorno l'oggetto associato all'istanza corrente di finger + finger.set_finger(finger.index, child, finger.position) + # quindi chiedo all'oggetto contenuto di gestire l'evento + child.handle_up_event(event, finger) + +func handle_move_event(event, finger): + # se l'oggetto è disabilitato esco, non propagando l'evento agli oggetti contenuti + if disabled: + return + # altrimenti per ogni oggetto contenuto + for child in get_children(): + # se l'oggetto è un oggetto del gamepad + if child.has_method("handle_move_event"): + # aggiorno l'oggetto associato all'istanza corrente di finger + finger.set_finger(finger.index, child, finger.position) + # quindi chiedo all'oggetto contenuto di gestire l'evento + child.handle_move_event(event, finger) + +func handle_input(event): + # questo evento viene richiamato dal container in caso di eventi da tastiera + for child in get_children(): + # pertanto propago l'evento a tutti i figli + if child.has_method("handle_input"): + # che sono in grado di gestirlo + child.handle_input(event) + +###[ END ]####################################################################################################### \ No newline at end of file diff --git a/addons/Gamepad/GamepadButton.gd b/addons/Gamepad/GamepadButton.gd new file mode 100644 index 0000000..af04d5e --- /dev/null +++ b/addons/Gamepad/GamepadButton.gd @@ -0,0 +1,295 @@ +###[ INFO ]###################################################################################################### + +# Component: GamepadButton +# Author: Francesco Iafulli (fiaful) +# E-mail: fiaful@hotmail.com +# Version: 1.0 +# Last modify: 2018-07-20 + +# What is this: +# E' l'oggetto che consente di gestire i pulsanti del gamepad +# Possono essere aggiunti nel contenitore quanti button si desideri + +# Requirements: +# - il parent di questo nodo deve essere di tipo GamepadArea se si desidera utilizzare la proprietà show_dinamically +# per far apparire il button dinamicamente alla posizione della pressione del dito sullo schermo. Il suo parent +# può essere di tipo GamepadContainer se il button è sempre visibile sullo schermo in una posizione fissa. +# - deve comunque essere contenuto (direttamente o indirettamente) in un nodo di tipo GamepadContainer, altrimenti +# non funzionerà +# - la texture del button deve essere quadrata altrimenti si verificheranno problemi di visualizzazione +# a runtime (vedere le immagini di esempio nella cartella assets/Gamepad) +# - se il button deve essere sempre visibile in una posizione fissa, è necessario valorizzare questa posizione nella +# proprietà static_position. + +# Changelog: +# +# + +###[ BEGIN ]##################################################################################################### + +tool +extends Control + +###[ INTERNAL OBJECTS ]########################################################################################## + +# mantiene l'aspetto del button +onready var button = $ButtonFace + +# gestisce l'autofire del button +onready var timer = $AutofireTimer + +# gestisce visualizzazione/nascondimento del button +onready var fader = $ShowHideAnimation + +###[ EXPORTED VARIABLES ]######################################################################################## + +# indica se il button deve essere disabilitato (se true, il button non riceverà i tocchi dell'utente e il suo aspetto +# verrà mutato visualizzando la texture_disabled se impostata) +export var disabled = false setget _set_disabled + +# indica se il button deve essere staticamente sempre visualizzato (false) o se questo deve apparire nascosto e +# mostrarsi (true) quando l'utente tocca la sua area (in questo caso deve essere contenuto in un oggetto di tipo +# GamepadArea) +export var show_dynamically = false setget _set_show_dynamically + +# questa proprietà contiene il nome dell'oggetto (che viene restituito nell'oggetto finger) +export var gamepad_type = "BUTTON 0" + +# texture del button nello stato rilasciato +export(Texture) var texture_normal setget _set_texture_normal, _get_texture_normal + +# texture del button nello stato premuto +export(Texture) var texture_pressed setget _set_texture_pressed, _get_texture_pressed + +# texture del button nello stato disabilitato +export(Texture) var texture_disabled setget _set_texture_disabled, _get_texture_disabled + +# contiene la reale posizione del button +export var static_position = Vector2(0, 0) + +# indica l'intervallo di tempo tra un fire e l'altro quando il button rimane premuto +# se vale 0, l'utente dovrà rilasciare e premere nuovamente il button per emettere un nuovo segnale di fire +export var autofire_delay = 0.0 + +# per utilizzare uniformemente gli oggetti anche in presenza di tastiera, consento di associare +# direttamente un input map per premere il button +export var simulate_action = "ui_select" + +###[ SIGNALS ]################################################################################################### + +# viene emesso quando il button è premuto (una sola volta) +signal down(sender) + +# viene emesso quando il button è rilasciato (una sola volta) +signal up(sender) + +# viene emesso quando il pulsante è premuto ed agli intervalli dell'autofire +signal fire(sender) + +###[ PRIVATE AND PUBLIC VARIABLES ]############################################################################## + +# centro del button (ovvero della sua texture) +var center_point = Vector2(0,0) + +# i dati del tocco (in modo che possano essere recuperati negli eventi) +var finger_data = null + +# indica lo stato de button (se premuto - true - o rilasciato - false) +var is_pressed = false + +# indica se sto simulando il button con la tastiera oppure no +var simulation = false + +# mantiene lo stato della visualizzazione dinamica +var shown = true + +###[ METHODS ]################################################################################################### + +# costruisce l'albero dei nodi necessari all'oggetto prendendoli dal template +func _init(): + # se non sono già stati caricati + if get_child_count() > 0: return + # carico e istanzio il template + var gamepad_button_template = load("res://addons/Gamepad/GamepadButtonTemplate.tscn").instance() + # quindi se ci sono oggetti nel template (ovviamente si) + if gamepad_button_template.get_child_count() > 0: + # prendo ogni oggetto nel template + for child in gamepad_button_template.get_children(): + # se l'oggetto è il timer + if child is Timer: + # ne creo il duplicato + var tmr = child.duplicate() + # lo aggiungo al mio nodo + add_child(tmr) + # connetto il suo segnale timeout allo script + tmr.connect("timeout", self, "_on_AutofireTimer_timeout") + else: + # aggiungo un duplicato al mio nodo + add_child(child.duplicate()) + +func _ready(): + # se l'oggetto deve essere visualizzato dinamicamente (ovvero solo quando l'utente tocca lo schermo) lo nascondo + if show_dynamically: + _hide_button() + # imposto la sua posizione statica (non ha senso se visualizzato dinamicamente in quanto la sua posizione + # varierà in base al tocco dell'utente) + rect_position = static_position + # ricavo i restanti valori che mi serviranno più avanti per fare i calcoli + center_point = self.rect_size / 2 + +# emula il button tramite tastiera +func handle_input(event): + # verifica quale tasto è stato premuto + simulation = false + # se il tasto premuto corrisponde a quello indicato + if simulate_action and Input.is_action_pressed(simulate_action): + simulation = true + # e il button non era precedentemente premuto + if !is_pressed: + # inizializzo la posizione del'oggetto + var ev = InputEventScreenTouch.new() + ev.position = get_parent().rect_global_position + static_position + center_point + # simulo la pressione del dito sul button + handle_down_event(ev, null) + else: + # mentre se il tasto corrispondente non è premuto e il button lo era, + if is_pressed: + # simulo il rilascio del dito dal button + handle_up_event(null, null) + +# l'utente ha toccato lo schermo in corrispondenza del button o dell'area che contiene il button +func handle_down_event(event, finger): + # se il button è disabilitato esco senza fare nulla (prima però resetto i dati interni) + if disabled: + is_pressed = false + button.pressed = false + return + # altrimenti imposto i dati del tocco in modo che possano essere recuperati da fuori + finger_data = finger + # se il button deve essere visualizzato dinamicamente vuol dire che in questo momento non è visibile e quindi lo mostro + if show_dynamically: + _show_button(event) + + # comunico che il button è stato premuto + emit_signal("down", self) + # quindi gestisco il fire (e l'autofire) + fire() + +# l'utente ha sollevato il dito con cui aveva toccato il button o la sua area +func handle_up_event(event, finger): + # se il button è disabilitato esco senza fare nulla (prima però resetto i dati interni) + if disabled: + is_pressed = false + button.pressed = false + return + # altrimenti imposto i dati del tocco in modo che possano essere recuperati da fuori + finger_data = finger + # se il button deve essere visualizzato dinamicamente vuol dire che in questo momento è visibile e quindi lo nascondo + if show_dynamically: + _hide_button() + + # gestisco la fine del fire (e dell'autofire) + fire_stop() + # comunico che il button è stato rilasciato + emit_signal("up", self) + +# l'utente ha spostato il dito con cui aveva toccato il button o la sua area +func handle_move_event(event, finger): + # non faccio nulla + pass +# if disabled: return + +func _on_AutofireTimer_timeout(): + # il timer dell'autofire, semplicemente emette segnali fire all'intervallo stabilito, continuamente + emit_signal("fire", self) + +# gestione del fire (può essere richiamata anche esternamente) +func fire(): + if disabled: + # proprio perchè questa funzione può essere richiamata anche esternamente, + # se il button è disabilitato esco senza fare nulla (prima però resetto i dati interni) + is_pressed = false + button.pressed = false + return + # imposto lo stato di premuto + button.pressed = true + is_pressed = true + # emetto il segnale fire + emit_signal("fire", self) + # e se l'autofire è impostato (ovvero se il suo delay è > 0) + if autofire_delay > 0: + # avvio il timer per l'autofire + timer.wait_time = autofire_delay + timer.start() + +# gestione della fine del fire (può essere richiamata anche esternamente) +func fire_stop(): + # resetto lo stato interno + button.pressed = false + is_pressed = false + # se il timer dell'autofire era partito, lo arresto + timer.stop() + +# mostra il button +func _show_button(event): + # se event è diverso dal null (nel caso in l'utente tocca il button o la sua area) calcolo la posizione + # in base a quella passata nell'evento + if shown: return + shown = true + if event: + rect_global_position = event.position - center_point + else: + # altrimenti la posizione del button è quella statica impostata in static_position + rect_position = static_position + # avvio l'animazione di visualizzazione + if fader: + fader.stop() + fader.play("fade_in", -1, 10) + +# nasconde il button +func _hide_button(): + if !shown: return + shown = false + # avvia l'animazione di nascondimento + if fader: + fader.stop() + fader.play("fade_out", -1, 10) + +###[ SETTER/GETTER ]############################################################################################# + +func _get_texture_normal(): + return $ButtonFace.texture_normal + +func _set_texture_normal(value): +# if !has_node("ButtonFace"): return + $ButtonFace.texture_normal = value + +func _get_texture_pressed(): + return $ButtonFace.texture_pressed + +func _set_texture_pressed(value): +# if !has_node("ButtonFace"): return + $ButtonFace.texture_pressed = value + +func _get_texture_disabled(): + return $ButtonFace.texture_disabled + +func _set_texture_disabled(value): +# if !has_node("ButtonFace"): return + $ButtonFace.texture_disabled = value + +func _set_disabled(value): + disabled = value +# if !has_node("ButtonFace"): return + $ButtonFace.disabled = value + +func _set_show_dynamically(value): + show_dynamically = value + # se sono nell'editor non faccio nulla (altrimenti mi verrebbe nascosto l'oggetto anche dall'editor) + if Engine.editor_hint: return + if value: + _hide_button() + else: + _show_button(null) + +###[ END ]####################################################################################################### \ No newline at end of file diff --git a/addons/Gamepad/GamepadButtonTemplate.tscn b/addons/Gamepad/GamepadButtonTemplate.tscn new file mode 100644 index 0000000..89f6a6f --- /dev/null +++ b/addons/Gamepad/GamepadButtonTemplate.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://assets/Gamepad/big_circle.png" type="Texture" id=1] +[ext_resource path="res://assets/Gamepad/small_circle.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] + +resource_name = "fade_in" +length = 1.0 +loop = false +step = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath("ButtonFace:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] +} + +[sub_resource type="Animation" id=2] + +resource_name = "fade_out" +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath("ButtonFace:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[node name="GamepadButtonTemplate" type="Control" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 192.0 +margin_bottom = 192.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +_sections_unfolded = [ "Hint", "Rect", "Size Flags" ] + +[node name="ButtonFace" type="TextureButton" parent="." index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +focus_mode = 2 +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +toggle_mode = true +action_mode = 0 +enabled_focus_mode = 2 +shortcut = null +group = null +texture_normal = ExtResource( 1 ) +texture_pressed = ExtResource( 2 ) +expand = true +_sections_unfolded = [ "Size Flags", "Textures", "Visibility" ] + +[node name="AutofireTimer" type="Timer" parent="." index="1"] + +process_mode = 1 +wait_time = 1.0 +one_shot = false +autostart = false + +[node name="ShowHideAnimation" type="AnimationPlayer" parent="." index="2"] + +root_node = NodePath("..") +autoplay = "" +playback_process_mode = 1 +playback_default_blend_time = 0.0 +playback_speed = 1.0 +anims/fade_in = SubResource( 1 ) +anims/fade_out = SubResource( 2 ) +blend_times = [ ] + + diff --git a/addons/Gamepad/GamepadContainer.gd b/addons/Gamepad/GamepadContainer.gd new file mode 100644 index 0000000..bf1c5f3 --- /dev/null +++ b/addons/Gamepad/GamepadContainer.gd @@ -0,0 +1,163 @@ +###[ INFO ]###################################################################################################### + +# Component: GamepadContainer +# Author: Francesco Iafulli (fiaful) +# E-mail: fiaful@hotmail.com +# Version: 1.0 +# Last modify: 2018-07-20 + +# What is this: +# E' il nodo che andrà a contenere tutti gli oggetti che costruiranno il gamepad. +# Di fatto, è l'oggetto che cattura l'input multitouch sullo schermo, legando ogni touch ad uno specifico oggetto +# del gamepad. + +# Requirements: +# - l'area di questo oggetto deve essere estesa a tutta la zone che si vuole rendere sensibile al tocco +# - tutti gli oggetti appartenenti al gamepad dovranno essere contenuti in questo oggetto + +# To do: +# - gestire lo scroll sugli assi x e y +# - gestire lo swipe sugli assi x e y +# - gestire lo zoom-in e zoom-out (pinch in/out) + +# Changelog: +# +# + +###[ BEGIN ]##################################################################################################### + +extends Control + +###[ EXPORTED VARIABLES ]######################################################################################## + +# indica se l'intero gamepad deve essere disabilitato (se true, nessuno degli oggetti contenuti riceverà i tocchi +# dell'utente +export var disabled = false + +###[ SIGNALS ]################################################################################################### + +# viene emesso quando avviene un qualsiasi tocco (in caso di più tocchi simultanei, viene emesso per ogni tocco) +signal finger_down(finger_data) +# viene emesso quando qualsiasi tocco ha fine (in caso di fine di più tocchi simultanei, viene emesso per ogni tocco) +signal finger_up(finger_data) +# viene emesso quando qualsiasi dito si muove sullo schermo (in caso di movimento di più dita, viene emesso per ogni dito) +signal finger_move(finger_data) + +# Nota: finger_data è un oggetto, di tipo finger, che mantiene le informazioni su cosa è accaduto. +# la classe Finger è definita in fondo a questo file + +###[ PRIVATE AND PUBLIC VARIABLES ]############################################################################## + +# mantiene un elenco (in forma di dizionario dove la chiave è l'indice del tocco) di tutti i tocchi attualmente attivi +var fingers = {} + +###[ METHODS ]################################################################################################### + +func _input(event): + # se il contenitore è disabilitato, non faccio nulla + if disabled: + return + # se l'evento è un tocco premuto + if event is InputEventScreenTouch: + if event.is_pressed(): + # creo, se non esistente (altrimenti l'aggiorna), una nuova voce Finger nel dizionario + fingers[event.index] = Finger.new() + # impostandone i dati di base (indice, l'oggetto su cui è avvenuto il tocco, la posizione del tocco) + fingers[event.index].set_finger(event.index, _find_object_by_position(event), event.position) + # emetto il segnale del tocco avvenuto + emit_signal("finger_down", fingers[event.index]) + # se il dito ha premuto lo schermo su un oggetto del gamepad, propago l'evento a quell'oggetto + if fingers[event.index].object: + fingers[event.index].object.handle_down_event(event, fingers[event.index]) + else: + # mentre se l'evento è un tocco rilasciato ed era stato memorizzato + if fingers.has(event.index): + # imposto le informazioni sul dito dicendo che non è più premuto + fingers[event.index].pressed = false + # ed emetto il segnale di dito rilasciato, passando tutte le informazioni raccolte finora + emit_signal("finger_up", fingers[event.index]) + # se il dito era premuto su un oggetto del gamepad, comunico a quell'oggetto che il dito è stato sollevato + if fingers[event.index].object: + fingers[event.index].object.handle_up_event(event, fingers[event.index]) + # dunque pulisco le informazioni del dito dal dizionario in modo che possano essere reinserire se necessario + fingers[event.index].reset_finger() + fingers.erase(event.index) + + # se invece l'evento è un trascinamento del dito + if event is InputEventScreenDrag: + # controllo di avere le informazioni per quel dito e, se ce l'ho, + if fingers.has(event.index): + # aggiorno le informazioni sulla posizione + fingers[event.index].position = event.position + # ed emetto il segnale di spostamento del dito + emit_signal("finger_move", fingers[event.index]) + # quindi se al dito era associato un oggetto del gamepad, comunico lo spostamento a quell'oggetto + if fingers[event.index].object: + fingers[event.index].object.handle_move_event(event, fingers[event.index]) + + # se l'evento è un'azione della tastiera (pressione o rilascio di tasti) + if event is InputEventKey: + # propago l'evento + for child in get_children(): + # a tutti i figli di tipo gamepad + if "gamepad_type" in child: + child.handle_input(event) + +# questa funzione verifica se alle date coordinate (estratte dall'evento), è presente un oggetto del gamepad. +# se è presente, lo ritorna, altrimenti restituisce null +func _find_object_by_position(event): + for child in get_children(): + if "gamepad_type" in child and child.get_global_rect().has_point(event.position): + return child + return null + + +###[ THE FINGER CLASS ]########################################################################################## + +class Finger: + +# What is this +# Questa classe è un contenitore di dati per le informazioni del dito + +###[ PRIVATE AND PUBLIC VARIABLES ]############################################################################## + + # contiene l'indice del tocco, + var index = -1 + # il tipo dell'oggetto su cui il tocco è avvenuto (UNKNOWN è se il tocco non ha sotto di sè oggetti del gamepad) + # il suo valore è dato dalla proprietà gamepad_type dell'oggetto del gamepad su cui è avvenuto il tocco + var type = "UNKNOWN" + # se il dito è premuso sullo schermo oppure no + var pressed = false + # la posizione del tocco + var position = Vector2() + # l'oggetto collegato al dito + var object = null + +###[ METHODS ]################################################################################################### + + func set_finger(_index, _object, _position, _type=""): + index = _index + type = _type if _type else _object.gamepad_type if _object else "UNKNOWN" + pressed = true + position = _position + object = _object + + func reset_finger(): + index = -1 + type = "UNKNOWN" + pressed = false + position.x = -1 + position.y = -1 + object = null + + func to_string(): + var d = { + "index": index, + "type": type, + "pressed": pressed, + "position": position, + "object": object + } + return str(d) + +###[ END ]####################################################################################################### \ No newline at end of file diff --git a/addons/Gamepad/GamepadPaddle.gd b/addons/Gamepad/GamepadPaddle.gd new file mode 100644 index 0000000..003f15e --- /dev/null +++ b/addons/Gamepad/GamepadPaddle.gd @@ -0,0 +1,408 @@ +###[ INFO ]###################################################################################################### + +# Component: GamepadPaddle +# Author: Francesco Iafulli (fiaful) +# E-mail: fiaful@hotmail.com +# Version: 1.0 +# Last modify: 2018-07-20 + +# What is this: +# E' l'oggetto che consente di gestire paddle virtuali analogici (la paddle è un controller che ruota su se stesso, +# come ad esempio il volante di una automobile). +# Possono essere aggiunti nel contenitore quanti paddle si desideri (generalmente 1 o 2) + +# Requirements: +# - il parent di questo nodo deve essere di tipo GamepadArea se si desidera utilizzare la proprietà show_dinamically +# per far apparire la paddle dinamicamente alla posizione della pressione del dito sullo schermo. Il suo parent +# può essere di tipo GamepadContainer se la paddle è sempre visibile sullo schermo ad una posizione fissa. +# - deve comunque essere contenuto (direttamente o indirettamente) in un nodo di tipo GamepadContainer, altrimenti +# non funzionerà +# - la texture di sfondo della paddle deve essere quadrata altrimenti si verificheranno problemi di visualizzazione +# a runtime (vedere le immagini di esempio nella cartella assets/Gamepad) +# - se la paddle deve essere sempre visibile in una posizione fissa, è necessario valorizzare questa posizione nella +# proprietà static_position. + +# Changelog: +# +# + +###[ BEGIN ]##################################################################################################### + +tool +extends Control + +###[ CONSTS ]#################################################################################################### + +# contiene un valore per definire un angolo non valido +const INVALID_ANGLE = -99 + +###[ INTERNAL OBJECTS ]########################################################################################## + +# texture di sfondo della paddle +onready var bg = $PaddleBackground + +# texture del centro della paddle +onready var paddle = $Paddle + +# animazione di visualizzazione/nascondimento della paddle +onready var fader = $ShowHideAnimation + +onready var timer = $Timer + +###[ EXPORTED VARIABLES ]######################################################################################## + +# indica se la paddle deve essere disabilitata (se true, la paddle non riceverà i tocchi dell'utente) +export var disabled = false + +# indica se la paddle deve essere staticamente sempre visualizzata (false) o se questa deve apparire nascosta e +# mostrarsi (true) quando l'utente tocca la sua area (in questo caso deve essere contenuta in un oggetto di tipo +# GamepadArea) +export var show_dynamically = false setget _set_show_dynamically + +# questa proprietà contiene il nome dell'oggetto (che viene restituito nell'oggetto finger) +export var gamepad_type = "PADDLE 0" + +# texture di sfondo della paddle +export(Texture) var background_texture setget _set_bg_texture, _get_bg_texture + +# texture del centro della paddle +export(Texture) var paddle_texture setget _set_texture, _get_texture + +# scala della texture del centro della paddle (la dimensione dello sfondo è data dal rect_size dell'oggetto, +# quindi per impostare la dimensione del centro della paddle si usa questa proprietà) +export(Vector2) var paddle_scale setget _set_scale, _get_scale + +# contiene la reale posizione della paddle +export var static_position = Vector2(0, 0) + +# questa proprietà indica la forza minima da imporre alla paddle per iniziare a considerare validi +# i valori (es. con un valore = 0.5, la paddle inizierà a ruotare solo se l'utente toccherà l'oggetto +# su oltre la metà della distanza tra il centro della paddle ed il bordo) +export var valid_threshold = 0.2 + +# se impostato a true, il rilascio della paddle resetterà i valori e la posizione della paddle, mentre +# se impostato a false, al rilascio i valori e la posizione resteranno gli ultimi validi +export var reset_on_release = true + +# impone un limite inferiore alla rotazione della paddle (limite inferiore e superiore possono essere invertiti) +export var low_limit = 0 + +# impone un limite alto alla rotazione della paddle (limite inferiore e superiore possono essere invertiti) +export var high_limit = 0 + +# per utilizzare uniformemente gli oggetti anche in presenza di tastiera, consento di associare +# direttamente degli input map per ruotare la paddle in senso antiorario e orario +export var simulate_counter_clockwise = "ui_left" +export var simulate_clockwise = "ui_right" + +# in caso di simulazione con la tastiera, indica lo step di incremento/decremento dell'angolo +export var simulation_increment = 0.05 + +# in caso di simulazione con la tastiera, indica la velocità di incremento/decremento dell'angolo +export var simulation_delay = 0.01 + +###[ PRIVATE AND PUBLIC VARIABLES ]############################################################################## + +# centro della paddle (ovvero dello sfondo della paddle) +var center_point = Vector2(0,0) + +# forza calcolata dal centro della paddle (serve per calcolare l'angolo) +var current_force = Vector2(0,0) + +# metà della dimensione dello sfondo della paddle +var half_size = Vector2() + +# area del rettangolo costituito da metà delle dimensioni dello sfondo +var squared_half_size_length = 0 + +# indica se l'angolo di rotazione della paddle si trova all'interno o all'esterno dei limiti imposti +var into_limits = false + +# i dati del tocco (in modo che possano essere recuperati negli eventi) +var finger_data = null + +# angolo di rotazione della paddle +var angle = -1 + +# indica se sto ruotando la paddle con i tasti della tastiera oppure no +var simulation = false + +# ultimo angolo calcolato (serve per emettere i segnali solo se l'angolo corrente è diverso da quello precedente) +var last_angle = INVALID_ANGLE + +# mantiene lo stato della visualizzazione dinamica +var shown = true + +# indica la direzione di rotazione nel caso di simulazione con la tastiera +var direction = 0 + +###[ SIGNALS ]################################################################################################### + +# viene emesso quando la paddle ruota, restituendo l'angolo di rotazione e l'oggetto paddle stesso (in modo da +# poter recuperare altre informazioni (qualsiasi proprietà dell'oggetto) +signal angle_changed(current_angle, sender) + +# viene emesso quando l'utente rilascia il dito dalla paddle (l'angolo sarà sempre invalido, pertanto è inutile +# passare il sender) +signal paddle_released + +###[ METHODS ]################################################################################################### + +# costruisce l'albero dei nodi necessari all'oggetto prendendoli dal template +func _init(): + # se non sono già stati caricati + if get_child_count() > 0: return + # carico e istanzio il template + var gamepad_paddle_template = load("res://addons/Gamepad/GamepadPaddleTemplate.tscn").instance() + # quindi se ci sono oggetti nel template (ovviamente si) + if gamepad_paddle_template.get_child_count() > 0: + # prendo ogni oggetto nel template + for child in gamepad_paddle_template.get_children(): + # se l'oggetto è il timer + if child is Timer: + # ne creo il duplicato + var tmr = child.duplicate() + # lo aggiungo al mio nodo + add_child(tmr) + tmr.wait_time = simulation_delay + # connetto il suo segnale timeout allo script + tmr.connect("timeout", self, "_on_timer_timeout") + else: + # aggiungo un duplicato al mio nodo + add_child(child.duplicate()) + +func _ready(): + # se l'oggetto deve essere visualizzato dinamicamente (ovvero solo quando l'utente tocca lo schermo) lo nascondo + if show_dynamically: + _hide_paddle() + # imposto la sua posizione statica (non ha senso se visualizzato dinamicamente in quanto la sua posizione + # varierà in base al tocco dell'utente) + rect_position = static_position + # ricavo i restanti valori che mi serviranno più avanti per fare i calcoli + half_size = bg.rect_size / 2 + center_point = half_size + paddle.position = half_size + squared_half_size_length = half_size.x * half_size.y + +# emula la paddle tramite i tasti +func handle_input(event): + if event is InputEventKey: + if !((simulate_counter_clockwise and event.is_action(simulate_counter_clockwise)) or \ + (simulate_clockwise and event.is_action(simulate_clockwise))): return + else: + return + # verifica quale tasto è stato premuto + var cnt = simulate_counter_clockwise and Input.is_action_pressed(simulate_counter_clockwise) + var clk = simulate_clockwise and Input.is_action_pressed(simulate_clockwise) + simulation = false + # se nessuna delle 2 direzioni è premuta, azzero l'angolo e sollevo l'evento di rilascio + if !cnt and !clk: + # fermo il timer che si occupa di far ruotare la paddle + timer.stop() + handle_up_event(null, null) + else: + # imposto la direzione di rotazione + if cnt: + clk = false + direction = -simulation_increment + elif clk: + cnt = false + direction = simulation_increment + # ed avvio il timer che si occuperà di far ruotare la paddle + timer.start() + +func _on_timer_timeout(): + # inizializza la posizione del'oggetto + var ev = InputEventScreenTouch.new() + ev.position = get_parent().rect_global_position + static_position + half_size + simulation = true + + # incrementa/decrementa l'angolo + angle += direction + + # se l'angolo è diverso dal precedente + if angle != last_angle: + last_angle = angle + # simulo la rotazione della paddle + handle_down_event(ev, null) + +# l'utente ha toccato lo schermo in corrispondenza della paddle o dell'area che contiene la paddle +func handle_down_event(event, finger): + # se la paddle è disabilitata esco senza fare nulla (prima però resetto i dati interni) + if disabled: + reset() + return + # altrimenti imposto i dati del tocco in modo che possano essere recuperati da fuori + finger_data = finger + # se la paddle deve essere visualizzata dinamicamente vuol dire che in questo momento non è visibile e quindi la mostro + if show_dynamically: + _show_paddle(event) + + # se il tocco è avvenuto nella zona dello sfondo della paddle + if simulation or bg.get_global_rect().has_point(event.position): + # calcolo la forza e l'angolo, aggiorno la rotazione della paddle ed emetto il segnale + calculate(event) + else: + # altrimenti resetto tutti i dati e esco + reset() + +# l'utente ha sollevato il dito con cui aveva toccato la paddle o la sua area +func handle_up_event(event, finger): + # se la paddle è disabilitata esco senza fare nulla (prima però resetto i dati interni) + if disabled: + reset() + return + # altrimenti imposto i dati del tocco in modo che possano essere recuperati da fuori + finger_data = finger + # se la paddle deve essere visualizzata dinamicamente vuol dire che in questo momento è visibile e quindi la nascondo + if show_dynamically: + _hide_paddle() + + # resetto i dati interni + reset() + # quindi emetto il segnale per comunicare che la paddle è stata rilasciata + emit_signal("paddle_released") + +# l'utente ha spostato il dito con cui aveva toccato la paddle o la sua area +func handle_move_event(event, finger): + # se la paddle è disabilitata esco senza fare nulla (prima però resetto i dati interni) + if disabled: + reset() + return + # altrimenti imposto i dati del tocco in modo che possano essere recuperati da fuori + finger_data = finger + # calcolo la forza, l'angolo, aggiorno la rotazione della paddle ed emetto il segnale + calculate(event) + +# calcolo la forza, l'angolo, aggiorno la rotazione della paddle ed emetto il segnale +func calculate(event): + # ricalcolo la posizione dell'evento in modo che lo 0,0 coincida con lo 0,0 dell'oggetto + if !simulation: + var pos = event.position - rect_global_position + calculate_force(pos) + update_paddle_pos() + emit() + +func calculate_force(pos): +# print ("pos: ", pos, " - center_point: ", center_point, " - half_size: ", half_size) + # calcolo la forza in relazione alla posizione del mouse e il centro della paddle, e la normalizzo + current_force.x = (pos.x - center_point.x) / half_size.x + current_force.y = (pos.y - center_point.y) / half_size.y + if current_force.length_squared() > 1: + current_force = current_force / current_force.length() + # quindi se la forza è minore della soglia di validità, resituisco 0,0 (per comunicare che + # non è stato effettuato uno spostamento valido del centro della paddle) + if (current_force.length() < valid_threshold): + current_force = Vector2(0,0) + +# aggiorno la rotazione della paddle in modo che graficamente sia coerente +func update_paddle_pos(): + var new_angle + if !simulation: + var x = center_point.x + half_size.x * current_force.x + var y = center_point.y + half_size.y * current_force.y + new_angle = Vector2(x, y).angle_to_point(center_point) + else: + new_angle = angle + # quindi verifico che il nuovo angolo sia nei limiti + into_limits = false + var deg_angle = rad2deg(new_angle) + 180 +# print ([deg_angle, low_limit, high_limit]) + # se low_limit e high_limit sono uguali non devo imporre limiti, ovvero sono sempre nei limiti + if low_limit != high_limit: + if low_limit > high_limit: + if deg_angle <= high_limit: + into_limits = true + if deg_angle >= low_limit: + if deg_angle >= high_limit: + into_limits = true + else: + if deg_angle <= high_limit and deg_angle >= low_limit: + into_limits = true + else: + into_limits = true + + # se sono nei limiti, imposto il nuovo angolo ed aggiorno la rotazione della paddle + if into_limits: + angle = new_angle + paddle.rotation = angle + +# solo se reset_on_release = true (vedi commento) effettuo un reset dei dati interni, +# imposto l'angolo della paddle ad un valore invalido e ne aggiorno graficamente la rotazione +func reset(): + if !reset_on_release: return + calculate_force(center_point) + update_paddle_pos() + angle = INVALID_ANGLE + last_angle = angle +# emit() + +# emette il segnale per comunicare il cambiamento dell'angolo della paddle +func emit(): + if into_limits: + emit_signal("angle_changed", angle, self) +# print (angle / PI * 180) +# print (rad2deg(angle) + 180) + +# mostra la paddle +func _show_paddle(event): + # se event è diverso dal null (nel caso in l'utente tocca la paddle o la sua area) calcolo la posizione + # in base a quella passata nell'evento + if shown: return + shown = true + if event: + rect_global_position = event.position - center_point + else: + # altrimenti la posizione della paddle è quella statica impostata in static_position + rect_position = static_position + # avvio l'animazione di visualizzazione + if fader: + reset() + fader.stop() + fader.play("fade_in", -1, 10) + +# nasconde la paddle +func _hide_paddle(): + if !shown: return + shown = false + # avvia l'animazione di nascondimento + if fader: + fader.stop() + fader.play("fade_out", -1, 10) + +###[ SETTER/GETTER ]############################################################################################# + +func _get_scale(): + return $Paddle.scale + +func _set_scale(value): +# if !has_node("Paddle"): return + $Paddle.scale = value + $Paddle.position = $PaddleBackground.rect_size / 2 + +func _get_bg_texture(): + return $PaddleBackground.texture + +func _set_bg_texture(value): +# if !has_node("PaddleBackground"): return + $PaddleBackground.texture = value + $Paddle.position = $PaddleBackground.rect_size / 2 + +func _get_texture(): + return $Paddle.texture + +func _set_texture(value): +# if !has_node("PaddleBackground"): return + $Paddle.texture = value + $Paddle.position = $PaddleBackground.rect_size / 2 + +func _set_show_dynamically(value): + show_dynamically = value + # se sono nell'editor non faccio nulla (altrimenti mi verrebbe nascosto l'oggetto anche dall'editor) + if Engine.editor_hint: return + if value: + _hide_paddle() + else: + _show_paddle(null) + +###[ END ]####################################################################################################### \ No newline at end of file diff --git a/addons/Gamepad/GamepadPaddleTemplate.tscn b/addons/Gamepad/GamepadPaddleTemplate.tscn new file mode 100644 index 0000000..11f458f --- /dev/null +++ b/addons/Gamepad/GamepadPaddleTemplate.tscn @@ -0,0 +1,125 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://assets/Gamepad/big_circle.png" type="Texture" id=1] +[ext_resource path="res://assets/Gamepad/small_circle.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] + +resource_name = "fade_in" +length = 1.0 +loop = false +step = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath("PaddleBackground:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Paddle:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] +} + +[sub_resource type="Animation" id=2] + +resource_name = "fade_out" +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath("PaddleBackground:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Paddle:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[node name="GamepadPaddleTemplate" type="Control" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 256.0 +margin_bottom = 256.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +_sections_unfolded = [ "Rect", "Size Flags" ] + +[node name="PaddleBackground" type="TextureRect" parent="." index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 1 ) +expand = true +stretch_mode = 0 +_sections_unfolded = [ "Size Flags", "Visibility" ] + +[node name="Paddle" type="Sprite" parent="." index="1"] + +position = Vector2( 128, 128 ) +texture = ExtResource( 2 ) +_sections_unfolded = [ "Transform", "Visibility" ] + +[node name="ShowHideAnimation" type="AnimationPlayer" parent="." index="2"] + +root_node = NodePath("..") +autoplay = "" +playback_process_mode = 1 +playback_default_blend_time = 0.0 +playback_speed = 1.0 +anims/fade_in = SubResource( 1 ) +anims/fade_out = SubResource( 2 ) +blend_times = [ ] + +[node name="Timer" type="Timer" parent="." index="3"] + +process_mode = 1 +wait_time = 1.0 +one_shot = false +autostart = false + + diff --git a/addons/Gamepad/GamepadStick.gd b/addons/Gamepad/GamepadStick.gd new file mode 100644 index 0000000..b67a9dd --- /dev/null +++ b/addons/Gamepad/GamepadStick.gd @@ -0,0 +1,546 @@ +###[ INFO ]###################################################################################################### + +# Component: GamepadStick +# Author: Francesco Iafulli (fiaful) +# E-mail: fiaful@hotmail.com +# Version: 1.0 +# Last modify: 2018-07-20 + +# What is this: +# E' l'oggetto che consente di gestire stick virtuali, analogici o digitali. +# Possono essere aggiunti nel contenitore quanti stick si desideri (generalmente 1 o 2) +# Esistono diversi tipi di stick: +# - analogici: +# restituiscono un vettore 2D forza contenente valori che vanno da 0 a 1 (positivi per le direzioni +# destra e basso, e negativi per le direzioni sinistra e alto) dipendenti dalla distanza dello stick +# dal suo centro. +# Stick analogici sono: +# - ANALOG (consentono qualsiasi direzione) +# - LEFT/RIGHT (consentono lo spostamento solo in orizzontale - l'asse y avrà sempre valore 0) +# - UP/DOWN (consentono lo spostamento solo in verticale - l'asse x avrà sempre valore 0) +# +# - digitali: +# restituiscono un vettore 2D digitale, ovvero i valori di x e y possono valere solo 0, 1, e -1 +# a seconda della direzione (positivi per le direzioni destra e basso, e negativi per le direzioni +# sinistra e alto). +# Stick digitali sono: +# - DIGITAL 8 (consente lo spostamento dello stick nelle 8 direzioni digitali (su, giù, sinistra, +# destra, e relative diagonali) +# - DIGITAL 4 PLUS (consente lo spostamento nelle sole 4 direzioni principali disposte cardinalmente +# (su, giù, destra, e sinistra) +# - DIGITAL 4 X (consente lo spostamento nelle 4 direzioni diagonali (alto-sinistra, alto-destra, +# basso-sinistra, e basso destra) +# - DIGITAL 4 ISO (è come il DIGITAL 4 X ma consente di modificare alcuni parametri particolari per +# visualizzare lo stick in maniera isometrica) +# +# La direzione corrente, nel caso di stick digitali, viene restituita anche in una lista di nome direction in cui +# è possibile verificare se una data direzione è presente (es.: if sender.UP in sender.direction: ) +# +# Nota: è possibile tramutare gli analogici LEFT/RIGHT e UP/DOWN in digitali impostando la proprietà step = 1 + +# Requirements: +# - il parent di questo nodo deve essere di tipo GamepadArea se si desidera utilizzare la proprietà show_dinamically +# per far apparire lo stick dinamicamente alla posizione della pressione del dito sullo schermo. Il suo parent +# può essere di tipo GamepadContainer se lo stick è sempre visibile sullo schermo ad una posizione fissa. +# - deve comunque essere contenuto (direttamente o indirettamente) in un nodo di tipo GamepadContainer, altrimenti +# non funzionerà +# - la texture di sfondo dello stick deve essere comunque quadrata (width == height), anche nel caso di LEFT/RIGHT, +# UD/DOWN, o DIGITAL 4 ISO, altrimenti si verificheranno problemi di visualizzazione a runtime (vedere le +# immagini di esempio nella cartella assets/Gamepad) +# - se lo stick deve essere sempre visibile in una posizione fissa, è necessario valorizzare questa posizione nella +# proprietà static_position. + +# To do: +# - inserire un flag per invertire l'asse y +# - provare a gestire l'analogico da tastiera come nella paddle + +# Changelog: +# +# + +###[ BEGIN ]##################################################################################################### + +tool +extends Control + +###[ CONSTS ]#################################################################################################### + +# contiene un valore per definire un angolo non valido +const INVALID_ANGLE = -99 + +###[ ENUMS ]##################################################################################################### + +# consente di specificare che tipo di stick si intende gestire +enum STICK_TYPE { _ANALOG, _DIGITAL_8, _DIGITAL_4_PLUS, _DIGITAL_4_X, _DIGITAL_4_ISO, _LEFT_RIGHT, _UP_DOWN } + +# contiene le quattro direzioni fondamentali, utilizzato per valorizzare la lista delle direzioni digitali direction +enum DIGITAL_DIRECTIONS { UP, LEFT, DOWN, RIGHT } + +###[ INTERNAL OBJECTS ]########################################################################################## + +# texture di sfondo dello stick +onready var bg = $StickBackground + +# texture del centro dello stick +onready var stick = $Stick + +# animazione di visualizzazione/nascondimento dello stick +onready var fader = $ShowHideAnimation + +###[ EXPORTED VARIABLES ]######################################################################################## + +# indica se lo stick deve essere disabilitato (se true, lo stick non riceverà i tocchi dell'utente) +export var disabled = false + +# indica se lo stick deve essere staticamente sempre visualizzato (false) o se questo deve apparire nascosto e +# mostrarsi (true) quando l'utente tocca la sua area (in questo caso deve essere contenuto in un oggetto di tipo +# GamepadArea) +export var show_dynamically = false setget _set_show_dynamically + +# questa proprietà contiene il nome dell'oggetto (che viene restituito nell'oggetto finger) +export var gamepad_type = "STICK 0" + +# indica il tipo dello stick (fare riferimento alla documentazione in alto e all'enum STICK_TYPE) +export(STICK_TYPE) var stick_type = STICK_TYPE._ANALOG + +# texture di sfondo dello stick +export(Texture) var background_texture setget _set_bg_texture, _get_bg_texture + +# texture del centro dello stick +export(Texture) var stick_texture setget _set_texture, _get_texture + +# scala della texture del centro dello stick (la dimensione dello sfondo è data dal rect_size dell'oggetto, +# quindi per impostare la dimensione del centro dello stick si usa questa proprietà) +export(Vector2) var stick_scale setget _set_scale, _get_scale + +# contiene la reale posizione dello stick +export var static_position = Vector2(0, 0) + +# indica se il centro dello stick deve essere nascosto (true) o meno se esso si trova al centro dell'oggetto +# (ovvero se la sua forza = 0) +export var hide_stick_on_stop = false + +# questa proprietà è da utilizzarsi solo se lo stick è di tipo DIGITAL 4 ISO e serve ad indicare di quanti +# pixel deve essere spostato il centro dello stick se si trova nelle posizioni diagonali alte +export var adjust_iso = 0 + +# questa proprietà indica la forza minima da imporre al centro dello stick per iniziare a considerare validi +# i valori (es. con un valore = 0.5, il centro dello stick non si sposterà fino a quando non sarà raggiunto +# almeno la metà della distanza tra il centro dello stick ed il bordo) +export var valid_threshold = 0.2 + +# consente di restituire i valori analogici arrotondati per step +# (es.: con un valore = 0.25, lo stick restituirà come forze i soli valori 0, 0.25, 0.5, 0.75, 1) +export var step = 0.0 + +# per utilizzare uniformemente gli oggetti anche in presenza di tastiera, consento di associare +# direttamente degli input map alle direzioni +# Attenzione: la simulazione non funzionerà correttamente con stick analogici +export var simulate_up = "ui_up" +export var simulate_left = "ui_left" +export var simulate_down = "ui_down" +export var simulate_right = "ui_right" + +###[ PRIVATE AND PUBLIC VARIABLES ]############################################################################## + +# centro dello stick (ovvero dello sfondo dello stick) +var center_point = Vector2(0,0) + +# ultima forza calcolata (serve per emettere i segnali solo se la forza corrente è diversa da quella precedente) +var last_force = Vector2(0,0) + +# forza calcolata dal centro dello stick (oppure i valori digitali nel caso di stick digitali) +var current_force = Vector2(0,0) + +# metà della dimensione dello sfondo dello stick +var half_size = Vector2() + +# metà della dimensione del centro dello stick +var half_stick = Vector2() + +# posizione del centro dello stick +var stick_pos = Vector2() + +# area del rettangolo costituito da metà delle dimensioni dello sfondo +var squared_half_size_length = 0 + +# i dati del tocco (in modo che possano essere recuperati negli eventi) +var finger_data = null + +# angolo tra la posizione del centro dello stick e l'asse x +var angle = -1 + +# lista delle direzioni digitali in cui si trova lo stick +var direction = [] + +# indica se sto simulando lo stick con i tasti della tastiera oppure no +var simulation = false + +# mantiene lo stato della visualizzazione dinamica +var shown = true + +###[ SIGNALS ]################################################################################################### + +# viene emesso quando lo stick si muove, restituendo il vettore della forza (se analogico altrimento valori 0, 1, +# -1 se digitale) e l'oggetto stick stesso (in modo da poter recuperare altre informazioni come l'angolo, le +# direzioni, i dati del tocco, o qualsiasi altra proprietà dell'oggetto) +signal gamepad_force_changed(current_force, sender) + +# viene emesso quando l'utente rilascia il dito dallo stick (la forza sarà sempre 0, l'angolo sarà sempre invalido, +# e la lista delle direzioni sarà sempre vuota, pertanto è inutile passare il sender) +signal gamepad_stick_released + +###[ METHODS ]################################################################################################### + +# costruisce l'albero dei nodi necessari all'oggetto prendendoli dal template +func _init(): + # se non sono già stati caricati + if get_child_count() > 0: return + # carico e istanzio il template + var gamepad_stick_template = load("res://addons/Gamepad/GamepadStickTemplate.tscn").instance() + # quindi se ci sono oggetti nel template (ovviamente si) + if gamepad_stick_template.get_child_count() > 0: + # prendo ogni oggetto nel template + for child in gamepad_stick_template.get_children(): + # e ne aggiungo un duplicato al mio nodo + add_child(child.duplicate()) + +func _ready(): + # se l'oggetto deve essere visualizzato dinamicamente (ovvero solo quando l'utente tocca lo schermo) lo nascondo + if show_dynamically: + _hide_stick() + # imposto la sua posizione statica (non ha senso se visualizzato dinamicamente in quanto la sua posizione + # varierà in base al tocco dell'utente) + rect_position = static_position + # ricavo i restanti valori che mi serviranno più avanti per fare i calcoli + half_size = bg.rect_size / 2 + center_point = half_size + stick.position = half_size + half_stick = (stick.texture.get_size() * stick.scale) / 2 + squared_half_size_length = half_size.x * half_size.y + +# emula lo stick tramite i tasti +func handle_input(event): + if event is InputEventKey: + if !((simulate_up and event.is_action(simulate_up)) or \ + (simulate_down and event.is_action(simulate_down)) or \ + (simulate_left and event.is_action(simulate_left)) or \ + (simulate_right and event.is_action(simulate_right))): return + else: + return + + var ev + # verifica quale tasto è stato premuto + var up = simulate_up and Input.is_action_pressed(simulate_up) + var down = simulate_down and Input.is_action_pressed(simulate_down) + var left = simulate_left and Input.is_action_pressed(simulate_left) + var right = simulate_right and Input.is_action_pressed(simulate_right) + simulation = false + # se nessuna delle 4 direzioni è premuta, azzero la forza così che verrà sollevato l'evento di rilascio + if !up and !down and !left and !right: + current_force = Vector2(0, 0) + else: + # se almeno una delle 4 direzioni è premuta, inizializza la posizione del'oggetto + ev = InputEventScreenTouch.new() + ev.position = get_parent().rect_global_position + static_position + half_size + simulation = true + + # se lo stick è di qualsiasi tipo tranne un DIGITAL 4 diagonale + if stick_type != STICK_TYPE._DIGITAL_4_X and stick_type != STICK_TYPE._DIGITAL_4_ISO: + # imposto la forza al valore digitale corrispondente ai tasti premuti + current_force.x = -1 if left else 1 if right else 0 + current_force.y = -1 if up else 1 if down else 0 + else: + # altrimenti, se lo stick è di tipo DIGITAL 4 diagonale, decido io la forza in base al tasto premuto + if up: + down = false; left = false; right = false + current_force = Vector2(-1, -1) + elif left: + down = false; up = false; right = false + current_force = Vector2(-1, 1) + elif down: + up = false; left = false; right = false + current_force = Vector2(1, 1) + elif right: + down = false; left = false; up = false + current_force = Vector2(1, -1) + + # se la forza è diversa da 0 + if current_force.x != 0 or current_force.y != 0: + # ed è diversa dalla precedente + if last_force.x != current_force.x or last_force.y != current_force.y: + # simulo la pressione del dito sullo stick + handle_down_event(ev, null) + else: + # mentre se la forza è 0 ma la precedente non lo era, + if last_force.x != 0 or last_force.y != 0: + # simulo il rilascio del dito dallo stick + handle_up_event(ev, null) + +# l'utente ha toccato lo schermo in corrispondenza dello stick o dell'area che contiene lo stick +func handle_down_event(event, finger): + # se lo stick è disabilitato esco senza fare nulla (prima però resetto i dati interni) + if disabled: + reset() + return + # altrimenti imposto i dati del tocco in modo che possano essere recuperati da fuori + finger_data = finger + # se lo stick deve essere visualizzato dinamicamente vuol dire che in questo momento non è visibile e quindi lo mostro + if show_dynamically: + _show_stick(event) + + # se il tocco è avvenuto nella zona dello sfondo dello stick + if simulation or bg.get_global_rect().has_point(event.position): + # calcolo la forza, aggiorno la posizione del centro dello stick ed emetto il segnale + calculate(event) + else: + # altrimenti resetto tutti i dati e esco + reset() + +# l'utente ha sollevato il dito con cui aveva toccato lo stick o la sua area +func handle_up_event(event, finger): + # se lo stick è disabilitato esco senza fare nulla (prima però resetto i dati interni) + if disabled: + reset() + return + # altrimenti imposto i dati del tocco in modo che possano essere recuperati da fuori + finger_data = finger + # se lo stick deve essere visualizzato dinamicamente vuol dire che in questo momento è visibile e quindi lo nascondo + if show_dynamically: + _hide_stick() + + # resetto i dati interni + reset() + # quindi emetto il segnale per comunicare che lo stick è stato rilasciato + emit_signal("gamepad_stick_released") + +# l'utente ha spostato il dito con cui aveva toccato lo stick o la sua area +func handle_move_event(event, finger): + # se lo stick è disabilitato esco senza fare nulla (prima però resetto i dati interni) + if disabled: + reset() + return + # altrimenti imposto i dati del tocco in modo che possano essere recuperati da fuori + finger_data = finger + # calcolo la forza, aggiorno la posizione del centro dello stick ed emetto il segnale + calculate(event) + +# calcolo la forza, aggiorno la posizione del centro dello stick ed emetto il segnale +func calculate(event): + # ricalcolo la posizione dell'evento in modo che lo 0,0 coincida con lo 0,0 dell'oggetto + var pos = event.position - rect_global_position + calculate_force(pos) + update_stick_pos() + emit() + +func calculate_force(pos): +# print ("pos: ", pos, " - center_point: ", center_point, " - half_size: ", half_size) + if !simulation: + # calcolo la forza in relazione alla posizione del mouse e il centro dello stick, e la normalizzo + current_force.x = (pos.x - center_point.x) / half_size.x + current_force.y = (pos.y - center_point.y) / half_size.y + if current_force.length_squared() > 1: + current_force = current_force / current_force.length() + # quindi se la forza è minore della soglia di validità, resituisco 0,0 (per comunicare che + # non è stato effettuato uno spostamento valido del centro dello stick) + if (current_force.length() < valid_threshold): + current_force = Vector2(0,0) + # effettuo aggiustamenti vari alla forza in baso a che tipo di stick sto gestendo + select_force() + +# aggiorno la posizione del centro dello stick in modo che graficamente sia coerente +func update_stick_pos(): + stick_pos.x = center_point.x + half_size.x * current_force.x + stick_pos.y = center_point.y + half_size.y * current_force.y + # questa funzione serve solo se lo stick è di tipo DIGITAL 4 ISO + adjust_stick_pos() + stick.position = Vector2(stick_pos) + # calcolo anche l'angolo tra la posizione dello stick e l'asse x + angle = stick.position.angle_to_point(center_point) + # infine gestisco la visualizzazione o meno del centro dello stick se deve essere + # gestita in base al valore di hide_stick_on_stop (vedi commento) + if hide_stick_on_stop and current_force.x == 0 and current_force.y == 0: + stick.hide() + else: + stick.show() + +# effettuo un reset dei dati interni, ovvero faccio si che la forza sia impostata a 0, +# il centro dello stick torni graficamente al centro, e sia impostato un angolo invalido +func reset(): +# calculate_force(center_point) + current_force = Vector2(0,0) + last_force = Vector2(0,0) + update_stick_pos() + angle = INVALID_ANGLE +# emit() + +# emette il segnale per comunicare il cambiamento della forza dello stick +func emit(): + if current_force.x != last_force.x or current_force.y != last_force.y: + # solo se la forza corrente è diversa da quella precedente + last_force = Vector2(current_force.x, current_force.y) + emit_signal("gamepad_force_changed", current_force, self) + +# se lo stick è di tipo DIGITAL 4 ISO, e la posizione del centro dello stick capita in una +# diagonale alta, viene aggiustata graficamente la posizione +func adjust_stick_pos(): + if stick_type != STICK_TYPE._ANALOG and stick_type != null: + if stick_type == STICK_TYPE._DIGITAL_4_ISO and adjust_iso != 0 and current_force.y == -1: + if stick_pos.x < half_stick.x + adjust_iso: + stick_pos.x = half_stick.x + adjust_iso + elif stick_pos.x > rect_size.x - half_stick.x - adjust_iso: + stick_pos.x = rect_size.x - half_stick.x - adjust_iso + else: + if stick_pos.x < half_stick.x: + stick_pos.x = half_stick.x + elif stick_pos.x > rect_size.x - half_stick.x: + stick_pos.x = rect_size.x - half_stick.x + if stick_pos.y < half_stick.y: + stick_pos.y = half_stick.y + elif stick_pos.y > rect_size.y - half_stick.y: + stick_pos.y = rect_size.y - half_stick.y + +# qui la forza viene adattata in base al tipo di stick che sto gestendo +func select_force(): + match stick_type: + STICK_TYPE._DIGITAL_8: + # la forza viene semplicemente convertita in digitale + to_digital() + STICK_TYPE._DIGITAL_4_PLUS: + # il minore dei due assi viene azzerato in modo che possano + # essere restituite solo forze cardinali + if abs(current_force.x) > abs(current_force.y): + current_force.y = 0 + else: + current_force.x = 0 + # quindi la forza viene convertita in digitale + to_digital() + STICK_TYPE._DIGITAL_4_X, STICK_TYPE._DIGITAL_4_ISO: + # salvo la forza analogica prima di convertirla in digitale + # in modo da poter capire effettivamente dove si trova il + # centro dello stick + var curr = Vector2(current_force.x, current_force.y) + # converto la forza in digitale + to_digital() + # determino quindi in quale diagonale mi trovo + if abs(current_force.x) == 1: + if curr.y > 0.35: + current_force.y = 1 + else: + current_force.y = -1 + else: + if abs(current_force.y) == 1: + if curr.x > 0.35: + current_force.x = 1 + else: + current_force.x = -1 + STICK_TYPE._LEFT_RIGHT: + # azzero l'asse y + current_force.y = 0 + # quindi, essendo un controllo analogico, lo sottopondo allo step + to_steps() + STICK_TYPE._UP_DOWN: + # azzero l'asse x + current_force.x = 0 + # quindi, essendo un controllo analogico, lo sottopondo allo step + to_steps() + _: + # ANALOG + # essendo un controllo analogico, lo sottopondo allo step + to_steps() + # popolo la lista delle direzioni in base ai valori digitali ottenuti + direction = [] + if current_force.x < 0: + direction.append(DIGITAL_DIRECTIONS.LEFT) + elif current_force.x > 0: + direction.append(DIGITAL_DIRECTIONS.RIGHT) + if current_force.y < 0: + direction.append(DIGITAL_DIRECTIONS.UP) + elif current_force.y > 0: + direction.append(DIGITAL_DIRECTIONS.DOWN) + + +func to_steps(): + # se lo step vale 0 (o meno) non applico lo step ed esco + if step <= 0: + return + # se lo step vale 1 (o più) converto direttamente in digitale ed esco + if step >= 1: + to_digital() + return + # altrimenti applico lo step + var modx = int(current_force.x / step) * step if abs(current_force.x) < 0.99 else 1 * sign(current_force.x) + var mody = int(current_force.y / step) * step if abs(current_force.y) < 0.99 else 1 * sign(current_force.y) + current_force = Vector2(modx, mody) + +# digitalizza la forza corrente +func to_digital(): + current_force = current_force.normalized() + current_force.x = stepify(current_force.x, 1) + current_force.y = stepify(current_force.y, 1) + +# mostra lo stick +func _show_stick(event): + # se event è diverso dal null (nel caso in l'utente tocca lo stick o la sua area) calcolo la posizione + # in base a quella passata nell'evento + if shown: return + shown = true + if event: + rect_global_position = event.position - center_point + else: + # altrimenti la posizione dello stick è quella statica impostata in static_position + rect_position = static_position + # avvio l'animazione di visualizzazione + if fader: + if !simulation: reset() + fader.stop() + fader.play("fade_in", -1, 10) + +# nasconde lo stick +func _hide_stick(): + if !shown: return + shown = false + # avvia l'animazione di nascondimento + if fader: + fader.stop() + fader.play("fade_out", -1, 10) + +###[ SETTER/GETTER ]############################################################################################# + +func _get_scale(): +# if !has_node("Stick"): return Vector2(1.0, 1.0) + return $Stick.scale + +func _set_scale(value): +# if !has_node("Stick"): return + $Stick.scale = value + $Stick.position = $StickBackground.rect_size / 2 + +func _get_bg_texture(): +# if !has_node("StickBackground"): return null + return $StickBackground.texture + +func _set_bg_texture(value): +# if !has_node("StickBackground"): return + $StickBackground.texture = value + $Stick.position = $StickBackground.rect_size / 2 + +func _get_texture(): +# if !has_node("Stick"): return null + return $Stick.texture + +func _set_texture(value): +# if !has_node("Stick"): return + $Stick.texture = value + $Stick.position = $StickBackground.rect_size / 2 + +func _set_show_dynamically(value): + show_dynamically = value + # se sono nell'editor non faccio nulla (altrimenti mi verrebbe nascosto l'oggetto anche dall'editor) + if Engine.editor_hint: return + if value: + _hide_stick() + else: + _show_stick(null) + +###[ END ]####################################################################################################### \ No newline at end of file diff --git a/addons/Gamepad/GamepadStickTemplate.tscn b/addons/Gamepad/GamepadStickTemplate.tscn new file mode 100644 index 0000000..0a66a8f --- /dev/null +++ b/addons/Gamepad/GamepadStickTemplate.tscn @@ -0,0 +1,118 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://assets/Gamepad/big_circle.png" type="Texture" id=1] +[ext_resource path="res://assets/Gamepad/small_circle.png" type="Texture" id=2] + +[sub_resource type="Animation" id=1] + +resource_name = "fade_in" +length = 1.0 +loop = false +step = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath("StickBackground:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Stick:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] +} + +[sub_resource type="Animation" id=2] + +resource_name = "fade_out" +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath("StickBackground:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Stick:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[node name="GamepadStickTemplate" type="Control" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 256.0 +margin_bottom = 256.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +_sections_unfolded = [ "Rect", "Size Flags" ] + +[node name="StickBackground" type="TextureRect" parent="." index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +texture = ExtResource( 1 ) +expand = true +stretch_mode = 0 +_sections_unfolded = [ "Size Flags", "Visibility" ] + +[node name="Stick" type="Sprite" parent="." index="1"] + +position = Vector2( 128, 128 ) +texture = ExtResource( 2 ) +_sections_unfolded = [ "Transform", "Visibility" ] + +[node name="ShowHideAnimation" type="AnimationPlayer" parent="." index="2"] + +root_node = NodePath("..") +autoplay = "" +playback_process_mode = 1 +playback_default_blend_time = 0.0 +playback_speed = 1.0 +anims/fade_in = SubResource( 1 ) +anims/fade_out = SubResource( 2 ) +blend_times = [ ] + + diff --git a/addons/Gamepad/icons/area.png b/addons/Gamepad/icons/area.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e70666242eefe1ad0acaa6b1e6245192708ccc GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf_b|H3M?%eyw&I3)6^>lFzu{gbS zvaJ`3qe#pCC@~oWLE(@6CwWuyFL2yDaG>Hqg8zo_87{%j`Ux5tn>^!>ISAbGo#VRD zXIH62+TF(53m0Pdgs z=ifehb8rQBil~z@gQr5;q{w`1FP!(@yBJ%us)#-Ct#6u#9P%)6@V~okp$? z0<2DR7)=YNgysH}`R8-v38Mq&on@h1cO~MtO!@Y|*-zpJo1c^5y|$_i3^{L9ey)n% zbF$gm;pN%)&Vuv)&2EiTF#BjwckHs_;Un7~|6!KkpXHUiVz)jp>=-;<{an^LB{Ts5 DreC2> literal 0 HcmV?d00001 diff --git a/addons/Gamepad/icons/area.png.import b/addons/Gamepad/icons/area.png.import new file mode 100644 index 0000000..ff5215c --- /dev/null +++ b/addons/Gamepad/icons/area.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/area.png-839064d7f6486da3f1f42829fe5ff350.stex" + +[deps] + +source_file="res://addons/Gamepad/icons/area.png" +dest_files=[ "res://.import/area.png-839064d7f6486da3f1f42829fe5ff350.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Gamepad/icons/button.png b/addons/Gamepad/icons/button.png new file mode 100644 index 0000000000000000000000000000000000000000..53eb38348d19e61e8ecc051fed95c8698915087d GIT binary patch literal 727 zcmV;|0x127P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L0#1zp0#1zqKzf$E00007bV*G`2jT}3 z2RS+tuMwaC000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0006qNkl>FnYs6#HuLPIwCb+zJ>PS_=X~$|Ud668olFmS{B4gv zCCC8)h5BYNvle@2Bp&&Y%~#n&HL1RIxC?;n#?qLH^m1YJ;tq*Hf3_u`9@idtDY7CY~7 zLmq$Hwlyh(`5GkXIXCwVpg`fxKs4|KV7@hft`=$&0OhEBIY;iJ!wm`2rL)9Z>7Y*+pHkrO1^DN?94K@NHRVSwRicp?QC-Qsv4?C-bzk9$q;cwXh308N^M z?Mts~gLw-`AROEX8~s_W2}z|vqui2KZl_q9`#k=5`zhaPi@o3WgRIN?t%fv;06~Jb z*aeMVH5iwYu7s6G8CO2oZ6pCyQ5Bzd>+aXtY3iYVVpBG+0?}Va`j?g4NuPn>@g=~d z*d8nY&u7X$Bct)?#XR{zi=9-c)gZwK30_2MTJ#Ge=47@Q;5V(E0{yz!Yf%6I002ov JPDHLkV1g4^L2Lj3 literal 0 HcmV?d00001 diff --git a/addons/Gamepad/icons/button.png.import b/addons/Gamepad/icons/button.png.import new file mode 100644 index 0000000..43e97f2 --- /dev/null +++ b/addons/Gamepad/icons/button.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button.png-53cd5d056500b25527df0b9c633f2443.stex" + +[deps] + +source_file="res://addons/Gamepad/icons/button.png" +dest_files=[ "res://.import/button.png-53cd5d056500b25527df0b9c633f2443.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Gamepad/icons/container.png b/addons/Gamepad/icons/container.png new file mode 100644 index 0000000000000000000000000000000000000000..8004f2166902d81087c79c63ae64b756e8235397 GIT binary patch literal 530 zcmV+t0`2{YP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jT}3 z2Pqn310y*A00ELoL_t(I%f-{bYLrnB1@PZ&7G2pwQBZ=06uv+z+pqBrQV4b%1Z^}{ z0r3G+2?kND>`ap~5}QT5oiAY_Sose(h5LcBW3l(sH9@fRR`;GWXNEaS@|3In3)ICD}1V0MrljdWbg2(-fyQ|UHH)BX-lTe5OH)! zQr2NPM(H&D8W4YQ%y1KLD|Q)AvD6J;r|BO{%nw{@2F-^B{B>!|KHgVNESfk$rp!vL z9}$C!ts`n|V$#C{MD6oQGidhzwm8k8*_R$i*Tq~*Y0Gk%mX&|qz%nf>r7g?w6Fa4$ UcJj1tB>(^b07*qoM6N<$f)e`OHUIzs literal 0 HcmV?d00001 diff --git a/addons/Gamepad/icons/container.png.import b/addons/Gamepad/icons/container.png.import new file mode 100644 index 0000000..3fe75b5 --- /dev/null +++ b/addons/Gamepad/icons/container.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/container.png-6fa1028c51fbe41a2e5a9a472482d80a.stex" + +[deps] + +source_file="res://addons/Gamepad/icons/container.png" +dest_files=[ "res://.import/container.png-6fa1028c51fbe41a2e5a9a472482d80a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Gamepad/icons/paddle.png b/addons/Gamepad/icons/paddle.png new file mode 100644 index 0000000000000000000000000000000000000000..9e33331def228b16c9ff3e10102eb5ee46df2198 GIT binary patch literal 615 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 literal 0 HcmV?d00001 diff --git a/assets/Gamepad/big_circle.png.import b/assets/Gamepad/big_circle.png.import new file mode 100644 index 0000000..875ebdf --- /dev/null +++ b/assets/Gamepad/big_circle.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/big_circle.png-133d03445796653ac801f6dce35e2739.stex" + +[deps] + +source_file="res://assets/Gamepad/big_circle.png" +dest_files=[ "res://.import/big_circle.png-133d03445796653ac801f6dce35e2739.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/button_a.png b/assets/Gamepad/button_a.png new file mode 100644 index 0000000000000000000000000000000000000000..6a3291c83b2b49418c40259bdd0047c950741e92 GIT binary patch literal 2532 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 literal 0 HcmV?d00001 diff --git a/assets/Gamepad/button_fire.png.import b/assets/Gamepad/button_fire.png.import new file mode 100644 index 0000000..0be5274 --- /dev/null +++ b/assets/Gamepad/button_fire.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button_fire.png-a3d807fe20812fbcde99caf0c4dd4553.stex" + +[deps] + +source_file="res://assets/Gamepad/button_fire.png" +dest_files=[ "res://.import/button_fire.png-a3d807fe20812fbcde99caf0c4dd4553.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/button_l.png b/assets/Gamepad/button_l.png new file mode 100644 index 0000000000000000000000000000000000000000..51c2774c4b4eccf1615d58c24ede4e299b6b5354 GIT binary patch literal 2193 zcmV;C2yXX@P) zT~gb~7ROJ2=p(@d7cW!+RVJ_ic+SgscHpdFsA2)b61;=UtRS8p_^#mkDbLOVU`!Go z@**@?Lb9bkeIKxlvAbo-AK2LbRk>1;)UED+&gs)?wN3~ukRS+3obw|9C<8zd5zn%e zqm(wKlr2I?GmhidyLazy=h@CQ$ZOs#2!ax0tU?GWODWGNrAM=<7ZF>8kfxNf;dx$d zcX#*SS=5__xeMqx&Q76Fs7NU<8Dp6&Y+8g64MIrGG|j)~eXqF*7z9CyQhG@#Jtu?| z=XIYnq?9fIT*Yx*o0pr`iHA-oD)^$$cl)vSe_nShSt>}+jqRS6*rv$%0c zDP2UYK0ZFqY@D2lfSpd~R7zQAj2-1}03rQf^7k~Pl>I-GUtWX|Eka1evaD~p3lA~1 zfMFPZp_HCyz9At%DSaW@v?M|zVlF`u@zS>KzoxnO#69S_Y=aPzDY7!gfKoc??Q(&L zAcV+tt(3Cq`+j*+m!3#K&+|?V!>ElDFR`}Q5^fko%w&~P%4QTr=Y>Kcw@c?1(DS@g z##n<=ni?n=W55{8Tm4)RLX5RYM0AA^<-8*15-SXpU$8mN5pq?fk=Nt^fSUT|lp8jDC!vM~?_L^Sb>b<^Zt2fI9~@ zXSQwEGSxNif*=UKP)aMh^ULb8<49au2c@(U1i_cF^`xEjJns+2SWS2Sty!K5M1*d) zt35A-I4=|m+EpE`fR5voOw(*K#*{&06~s$O6Hy4^cDvoP-Q8VfWY#KRSyoLa-dhS7 zS)i0^-I*~~v@ENpEvq`%ZnyvJts2AdZk>rddrJ_f{QU9~oms(=@BY$6r{W<2WVD zvRbMN48uqb`>RA0McRpWr_(ta3@9%w&@ha1RiSZnrd16Eb~xwCvCp!s zl?)td2qB=;>8OsoaUA!@!oCG^&MTDC;&224fVC43;JMGkdQeJ>ob&#ZSzkaY<)x~k zb#mQdbbTMxiUK?Z58X@ejew&t#?BnaDFO5ZWQw->$L^A>a&~CSt>)eGxVP5ST;n%NU@cHxS7stMS{rYP6Ps8&(P?Xl{NxClcojboR{+ySXWeD$~iCdNw$ZrBZLq@#F670Q=5{FfK#$@;T)*6 z+F0O}Yy_MVDuieaAI!QvcAZdZB7|sB0B8-bb*aMjx|3`b9(vu;q5$Bk3T&+KnG`Kt zP6%lNz{vJBL|piS!lzH4QqNypT)@S}#oXJW^GHHSlg4p8;=;*(;tfwEd#e>1wI~2I zb%i!Ok)lPD?(OX2Ld+~pz+L*)co2+`c%-@gTTxi_Y!s$`w5P}lcCt@;A`zF$*aoVM9;l}YROpjLeW zPfkw$6++Zh6Gq?n=ilNb!}opVAV_<7xEi)TfRu0L?(XjX=_LkxS%45I7KRck?Dg>2reUVaD4-XHui73W?DSdZ$_dmv1S#^$c4j(>zc(d*tMG-taJZP7zgbKOZ4GYrE@9LFQi$;on;<2Y~fNoBC@n$_lJ7=~KcO~~}E{?DI3PXVBz`v{Q` z0=v7rZ^jZ6@pQW~gb*$Ol+#={A#<{WEFu;P1=!l!%39?@@O>XV&zp&O067!y^hDHV z@Bn!FuC7=tF5Mo(Bv_=aE+JwQ0M4_D2QWeEr|awM9m}#(bI35ppin5l`}gnjRzDXW zA0NT z2oGc1Hf(Kefn`~f-YyrNP6vG7&$NPsi1lu_dp?PH05eFy`2G9${{XEwEkjfkx%iYmv)$BRz^ns9x6y<-?gl~Stw?s#lNa-io%9AxH6uWoK`PC4h*w0v8O01<0(9AC}C>IRux*03Kxe*7k-yj--9^Aav$ z?rGOKzWj!(`od!D%Yiy zjgKEc{&$vjr?Ifae?7}AODWF?A!ky`qpYI#EUYD^Y!X76LWsuk@$o|bON{>mTcj?| T^8Db*00000NkvXXu0mjfz?3H3 literal 0 HcmV?d00001 diff --git a/assets/Gamepad/button_l.png.import b/assets/Gamepad/button_l.png.import new file mode 100644 index 0000000..c6f7785 --- /dev/null +++ b/assets/Gamepad/button_l.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button_l.png-005713f15e95ca68e459f9814ff0334e.stex" + +[deps] + +source_file="res://assets/Gamepad/button_l.png" +dest_files=[ "res://.import/button_l.png-005713f15e95ca68e459f9814ff0334e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/button_r.png b/assets/Gamepad/button_r.png new file mode 100644 index 0000000000000000000000000000000000000000..5637c25e6936ae2fece2b6497aa5a28c0066489a GIT binary patch literal 2398 zcmV-k38D6hP)?l_EST{iRKH5q|+v$`qHYG<4ZlrF^`< z;JHfe`~mPx5-Ox+FJ7~2@6OCE@cJ5iX1#0tvB3RF7I&H2BX3w5IAebOL&nr+$ zmjR#z0C~=NF-bd&aYYDGMF>^GFsx2ZO`VK#o^e3q9L)2)0wH7zAyg7V6fwrj!|0cD zUPTC1gb-!db*;I%xj%-{ZxW20K-;!wbGh7>5MqZAl1RdC3dUF&A!O;g{_jzbH8KJ{ z&nsYzcQD4=2%-F_#)*Rv!U2H&Fbu6xsrk?eY!PQ+j7!7r`zGL=?{m)ghfU zstBPi!!W+3Zrp_%6X^T?XN>W7;sFr?jPW(nZiBmws8^H4bFKYsT4v~ zf*{z=<#MT2IyHf=>uwN2${6EVLqP}uLP*-~M*_xJUy02RZ$T@capqS>UlUTQG+nxo0!#MINrJ!kA=EwuM`on6P29#3e zHLbNBw$_@g-y|2=wmoZ_W*K9w-19U|o7i5L7Mybkf*`KG;`@Fg!;)ylrfFI#@(@Cx z>-w!B4*&pT47#o>H3ef_G)>b=)K|X?JkR@#G2T+uXH{kUAyR1-FveS+=Y8(mPh6$z zy1x)YELHt&lROzX=g@36mGz9V?OZOW^y(-Hv~9bf>w1L{A~hO!fxHNDBr?XFX0utG zo12qbW+elLVOT2iZj-@C0*tXzoe3d%!!RsmTUlYPR{OQ(HHPj_mJZ0nM6@p1nh`>! zTCMi0tX+=^+qONcX-3U&kTIummanmV@?nR%iTwt9tqTSeJ^g`yX#P` zkr0yCb$ze9{F(&Xwp}m`qbln_)3jK#f0qyhf%2f;Xf&2P4azkM)HH2d)~Mf^>8>H} zY}?II`zqVEXDOx9z0WX=J83xLz!-x@qaiDI!Z2*_g>4C>lx|^+^W7E*0PY=m0DrBy zn-7d}o>JPrGiwtlgxHaFbe~kW8>+Q;a)kk|jECx>_umBef)G-)ZMy)_B9IWWr8+d< zcc>26gpe(O7J&$%lB{u@^YOkw#X-aw0syGhYEnOUE|(kCysqK(>(@}P*JH1F{`@)Y z?(V|l$B)M{r%t%8D=nXynL+6M{CtBDQt7Uwl)}{1)W|0X0I<2and;nKH(TvfGwPO5nl4K~Gt?)SaE3jcYo9F;;nKib|HUro!Xi_c{^B1*Vji(lp2t zPEN)b8ZFaON@5+0Tn6bgm0jfD^b&UsJytq?Waw#ROHlOmJ18cE1{_wL;oX3`(G zQiY#Adj`9^yJH_$##JUIFb)R?2e7`rKIv(+k;y%9ZEX$K*4CtTSt1VrfHKCa-NE5W z!(&GU%d*zhWv=l~o@#00#v)V6TzKnGaF?pQc!ci3ifK&prM&O4JA9~8hC516uRPg-#yfmyo zYXkxSynp|`r|jb5V&vnhxR{@x|Aqhn&d$#MgAnQo<9+z>;k|yW32+rBBl{x>Ar2os zdh{>c`cjrPjthOgFHmt1afSf^!Z19PT_lSQxo=Q$5OIb902US&P8eeq*@4>k{V`5A zTkw5fdVpq(RTdT&P5`dQ##pjW?z0rC*51igo4|U#Zpki=3pTvVh+B6jS8W1US6BaF zj9Ib+W51|@yNG(dET_bQ|Vc~>x zZpj+f>-9|CACC&0bEU>{&aKFJMCfs-a?bY{V~#|0$8zeQG%hYKfH5XhT}P&&Jp{HG z-j{XWY&OC3yy4F}Bk(*g?&e{?TlxTE-jzE&J^gEK@foBIMN44 zVHj2y7Z;z%+9{uj2qC0VtDJLi949jl*I|G$29D!M56!KQ@^xP&flEtE--Hl*vbu=G zyI@rMtwjj2x3sjROhnQ5P3hCq)Bh1dO0qgi>8$*cB4~_wT;}z_!Y`bb=59Gcz-w>-x}N zBMZY2n$0HEYPCdnNiB!TPN7h^QKsLaq#QavKHktY?J!MVXi6yNz&&ycz_-*2>Dt@Z!miVtFnI$1a5g}9*LM$gGwIyLyAw&fsRAG#jS5{Ug@-H#|1U#%;waAO; QBme*a07*qoM6N<$f_JHG*8l(j literal 0 HcmV?d00001 diff --git a/assets/Gamepad/button_r.png.import b/assets/Gamepad/button_r.png.import new file mode 100644 index 0000000..0eac8de --- /dev/null +++ b/assets/Gamepad/button_r.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button_r.png-7b69b467b84da136e20c628e4594a14b.stex" + +[deps] + +source_file="res://assets/Gamepad/button_r.png" +dest_files=[ "res://.import/button_r.png-7b69b467b84da136e20c628e4594a14b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/button_target.png b/assets/Gamepad/button_target.png new file mode 100644 index 0000000000000000000000000000000000000000..f7561c6b19efed940bfd0e17d6d74d39de8fffc2 GIT binary patch literal 3124 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 literal 0 HcmV?d00001 diff --git a/assets/Gamepad/cross_dark.png.import b/assets/Gamepad/cross_dark.png.import new file mode 100644 index 0000000..9d2c858 --- /dev/null +++ b/assets/Gamepad/cross_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cross_dark.png-309abb32126b3e8341efbb2f05560805.stex" + +[deps] + +source_file="res://assets/Gamepad/cross_dark.png" +dest_files=[ "res://.import/cross_dark.png-309abb32126b3e8341efbb2f05560805.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/cross_light.png b/assets/Gamepad/cross_light.png new file mode 100644 index 0000000000000000000000000000000000000000..c31d9b8cf8e9794fe3f991ade2d6c5f382c78afb GIT binary patch literal 1669 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 literal 0 HcmV?d00001 diff --git a/assets/Gamepad/diagonal_dark.png.import b/assets/Gamepad/diagonal_dark.png.import new file mode 100644 index 0000000..acf588a --- /dev/null +++ b/assets/Gamepad/diagonal_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/diagonal_dark.png-f84908cf6a4f75f6cf1849b19bafba26.stex" + +[deps] + +source_file="res://assets/Gamepad/diagonal_dark.png" +dest_files=[ "res://.import/diagonal_dark.png-f84908cf6a4f75f6cf1849b19bafba26.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/diagonal_int_dark.png b/assets/Gamepad/diagonal_int_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b95c1a2031e93180230d7e28e60dd3ba985b22cd GIT binary patch literal 829 zcmV-D1H$}?P)q| zFGU31Zg*^>uj+QY000qr;bSbLdPzk6myJ_V6sd*I`Qplo_>3_IQ521mZ74A_thLB$ zbOu0}7w5CkvWWD(R)vxzQI^d@3waWFE+UBI7{}Cjz0#S_Se_Jd`j*khz&~CbyP_yU z5CjmB3q>)$1Qv}kV_!mDrD+NPS_iWLehuDXhx>KraD@;bLA)Q6HGs?5j)w=nWz>7uG@E3|!KaD*a!; zurYW)Z!`CBpbJ*6BuSL*{-MoWPW&C99;2^vSXKt_4X#2B5t#+5FJKiB^%KY#=Y7lQ zx}Mi<1{}tlz69=7y@AViS>D1Y9;|zMa-Yj`mSGODRO;s@n%{==9XlJ}Q?{2i*`6h-jtG;DgF+euaq8 zOw)7`Kxm9<*V#TQ9q2So_W;Z`JDrZ1n3(uHIXSsd*8+AWBFO%1*ox!0WtjOpfGun7 zkE-E@m9=&Uz$a$@+06DA+amH6zzG2Lo&vy%$Tom4#u)qoCr?*GQ64=l00000NkvXX Hu0mjf0$q5_ literal 0 HcmV?d00001 diff --git a/assets/Gamepad/diagonal_int_dark.png.import b/assets/Gamepad/diagonal_int_dark.png.import new file mode 100644 index 0000000..497f5f9 --- /dev/null +++ b/assets/Gamepad/diagonal_int_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/diagonal_int_dark.png-5f97c51c3c6125e1c44aca983ca326ef.stex" + +[deps] + +source_file="res://assets/Gamepad/diagonal_int_dark.png" +dest_files=[ "res://.import/diagonal_int_dark.png-5f97c51c3c6125e1c44aca983ca326ef.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/diagonal_int_light.png b/assets/Gamepad/diagonal_int_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c08ab82c6bf24f9f560fd9862734adf9b5c04b GIT binary patch literal 809 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 P00000NkvXXu0mjfsX6h~ literal 0 HcmV?d00001 diff --git a/assets/Gamepad/diagonal_light.png.import b/assets/Gamepad/diagonal_light.png.import new file mode 100644 index 0000000..a57aa0b --- /dev/null +++ b/assets/Gamepad/diagonal_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/diagonal_light.png-46bca542db63d1263474a3c51a4e716c.stex" + +[deps] + +source_file="res://assets/Gamepad/diagonal_light.png" +dest_files=[ "res://.import/diagonal_light.png-46bca542db63d1263474a3c51a4e716c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/left_right_dark.png b/assets/Gamepad/left_right_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..08e748f06f8c1265866b9a6bbbd4a4447d0bca93 GIT binary patch literal 1122 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf_b|GFy(Zyw=R~Q(WA9=bshE&{o zd&e;Ev75-TkMDcklr(R?5)*jPwPAr(X%|D@rR6@8waQP(irtW2a!W>`{DkPXO$iQR z$>y0!GbU+FG}cVwI+bS@d2`wx>3{XIxd)8q+3%~A=~ZO}T1XkvmDn zzT*8~Y2)mDnJxV6(RuQlu9{c^1@hC@tGGU&bNBAul{(%N9c5N9Yk3OIoik^~OjqOT zr_LOcQqEaUO}#aQa^uxQ6~e>PbJoSE)?l_7ENK&?__x7YHGY-j&irf zy~7@pt(~tb;s<(^!j9M04%vkcVVom$yFV)YNpPXyFd9R;? zx&D*A*Herx7FdMLTDI2eNLHHH<&frs4nUMSYuhW4%AUZ?Sy>h`Sw=HYRPX=Jd*jKw zK<|R>w?pSWU&|dAyd!S?av<_szSwX1=Dm5hnPY{I*qp!mwyfWn+3NX}=R1G>t;>Es zKW_c^gGF;xJhT5#Uv~e!_W955xlea4>zIG(q!Wjgy?yw!)V25QUX)nXN4u467rmu* z+Q?UJvVWD>jk9yA-^efYb^iYQ=)z! zrX3o(b?>@WUaPOJ+N#|&bEO7XY;5e?xt)8NcihY|nSVZ1#8sR7-kVyz>E5EQ3m0i@ ziP4*%>i@<&RHXIU=bfuo-Lh}^eWqde>9aXzm#g;Xy_J=B3J48dwaQDe<=Q%q*I%PH z-+Uu~d{Xn72H%CNS6wQxx|*~xcRX^-d9T3 zo<4ngznO@o?`5fTmUr*nd-d#@+qs?UcN_k#EO*+h+W4*YgXNF3Z;wAG6zJ@(Ze26G z;-;S$=Z8p^36n2cJPS4fMKB{12UEwlPrEnE7c20+{aegl;;@0GnSn{)o|)f=n43V#|7^Es Xw354|Ij`@-VG!Tb)z4*}Q$iB}{ngeW literal 0 HcmV?d00001 diff --git a/assets/Gamepad/left_right_dark.png.import b/assets/Gamepad/left_right_dark.png.import new file mode 100644 index 0000000..b799a26 --- /dev/null +++ b/assets/Gamepad/left_right_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/left_right_dark.png-ecafbcd1394c471262560c7d3f30b204.stex" + +[deps] + +source_file="res://assets/Gamepad/left_right_dark.png" +dest_files=[ "res://.import/left_right_dark.png-ecafbcd1394c471262560c7d3f30b204.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/left_right_light.png b/assets/Gamepad/left_right_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7af66a964cfa5f2abfa7e48db196a826a0d3b4b7 GIT binary patch literal 1115 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf_b|GFy^D?mz0|o}>+nz3tAr-gY z-gV4Vau+%F@qMZIE3<4R7P0aZoJH+23X!Sy-)9)7Omz+GENYKQ>`Q0~;4wr}(bOAfnqNlQ;&^3R?#a#L?qNd2Bw>{k^SfmV?S{;1!m+RLZdvR<`TedU?Yf3(|J zpIHv6o3vWQPhm(x-W?&%P7H+?KU{2S zP-8JsWboz4aAKGxaG{04MA1W~;qAMYeZd94|EHDRc-l~Mt>A5?ed^C^XJg7v9lZVE zsD$bK^IN0VUdemu|CHs=UEP_hrlv-%4V!iTd6(fU%UTzU(vK0>w~BSQ+SUA6U~_)* zDh5NhyZ7#`TBYR~6euFq>&B(1V$4<=`}*U@Ky!2RS$@lOV^(F(x_5L%xNuThl#UqC@|~y3ZT^D4ck`JTPfcBUGG)=1W`LbH*lg;%U zv*19H_U7eVUevvM|9?GOb7R+{3qZkn&(-%!C%yjqtKj_V)vML{lcKXW>sZ&^VG`fE z+?acd{9~cyH>PiQ?JnDWcfRPCE87Ea{ocC1R&d{zYX|Sn{5+-je3{N4Z2^avZJn8? zHEyr`Ff04Sc_xk+rIr}srfyTCHH?nJOtS=*C0qa|hn7G_P-K(NjlZV PwjjQztDnm{r-UW|lLge= literal 0 HcmV?d00001 diff --git a/assets/Gamepad/left_right_light.png.import b/assets/Gamepad/left_right_light.png.import new file mode 100644 index 0000000..1bbbb95 --- /dev/null +++ b/assets/Gamepad/left_right_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/left_right_light.png-997df9a152863ba659ae2db2d3127d1a.stex" + +[deps] + +source_file="res://assets/Gamepad/left_right_light.png" +dest_files=[ "res://.import/left_right_light.png-997df9a152863ba659ae2db2d3127d1a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/omni_dark.png b/assets/Gamepad/omni_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c58e926e6d87c65c82278b2d6f3db5b5dc2afdba GIT binary patch literal 4732 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 Hm#F^%J&w}7 literal 0 HcmV?d00001 diff --git a/assets/Gamepad/omni_dark.png.import b/assets/Gamepad/omni_dark.png.import new file mode 100644 index 0000000..f864095 --- /dev/null +++ b/assets/Gamepad/omni_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/omni_dark.png-c2c424cfec7053d41d67b22c27529ee0.stex" + +[deps] + +source_file="res://assets/Gamepad/omni_dark.png" +dest_files=[ "res://.import/omni_dark.png-c2c424cfec7053d41d67b22c27529ee0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/omni_int_dark.png b/assets/Gamepad/omni_int_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..381ccb2442092533ff7ec4539f4a200c30cad12a GIT binary patch literal 4212 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 Z{|Dj{6}@h&JB|PV002ovPDHLkV1j}ZS`PpK literal 0 HcmV?d00001 diff --git a/assets/Gamepad/omni_light.png.import b/assets/Gamepad/omni_light.png.import new file mode 100644 index 0000000..8f481c6 --- /dev/null +++ b/assets/Gamepad/omni_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/omni_light.png-9f8bbd8a6d35d648f266d2b186633764.stex" + +[deps] + +source_file="res://assets/Gamepad/omni_light.png" +dest_files=[ "res://.import/omni_light.png-9f8bbd8a6d35d648f266d2b186633764.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/omni_square_dark.png b/assets/Gamepad/omni_square_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d75a356e327d65c3a03af47b207b7bc9874cdff1 GIT binary patch literal 1169 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuFE&V2SW_aSW-L^Y*r_pNuC%+rwXr zmv`m}DyVz#eP@t4z{p;(3)nLg(4F+Db;ySuwwU0pqX&DQxnhH2mBB)ob)?%rDV>+$vb&p!XW ze){z3=-a_*;j>WQoTmcJu2$J%9eZ{$o%3oi$tK`}+IscTBmI{x#9SPjl({ zbC%!ZY6W^G7r(3Z(6s&C{Q7nF!NP(QYqman^XARX_tpm^4V--aOO6RB9N`cMV&PbM zOps|$>#}PVY%L;;PF)O&t_>5CTD}B?PBlC><7<_!-O0L)EM1Osg#xd3nVq}4zro`9 znWCK{^E2!}3f(#Q_(#u9{tfH0A9j8dXWSPQ8ft%Z`{Oy)6`pR@EI+tHLuU&7`ya2X z$f8uE>gM6??(VLCZ2RVFp2JTp_X%Hep8Z44{#w-Uw&j*GYaUD!>u&wU!QPqf;3256 zL_+aIn_$x;0fi-CS8BR(Y)WidV8Ozn$pm(%U{j8Sq6Qzr#R}4H99_;06O`znJ?nzt zqdCTg#}2M*|MX?&@q8;MVAzz#O27XbFx@3_&v*Xsl^V?~5!bgCzWW!n`@4lr|ND;t zg5TDq8qE~A%VGKaOp4LV`nh)UF`=URJC&d9H4hE_y36gkU{L5(PQ@?3PH+5Q#=GYF z>v+4e4T6vMs@vIcD3-ii7~EiZ?ARw!@MsjIOE85S;n#t78Z|Qx9cA+nG$5weblM8XYX-ig(W}y zI5s`ppS%zy1xmSlc)h&;$DOgK)6g&0>!tixM}w&QF&q#3B_5Z5^)%2kJoYlj?DysS zckbMoH*em*w|oDejrtu}Yap{v;_>yHIp2O?y?XU+{i6ig{(ns_+kr(5gQu&X%Q~lo FCIB^8?o0px literal 0 HcmV?d00001 diff --git a/assets/Gamepad/omni_square_dark.png.import b/assets/Gamepad/omni_square_dark.png.import new file mode 100644 index 0000000..de3146c --- /dev/null +++ b/assets/Gamepad/omni_square_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/omni_square_dark.png-d225c4fae15b4c1cdb018f845344bc57.stex" + +[deps] + +source_file="res://assets/Gamepad/omni_square_dark.png" +dest_files=[ "res://.import/omni_square_dark.png-d225c4fae15b4c1cdb018f845344bc57.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/omni_square_int_dark.png b/assets/Gamepad/omni_square_int_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6d95d3811847ba67af883b8e2ed0bdf064c329 GIT binary patch literal 1233 zcmV;?1TOoDP) z%Wm>U7>3^&4(1SXNQgiRl~_c|Dl2Xvm+crmNF$8#%$V<4VH?ah^EvZ)4mb<|n$2eM;Naj##@HDEaL&)L0Amd6 zYzO&_&gTdNA;dSv*u_7ue|vg*`sMume88H`X0cMKTrkEOn*^$J1?rN7MT8I+wr!s! zPESvNW{jQbTzFm15hjeWS|*dJC8d;K7-Nu9Vl*0IGMQjHoo@BZcM;Axve_(3r4q{J zvbXz7l5<}2wg!WNn&@@_Aq2+bF~;NZJOP~Z5|>gc4sEyL06J)6yNcXwxG4?YRJH$NsN;pF55mSy?& z<@0%5US7g=T}4p^W8MUrl7vd7vQ+s1U|AL#jRtOSZxuup9RB%R^rBv`e|YTh@G!zi z!oj!%th)M5#<-4{ZQFs4>55OnCODwm?V?a9Aer>tL1Q+Xq1){mQHDi~>xemygI24B z;cz(LHyjSpYPH}vj>5=-k^KBE`r*1RuCK3EhYr<2WS8}Km*7D8bA(E069Pd$N?Ha4$uHffC79DSX>W8 z4u}q)1E~F1gUP1-P z_UhcXI(i+BkB^Z~r+xdf*(`2uZj4(Zz7AoQTS^)17c%8?c_|3s->c*P{(h}MOko@4 z4m227tJOX{w!go>_W4X9ta2~bd7ys4s;giZ2(#Q?od@a%{NF=8;{3pmu*)6T0sVd- zdwYBHI{^>ZbA zPNxGQgrcZ|VVnaBg~C$h13)U3LbX~&uh&x$)p{%r`xxhdN~QAQv0||pVI-Tev^v@p zR$cw3Vq{0``T04}FhOB5vEZ5oIvi0n_OeoleL1q;$t|(CKuH`X@ds z2jfgZ2!V%(2i0M0jFAqA8^$>x4jAo#xL|BQAWo12G=LnS0CIo^kOMS8N(nB6m_Opf z#0d@4SR6u`&1PSduIv8EIsXoLPe4>j_^)q1+Ya)XZJZ;Fb9x9Neov%QsZKth|DG|H zS^2Ilvdc+uUH9wN)zwdl!C>%`%jN#CEbG|&ONf$POv3By>#yy0`-gtN-(vt001iPy vj+!?Be zzi;YR6vw~!+TlkcfrTg$kw_}kE&oLRl+In!zoSy-j(tO>P8~9I$yTXrmN#aKgc7Cr z*#Uwf7so*NVZ*tT6)O8q>a&o2PLFpLYO6uu_y zx_umTALmJfAP5}a_wW8Y#~;Jt@KdAFaMk_&eciIGJHs%(PimkzVSDED`Q2bJxKRCm z|2M7mkDLdGu@gQi+qSX0(t+=q1Dv5hg}Nm>3aZVnPiFf`E+%Os7-0t{axM z)~MI(FirCt-^wTaECyiPHhkZY)xEvFq19?ZYhJR(E(#irMk|94EMD_n*F~ezAh0Sq z>_qtG+5TVmZSqa5ngxobB5iUaHUd7)RtFxDHecQt+sIirB<8+PjfMPWJa=CYuak|-!+M1*sIXaF(d z00KmWbHH-kzHWd-AcrUZr47P1!KA!_v zq=;LV#WFW%8`A7|ED8d)TM>JFe8g-vi`7l1Q=FWfz%Y!hjp0Jt{Z1spgTY|M2;l## zqp0ko--$%nah#29!{IQIAsk4n-#d%&x~t$LkY>MQQxVaM_i%W4n5d0AY42Gro-}mwK^aRiI04z2~93LMSIsyXH>37tLi5(y$C%XJA zQxQbSdO!}4Mfn^c)6vAR+bLfJqN|T0!bFG&=KvAm93Uc0j5vS**&~(%WRF-55E0G+ zq5;H+1Bej^5D<%kq74!SWk)Ou5@<-gC@-XkIDi;&00AqRaYFX2q^ARXq9D)n@cjH7 zmbKPswOTkhI3ToYdsfoZxzOwNR`N6-9v*OZcE&C-jNK#1b={3A;?cW;3+x=w@Ao&h zed|A~=Lyy#T$I%KmGpEj9334cYRe-#?GdA**=%Aw9*3LcmT0ZfY&Kc+Aqu-Ypi-%z z+wG!St%h~gY8BmXm*wvVuna>D!@%k3DYY4iiDkwS+wx&yE5b!WrlWHJyC|q=$Q?ic z>o?(|AR?RtM1%=gd4u;n?_pUOjYgRp^wF43r{U+xWb)bcJn!#HrP2Ww)45qr>2CT( zy!X`Y`u#kd$8nrL_07%AFSFUqUHPjFSeFp|-nw1CPko-rWb*my>greH_V#vset!N} zr_=etG|kRh3-(N2uh4xR({Y^NFE1~Dy1u@CQ~(SB-$5dxta$_Qj{zV6;9>Dr%yM>= fA+G?w00{mCOW8G4#}FVE00000NkvXXu0mjfg2*Nv literal 0 HcmV?d00001 diff --git a/assets/Gamepad/omni_square_int_light.png.import b/assets/Gamepad/omni_square_int_light.png.import new file mode 100644 index 0000000..f244b1b --- /dev/null +++ b/assets/Gamepad/omni_square_int_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/omni_square_int_light.png-1c9b638196c3a0ec99bd4edcf6938779.stex" + +[deps] + +source_file="res://assets/Gamepad/omni_square_int_light.png" +dest_files=[ "res://.import/omni_square_int_light.png-1c9b638196c3a0ec99bd4edcf6938779.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/omni_square_light.png b/assets/Gamepad/omni_square_light.png new file mode 100644 index 0000000000000000000000000000000000000000..c85cacd7c45437c7923570b63eda1df4e667e817 GIT binary patch literal 1243 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuFE&U|Hnp;uumf=k4uyzsG4JZ66=^ zyQpzxtlHTTutRf$;IvDsC7iKNd;GEg^XJd^r$v@!r(Mh1n#ZegF>UkAiudo&o@r9}@#)8p zitj%^KhHl{Ve_w~tgP()oZpc)%2G$F>+R>C&u>=o{8w=9?;<&lvy)SA#%_pP|DUhv zf%;d2jCp6%j5#lv++D%$SiJR{?T)zhtLHKEUdY=%-}V_xF@yEmvu*nitT?vs+7Ff% z5k{vj21VC~2}%wg8(9|{29*;B!NUfmLG15FTQC1v2Bvd#)}y$GhXc2 z$hzNA=D6AHv;V%ozPulQYr!4E04=~FL-T!|6>AX{i zS^WL|&)bP_)(Jk-#D8w*^ZDg9Odv-d73(>*fpu{ihd>Yuhb9x$=|>HDv<@5cWVOS5 z@ix|}NkO2eslQK^WvesTV}c4xAe#CT10;di8d<;W#T7i!1_=E?#W$J)CATG9;lm6Y zS(vrJ5KH2AO9iS#F%0O$J+H;y?A`vfDDv9VfZ)?lFYWohG0`z|i~kw~ke~mWQQcfdS9j z`|tNlJT%*9z@t6q%?`l_(tAV{KR$H^W(IwyN2mK4ihtNSJ<@K|wODSz^Y+y%FWX~* zSp2wo{nowZhk-evT%OIqxcJ_0`>W0iW^U5iU7q$W)Rsf)b@%B_Z_MBSb+P4~rFweP zZxi48^6S^H*QZ97%}%`;{xu+j?fu`_Sva?s&E1PR%XZ(z;WF(XkviFK|k>pz0 z*@TGf|LK3u^PcxP?|I&H-tT(e&*yWZwKP=dXxL}~0H9O7htmQ3@PCb(61-~T!ivBS z;-RCW1e6c5uYos|mJd{Lz{S5ax1}f<9J%az&(H$^Xs`Th5Fj%f0S;1ms;c9u7N{7Z zH#u58hMEC@^^q!0@uAP;)+>Kk6aB#6wzk;@@9pxL+D*xXMjpP9^ln%`LrcCSJ)dse z4M%T*eZ1~m0tqvc<|YFzd?gspN~x1hugga&VLHjkrh)a+%K{9$c`dpXrG!oOjER9Nn%Mq z`bat!MEiwhT0u>%9~j6&^z`=7J{&OeuF}(cf;M<$3dUjW)&(w`VWX0*Qf#(~)FU z^xX<-g`=aRd3ALX7eQyoeblUofbr6GlxX~+K zBp+nw0kzfH3y9Sn0v})vYc~dRV)IwcID=1jA1{v|wq2Z!*SVNMyHnT0{I^>U_0Y$+ z2nl3bK>A%LB>+dR&7_ETsjOUXwPRLFjU^-iEH`H!ID_Bh*UdE7_mBk{qH%&Zs z1IqMF+V0IgDdR#P4RUV8w`FUzF;**z5*o|1BD;K&^Y^B-00kq5vn>>L(6@;RU%3Mq z-cb3$gMLoYJrzi)m95P$VZeH!Wi4Ql!ktcL3s57)3Kae(_~cL(rra=as#k_jaN>t0 z4t`BHQ32vEGjRt82M)B<*TRpFkC}5;WR-9dWCB(BP>(;@X;gYsBb@RBe>Qb%H&69X3lSTY(~&svt^27C0qE_ zw0+mxTSBkgM3tGD`2}tt1203o7vMotAT4hCg}x6FNxh#}T3V`LH(mpSuaSS?ex)HV zGh$&qY3w^uWi#FyDD!M{Jml@$x3gOJ&o09Q)7+&DEAM_#6!4sc(~$F`m-0!FO<0R*Nn1iviJ5>#;qlCGhc*g@AAiVN8n7 zJ-+1P;^IDkYN2qTJqJa79`Mh6pPde>-G-sSa?cQZd;9kJuE^nU-+qe%!3?>dG`O5# zn|Cv}F-*!9-FE8gba#fZ6Uhb?^)I_H0l5VQ1r8%`)mK+n(`y|T))*5SMAmPKi_1~Z zy^b#al<307O?@fc!XWpGZT>S1M{qFSyWme?fk0;l*6!=rn7(WE@}0G*6rGC(-@WBo zIGmDj!?;$h|8_|UiT3s1ZvLIsf`t5%l9IHHwvv?NH%YWo(?HqnP*l2G0w!aR`0=IK z%3dI+1!9s}ixF;N%a_j}>fzbT;mtl%+eB zFQfO2@5&1>DLaUD#@xY2u)LZay;qo2F7w)!=(WFUd|_C-K~xO7X`c@5$BDi8P*XFC zr6`qxgu@f*=;%zny#8oLt-j6nAqT{2p6j?zc=Qkl7Ek2BREI@am_{yn_DC0g*OYMn z;Zsmz+j`it{Yn4n?jmDAm#!6{iOI=<(pOe?_MIMl!Dyk7K(rYOlXC!Lw!k#YJw>i4dDFxA#J!$pdnH6x}NF$J#*q z`sn*@svR;16d(PS>Xft`DG$olZ5C>EwBO$_&eJ(P?$aV(>(a+fSBLKGK}qG0{a-Ii zCcuU*{kz2?ES^1I&d0|RF^%vH7rgfV{B)DIe1q49-sWV@MwQ%l)hDsc%uLt6I~JuT z4OL(Enq6SS9C&QB6~cB{H+^3&_5M+U8juf^PjIk}35r?cj)Ok^%dK%n1Aq-UIxu5(opF8tqNLi**n zLE2Ktj_+bgTvLoix{Tk#>Cqm7l~ptk7e#%)WXLS|?2iLrzWC{dZUL8Gse$%mZS5q! z{L@vNO^)UAocdpl8$_Hb7dj??bxmT%$EpkT=h^$;Fo&^n3V($oO$Vxn6u%OWb<{Ez;LL_ZJB}+Z|_fAFtEb>ScHGy`h>w2$StIN4_bLeQg zLco%cnJCxdBHG=-*;05@3qJKj6Hi4+={PKi^X#v6nv#Q>|A-9!)H1N$xKZAdvr?GR z(4kl5W~(io7nV_JKaA!{R`s8A3x<(%K6P-|c%4$LR;bg4$B9CDfANA@OtX)~&TdN% z)|0V66+Uy_D66{(>@W~ducZk@t6&~{?Zn`GeSH<#Xizl)N5A83h*k$-4s9Sjug7b;B1_AMC^_zVV~-^kM393b7R zk&LglQbVz^u>ru+(h_I?nXm|t)fpx@7lB09au)Ew=fUE1BD?wUCM!VCDd*_^{RJQy zVSfHJT8+=DA1F*YR-RK@65|vjl^Tvf=fq_mc8j;EIlTD)Q*^$!%XFjH6FF-G2dPrX zhvM{N19_r|kZBXGLYdA}CuCGk4)TY`kSvktZTZoiwJE~av2}au_GNR=rl>=vs4w&L z^L5dE*9+tq8oN%J)9|r1_nf5)WQ>fBg?=jt6gppW)&F5VM#(hcc=g}|IpMIryom|; zTRY_(Mw)aKXN-(>XctDswLBKAAqVOk8>JO-woQ3HcfZ&03-hwvPji|47@Z!)4s6F~ ztxaBLy=yY5L5OnRy`x#F6BE7qs)q`+B@Z*?Vo)0sWkMfn{>1rxzEAN9+Xx&_qDIYw zU%Qo~{rGp?X^(u?+^3uG@PsHGVkt-2A3y)w$A}1>Py*_0+h))e2sJ8cxVw^?-aq5s znAcuxi+$O)8}MdMhuko^O3 z*O8YZEL8Hc{aBbJvfB;v49Y;DSF`}=t8-Db;d1w~ZtZodNzNW>o0>Xrd^(gwyIZmI z-RD=M7K+;7`h7jO{~e51h|81}*MPEBxFrBpILAD+1+v$u5}=nXt}@{%OfBQeZlo&X z+F0v6OWNCE{2_hs6&@PKepr{rJ&GkfWS;Xgw@tK1^)7(HNJ>M<$(W@^{UY@hctLP*Q zdFF&9#d{6VqX*u;w4$Nmto2>UPI7KM z+k&0wEm!2qYyeq?M-iN!PT^D-XI88j_wtFPesI~Y>rq?-b#!~fb)MtL1OkR=?)rh| zzx_lv#Lc_3y60N*Vk;Wl9tY~-%4dlv8R@y(9Ul!ltsc|TGr1$#PP z0y+V3!SaTbsyvA{my`)#Bay6kCGQaIi#esS)R)hGtgieG^+6d|0jZaA-qN{ztzd!C z;+dyoCnqF5Z@^uX@Ajy)1V36rr1QQ^@9+JF!z6CBN_4TH^QKOyl7bOnuMk;~O2JlO zD>@h_NT!TV5{Ou6;{Y=1lO8nO!&@b2Qu8q-+SlX^)lCNwZHgAM8#o&tQ+u;q-kL0rpLc- zd%#*uc98>n6E-A!XcEkXH>3Q@;IN?9JniuW0SD*IGt=U)!bcI#x+Cqk zZ_iIaVud6k@;p01%vAjDUDXDRd~OHis{RDp)X%XBnX6qcOtka8oVqh8NI0#VI{DPg5|8_H8!#}7=;OH zU-S;Xl4(1BwH-jk!NKwJ6ncADm7YU7++$_XV(nYug))xwl9nn?slc|kxL#$M;0%U7 zPZg`~6Z{y5^f^CT(PW^f?<5AZ>c?p;zX3gXR=+5DaS!Jk{HEq^bJ^l%S3B_^6Y}+K z2u!xEA-x6><%+!7FT2MiB`&@VpXCg@b3E=~Nkd>+$r5HO-yTh>&l5 zsON@P0BO@VwfrOu^x{4)D9uBqGAEsEhAZjbzu3)Wr{aDVX)`%#7L5cN*EtWk9LRB* zBun`Q2Fk{>OND;=^l1r*$9jBe1aR6+k@2jz%5H;{|EjQoc|`5Npro<|qWnS8NN=6f zRKzP8Z`0Pgj7>b4%XvjbRPXi5jI!?W#E)}vM_4Z7e}YT^R6jO9t63msUTYM|RJ`Hj zYq_nYsmYLb!#Dzmc8iNT?`%}yLJJhO6Mgeor@n`o=Tu-=pEHT?D-#3$fpUFMUDHt~ z6Mg-cYJACNy!rCCJu@$?G(`gy>dRx-*PntYmPy^?G;RCj_4?}SPR0ISh0k6}LVb=6KAc@gm0UjnF;diPrEVR;(tgag8&t+ z$L~VWM$JBMMLJJ;v9r$lVotJfWj7nHOTd@@er;Xd8JDmxj1CXbm#^40wTNegFPF-GOlo6$uj>DX*@TLpKN`ry8zei}+ai`3*{gb@BLt76dT>yK_%z$#}D?- zrd?!CPEKaQe@6BHEDvN2lSmO#8(eDh?^;`tLvkmjpyI>=2|yGuz>)=XF<6ta8$rT> z8qWsRURS((_fFxC(Y2b_^j)rAh=^GV0z<$YnZ1k4>)#vcY3e2k>{6EiS9TR|Z|@6C z)a0PMA%;s-wpA=j8Z`SS(*m0l z)pkbZPmH|(Z2kK6>HO@(?Pp(7xj>9~R38${JOq6$R5<5rYHCdUG%b~d>~mv(`0!zF zZLPRGpM?!$E9rQutE+26Mp`;(Vsg@Nq9DzKuOHF>tM$a$)7!hCu#lG(Km4rM?HO#C zu3?ATmQObzI$yx-;O6uC;6hZo6!f#T*ahlE1}y8O$t=3hZe(qr0WjZN9vERn+fq;i z_D`O4jA+U`0S(Dft@m-;*v$O;4v=0UB6zu}`N@>TGH`~5tn9slJ27eF=Q&ZQkNy2m zL?HjFW4y_Gn@GK#;h19V+(04Hvj5+fl-vN(%+gkZUy|0=%b^TTt{9YQTB2l8E(=O# z&CRFzMRTP*!tZO&!$8rmSKM(Nvo&u)3c=KZV!`H*hAZCFUM!#%IlC-5cnB#4v~2vz zPJUI&elnTad;fRxAJ67Wz2D(A9om`wC}E8|zt_}vDRqlqBbyrJC`lScc17o6SugA& zlR$lx0kiiEIK)<4{dNJYm10QJ63_k`@FY26 zK;)0~!Mdnb|FEzym7IXzs=?*^9oc~8=(|UfL8tXwQeUE1?*gywmJ`Oqqg8_-F*CcLXeHyxK$5cX;qSzlWkTWzes|`{z2}7id{lq8LfJuLoPVIo7^fU2-L(p+BQxZm_PF?>g*-l}WPU@pfEPfQP;P zYF<%}-}&4aFtQpYj@g5P=V&UJMrZ{TMwD*!S+oE;V6)k zFapF!So~cD73U;Q*ZPa|lgi+Wb3{}LRB&UgqK&ovI{GP75~$3xz^5gXnvfNHTWkbb ziG8s<1P&upik(aFvzMes{^ZYhrbkEr=#>=q@urSTh>I_P`&ti|4X8ywNY$amThqZ? zsM?#N?eU^0yu$dSj@TG0tIHE;AP6$&3-`^;NO)Q{bXR-d&(6-S!*AZp%WHLO3#18j z;I8pX=e`uc-s|?gudk2peu;5L!%Y@bXDTf^LW<5n4>JF63#pNoz>fyC@h4?}baDF; sI_tqTBsAIrMt&YbMztUCr0aspSMSA@5A{ib;6E2Y6|aFSS27R%A9aXe00000 literal 0 HcmV?d00001 diff --git a/assets/Gamepad/paddle_dark.png.import b/assets/Gamepad/paddle_dark.png.import new file mode 100644 index 0000000..17996ed --- /dev/null +++ b/assets/Gamepad/paddle_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/paddle_dark.png-ff76cc51d0c2f8d02ca93579ce2effba.stex" + +[deps] + +source_file="res://assets/Gamepad/paddle_dark.png" +dest_files=[ "res://.import/paddle_dark.png-ff76cc51d0c2f8d02ca93579ce2effba.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/paddle_light.png b/assets/Gamepad/paddle_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6a50df7db660f2c575494006ebc33cc5df2f699e GIT binary patch literal 5309 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 G;r|1m6aOjz literal 0 HcmV?d00001 diff --git a/assets/Gamepad/paddle_light.png.import b/assets/Gamepad/paddle_light.png.import new file mode 100644 index 0000000..48b3e5b --- /dev/null +++ b/assets/Gamepad/paddle_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/paddle_light.png-68bc3bd76f7f29fd851c29cccf13f361.stex" + +[deps] + +source_file="res://assets/Gamepad/paddle_light.png" +dest_files=[ "res://.import/paddle_light.png-68bc3bd76f7f29fd851c29cccf13f361.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/small_circle.png b/assets/Gamepad/small_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc2c840cacadb8f648d101b0e2743b90850db97 GIT binary patch literal 834 zcmV-I1HJr-P)4Q_K~z|U#n;b^m1PtM@Xzy76D2bfq|r#Y5EO!JV~L@Q3fia` zL?EfH`Uiq+Wf|Biv|r1ZT1K^~FshZ1w5Tb|jU_~2MBoS-sna-?;A!!^Z}+*kxy-%H zeaG+Wobx>Q{eC&mbI)^5G9V)2c07*V*of6wQ!ih@Mf{9UaXh88FzC0JB3>5}??%LY z4357dVmc!3T@LZ8h&U1v3quh1;%Y>^T4!%jq(0XdfTT)8r|0ke6rxVyxhi>3?ygwvyFZSU%RJA{YM^j4I6hU~gAU7g%cn@zC z{#G1poWy^Z?icy|$Z3Ch1mq=N(K(KJY)C21HW@fnkYB>l5tG9aoqM!O&bTTfZo}SU z<22@45O4+W6#l-57^~#+I$j5_$$z!B@UdJ=U=oj2*ja4&0e`nBU;*D3{;mr56@i%+ z$s2rA*qbZ4gf=*@ef(P3>np4+0vA?5z@@^TtaO*-SOEcDsBo_E*Yw*sLfl!{mn->M zZ7`*MtS{`d70wiahgU$rw!%JD$&E*Y2jw!^7RGfqImap-*SVQv*wdnbJ-DT||HPM7 zO6fX2EH*u(yOS9eCb7TpKS(KEZ(hU0xLVs2c)kSz2Xx+?dHH$H4M|Gr9NsK8@50j~ zB;T*QHG89JP;W*{_AMT1TCzc#(xZm&5r%6@3laC@bF3@Em*r++Ic@oG*qKuLsodOe zFu5BaVSCR~GnjmhvpQKBmn+;hxt8<}CST#Hl+xgjT||sU#7hw|w~WzjE+P&_#H|Ap zFCt_r@}N2FaQb#c+_Tj87d?VLLdx;{0r`%su9q*$XM7sR3^AVn3qc^X=|5shGXMYp M07*qoM6N<$f`9&bzW@LL literal 0 HcmV?d00001 diff --git a/assets/Gamepad/small_circle.png.import b/assets/Gamepad/small_circle.png.import new file mode 100644 index 0000000..164610b --- /dev/null +++ b/assets/Gamepad/small_circle.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/small_circle.png-136001dcb41744d5a052513c95052c98.stex" + +[deps] + +source_file="res://assets/Gamepad/small_circle.png" +dest_files=[ "res://.import/small_circle.png-136001dcb41744d5a052513c95052c98.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/up_down_dark.png b/assets/Gamepad/up_down_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e83c4e91d2582f31ad736a06a1de68d5f2591493 GIT binary patch literal 1303 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf_b|GFSDTyc1Z43-7(>+}rLn>~) zy}Q>>Ib5RsJ^6k6a<^Q#h{ivPye7~%$Z13rszDY*=cepM7=*sbMx~GZW z$*|h_XV)a9&7Xa9{Uke&UmMRn*O>D2=**kumw(*3>%?KS`R3!LxBG41y*WMk`|Z26 zpT6!3KB=l&U;Fjs$?daeOQ%L|3$iXR=bG1cE5pQR((Ie*EIZB}uI7+eU)-4*`E9;> z&DA@%+%H=TochO| zPg>%)e6h{>bi*diiiICTSBJiR`&QF8cxmRUvfXR5ww_{CI-u$!>A48Vb6ad!omX5O z{I)FGbJCil`OzE&zV7zMm*2fxH|y-PJD=aJOWVBi@88-`Em0+v14nf%wr$`3+-=|P z>or@We66jmHy`DUXxSrW9K8N|aG(f(UCgvp9T$!Q#$Z>DUHkUcl~m2WXU@SC{TJ-(qZrvF-@5t}_tjBYHaskJ@JgL~VVZpPO85#E;Pv&iR z7Ii(yn8XsZ$HaH)vX?nmyeGMQt%_A-adTvf+2ggeDF2l2Bp1a34Nd`;h_cJsdv9}3 zusJW9{N#bagGb>94?he5B15;CGe6nPzs(Z*d{~jDqja;^RwKg!iuRncv>&A_M)mN(uMBaS=y=%{&Ck=(X zKTff0vCN%6Kifd!4tH^uiPXzCZ+b5FGsMrIdGc;)Rn@Ax{r2DY%v^c@{p%-BTwDV` z#J31Oc=V)lUEX$UY0k4g^X+Pbw%-n&_xy-^L$@reYNn0c>dP-z+<(9N`sd8Goh7rCG)KF8ycd z)AO-k;E=ng*X5ANX>0$OzFK>lZF&mJj(csB1@>Oex_MW4-;1{rk7FXXZigZvtsY^`}6O{PM-Yovb5Lo{^@!4-zwg9)oj||WmxCkkey>7@n_!ipV#00`@YL3 r{axGbP0l+XkKm4O@% literal 0 HcmV?d00001 diff --git a/assets/Gamepad/up_down_dark.png.import b/assets/Gamepad/up_down_dark.png.import new file mode 100644 index 0000000..915fa77 --- /dev/null +++ b/assets/Gamepad/up_down_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/up_down_dark.png-7d220233a78e0d477d10e5afebcf5f3b.stex" + +[deps] + +source_file="res://assets/Gamepad/up_down_dark.png" +dest_files=[ "res://.import/up_down_dark.png-7d220233a78e0d477d10e5afebcf5f3b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/Gamepad/up_down_light.png b/assets/Gamepad/up_down_light.png new file mode 100644 index 0000000000000000000000000000000000000000..85c8e8a219b433b908bdb921aa63a5b4a4955c85 GIT binary patch literal 1295 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf_b|GG7#_m~*wHX*#`aNA7Ln>~) zy}Qxxb(qZYkM}=r+<4SsqQ?Zzrt}xWcQ#fZFMDxs`VRhpmDTNjvR0w5?rilBSlQ3O zHIYL}Cn5RwAL~07z8MQ0Ra6W2$#*`KQ{DBT=BK=M%Y!S4=H})bzyH&I|M&a3o%?2< zJo9AE?7PoQv;A$if1CFI@R?ZxhvrY(H~EYAyyv0Q zT0Y%;UiA2W!p$#@rGX;4IpwogWlGuF*jRWzoAZ0kYvB!-8LQsg`)rT9er)?m!C5mG zX=K^^FP9Z4{mVV4UcvmY;oXVP%CsE>6dW3Wh{3TTI{zK#gnsNdM;nSyepYcRk+~nt<3PyscnZBu38lo8Y+Y`b=s)%ef*pP&q*6tg&(|X6}a;H>$H8kw+$HA)o{m^Z4#7! z4s|U9V-o`-6AKV=0FeNU6j0y*`Uv4EbY(jdD;9e&)r9Zymq%!YX~M6SV^8cE#R^;F zU=GJi%j4_v?a%bYx2Yfa+6D}yy!?FAnLa6Lx9;B$Uw=J#TB?k~wg+FO`;X7^Q7bxk zvU>d@jgs2hwY%2MtYg_xml}C)+numLkyWo}H9I#b9O(1D9Fn%}!?pa#X_|eObJY&~ zciay$XY%(r-^&`OjlTY_Jz99?w_uUzp18NI#~(gi$j8T*mK{?g@L+e#kNnpO+-#Vh z0Yxh!9Apo9KjHik`;jXZ5?U}XqpCs=Ent8U2$Mg$&jfUipAm6AUAwscYlLG*U=ale9xah-&}9}ljB3I zQ_U{6Z3&GPF^OtjfHQ)Is zbMwrZw+Ad;uFq%JS@yh1%&FkK@66O|)Artves_DF<#V4&#+$9TJ$U==amgYJPqX^M zPhY0${NK9m&GF*zv1Pft-YpCMt<0FWao4(fUd5W^wClGw&7Bzuv_xL9W&PPV?d#Zo ai1+ARs{EDx^b@eOV(@hJb6Mw<&;$T)1}L=v literal 0 HcmV?d00001 diff --git a/assets/Gamepad/up_down_light.png.import b/assets/Gamepad/up_down_light.png.import new file mode 100644 index 0000000..ed88838 --- /dev/null +++ b/assets/Gamepad/up_down_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/up_down_light.png-b168b374670f061c4cba35a8b8c61c2a.stex" + +[deps] + +source_file="res://assets/Gamepad/up_down_light.png" +dest_files=[ "res://.import/up_down_light.png-b168b374670f061c4cba35a8b8c61c2a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/characters/player/script/player.gd b/characters/player/script/player.gd new file mode 100644 index 0000000..d9846f6 --- /dev/null +++ b/characters/player/script/player.gd @@ -0,0 +1,63 @@ +extends KinematicBody2D + +const UPRIGHT = Vector2(0, -1) +const GRAVITY = 20 +const MAX_SPEED = 200 +const ACCELERATION = 50 +const JUMP_HEIGHT = -550 +var motion = Vector2() +var touch_pos = Vector2() +var screen_bounds = Vector2() +enum DIGITAL_DIRECTIONS { UP, LEFT, DOWN, RIGHT, RELEASED } +var active_direction = DIGITAL_DIRECTIONS.RELEASED +var jump_pressed = false + +func _ready(): + screen_bounds = get_viewport().get_visible_rect().size + +func _physics_process(delta): + motion.y += GRAVITY + var friction = false + + if Input.is_action_pressed("ui_right") or active_direction == DIGITAL_DIRECTIONS.RIGHT: + motion.x = min(motion.x + ACCELERATION, MAX_SPEED) + $Sprite.flip_h = false + $Sprite.play("Run") + elif Input.is_action_pressed("ui_left") or active_direction == DIGITAL_DIRECTIONS.LEFT: + motion.x = max(motion.x - ACCELERATION, -MAX_SPEED) + $Sprite.flip_h = true + $Sprite.play("Run") + else: + $Sprite.play("Idle") + friction = true + + if is_on_floor(): + if Input.is_action_just_pressed("ui_up") or jump_pressed: + motion.y = JUMP_HEIGHT + if friction == true: + motion.x = lerp(motion.x, 0, 0.2) + else: + if motion.y < 0: + $Sprite.play("Jump") + else: + $Sprite.play("Fall") + if friction == true: + motion.x = lerp(motion.x, 0, 0.05) + + motion = move_and_slide(motion, UPRIGHT) + +func gamepad_force_changed(current_force, sender): + print ("Gamepad force: ", current_force, ", direction: ", sender.direction) + if sender.direction.size() > 0: + active_direction = sender.direction[0] + else: + active_direction = DIGITAL_DIRECTIONS.RELEASED + +func gamepad_stick_released(): + active_direction = DIGITAL_DIRECTIONS.RELEASED + +func A_GamepadButton_up(sender): + jump_pressed = false + +func A_GamepadButton_down(sender): + jump_pressed = true diff --git a/characters/player/sprite/Idle0.png b/characters/player/sprite/Idle0.png new file mode 100644 index 0000000000000000000000000000000000000000..98b35a6746bbd9bb99d6c51a39e6d1417f82bdc6 GIT binary patch literal 1615 zcmV-V2C(^wP)ckWHLd*<#I^Fj9BoteFz z@0&Ac&YZd3q5kLC(d-U18`}ajy93R}wgAoUK(nzeK(jm0Y@{y0_`v=ku5NkdFV&IV zX}`a5?#GPp{-i2E5_tgRA;O{IZdIIKwC#Ngk(vOTktaZe&nD)r2=rTDBBUa~n|r&r zM4p4l6MTu_T>y~h^STlE5W%+qV&r|nrvQN-{n$!9k~L*|gw2(lA+C;gm`-9=;7fol zkw5;y$LiTvMr?U$;iCHG#Jiz(UlhKx-+wQa)cd1H%=49y2tEYZ5_u5Ibv+ZRGvAMX zq+aWP&bHxrD3>#$Ns1sXKqC3Cf4)QIJA2fD7yD|+6XMDV5J3`>0>qN1Q3v@}gOmVH z@?&%JO3l^xpzpstZSOG^qSHVcUYwvI9)n_eRuxBQ%{_O30LWM8w?$M0I6_H?3E(0P zs|d#dH?;tjI}nYM1#ZlKZtoxHdEH#eDf)mH3rKQ=D{nupvZt;%>o|G(P9j8~pJZkA zKuQ2CM>T$ckN)$!Zdl^wv#;9nhqF&5KA1%LZRIC(#YRaIUY#I;lSj1IdGHLYJ!8u9 zy^lG?0CCEF2(i2DHQAdNmJA7|2Lnbd#fv$Ylx7E7sxwR=@p+n-Y1mJtB!`|#a= znEM|hb?Z+&tv|0=Q%)MeN**BmJ=%U@O`^vekPsjM`HA)W%o67!$jf-vhd}e1mmwd3 zwwM~xcCZ2|h^_(!9i~PtAd11^A#ja7Qv^6N zI50Rp?f@zM1yDK1uJd#1*O&I1`$9DbU>v2eMTkuSh){Gygf2heB22(&gD{czjZ}O9 z<@hO{=ZHpru#A2-$`JI}sY9XXNFo&hU zZ{h?W0yw7urL_>+7PN=&uWo?>={IeE@k_bj{#0LRwe z`?9$|UcGWcz3qWH2|l@68C*Teq2F_{e8P(Wdj1FPy?r(1Lqh}hFl6a!CG73UR_d19 zyVc;-CEIptaG$yI{6C(HtJ!=BL0kZI5~sf$t`i^tPLaP90n!kG$Q$Q5XRIN3Iz9tH!S7PW0 zoI+zh`h-y|@B}X6dIt56C zq*q+{k{4b6X!nTa4$B@3rCT==jDnx#xhx{?q&M2u*N)KJULdKSGC&ydVtJkuv%e$Z zB;$S;Qd>-Qr2R5ws#)P^?oaRZ5=Ynf=mY7T3^5}7JYekL##R^qv4ZjkfcEs> z$phZvfJXN2_b+}U->De*Oo`PHpI*(V>0|CV9(9UkjIiwC>N6h*{0G68(wx67;&uQ4 N002ovPDHLkV1itm3Zwu4 literal 0 HcmV?d00001 diff --git a/characters/player/sprite/Idle0.png.import b/characters/player/sprite/Idle0.png.import new file mode 100644 index 0000000..f28eb51 --- /dev/null +++ b/characters/player/sprite/Idle0.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Idle0.png-afe017ad7ad0d90b5a0140896d6c9932.stex" + +[deps] + +source_file="res://characters/player/sprite/Idle0.png" +dest_files=[ "res://.import/Idle0.png-afe017ad7ad0d90b5a0140896d6c9932.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/characters/player/sprite/Jump0.png b/characters/player/sprite/Jump0.png new file mode 100644 index 0000000000000000000000000000000000000000..bd257f2f139aadae688451756cd2db90e7a94f7e GIT binary patch literal 883 zcmV-(1C0EMP)D@S0PT)RmN?#x|DSQPVz=dLH1kNM)u)AD2 zCP4emU?fwN%=ZzC{o`iy%KCBlYtLe{-SAkAj)uhS{of}VXq-YyD=_AnZvl`J!p)bD z`xXH5nVgH~r-yKPalW?z7z90T0Wb(@>VleQ0KCxitKSJPW2OayJ-_&!&?=a>?~g%Qo3umCjuO91Bf2HvoEX}eSc03oyh zV1e@nYCb9ekwR#h6U>QR>w*oFB5&r$vVkt0g;!-_RD)!Df>i;K&mOKm48c~7RSyFqHr%dyk|4kE=)|1Lczps@-7 zUNN*yq4vN;J_y_Kz5p8!cp&mWGqmLoJ7AOWz<6T;0j06Dy|NthI!sp6w%^ALz!9T0 zA0EQwLczQO@B+;v#54fdg-WynVA+8HFe8@sIu+^bZThzWun_RK=tGqu2Sw{3`0E^N8SzN5I?gUWFfY1PHcfSWfb!{L6fH}PY zHUX9iw3#ig%H8Sd2JK#g8b<(e#sih=Ja-^u&FiEo^k{IBnxGN@yK>}(oEOft)u;ym z)c_n;kBqE&c1{YRc@IF#_f`vleaB9q(wZ0b0ze3_ea$bb9ss#kfGX+*5ND8cf>*hpq3DvI7t?0HeMCw literal 0 HcmV?d00001 diff --git a/characters/player/sprite/Jump0.png.import b/characters/player/sprite/Jump0.png.import new file mode 100644 index 0000000..82203c5 --- /dev/null +++ b/characters/player/sprite/Jump0.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Jump0.png-1031ca0b01bb60a449a0b5aa1293e57b.stex" + +[deps] + +source_file="res://characters/player/sprite/Jump0.png" +dest_files=[ "res://.import/Jump0.png-1031ca0b01bb60a449a0b5aa1293e57b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/characters/player/sprite/Jump1.png b/characters/player/sprite/Jump1.png new file mode 100644 index 0000000000000000000000000000000000000000..681f80c32a90a8d5b4b953b430af039920ee5012 GIT binary patch literal 807 zcmV+?1K9kDP)V;R5bK7P;r9oX(_n?5(QV_02B~MIC30&?1{1)o8*@) zEt?1Pf3YX?*v)3us-5fM^6bYGbGLIR@|wRsJ!#`#!SI^bAfyJNruo69i?@&OUch$< z0zN-&U%F_o$)YjlAv&YXd@2ZI&C@K<0ECCY>vxd=Gzb)c27#X=n$H3NKXX%7NU#PG zQk6zE^APXPSNQ>826+1g3IPBVA%qk&T>=2+EC9t)2&aO14#0f6O-KNGe}_}$)5qYY zK#x&KgOUj+XZ>@7XbN9}{5TyR_p&CGng(r;kK4F7Jny{%y#TBXz+<5Spm}Xpho-(> zAG^>1!2MDI;7@!oxBoLh&0}Z)FzELkurLxjKMnxRN#=P_08sx3LF_a`$msp~)Ad52 z89*VV2jGQ3J5~(rGh#s)0iXr~FP{_uv~fOv#d$&Sw?-TQWQ69K=t$!LTG!Tber{+0 zr7^x1o@?R_i3JFyNsa}<0yMaP2pNW_fDp@YNfi*ZnpfuvX;gSMY9O>Sg82o++?H$+ zLz;P9+5NmZa%Bjbj}M_~?A`5s8>Lkt4xtoyUOE6C2y`DnGEcY3;%5O#Sqi}_htkdv z1~=aV2-P79bxQ$YgT2`x?h-W;0n83T>9{xm2y2m4GCvsVYMo^y^9X?V;@0K}E})37 zLdXA{9l&7YlBKR?9L7pF|P>&*FxZ5<MiPC+YsLNL#o_nd^&DNEaSZ@Q?z$hP7~|DK=xg2sP#gr$$WQ>q zKp+!C0hABnY_**)fSvjI0@#~R0f5SL+wE%B0Khy#m=%DgQUXHt0B+8&w;Y`IV`M>b z0NA_+LCXZK$>6;Vz$?$~y^#e#gD_@H4giN71x^VexA#Vrj%a?fUN;e&39p;??dSJz zE3o|W;ij2<|PC)Z$d~8!WiCUa|l7O%!dF_R1E+PPBsIqaXw`J z>+P-yZr`5ys6HTDU!V+2+T;ZRuz3bh{)o_X+(rP}B*!bK&nCF6iUhz0G=rS>GDG;f zYd$pq+0o(TXD9$^UYecM+t&cZK#%~?5MJYnlq^@*1yeB}0>PaloBa8BIfP~&A#^e# zr$S~u0N4p40EEECX*iS+CYSzH0UDDryb%B)P&Rk~F!&z+uFmsv06=pZ1UdPUlOhX( zG*5qv=2Za6GsAc&R?J!&O9)ygh~FvA#{xK%r!p@eET_ZnBBp1=0607=rFjWJd-J^f z4Q+{y24K|Y5Lr3;>1~toqDSlSFw~6MDcJrM7|8&j`49jPLdSfdPU;&!NmH=WOc?h7 zNC;ZAnn*ynT*i(Mua5@+ARqvBM!5PvBGVwF<}G=~y(6&d0EEu?lGzdUVs;XD-Eo}>ZR+>G4MT;h_ YKaZ|+z(HHXr2qf`07*qoM6N<$g3R|;LjV8( literal 0 HcmV?d00001 diff --git a/characters/player/sprite/Jump3.png.import b/characters/player/sprite/Jump3.png.import new file mode 100644 index 0000000..ef39fc9 --- /dev/null +++ b/characters/player/sprite/Jump3.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Jump3.png-90ebffddf0dbb59d0163b1d95dc16442.stex" + +[deps] + +source_file="res://characters/player/sprite/Jump3.png" +dest_files=[ "res://.import/Jump3.png-90ebffddf0dbb59d0163b1d95dc16442.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/characters/player/sprite/Jump4.png b/characters/player/sprite/Jump4.png new file mode 100644 index 0000000000000000000000000000000000000000..682eee9bc550d196c93b7fd6c7dff76672afe7a9 GIT binary patch literal 830 zcmV-E1Ht@>P)c&25Jh)ylFEQPCxEK}ZgPn9xj=5<%1wGVPURD9?>1#F5FnSx0aC0n0!A1O{|rYf zX-QG~z+eF`E%86i4k^-y!>(PsuBGR%pU)`1-+$~vx0fF8Y(nNN5U9QM_!E7(eK^bT z`bN#K3W5e;!5C}a15g!&2mtGM-2{Xj05-n_fGQxk0FH+)HVJ^uFAbnt2%84Lrsn_< zfzaJ+2e1RE4*)}08bAlSCIA!?z*Goyy{Z8q2pRxGSPDS#*#MbG5X>hCLIUvm$iCG8 z@YV$p^Rll8Kwq&acwTOoxX&APs;* zzW7Km?lIehF)X(p2nYeV`S1xsppb8T?$Z~_0Vpa2070O*#C-L#05AkAnlMlD0LYZD z^2BEjw}ADT1U30GR>FM(Wx%_7pfdOIW)i05}792|R$X zc11IQm%hydK+|CV@3mV1FnHoX)IQi8UAvHZufMr9zE)idVE(# zJ8l$F5JhKpLWBg7jYNb*!Xn7o0D*HNB;=gLM6AF$DIt<$BnNDP1rQk3NHxAL*ZbFd zRXq-_+#dII*E#*Z?cL3no8426djZ~YFTgwQ1$f830PnaL;2rk@yyISgcie9L_5GW> z)|`xh9{5=zmcxI1eLe(Fp=)eXfCap@gk|u%{mu-Y1z2>4W$>0y9|ep`SO)(j1t5H{ z0J?_ECIm?M9svmb`P1dyuiJlzXi`E6(BNAnNH~PImar6FO3)y*NO%@NV!mDfh$A2e zUklqKfF*^V0l!Q@X)q*s`pIyz-(xqBpM@7tf+rY0mI4r54vrQtL(B!BgqrmL!}ED4 z0Ox;gR<*pP!gJL)V?_Rt;?95~|c-+0E1e7FLc7ti~ z9IXrR)TRm0#tm(GjIC|zZjhRCE;)D#o{It~v;yQ+pw*yDQN%jJ>g7v69GLNkd|w2 tLco;5q6=7AWLN>G5cdMS<6eMw{sT+?&C*wkv~Bz06N)VLJELX!>IsV7G&2%qk9b?wGa*gptLs& zAXEclR{{-!TmjsB6B6bR4^Brz_;|T)Ld&M_x2GoTErSdI%p=yTm5UIBuiIm1-Uo!t zcOaON007f?#pkI2w2{YmJ@X|17|H;GK;~i02Y{!)z0rph03q`Tn8z!nxSRq!1A4W= zlso{2%)<=-nE-H;S}m}93Tz<|fRK4IiuaV-&S1OzapN60Ce@k=?Fr;4`v72*!vO%Q z&GhF=G%qVW2f*h(O)1;vA&>c(&5gFn!SA3@mH{BJ6^>cowcr382(wB&?S;&904R#4 z0m%J-%t1$1cx}szfN30l%uWNCr)w$-%{)x-Qyn+1t@+;Cu}foG$nT|j4Fo+)$6LM& zlmNUnq?Nl9%mttaq#YR_1pX`sKoB?x4ai_Eu>e8qm}cGwfeu98dI9BxFa#o0>E#sQ z03-xNr(IIas*+6+o#UgbL7?D}+@Yt(Fd{^e?faX$KT3!K}|XvG@W z0LagCdl{v<0J!2;nl6tnqRq>lU-1B7o82J{Pb Wp0%$ zFOBk2B7dJZv%B_U(bCe=($dn>($X?(9xl(ikcxf0lO`0tC=uJhXD?w2c+~ajaefk} zg3nR{4t5s;viLjTKKr-1Nz%>e_1i-6jS&V?R;1NRrFG~R6>3i?bSAFFp01*RBVnEMGp1Lun)?f=i=(-wdj zOJi$!93miX2_x70QUIUxQBpuJA<5YQ86kkWy#`MOX!L~i1t25f#wQ_YS;g(fk%Sw0+kqF0jP_^^YSEw3Mfv3uKT>9!1t7ix zVjt(u!k5Hy$QKQcSRKC#3F_V6TB2U$tSao@UhG4OlZ4m$KNuYg9_TG?-v9sr07*qo IM6N<$f`+s)!2kdN literal 0 HcmV?d00001 diff --git a/characters/player/sprite/Run2.png.import b/characters/player/sprite/Run2.png.import new file mode 100644 index 0000000..fe7bb24 --- /dev/null +++ b/characters/player/sprite/Run2.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Run2.png-79b0186e3b78ac0bb2f00b70373eb453.stex" + +[deps] + +source_file="res://characters/player/sprite/Run2.png" +dest_files=[ "res://.import/Run2.png-79b0186e3b78ac0bb2f00b70373eb453.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/characters/player/sprite/Run3.png b/characters/player/sprite/Run3.png new file mode 100644 index 0000000000000000000000000000000000000000..bc7df45f42a7f1e9549ebd02934f327c68f20639 GIT binary patch literal 735 zcmV<50wDc~P)4SizJ_6vHZrPM@06ta#0zW=HZ9c#Mn&a2?`}T8FQQ-Rs zKzO?XJm5nFxZNG$sQ{3Y8+#j1_(KA?XMA!3G{{K`h=JvLhIs*fLACJ!fC0XN-VKU& z2Ejn^kiqcx?wS+Ko@LQqZwl`$&(7y_{HB?qhoaWyCoo?~Zdc)Yt*fFz;QFz#`(C_>x)(ZZep z%UtJvH?1yE8S$PeMXp_+ka5054L2&-~umM>r``fcpkVg4V8s(_2vjxK~&q&@`NY zq1v4$%SGqaRSdLyz0N|%e0B?x_P;oZu2%*;WQbK+aVx!|8aq^GFQBH(`~y@af*{@E R+>HPL002ovPDHLkV1f|HMLqxk literal 0 HcmV?d00001 diff --git a/characters/player/sprite/Run3.png.import b/characters/player/sprite/Run3.png.import new file mode 100644 index 0000000..91ef52c --- /dev/null +++ b/characters/player/sprite/Run3.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Run3.png-c2a2e0a76ae7dff4e16e74e44325d136.stex" + +[deps] + +source_file="res://characters/player/sprite/Run3.png" +dest_files=[ "res://.import/Run3.png-c2a2e0a76ae7dff4e16e74e44325d136.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/characters/player/sprite/Run4.png b/characters/player/sprite/Run4.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d6ff77e82d4015a8bea9454ea3c92045c45f1f GIT binary patch literal 729 zcmV;~0w(>5P)KB^N-V;0hdoB50zWFmc8nzji$i z{v}IGv{Og z@Hqw4BZ0u@mQWf^4g>#xMu7!BRsdX&Z7Sn{j}btD@9!S^=gsT*S)T*}K2^Z`=g-jK zGm0pU{1*@S5CP_JM|dh=7zHZg3GWhMo##suAVDrpKn$of|J4de0rgo65FS^5UAurM zbj)J-{q{7w&g7ViIG{J{_0VE=19QXxI5s`-5M~WP_``$K+1+MF4G5ZGi9}FV{okri0GA4-o`N#Sy^cXB0s1Je5+N0I5I%Fe-xz zzx#|<}ki->06n-|9 zN(IW>lm_z{8U^JRN-AT7uL;yg1U~0OC5Y9abrIcnu%ou2n<@bBE)~E@*gNh!Hz?dp88yE1}`n5#bW7@O+e5eL&)!-V#oJ@ngw8|=~r_K z&?6yWXokSMrbd+lLhru0L(n?FDq)ENObPk~ND{UQ9qMq7ZClkR0FrtB<9S~2YU1cn ztN`}<>cBnX3l6W)u$As}wuFK&MnVdB)e=IsxZx>to2n&nZ*gqU(zWUnuiHzCkw zOaXfS3xtayAQsvTg|9|H?n_S!AJy4WVWO|(wPlwbtGNPfY0;fuj?FIUu9-N*00000 LNkvXXu0mjfE8#*z literal 0 HcmV?d00001 diff --git a/characters/player/sprite/Run4.png.import b/characters/player/sprite/Run4.png.import new file mode 100644 index 0000000..ed2d58e --- /dev/null +++ b/characters/player/sprite/Run4.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Run4.png-bc3cbdb4283aa9ceeec40ac4facbb189.stex" + +[deps] + +source_file="res://characters/player/sprite/Run4.png" +dest_files=[ "res://.import/Run4.png-bc3cbdb4283aa9ceeec40ac4facbb189.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/characters/player/sprite/Run7.png b/characters/player/sprite/Run7.png new file mode 100644 index 0000000000000000000000000000000000000000..560dc99bb5264920cac9470bf3c356b6049b44d6 GIT binary patch literal 651 zcmV;60(AX}P)=gsz0YZWl5SkbfJdPoNO7;gf;VB*gF*8F5;P4!J@S4du1jNh| z35*|ecpCm707B~Z+nn)}oOxCq}!p{@vLi=+AG!UK*ZUBCl%>toALXMT7Uw4N6NAe2Eg8fK&mc1tS0rgH;QF1l%X60-h56 zUw~4x{QvxnOp1UaB~&kf61pi;ya3AO;YEkic7Te8N2CBLVea3z^*{i>;ZYsDlu*T7 lfbvg3O{p55A_Z8H@Czp2AB12U(zO5p002ovPDHLkV1k9AAIty% literal 0 HcmV?d00001 diff --git a/characters/player/sprite/Run7.png.import b/characters/player/sprite/Run7.png.import new file mode 100644 index 0000000..66a3253 --- /dev/null +++ b/characters/player/sprite/Run7.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Run7.png-b2f1a1d62278dc3c53e9ecf2b33080b7.stex" + +[deps] + +source_file="res://characters/player/sprite/Run7.png" +dest_files=[ "res://.import/Run7.png-b2f1a1d62278dc3c53e9ecf2b33080b7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/default_env.tres b/default_env.tres new file mode 100644 index 0000000..ad86b72 --- /dev/null +++ b/default_env.tres @@ -0,0 +1,101 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +radiance_size = 4 +sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) +sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) +sky_curve = 0.25 +sky_energy = 1.0 +ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) +ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) +ground_curve = 0.01 +ground_energy = 1.0 +sun_color = Color( 1, 1, 1, 1 ) +sun_latitude = 35.0 +sun_longitude = 0.0 +sun_angle_min = 1.0 +sun_angle_max = 100.0 +sun_curve = 0.05 +sun_energy = 16.0 +texture_size = 2 + +[resource] + +background_mode = 2 +background_sky = SubResource( 1 ) +background_sky_custom_fov = 0.0 +background_color = Color( 0, 0, 0, 1 ) +background_energy = 1.0 +background_canvas_max_layer = 0 +ambient_light_color = Color( 0, 0, 0, 1 ) +ambient_light_energy = 1.0 +ambient_light_sky_contribution = 1.0 +fog_enabled = false +fog_color = Color( 0.5, 0.6, 0.7, 1 ) +fog_sun_color = Color( 1, 0.9, 0.7, 1 ) +fog_sun_amount = 0.0 +fog_depth_enabled = true +fog_depth_begin = 10.0 +fog_depth_curve = 1.0 +fog_transmit_enabled = false +fog_transmit_curve = 1.0 +fog_height_enabled = false +fog_height_min = 0.0 +fog_height_max = 100.0 +fog_height_curve = 1.0 +tonemap_mode = 0 +tonemap_exposure = 1.0 +tonemap_white = 1.0 +auto_exposure_enabled = false +auto_exposure_scale = 0.4 +auto_exposure_min_luma = 0.05 +auto_exposure_max_luma = 8.0 +auto_exposure_speed = 0.5 +ss_reflections_enabled = false +ss_reflections_max_steps = 64 +ss_reflections_fade_in = 0.15 +ss_reflections_fade_out = 2.0 +ss_reflections_depth_tolerance = 0.2 +ss_reflections_roughness = true +ssao_enabled = false +ssao_radius = 1.0 +ssao_intensity = 1.0 +ssao_radius2 = 0.0 +ssao_intensity2 = 1.0 +ssao_bias = 0.01 +ssao_light_affect = 0.0 +ssao_color = Color( 0, 0, 0, 1 ) +ssao_quality = 0 +ssao_blur = 3 +ssao_edge_sharpness = 4.0 +dof_blur_far_enabled = false +dof_blur_far_distance = 10.0 +dof_blur_far_transition = 5.0 +dof_blur_far_amount = 0.1 +dof_blur_far_quality = 1 +dof_blur_near_enabled = false +dof_blur_near_distance = 2.0 +dof_blur_near_transition = 1.0 +dof_blur_near_amount = 0.1 +dof_blur_near_quality = 1 +glow_enabled = false +glow_levels/1 = false +glow_levels/2 = false +glow_levels/3 = true +glow_levels/4 = false +glow_levels/5 = true +glow_levels/6 = false +glow_levels/7 = false +glow_intensity = 0.8 +glow_strength = 1.0 +glow_bloom = 0.0 +glow_blend_mode = 2 +glow_hdr_threshold = 1.0 +glow_hdr_scale = 2.0 +glow_bicubic_upscale = false +adjustment_enabled = false +adjustment_brightness = 1.0 +adjustment_contrast = 1.0 +adjustment_saturation = 1.0 + diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..4c95548 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,250 @@ +[preset.0] + +name="Android" +platform="Android" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +patch_list=PoolStringArray( ) + +[preset.0.options] + +graphics/32_bits_framebuffer=true +one_click_deploy/clear_previous_install=true +custom_package/debug="" +custom_package/release="" +command_line/extra_args="" +version/code=1 +version/name="1.0" +package/unique_name="org.godotengine.$genname" +package/name="" +package/signed=true +screen/immersive_mode=true +screen/orientation=0 +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +launcher_icons/xxxhdpi_192x192="" +launcher_icons/xxhdpi_144x144="" +launcher_icons/xhdpi_96x96="" +launcher_icons/hdpi_72x72="" +launcher_icons/mdpi_48x48="" +keystore/release="" +keystore/release_user="" +keystore/release_password="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +architectures/armeabi-v7a=true +architectures/arm64-v8a=false +architectures/x86=false +architectures/x86_64=false +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false +user_permissions/0=false +user_permissions/1=false +user_permissions/2=false +user_permissions/3=false +user_permissions/4=false +user_permissions/5=false +user_permissions/6=false +user_permissions/7=false +user_permissions/8=false +user_permissions/9=false +user_permissions/10=false +user_permissions/11=false +user_permissions/12=false +user_permissions/13=false +user_permissions/14=false +user_permissions/15=false +user_permissions/16=false +user_permissions/17=false +user_permissions/18=false +user_permissions/19=false + +[preset.1] + +name="Linux/X11" +platform="Linux/X11" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +patch_list=PoolStringArray( ) + +[preset.1.options] + +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +binary_format/64_bits=true +custom_template/release="" +custom_template/debug="" + +[preset.2] + +name="HTML5" +platform="HTML5" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +patch_list=PoolStringArray( ) + +[preset.2.options] + +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=true +html/custom_html_shell="" +html/head_include="" +custom_template/release="" +custom_template/debug="" diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b64eee944cb4cfb2aa8dc0d8d78faf6ca44dc1 GIT binary patch literal 3498 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 Y|LV|6es%hBO8@`>07*qoM6N<$f`}~Z-v9sr literal 0 HcmV?d00001 diff --git a/icon.png.import b/icon.png.import new file mode 100644 index 0000000..0041ef8 --- /dev/null +++ b/icon.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/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 +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/levels/world1/JungleDirtTiles.tscn b/levels/world1/JungleDirtTiles.tscn new file mode 100644 index 0000000..6a387cc --- /dev/null +++ b/levels/world1/JungleDirtTiles.tscn @@ -0,0 +1,291 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://levels/world1/sprite/JungleDirtTileSet.png" type="Texture" id=1] + + +[sub_resource type="RectangleShape2D" id=1] + +custom_solver_bias = 0.0 +extents = Vector2( 16, 16 ) + +[node name="JungleDirtTiles" type="Node"] + +[node name="0" type="Sprite" parent="." index="0"] + +editor/display_folded = true +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 0, 96, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="0" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="0/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="1" type="Sprite" parent="." index="1"] + +editor/display_folded = true +position = Vector2( 64, 0 ) +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 32, 96, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="1" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="1/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="2" type="Sprite" parent="." index="2"] + +editor/display_folded = true +position = Vector2( 128, 0 ) +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 64, 96, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="2" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="2/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="3" type="Sprite" parent="." index="3"] + +editor/display_folded = true +position = Vector2( 0, 64 ) +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 64, 160, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="3" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="3/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="4" type="Sprite" parent="." index="4"] + +editor/display_folded = true +position = Vector2( 64, 64 ) +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 160, 160, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="4" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="4/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="5" type="Sprite" parent="." index="5"] + +editor/display_folded = true +position = Vector2( 128, 64 ) +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 96, 160, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="5" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="5/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="6" type="Sprite" parent="." index="6"] + +editor/display_folded = true +position = Vector2( 0, 128 ) +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 96, 0, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="6" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="6/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="7" type="Sprite" parent="." index="7"] + +editor/display_folded = true +position = Vector2( 64, 128 ) +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 128, 0, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="7" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="7/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + +[node name="8" type="Sprite" parent="." index="8"] + +editor/display_folded = true +position = Vector2( 128, 128 ) +texture = ExtResource( 1 ) +centered = false +region_enabled = true +region_rect = Rect2( 160, 0, 32, 32 ) +_sections_unfolded = [ "Offset", "Region" ] +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody2D" type="StaticBody2D" parent="8" index="0"] + +editor/display_folded = true +input_pickable = false +collision_layer = 1 +collision_mask = 1 +constant_linear_velocity = Vector2( 0, 0 ) +constant_angular_velocity = 0.0 +friction = 1.0 +bounce = 0.0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="8/StaticBody2D" index="0"] + +visible = false +position = Vector2( 16, 16 ) +shape = SubResource( 1 ) +_sections_unfolded = [ "Transform" ] + + diff --git a/levels/world1/JungleDirtTileset.tres b/levels/world1/JungleDirtTileset.tres new file mode 100644 index 0000000..c881b4b --- /dev/null +++ b/levels/world1/JungleDirtTileset.tres @@ -0,0 +1,138 @@ +[gd_resource type="TileSet" load_steps=3 format=2] + +[ext_resource path="res://levels/world1/sprite/JungleDirtTileSet.png" type="Texture" id=1] + +[sub_resource type="RectangleShape2D" id=1] + +custom_solver_bias = 0.0 +extents = Vector2( 16, 16 ) + +[resource] + +0/name = "0" +0/texture = ExtResource( 1 ) +0/tex_offset = Vector2( 0, 0 ) +0/modulate = Color( 1, 1, 1, 1 ) +0/region = Rect2( 0, 96, 32, 32 ) +0/is_autotile = false +0/occluder_offset = Vector2( 0, 0 ) +0/navigation_offset = Vector2( 0, 0 ) +0/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] +1/name = "1" +1/texture = ExtResource( 1 ) +1/tex_offset = Vector2( 0, 0 ) +1/modulate = Color( 1, 1, 1, 1 ) +1/region = Rect2( 32, 96, 32, 32 ) +1/is_autotile = false +1/occluder_offset = Vector2( 0, 0 ) +1/navigation_offset = Vector2( 0, 0 ) +1/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] +2/name = "2" +2/texture = ExtResource( 1 ) +2/tex_offset = Vector2( 0, 0 ) +2/modulate = Color( 1, 1, 1, 1 ) +2/region = Rect2( 64, 96, 32, 32 ) +2/is_autotile = false +2/occluder_offset = Vector2( 0, 0 ) +2/navigation_offset = Vector2( 0, 0 ) +2/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] +3/name = "3" +3/texture = ExtResource( 1 ) +3/tex_offset = Vector2( 0, 0 ) +3/modulate = Color( 1, 1, 1, 1 ) +3/region = Rect2( 64, 160, 32, 32 ) +3/is_autotile = false +3/occluder_offset = Vector2( 0, 0 ) +3/navigation_offset = Vector2( 0, 0 ) +3/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] +4/name = "4" +4/texture = ExtResource( 1 ) +4/tex_offset = Vector2( 0, 0 ) +4/modulate = Color( 1, 1, 1, 1 ) +4/region = Rect2( 160, 160, 32, 32 ) +4/is_autotile = false +4/occluder_offset = Vector2( 0, 0 ) +4/navigation_offset = Vector2( 0, 0 ) +4/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] +5/name = "5" +5/texture = ExtResource( 1 ) +5/tex_offset = Vector2( 0, 0 ) +5/modulate = Color( 1, 1, 1, 1 ) +5/region = Rect2( 96, 160, 32, 32 ) +5/is_autotile = false +5/occluder_offset = Vector2( 0, 0 ) +5/navigation_offset = Vector2( 0, 0 ) +5/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] +6/name = "6" +6/texture = ExtResource( 1 ) +6/tex_offset = Vector2( 0, 0 ) +6/modulate = Color( 1, 1, 1, 1 ) +6/region = Rect2( 96, 0, 32, 32 ) +6/is_autotile = false +6/occluder_offset = Vector2( 0, 0 ) +6/navigation_offset = Vector2( 0, 0 ) +6/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] +7/name = "7" +7/texture = ExtResource( 1 ) +7/tex_offset = Vector2( 0, 0 ) +7/modulate = Color( 1, 1, 1, 1 ) +7/region = Rect2( 128, 0, 32, 32 ) +7/is_autotile = false +7/occluder_offset = Vector2( 0, 0 ) +7/navigation_offset = Vector2( 0, 0 ) +7/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] +8/name = "8" +8/texture = ExtResource( 1 ) +8/tex_offset = Vector2( 0, 0 ) +8/modulate = Color( 1, 1, 1, 1 ) +8/region = Rect2( 160, 0, 32, 32 ) +8/is_autotile = false +8/occluder_offset = Vector2( 0, 0 ) +8/navigation_offset = Vector2( 0, 0 ) +8/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 16, 16 ) +} ] + diff --git a/levels/world1/script/world1.gd b/levels/world1/script/world1.gd new file mode 100644 index 0000000..1fa3820 --- /dev/null +++ b/levels/world1/script/world1.gd @@ -0,0 +1,16 @@ +extends Node + +# class member variables go here, for example: +# var a = 2 +# var b = "textvar" +onready var gamepad = $GamePad/GamepadContainer/GamepadArea/GamepadStick + +func _ready(): + # Called when the node is added to the scene for the first time. + # Initialization here + gamepad.show_dynamically = false + +#func _process(delta): +# # Called every frame. Delta is time since last frame. +# # Update game logic here. +# pass diff --git a/levels/world1/sprite/JungleDirtTileSet.png b/levels/world1/sprite/JungleDirtTileSet.png new file mode 100644 index 0000000000000000000000000000000000000000..ef09cbd7365c85ac87c9292f93614674edfec7db GIT binary patch literal 5816 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 literal 0 HcmV?d00001 diff --git a/levels/world1/sprite/JungleDirtTileSet.png.import b/levels/world1/sprite/JungleDirtTileSet.png.import new file mode 100644 index 0000000..6a04d44 --- /dev/null +++ b/levels/world1/sprite/JungleDirtTileSet.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/JungleDirtTileSet.png-b491582343ea5ad979406256695a320c.stex" + +[deps] + +source_file="res://levels/world1/sprite/JungleDirtTileSet.png" +dest_files=[ "res://.import/JungleDirtTileSet.png-b491582343ea5ad979406256695a320c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/levels/world1/world1.tscn b/levels/world1/world1.tscn new file mode 100644 index 0000000..3ab57c8 --- /dev/null +++ b/levels/world1/world1.tscn @@ -0,0 +1,258 @@ +[gd_scene load_steps=26 format=2] + +[ext_resource path="res://levels/world1/script/world1.gd" type="Script" id=1] +[ext_resource path="res://characters/player/script/player.gd" type="Script" id=2] +[ext_resource path="res://characters/player/sprite/Run0.png" type="Texture" id=3] +[ext_resource path="res://characters/player/sprite/Run1.png" type="Texture" id=4] +[ext_resource path="res://characters/player/sprite/Run2.png" type="Texture" id=5] +[ext_resource path="res://characters/player/sprite/Run3.png" type="Texture" id=6] +[ext_resource path="res://characters/player/sprite/Run4.png" type="Texture" id=7] +[ext_resource path="res://characters/player/sprite/Run7.png" type="Texture" id=8] +[ext_resource path="res://characters/player/sprite/Idle0.png" type="Texture" id=9] +[ext_resource path="res://characters/player/sprite/Jump3.png" type="Texture" id=10] +[ext_resource path="res://characters/player/sprite/Jump0.png" type="Texture" id=11] +[ext_resource path="res://levels/world1/JungleDirtTileset.tres" type="TileSet" id=12] +[ext_resource path="res://addons/Gamepad/GamepadContainer.gd" type="Script" id=13] +[ext_resource path="res://addons/Gamepad/icons/container.png" type="Texture" id=14] +[ext_resource path="res://addons/Gamepad/GamepadArea.gd" type="Script" id=15] +[ext_resource path="res://addons/Gamepad/icons/area.png" type="Texture" id=16] +[ext_resource path="res://addons/Gamepad/GamepadStick.gd" type="Script" id=17] +[ext_resource path="res://addons/Gamepad/icons/stick.png" type="Texture" id=18] +[ext_resource path="res://assets/Gamepad/cross_light.png" type="Texture" id=19] +[ext_resource path="res://assets/Gamepad/cursor_dark.png" type="Texture" id=20] +[ext_resource path="res://addons/Gamepad/GamepadButton.gd" type="Script" id=21] +[ext_resource path="res://addons/Gamepad/icons/button.png" type="Texture" id=22] +[ext_resource path="res://assets/Gamepad/button_a.png" type="Texture" id=23] + +[sub_resource type="SpriteFrames" id=1] + +animations = [ { +"frames": [ ExtResource( 3 ), ExtResource( 4 ), ExtResource( 5 ), ExtResource( 6 ), ExtResource( 7 ), ExtResource( 8 ) ], +"loop": true, +"name": "Run", +"speed": 10.0 +}, { +"frames": [ ExtResource( 9 ) ], +"loop": true, +"name": "Idle", +"speed": 5.0 +}, { +"frames": [ ExtResource( 10 ) ], +"loop": true, +"name": "Fall", +"speed": 5.0 +}, { +"frames": [ ExtResource( 11 ) ], +"loop": true, +"name": "Jump", +"speed": 5.0 +} ] + +[sub_resource type="CapsuleShape2D" id=2] + +custom_solver_bias = 0.0 +radius = 14.0 +height = 28.0 + +[node name="World" type="Node" index="0"] + +script = ExtResource( 1 ) + +[node name="Player" type="KinematicBody2D" parent="." index="0"] + +position = Vector2( 320, 96 ) +input_pickable = false +collision_layer = 1 +collision_mask = 1 +collision/safe_margin = 0.08 +script = ExtResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="Sprite" type="AnimatedSprite" parent="Player" index="0"] + +frames = SubResource( 1 ) +animation = "Idle" +playing = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player" index="1"] + +position = Vector2( 0, 4 ) +shape = SubResource( 2 ) +_sections_unfolded = [ "Transform" ] + +[node name="TileMap" type="TileMap" parent="." index="1"] + +mode = 0 +tile_set = ExtResource( 12 ) +cell_size = Vector2( 32, 32 ) +cell_quadrant_size = 16 +cell_custom_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +cell_half_offset = 2 +cell_tile_origin = 0 +cell_y_sort = false +cell_clip_uv = false +collision_use_kinematic = false +collision_friction = 1.0 +collision_bounce = 0.0 +collision_layer = 1 +collision_mask = 1 +occluder_light_mask = 1 +format = 1 +tile_data = PoolIntArray( 196611, 0, 0, 196612, 1, 0, 196613, 1, 0, 196614, 1, 0, 196615, 2, 0, 262147, 6, 0, 262148, 7, 0, 262149, 7, 0, 262150, 7, 0, 262151, 8, 0, 262157, 0, 0, 262158, 1, 0, 262159, 1, 0, 262160, 2, 0, 327693, 3, 0, 327694, 4, 0, 327695, 4, 0, 327696, 5, 0, 393229, 3, 0, 393230, 4, 0, 393231, 4, 0, 393232, 5, 0, 458753, 0, 0, 458754, 1, 0, 458755, 1, 0, 458756, 1, 0, 458757, 1, 0, 458758, 1, 0, 458759, 1, 0, 458760, 1, 0, 458761, 1, 0, 458762, 1, 0, 458763, 1, 0, 458764, 1, 0, 458765, 1, 0, 458766, 1, 0, 458767, 1, 0, 458768, 1, 0, 458769, 1, 0, 458770, 2, 0, 524289, 3, 0, 524290, 4, 0, 524291, 4, 0, 524292, 4, 0, 524293, 4, 0, 524294, 4, 0, 524295, 4, 0, 524296, 4, 0, 524297, 4, 0, 524298, 4, 0, 524299, 4, 0, 524300, 4, 0, 524301, 4, 0, 524302, 4, 0, 524303, 4, 0, 524304, 4, 0, 524305, 4, 0, 524306, 5, 0, 589825, 6, 0, 589826, 7, 0, 589827, 7, 0, 589828, 7, 0, 589829, 7, 0, 589830, 7, 0, 589831, 7, 0, 589832, 7, 0, 589833, 7, 0, 589834, 7, 0, 589835, 7, 0, 589836, 7, 0, 589837, 7, 0, 589838, 7, 0, 589839, 7, 0, 589840, 7, 0, 589841, 7, 0, 589842, 8, 0 ) +_sections_unfolded = [ "Cell", "Collision", "Material", "Transform", "Visibility", "Z Index" ] +__meta__ = { +"_edit_lock_": true +} + +[node name="GamePad" type="CanvasLayer" parent="." index="2"] + +layer = 1 +offset = Vector2( 0, 0 ) +rotation = 0.0 +scale = Vector2( 1, 1 ) +transform = Transform2D( 1, 0, 0, 1, 0, 0 ) + +[node name="GamepadContainer" type="Control" parent="GamePad" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 640.0 +margin_bottom = 384.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +script = ExtResource( 13 ) +__meta__ = { +"_editor_icon": ExtResource( 14 ) +} +disabled = false + +[node name="GamepadArea" type="Control" parent="GamePad/GamepadContainer" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 224.0 +margin_bottom = 384.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +script = ExtResource( 15 ) +_sections_unfolded = [ "Visibility" ] +__meta__ = { +"_editor_icon": ExtResource( 16 ) +} +disabled = false +gamepad_type = "AREA 0" + +[node name="GamepadStick" type="Control" parent="GamePad/GamepadContainer/GamepadArea" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 35.0 +margin_top = 200.0 +margin_right = 131.0 +margin_bottom = 296.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +script = ExtResource( 17 ) +_sections_unfolded = [ "Rect" ] +__meta__ = { +"_editor_icon": ExtResource( 18 ) +} +disabled = false +show_dynamically = false +gamepad_type = "STICK 0" +stick_type = 2 +background_texture = ExtResource( 19 ) +stick_texture = ExtResource( 20 ) +stick_scale = Vector2( 1, 1 ) +static_position = Vector2( 35, 200 ) +hide_stick_on_stop = false +adjust_iso = 0 +valid_threshold = 0.2 +step = 0.0 +simulate_up = "ui_up" +simulate_left = "ui_left" +simulate_down = "ui_down" +simulate_right = "ui_right" + +[node name="GamepadArea2" type="Control" parent="GamePad/GamepadContainer" index="1"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 448.0 +margin_top = 224.0 +margin_right = 608.0 +margin_bottom = 352.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +script = ExtResource( 15 ) +__meta__ = { +"_editor_icon": ExtResource( 16 ) +} +disabled = false +gamepad_type = "AREA 0" + +[node name="GamepadButton" type="Control" parent="GamePad/GamepadContainer/GamepadArea2" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 50.0 +margin_right = 114.0 +margin_bottom = 64.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +script = ExtResource( 21 ) +_sections_unfolded = [ "Anchor" ] +__meta__ = { +"_editor_icon": ExtResource( 22 ) +} +disabled = false +show_dynamically = false +gamepad_type = "BUTTON 0" +texture_normal = ExtResource( 23 ) +texture_pressed = ExtResource( 23 ) +texture_disabled = null +static_position = Vector2( 50, 0 ) +autofire_delay = 0.0 +simulate_action = "ui_select" + +[connection signal="gamepad_force_changed" from="GamePad/GamepadContainer/GamepadArea/GamepadStick" to="Player" method="gamepad_force_changed"] + +[connection signal="gamepad_stick_released" from="GamePad/GamepadContainer/GamepadArea/GamepadStick" to="Player" method="gamepad_stick_released"] + +[connection signal="down" from="GamePad/GamepadContainer/GamepadArea2/GamepadButton" to="Player" method="A_GamepadButton_down"] + +[connection signal="up" from="GamePad/GamepadContainer/GamepadArea2/GamepadButton" to="Player" method="A_GamepadButton_up"] + + diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..5f24527 --- /dev/null +++ b/project.godot @@ -0,0 +1,32 @@ +; 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=3 + +[application] + +config/name="MiniPlatformGame" +run/main_scene="res://levels/world1/world1.tscn" +config/icon="res://icon.png" + +[display] + +window/size/width=640 +window/size/height=360 +window/size/test_width=1280 +window/size/test_height=720 +window/stretch/mode="2d" +window/stretch/aspect="expand" + +[editor_plugins] + +enabled=PoolStringArray( "Gamepad" ) + +[rendering] + +environment/default_environment="res://default_env.tres"