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
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
.import/
|
||||
17
addons/Gamepad/Gamepad.gd
Normal file
|
|
@ -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")
|
||||
99
addons/Gamepad/GamepadArea.gd
Normal file
|
|
@ -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 ]#######################################################################################################
|
||||
295
addons/Gamepad/GamepadButton.gd
Normal file
|
|
@ -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 ]#######################################################################################################
|
||||
101
addons/Gamepad/GamepadButtonTemplate.tscn
Normal file
|
|
@ -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 = [ ]
|
||||
|
||||
|
||||
163
addons/Gamepad/GamepadContainer.gd
Normal file
|
|
@ -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 ]#######################################################################################################
|
||||
408
addons/Gamepad/GamepadPaddle.gd
Normal file
|
|
@ -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 ]#######################################################################################################
|
||||
125
addons/Gamepad/GamepadPaddleTemplate.tscn
Normal file
|
|
@ -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
|
||||
|
||||
|
||||
546
addons/Gamepad/GamepadStick.gd
Normal file
|
|
@ -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 ]#######################################################################################################
|
||||
118
addons/Gamepad/GamepadStickTemplate.tscn
Normal file
|
|
@ -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 = [ ]
|
||||
|
||||
|
||||
BIN
addons/Gamepad/icons/area.png
Normal file
|
After Width: | Height: | Size: 413 B |
29
addons/Gamepad/icons/area.png.import
Normal file
|
|
@ -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
|
||||
BIN
addons/Gamepad/icons/button.png
Normal file
|
After Width: | Height: | Size: 727 B |
29
addons/Gamepad/icons/button.png.import
Normal file
|
|
@ -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
|
||||
BIN
addons/Gamepad/icons/container.png
Normal file
|
After Width: | Height: | Size: 530 B |
29
addons/Gamepad/icons/container.png.import
Normal file
|
|
@ -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
|
||||
BIN
addons/Gamepad/icons/paddle.png
Normal file
|
After Width: | Height: | Size: 615 B |
29
addons/Gamepad/icons/paddle.png.import
Normal file
|
|
@ -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
|
||||
BIN
addons/Gamepad/icons/stick.png
Normal file
|
After Width: | Height: | Size: 600 B |
29
addons/Gamepad/icons/stick.png.import
Normal file
|
|
@ -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
|
||||
7
addons/Gamepad/plugin.cfg
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
[plugin]
|
||||
|
||||
name="Gamepad"
|
||||
description="Adds touch gamepad controls for mobile applications"
|
||||
author="Francesco Iafulli"
|
||||
version="1.0"
|
||||
script="Gamepad.gd"
|
||||
BIN
assets/Gamepad/big_circle.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
29
assets/Gamepad/big_circle.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/button_a.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
29
assets/Gamepad/button_a.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/button_b.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
29
assets/Gamepad/button_b.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/button_fire.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
29
assets/Gamepad/button_fire.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/button_l.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
29
assets/Gamepad/button_l.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/button_r.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
29
assets/Gamepad/button_r.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/button_target.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
29
assets/Gamepad/button_target.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/button_x.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
29
assets/Gamepad/button_x.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/button_y.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
29
assets/Gamepad/button_y.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/cross_dark.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
29
assets/Gamepad/cross_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/cross_light.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
29
assets/Gamepad/cross_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/cursor_dark.png
Normal file
|
After Width: | Height: | Size: 383 B |
29
assets/Gamepad/cursor_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/cursor_light.png
Normal file
|
After Width: | Height: | Size: 374 B |
29
assets/Gamepad/cursor_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/diagonal_dark.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
29
assets/Gamepad/diagonal_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/diagonal_int_dark.png
Normal file
|
After Width: | Height: | Size: 829 B |
29
assets/Gamepad/diagonal_int_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/diagonal_int_light.png
Normal file
|
After Width: | Height: | Size: 809 B |
29
assets/Gamepad/diagonal_int_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/diagonal_light.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
29
assets/Gamepad/diagonal_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/left_right_dark.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
29
assets/Gamepad/left_right_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/left_right_light.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
29
assets/Gamepad/left_right_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/omni_dark.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
29
assets/Gamepad/omni_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/omni_int_dark.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
29
assets/Gamepad/omni_int_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/omni_int_light.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
29
assets/Gamepad/omni_int_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/omni_light.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
29
assets/Gamepad/omni_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/omni_square_dark.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
29
assets/Gamepad/omni_square_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/omni_square_int_dark.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
29
assets/Gamepad/omni_square_int_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/omni_square_int_light.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
29
assets/Gamepad/omni_square_int_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/omni_square_light.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
29
assets/Gamepad/omni_square_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/paddle_dark.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
29
assets/Gamepad/paddle_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/paddle_light.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
29
assets/Gamepad/paddle_light.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/small_circle.png
Normal file
|
After Width: | Height: | Size: 834 B |
29
assets/Gamepad/small_circle.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/up_down_dark.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
29
assets/Gamepad/up_down_dark.png.import
Normal file
|
|
@ -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
|
||||
BIN
assets/Gamepad/up_down_light.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
29
assets/Gamepad/up_down_light.png.import
Normal file
|
|
@ -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
|
||||
63
characters/player/script/player.gd
Normal file
|
|
@ -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
|
||||
BIN
characters/player/sprite/Idle0.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
29
characters/player/sprite/Idle0.png.import
Normal file
|
|
@ -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
|
||||
BIN
characters/player/sprite/Jump0.png
Normal file
|
After Width: | Height: | Size: 883 B |
29
characters/player/sprite/Jump0.png.import
Normal file
|
|
@ -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
|
||||
BIN
characters/player/sprite/Jump1.png
Normal file
|
After Width: | Height: | Size: 807 B |
29
characters/player/sprite/Jump1.png.import
Normal file
|
|
@ -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
|
||||
BIN
characters/player/sprite/Jump3.png
Normal file
|
After Width: | Height: | Size: 794 B |
29
characters/player/sprite/Jump3.png.import
Normal file
|
|
@ -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
|
||||
BIN
characters/player/sprite/Jump4.png
Normal file
|
After Width: | Height: | Size: 830 B |
29
characters/player/sprite/Jump4.png.import
Normal file
|
|
@ -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
|
||||
BIN
characters/player/sprite/Run0.png
Normal file
|
After Width: | Height: | Size: 867 B |
29
characters/player/sprite/Run0.png.import
Normal file
|
|
@ -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
|
||||
BIN
characters/player/sprite/Run1.png
Normal file
|
After Width: | Height: | Size: 792 B |
29
characters/player/sprite/Run1.png.import
Normal file
|
|
@ -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
|
||||