WIP: weird song selection refactor for swipe scrolling

This commit is contained in:
Luke Hubmayer-Werner 2021-01-21 22:44:54 +10:30
parent 4cd369013f
commit 8ac3f9d945
2 changed files with 67 additions and 46 deletions

View File

@ -17,6 +17,8 @@ const TOUCHBUTTON_MAX_DIST := 1.075
const BUTTON_MIN_DIST := 0.925 const BUTTON_MIN_DIST := 0.925
const BUTTON_MAX_DIST := 1.25 const BUTTON_MAX_DIST := 1.25
var swipe_momentum := Vector2.ZERO
func resize(): func resize():
var screen_size = $'/root'.get_visible_rect().size var screen_size = $'/root'.get_visible_rect().size
rect_position = -screen_size*0.5 rect_position = -screen_size*0.5
@ -41,6 +43,10 @@ func _ready():
$VolumeSlider.connect('value_changed', self, 'update_volume') $VolumeSlider.connect('value_changed', self, 'update_volume')
$SSXSlider.connect('value_changed', Settings, 'SSX_set') $SSXSlider.connect('value_changed', Settings, 'SSX_set')
$SSYSlider.connect('value_changed', Settings, 'SSY_set') $SSYSlider.connect('value_changed', Settings, 'SSY_set')
$BtnLanguage.add_item('Native')
$BtnLanguage.add_item('Romaji')
$BtnLanguage.add_item('English')
$BtnLanguage.connect('item_selected', self, 'update_display_language')
resize() resize()
func update_vsync(setting: bool): func update_vsync(setting: bool):
@ -55,6 +61,9 @@ func update_filter(alpha: float):
func update_volume(volume: float): func update_volume(volume: float):
AudioServer.set_bus_volume_db(0, volume) AudioServer.set_bus_volume_db(0, volume)
func update_display_language(index: int):
GameTheme.display_language = ['n', 'tl', 'en'][index]
func print_pressed(col: int): func print_pressed(col: int):
print('Pressed %d'%col) print('Pressed %d'%col)
@ -65,6 +74,8 @@ var fps: float = 0.0
var audio_latency: float = 0.0 var audio_latency: float = 0.0
func _draw(): func _draw():
set_text('FPS: %.0f\nAudio Latency: %.2fms'%[fps, audio_latency*1000]) set_text('FPS: %.0f\nAudio Latency: %.2fms'%[fps, audio_latency*1000])
var swipe_origin = Vector2(300, 540)
draw_line(swipe_origin, swipe_origin+swipe_momentum, Color.red)
# draw points # draw points
for i in touch_points: for i in touch_points:
@ -81,6 +92,9 @@ func _draw():
var last_latency_check := 0.0 var last_latency_check := 0.0
func _process(delta): func _process(delta):
swipe_momentum *= max(1.0 - 5.0*delta, 0)
if swipe_momentum.length_squared() < 1.0:
swipe_momentum = Vector2.ZERO
last_latency_check += delta last_latency_check += delta
fps = Engine.get_frames_per_second() fps = Engine.get_frames_per_second()
if last_latency_check > 3.0: if last_latency_check > 3.0:
@ -126,6 +140,7 @@ func _input(event):
# As such, we'll need to do some fancy mapping for multiple inputs # As such, we'll need to do some fancy mapping for multiple inputs
if (event is InputEventScreenDrag): if (event is InputEventScreenDrag):
touch_points[event.index] = {pressed = true, position = event.position} touch_points[event.index] = {pressed = true, position = event.position}
swipe_momentum = event.speed
elif (event is InputEventScreenTouch): elif (event is InputEventScreenTouch):
if event.pressed: if event.pressed:
if not touch_points.has(event.index): if not touch_points.has(event.index):

View File

