commit 8689a4732a085ae5d6dd032e286709f664b161d3 Author: Martin Dimitrov Date: Fri Oct 26 16:06:27 2018 +0300 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 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 0000000..d7e7066 Binary files /dev/null and b/addons/Gamepad/icons/area.png differ 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 0000000..53eb383 Binary files /dev/null and b/addons/Gamepad/icons/button.png differ 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 0000000..8004f21 Binary files /dev/null and b/addons/Gamepad/icons/container.png differ 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 0000000..9e33331 Binary files /dev/null and b/addons/Gamepad/icons/paddle.png differ diff --git a/addons/Gamepad/icons/paddle.png.import b/addons/Gamepad/icons/paddle.png.import new file mode 100644 index 0000000..22b7163 --- /dev/null +++ b/addons/Gamepad/icons/paddle.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/paddle.png-59514a14dc6761beb00e68c904d8fdeb.stex" + +[deps] + +source_file="res://addons/Gamepad/icons/paddle.png" +dest_files=[ "res://.import/paddle.png-59514a14dc6761beb00e68c904d8fdeb.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/stick.png b/addons/Gamepad/icons/stick.png new file mode 100644 index 0000000..8053472 Binary files /dev/null and b/addons/Gamepad/icons/stick.png differ diff --git a/addons/Gamepad/icons/stick.png.import b/addons/Gamepad/icons/stick.png.import new file mode 100644 index 0000000..ce66c34 --- /dev/null +++ b/addons/Gamepad/icons/stick.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/stick.png-f1f1d9614c54b68a216944c6dd22f794.stex" + +[deps] + +source_file="res://addons/Gamepad/icons/stick.png" +dest_files=[ "res://.import/stick.png-f1f1d9614c54b68a216944c6dd22f794.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/plugin.cfg b/addons/Gamepad/plugin.cfg new file mode 100644 index 0000000..d7466b5 --- /dev/null +++ b/addons/Gamepad/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Gamepad" +description="Adds touch gamepad controls for mobile applications" +author="Francesco Iafulli" +version="1.0" +script="Gamepad.gd" \ No newline at end of file diff --git a/assets/Gamepad/big_circle.png b/assets/Gamepad/big_circle.png new file mode 100644 index 0000000..f5e305b Binary files /dev/null and b/assets/Gamepad/big_circle.png differ 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 0000000..6a3291c Binary files /dev/null and b/assets/Gamepad/button_a.png differ diff --git a/assets/Gamepad/button_a.png.import b/assets/Gamepad/button_a.png.import new file mode 100644 index 0000000..e9171ed --- /dev/null +++ b/assets/Gamepad/button_a.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button_a.png-3425d7a5fbc3dfc0a8035eb514d85043.stex" + +[deps] + +source_file="res://assets/Gamepad/button_a.png" +dest_files=[ "res://.import/button_a.png-3425d7a5fbc3dfc0a8035eb514d85043.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_b.png b/assets/Gamepad/button_b.png new file mode 100644 index 0000000..47abbc1 Binary files /dev/null and b/assets/Gamepad/button_b.png differ diff --git a/assets/Gamepad/button_b.png.import b/assets/Gamepad/button_b.png.import new file mode 100644 index 0000000..fd6c409 --- /dev/null +++ b/assets/Gamepad/button_b.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button_b.png-126d00e733ca708d9f00355fb34510f6.stex" + +[deps] + +source_file="res://assets/Gamepad/button_b.png" +dest_files=[ "res://.import/button_b.png-126d00e733ca708d9f00355fb34510f6.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_fire.png b/assets/Gamepad/button_fire.png new file mode 100644 index 0000000..c129d8f Binary files /dev/null and b/assets/Gamepad/button_fire.png differ 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 0000000..51c2774 Binary files /dev/null and b/assets/Gamepad/button_l.png differ 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 0000000..5637c25 Binary files /dev/null and b/assets/Gamepad/button_r.png differ 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 0000000..f7561c6 Binary files /dev/null and b/assets/Gamepad/button_target.png differ diff --git a/assets/Gamepad/button_target.png.import b/assets/Gamepad/button_target.png.import new file mode 100644 index 0000000..27ce0ad --- /dev/null +++ b/assets/Gamepad/button_target.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button_target.png-2baafc8011e910bd60bdd7618cee8b74.stex" + +[deps] + +source_file="res://assets/Gamepad/button_target.png" +dest_files=[ "res://.import/button_target.png-2baafc8011e910bd60bdd7618cee8b74.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_x.png b/assets/Gamepad/button_x.png new file mode 100644 index 0000000..8f8dba4 Binary files /dev/null and b/assets/Gamepad/button_x.png differ diff --git a/assets/Gamepad/button_x.png.import b/assets/Gamepad/button_x.png.import new file mode 100644 index 0000000..e7e5ab2 --- /dev/null +++ b/assets/Gamepad/button_x.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button_x.png-ca13c48418dcd2a2cf82fd985ae9fe5b.stex" + +[deps] + +source_file="res://assets/Gamepad/button_x.png" +dest_files=[ "res://.import/button_x.png-ca13c48418dcd2a2cf82fd985ae9fe5b.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_y.png b/assets/Gamepad/button_y.png new file mode 100644 index 0000000..f34cc5a Binary files /dev/null and b/assets/Gamepad/button_y.png differ diff --git a/assets/Gamepad/button_y.png.import b/assets/Gamepad/button_y.png.import new file mode 100644 index 0000000..2935d81 --- /dev/null +++ b/assets/Gamepad/button_y.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/button_y.png-7ff07289434f8350718c3aaa7cc2412d.stex" + +[deps] + +source_file="res://assets/Gamepad/button_y.png" +dest_files=[ "res://.import/button_y.png-7ff07289434f8350718c3aaa7cc2412d.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_dark.png b/assets/Gamepad/cross_dark.png new file mode 100644 index 0000000..21ebaaf Binary files /dev/null and b/assets/Gamepad/cross_dark.png differ 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 0000000..c31d9b8 Binary files /dev/null and b/assets/Gamepad/cross_light.png differ diff --git a/assets/Gamepad/cross_light.png.import b/assets/Gamepad/cross_light.png.import new file mode 100644 index 0000000..a235ec6 --- /dev/null +++ b/assets/Gamepad/cross_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cross_light.png-da14eb1bb7ceb770cd3460d9616bd9d7.stex" + +[deps] + +source_file="res://assets/Gamepad/cross_light.png" +dest_files=[ "res://.import/cross_light.png-da14eb1bb7ceb770cd3460d9616bd9d7.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/cursor_dark.png b/assets/Gamepad/cursor_dark.png new file mode 100644 index 0000000..1b1916b Binary files /dev/null and b/assets/Gamepad/cursor_dark.png differ diff --git a/assets/Gamepad/cursor_dark.png.import b/assets/Gamepad/cursor_dark.png.import new file mode 100644 index 0000000..24a685f --- /dev/null +++ b/assets/Gamepad/cursor_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cursor_dark.png-1b46b2c8cde337e0c2b3d16428ce7d4c.stex" + +[deps] + +source_file="res://assets/Gamepad/cursor_dark.png" +dest_files=[ "res://.import/cursor_dark.png-1b46b2c8cde337e0c2b3d16428ce7d4c.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/cursor_light.png b/assets/Gamepad/cursor_light.png new file mode 100644 index 0000000..4bb8eca Binary files /dev/null and b/assets/Gamepad/cursor_light.png differ diff --git a/assets/Gamepad/cursor_light.png.import b/assets/Gamepad/cursor_light.png.import new file mode 100644 index 0000000..a44da2f --- /dev/null +++ b/assets/Gamepad/cursor_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cursor_light.png-68fa5bda91a6da44255f09bfc83b5c7c.stex" + +[deps] + +source_file="res://assets/Gamepad/cursor_light.png" +dest_files=[ "res://.import/cursor_light.png-68fa5bda91a6da44255f09bfc83b5c7c.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_dark.png b/assets/Gamepad/diagonal_dark.png new file mode 100644 index 0000000..d225591 Binary files /dev/null and b/assets/Gamepad/diagonal_dark.png differ 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 0000000..b95c1a2 Binary files /dev/null and b/assets/Gamepad/diagonal_int_dark.png differ 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 0000000..e9c08ab Binary files /dev/null and b/assets/Gamepad/diagonal_int_light.png differ diff --git a/assets/Gamepad/diagonal_int_light.png.import b/assets/Gamepad/diagonal_int_light.png.import new file mode 100644 index 0000000..04639b7 --- /dev/null +++ b/assets/Gamepad/diagonal_int_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/diagonal_int_light.png-cc157c17e49280d4956545af8a5e3d36.stex" + +[deps] + +source_file="res://assets/Gamepad/diagonal_int_light.png" +dest_files=[ "res://.import/diagonal_int_light.png-cc157c17e49280d4956545af8a5e3d36.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_light.png b/assets/Gamepad/diagonal_light.png new file mode 100644 index 0000000..aa43982 Binary files /dev/null and b/assets/Gamepad/diagonal_light.png differ 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 0000000..08e748f Binary files /dev/null and b/assets/Gamepad/left_right_dark.png differ 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 0000000..7af66a9 Binary files /dev/null and b/assets/Gamepad/left_right_light.png differ 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 0000000..c58e926 Binary files /dev/null and b/assets/Gamepad/omni_dark.png differ 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 0000000..381ccb2 Binary files /dev/null and b/assets/Gamepad/omni_int_dark.png differ diff --git a/assets/Gamepad/omni_int_dark.png.import b/assets/Gamepad/omni_int_dark.png.import new file mode 100644 index 0000000..7bbc3f3 --- /dev/null +++ b/assets/Gamepad/omni_int_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/omni_int_dark.png-871036fd0dcaeafb8ead63d9ae7bca86.stex" + +[deps] + +source_file="res://assets/Gamepad/omni_int_dark.png" +dest_files=[ "res://.import/omni_int_dark.png-871036fd0dcaeafb8ead63d9ae7bca86.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_light.png b/assets/Gamepad/omni_int_light.png new file mode 100644 index 0000000..e81eede Binary files /dev/null and b/assets/Gamepad/omni_int_light.png differ diff --git a/assets/Gamepad/omni_int_light.png.import b/assets/Gamepad/omni_int_light.png.import new file mode 100644 index 0000000..84d4988 --- /dev/null +++ b/assets/Gamepad/omni_int_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/omni_int_light.png-b29f657562a3524e3d0bca76cddcaeeb.stex" + +[deps] + +source_file="res://assets/Gamepad/omni_int_light.png" +dest_files=[ "res://.import/omni_int_light.png-b29f657562a3524e3d0bca76cddcaeeb.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_light.png b/assets/Gamepad/omni_light.png new file mode 100644 index 0000000..7d9e278 Binary files /dev/null and b/assets/Gamepad/omni_light.png differ 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 0000000..d75a356 Binary files /dev/null and b/assets/Gamepad/omni_square_dark.png differ 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 0000000..bb6d95d Binary files /dev/null and b/assets/Gamepad/omni_square_int_dark.png differ diff --git a/assets/Gamepad/omni_square_int_dark.png.import b/assets/Gamepad/omni_square_int_dark.png.import new file mode 100644 index 0000000..6f74605 --- /dev/null +++ b/assets/Gamepad/omni_square_int_dark.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/omni_square_int_dark.png-e32d7d162dbb803947e8c5f580f24cb1.stex" + +[deps] + +source_file="res://assets/Gamepad/omni_square_int_dark.png" +dest_files=[ "res://.import/omni_square_int_dark.png-e32d7d162dbb803947e8c5f580f24cb1.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_light.png b/assets/Gamepad/omni_square_int_light.png new file mode 100644 index 0000000..4fbba1a Binary files /dev/null and b/assets/Gamepad/omni_square_int_light.png differ 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 0000000..c85cacd Binary files /dev/null and b/assets/Gamepad/omni_square_light.png differ diff --git a/assets/Gamepad/omni_square_light.png.import b/assets/Gamepad/omni_square_light.png.import new file mode 100644 index 0000000..11b1b39 --- /dev/null +++ b/assets/Gamepad/omni_square_light.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/omni_square_light.png-a81ead77f97f3089dffdefb5b69acaa5.stex" + +[deps] + +source_file="res://assets/Gamepad/omni_square_light.png" +dest_files=[ "res://.import/omni_square_light.png-a81ead77f97f3089dffdefb5b69acaa5.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_dark.png b/assets/Gamepad/paddle_dark.png new file mode 100644 index 0000000..215a024 Binary files /dev/null and b/assets/Gamepad/paddle_dark.png differ 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 0000000..6a50df7 Binary files /dev/null and b/assets/Gamepad/paddle_light.png differ 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 0000000..5bc2c84 Binary files /dev/null and b/assets/Gamepad/small_circle.png differ 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 0000000..e83c4e9 Binary files /dev/null and b/assets/Gamepad/up_down_dark.png differ 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 0000000..85c8e8a Binary files /dev/null and b/assets/Gamepad/up_down_light.png differ 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 0000000..98b35a6 Binary files /dev/null and b/characters/player/sprite/Idle0.png differ 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 0000000..bd257f2 Binary files /dev/null and b/characters/player/sprite/Jump0.png differ 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 0000000..681f80c Binary files /dev/null and b/characters/player/sprite/Jump1.png differ diff --git a/characters/player/sprite/Jump1.png.import b/characters/player/sprite/Jump1.png.import new file mode 100644 index 0000000..47ccc17 --- /dev/null +++ b/characters/player/sprite/Jump1.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Jump1.png-4dcf5efccf390af8d32013b538a4b3d5.stex" + +[deps] + +source_file="res://characters/player/sprite/Jump1.png" +dest_files=[ "res://.import/Jump1.png-4dcf5efccf390af8d32013b538a4b3d5.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/Jump3.png b/characters/player/sprite/Jump3.png new file mode 100644 index 0000000..ea6a1a3 Binary files /dev/null and b/characters/player/sprite/Jump3.png differ 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 0000000..682eee9 Binary files /dev/null and b/characters/player/sprite/Jump4.png differ diff --git a/characters/player/sprite/Jump4.png.import b/characters/player/sprite/Jump4.png.import new file mode 100644 index 0000000..beddc6e --- /dev/null +++ b/characters/player/sprite/Jump4.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Jump4.png-0eb245ee330545001e2a3d898d1f49f0.stex" + +[deps] + +source_file="res://characters/player/sprite/Jump4.png" +dest_files=[ "res://.import/Jump4.png-0eb245ee330545001e2a3d898d1f49f0.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/Run0.png b/characters/player/sprite/Run0.png new file mode 100644 index 0000000..3a15012 Binary files /dev/null and b/characters/player/sprite/Run0.png differ diff --git a/characters/player/sprite/Run0.png.import b/characters/player/sprite/Run0.png.import new file mode 100644 index 0000000..a6927a5 --- /dev/null +++ b/characters/player/sprite/Run0.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Run0.png-6c9753af7d0b2baf39cd2c0db6fb1ec8.stex" + +[deps] + +source_file="res://characters/player/sprite/Run0.png" +dest_files=[ "res://.import/Run0.png-6c9753af7d0b2baf39cd2c0db6fb1ec8.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/Run1.png b/characters/player/sprite/Run1.png new file mode 100644 index 0000000..0d49f77 Binary files /dev/null and b/characters/player/sprite/Run1.png differ diff --git a/characters/player/sprite/Run1.png.import b/characters/player/sprite/Run1.png.import new file mode 100644 index 0000000..004fd00 --- /dev/null +++ b/characters/player/sprite/Run1.png.import @@ -0,0 +1,29 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Run1.png-0f17afe42ce1632133d8f7622d9318b9.stex" + +[deps] + +source_file="res://characters/player/sprite/Run1.png" +dest_files=[ "res://.import/Run1.png-0f17afe42ce1632133d8f7622d9318b9.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/Run2.png b/characters/player/sprite/Run2.png new file mode 100644 index 0000000..638077a Binary files /dev/null and b/characters/player/sprite/Run2.png differ 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 0000000..bc7df45 Binary files /dev/null and b/characters/player/sprite/Run3.png differ 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 0000000..e5d6ff7 Binary files /dev/null and b/characters/player/sprite/Run4.png differ 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 0000000..560dc99 Binary files /dev/null and b/characters/player/sprite/Run7.png differ 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 0000000..a0b64ee Binary files /dev/null and b/icon.png differ 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 0000000..ef09cbd Binary files /dev/null and b/levels/world1/sprite/JungleDirtTileSet.png differ 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"