@ -12,20 +12,32 @@ var genres = {}
enum ChartDifficulty {EASY, BASIC, ADV, EXPERT, MASTER} enum ChartDifficulty {EASY, BASIC, ADV, EXPERT, MASTER}
enum MenuMode {SONG_SELECT, CHART_SELECT, OPTIONS, GAMEPLAY, SCORE_SCREEN} enum MenuMode {SONG_SELECT, CHART_SELECT, OPTIONS, GAMEPLAY, SCORE_SCREEN}
var selected_genre: int = 0
var selected_genre_vis: int = 0
var selected_genre_delta: float = 0.0 # For floaty display scrolling
var selected_song: int = 0
var selected_song_vis: int = 0
var selected_song_delta: float = 0.0 # For floaty display scrolling
var selected_song_key: String = ''
var selected_difficulty = ChartDifficulty.ADV
var menu_mode = MenuMode.SONG_SELECT var menu_mode = MenuMode.SONG_SELECT
var menu_mode_prev = MenuMode.SONG_SELECT var menu_mode_prev = MenuMode.SONG_SELECT
var menu_mode_prev_fade_timer := 0.0 var menu_mode_prev_fade_timer := 0.0
var menu_mode_prev_fade_timer_duration := 0.25 var menu_mode_prev_fade_timer_duration := 0.25
var currently_playing := false var currently_playing := false
var selected_genre: int = 0
var selected_genre_vis: int = 0
var selected_genre_delta: float = 0.0 # For floaty display scrolling
var target_song_idx: int = 0 setget set_target_song_idx
var target_song_delta: float = 0.0 # For floaty display scrolling
var selected_song_idx: int setget , get_song_idx
var selected_song_key: String setget , get_song_key
var selected_difficulty = ChartDifficulty.ADV
func set_target_song_idx(index: int):
target_song_delta -= index - target_song_idx
target_song_idx = index
func get_song_idx() -> int:
return int(round(self.target_song_idx + target_song_delta))
func get_song_key() -> String:
var songslist = genres[genres.keys()[selected_genre]]
return songslist[self.target_song_idx % len(songslist)]
var scorescreen_song_key := '' var scorescreen_song_key := ''
var scorescreen_score_data := {} var scorescreen_score_data := {}
var scorescreen_datetime := {} var scorescreen_datetime := {}
@ -74,7 +86,7 @@ func save_score() -> int:
print_debug('Error saving score file %s'%filename) print_debug('Error saving score file %s'%filename)
return err return err
func load_score(filename): func load_score(filename: String):
var result = FileLoader.load_json('scores/%s'%filename) var result = FileLoader.load_json('scores/%s'%filename)
if not (result is Dictionary): if not (result is Dictionary):
print('An error occurred while trying to access the chosen score file: ', result) print('An error occurred while trying to access the chosen score file: ', result)
@ -93,9 +105,8 @@ func load_score(filename):
set_menu_mode(MenuMode.SCORE_SCREEN) set_menu_mode(MenuMode.SCORE_SCREEN)
func load_preview(): func load_preview():
var songslist = genres[genres.keys()[selected_genre]] var tmp = self.selected_song_key
var song_key = songslist[selected_song % len(songslist)] var data = Library.all_songs[tmp]
var data = Library.all_songs[song_key]
PVMusic.stop() PVMusic.stop()
PVMusic.set_stream(FileLoader.load_ogg('songs/' + data.filepath.rstrip('/') + '/' + data.audio_filelist[0])) PVMusic.set_stream(FileLoader.load_ogg('songs/' + data.filepath.rstrip('/') + '/' + data.audio_filelist[0]))
PVMusic.play(16*60.0/data.BPM) PVMusic.play(16*60.0/data.BPM)
@ -106,17 +117,10 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame. # Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta): func _process(delta):
var diff = selected_song - (selected_song_vis + selected_song_delta) target_song_delta -= ease_curve.interpolate(clamp(target_song_delta, -2, 2)*0.5) * 10 * delta
selected_song_delta += ease_curve.interpolate(clamp(diff, -2, 2)*0.5) * 10 * delta # target_song_delta += $'../InputHandler'.swipe_momentum.x * 1
if selected_song_delta > 0.5: if abs(target_song_delta) < 0.02: # Snap
selected_song_delta -= 1.0 target_song_delta = 0.0
selected_song_vis += 1
elif selected_song_delta < -0.5:
selected_song_delta += 1.0
selected_song_vis -= 1
if abs(diff) < 0.02: # Snap
selected_song_delta = 0.0
selected_song_vis = selected_song
var g_diff = selected_genre - (selected_genre_vis + selected_genre_delta) var g_diff = selected_genre - (selected_genre_vis + selected_genre_delta)
selected_genre_delta += ease_curve.interpolate(clamp(g_diff, -1, 1)) * 10 * delta selected_genre_delta += ease_curve.interpolate(clamp(g_diff, -1, 1)) * 10 * delta
@ -134,7 +138,7 @@ func _process(delta):
update() update()
if (menu_mode == MenuMode.GAMEPLAY) and (menu_mode_prev_fade_timer <= 0.0) and not NoteHandler.running: if (menu_mode == MenuMode.GAMEPLAY) and (menu_mode_prev_fade_timer <= 0.0) and not NoteHandler.running:
var songslist = genres[genres.keys()[selected_genre]] var songslist = genres[genres.keys()[selected_genre]]
var song_key = songslist[selected_song % len(songslist)] var song_key = songslist[self.target_song_idx % len(songslist)]
NoteHandler.load_track(song_key, Library.Song.default_difficulty_keys[selected_difficulty]) NoteHandler.load_track(song_key, Library.Song.default_difficulty_keys[selected_difficulty])
NoteHandler.running = true NoteHandler.running = true
@ -175,22 +179,24 @@ func _draw_song_select(center: Vector2) -> Array:
var gy: float = center.y - 375 - size*selected_genre_delta var gy: float = center.y - 375 - size*selected_genre_delta
var touchrects := [] var touchrects := []
var ssid = self.selected_song_idx
var s_delta = target_song_delta-round(target_song_delta)
for gi in [-2, -1, 0, 1, 2]: for gi in [-2, -1, 0, 1, 2]:
var g = (selected_genre_vis + gi) % len(genres) var g = (selected_genre_vis + gi) % len(genres)
var selected: bool = (gi == 0) var selected: bool = (gi == 0)
var scales = sel_scales if selected else bg_scales var scales = sel_scales if selected else bg_scales
var subsize = size * scales.value(abs(selected_song_delta)) var subsize = size * scales.value(abs(s_delta))
var gx = center.x - (subsize + spacer_x) * selected_song_delta var gx = center.x - (subsize + spacer_x) * s_delta
var songslist = Library.genre_songs[g].keys() var songslist = Library.genre_songs[g].keys()
var genre_str = '%s (%d)'%[genres.keys()[g], len(songslist)] var genre_str = '%s (%d)'%[genres.keys()[g], len(songslist)]
draw_string_centered(GenreFont, Vector2(center.x, gy), genre_str, Color.aqua) draw_string_centered(GenreFont, Vector2(center.x, gy), genre_str, Color.aqua)
var s = len(songslist) var s = len(songslist)
var key = songslist[selected_song_vis % s] var key = songslist[self.selected_song_idx % s]
var y = gy + spacer_y var y = gy + spacer_y
var x = -subsize/2.0 var x = -subsize/2.0
var r = draw_songtile(key, Vector2(gx+x, y), subsize, selected) var r = draw_songtile(key, Vector2(gx+x, y), subsize, selected)
touchrects.append({rect=r, song_idx=selected_song_vis, genre_idx=g}) touchrects.append({rect=r, song_idx=self.selected_song_idx, genre_idx=g})
var subsize_p = subsize var subsize_p = subsize
var subsize_n = subsize var subsize_n = subsize
@ -199,19 +205,19 @@ func _draw_song_select(center: Vector2) -> Array:
for i in range(1, scales.len()): for i in range(1, scales.len()):
x_p += subsize_p + spacer_x x_p += subsize_p + spacer_x
x_n += subsize_n + spacer_x x_n += subsize_n + spacer_x
subsize_p = size * scales.value(abs(i-selected_song_delta)) subsize_p = size * scales.value(abs(i-s_delta))
subsize_n = size * scales.value(abs(-i-selected_song_delta)) subsize_n = size * scales.value(abs(-i-s_delta))
r = draw_songtile(songslist[(selected_song_vis+i) % s], Vector2(gx+x_p, y), subsize_p) r = draw_songtile(songslist[(ssid+i) % s], Vector2(gx+x_p, y), subsize_p)
touchrects.append({rect=r, song_idx=selected_song_vis+i, genre_idx=g}) touchrects.append({rect=r, song_idx=ssid+i, genre_idx=g})
r = draw_songtile(songslist[(selected_song_vis-i) % s], Vector2(gx-x_n - subsize_n, y), subsize_n) r = draw_songtile(songslist[(ssid-i) % s], Vector2(gx-x_n - subsize_n, y), subsize_n)
touchrects.append({rect=r, song_idx=selected_song_vis-i, genre_idx=g}) touchrects.append({rect=r, song_idx=ssid-i, genre_idx=g})
gy += size*scales.value(0) + spacer_y + (title_spacer_y if selected else 0) gy += size*scales.value(0) + spacer_y + (title_spacer_y if selected else 0)
return touchrects return touchrects
func _draw_chart_select(center: Vector2) -> Array: func _draw_chart_select(center: Vector2) -> Array:
# Select difficulty for chosen song # Select difficulty for chosen song
var charts: Dictionary = Library.get_song_charts(selected_song_key) var charts: Dictionary = Library.get_song_charts(self.selected_song_key)
var song_data = Library.all_songs[selected_song_key] var song_data = Library.all_songs[self.selected_song_key]
var diffs = song_data.chart_difficulties var diffs = song_data.chart_difficulties
var n = len(diffs) var n = len(diffs)
var spacer_x = max(14, 70/n) var spacer_x = max(14, 70/n)
@ -227,10 +233,10 @@ func _draw_chart_select(center: Vector2) -> Array:
var i_diff = Library.Song.difficulty_key_ids.get(diff, 0) var i_diff = Library.Song.difficulty_key_ids.get(diff, 0)
var width = 8 if i_diff == selected_difficulty else 3 var width = 8 if i_diff == selected_difficulty else 3
var chart_exists: bool = (diff in charts) var chart_exists: bool = (diff in charts)
var r = draw_songtile(selected_song_key, Vector2(x, center.y), size, false, i_diff, width, not chart_exists) var r = draw_songtile(self.selected_song_key, Vector2(x, center.y), size, false, i_diff, width, not chart_exists)
touchrects.append({rect=r, chart_idx=i_diff, enabled=chart_exists}) touchrects.append({rect=r, chart_idx=i_diff, enabled=chart_exists})
x += size + spacer_x x += size + spacer_x
draw_string_centered(TitleFont, Vector2(center.x, center.y+size+32), str(Library.all_songs[selected_song_key].title)) draw_string_centered(TitleFont, Vector2(center.x, center.y+size+32), str(Library.all_songs[self.selected_song_key].title))
draw_string_centered(TitleFont, Vector2(center.x-50, center.y+size+80), 'BPM:') draw_string_centered(TitleFont, Vector2(center.x-50, center.y+size+80), 'BPM:')
draw_string_centered(TitleFont, Vector2(center.x+50, center.y+size+80), str(song_data.BPM)) draw_string_centered(TitleFont, Vector2(center.x+50, center.y+size+80), str(song_data.BPM))
@ -258,7 +264,7 @@ func _draw_score_screen(center: Vector2) -> Array:
var songslist = genres[genres.keys()[selected_genre]] var songslist = genres[genres.keys()[selected_genre]]
var song_key = scorescreen_song_key var song_key = scorescreen_song_key
# var song_data = Library.all_songs[song_key] # var song_data = Library.all_songs[song_key]
var chart: Array = Library.get_song_charts(selected_song_key)[Library.Song.default_difficulty_keys[selected_difficulty]] var chart: Array = Library.get_song_charts(song_key)[Library.Song.default_difficulty_keys[selected_difficulty]]
var all_notes: Array = chart[1] var all_notes: Array = chart[1]
var meta: Dictionary = chart[0] var meta: Dictionary = chart[0]
@ -438,14 +444,14 @@ func set_menu_mode(mode):
menu_mode_prev_fade_timer = menu_mode_prev_fade_timer_duration menu_mode_prev_fade_timer = menu_mode_prev_fade_timer_duration
func touch_select_song(touchdict): func touch_select_song(touchdict):
if (self.selected_genre == touchdict.genre_idx) and (self.selected_song_vis == touchdict.song_idx): if (self.selected_genre == touchdict.genre_idx) and (self.selected_song_idx == touchdict.song_idx):
SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_interact, 0.0) SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_interact, 0.0)
var songslist = genres[genres.keys()[selected_genre]] # var songslist = genres[genres.keys()[selected_genre]]
selected_song_key = songslist[selected_song % len(songslist)] # selected_song_key = songslist[self.target_song_idx % len(songslist)]
set_menu_mode(MenuMode.CHART_SELECT) set_menu_mode(MenuMode.CHART_SELECT)
else: else:
self.selected_genre = touchdict.genre_idx self.selected_genre = touchdict.genre_idx
self.selected_song = touchdict.song_idx self.target_song_idx = touchdict.song_idx
SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_interact, -4.5) SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_interact, -4.5)
load_preview() load_preview()
@ -516,9 +522,9 @@ func _input(event):
match menu_mode: match menu_mode:
MenuMode.SONG_SELECT: MenuMode.SONG_SELECT:
if event.is_action_pressed('ui_right'): # Sadly can't use match with this input system if event.is_action_pressed('ui_right'): # Sadly can't use match with this input system
selected_song += 1 self.target_song_idx += 1
elif event.is_action_pressed('ui_left'): elif event.is_action_pressed('ui_left'):
selected_song -= 1 self.target_song_idx -= 1
elif event.is_action_pressed('ui_up'): elif event.is_action_pressed('ui_up'):
selected_genre = posmod(selected_genre - 1, len(genres)) selected_genre = posmod(selected_genre - 1, len(genres))
elif event.is_action_pressed('ui_down'): elif event.is_action_pressed('ui_down'):
@ -526,4 +532,4 @@ func _input(event):
elif event.is_action_pressed('ui_page_up'): elif event.is_action_pressed('ui_page_up'):
selected_difficulty = int(max(0, selected_difficulty - 1)) selected_difficulty = int(max(0, selected_difficulty - 1))
elif event.is_action_pressed('ui_page_down'): elif event.is_action_pressed('ui_page_down'):
selected_difficulty = int(min(4, selected_difficulty + 1)) selected_difficulty = int(min(6, selected_difficulty + 1))