From 4f2a4768c8eedfb882b17ad57f0e7e482930acca Mon Sep 17 00:00:00 2001 From: Artus Date: Tue, 3 Nov 2020 00:47:59 +0100 Subject: [PATCH] adds track parser from txt files --- CarSprite.gd | 4 +- Global.gd | 9 +- Gui.tscn | 1 - Main.gd | 2 +- Player.gd | 25 ++++ PlayerCar.gd | 18 +-- PlayerCar.tscn | 36 +++--- RaceTrack.gd | 21 ++-- RaceTrack.tscn | 180 +++++++++++++++++++++------- TileMap.gd | 69 +++++++++++ TrackPath.gd | 9 +- assets/track_tiles/dl.png | Bin 0 -> 5031 bytes assets/track_tiles/dl.png.import | 34 ++++++ assets/track_tiles/dr.png | Bin 0 -> 5002 bytes assets/track_tiles/dr.png.import | 34 ++++++ assets/track_tiles/lr.png | Bin 0 -> 474 bytes assets/track_tiles/lr.png.import | 34 ++++++ assets/track_tiles/start.png | Bin 0 -> 2165 bytes assets/track_tiles/start.png.import | 34 ++++++ assets/track_tiles/track.png | Bin 0 -> 21907 bytes assets/track_tiles/track.png.import | 34 ++++++ assets/track_tiles/ud.png | Bin 0 -> 548 bytes assets/track_tiles/ud.png.import | 34 ++++++ assets/track_tiles/ul.png | Bin 0 -> 4962 bytes assets/track_tiles/ul.png.import | 34 ++++++ assets/track_tiles/ur.png | Bin 0 -> 5091 bytes assets/track_tiles/ur.png.import | 34 ++++++ assets/tracks/demo.txt | 8 ++ assets/tracks/track1.txt | 8 ++ project.godot | 1 + track_selection.gd | 89 ++++++++++++++ 31 files changed, 649 insertions(+), 103 deletions(-) create mode 100644 Player.gd create mode 100644 TileMap.gd create mode 100644 assets/track_tiles/dl.png create mode 100644 assets/track_tiles/dl.png.import create mode 100644 assets/track_tiles/dr.png create mode 100644 assets/track_tiles/dr.png.import create mode 100644 assets/track_tiles/lr.png create mode 100644 assets/track_tiles/lr.png.import create mode 100644 assets/track_tiles/start.png create mode 100644 assets/track_tiles/start.png.import create mode 100644 assets/track_tiles/track.png create mode 100644 assets/track_tiles/track.png.import create mode 100644 assets/track_tiles/ud.png create mode 100644 assets/track_tiles/ud.png.import create mode 100644 assets/track_tiles/ul.png create mode 100644 assets/track_tiles/ul.png.import create mode 100644 assets/track_tiles/ur.png create mode 100644 assets/track_tiles/ur.png.import create mode 100644 assets/tracks/demo.txt create mode 100644 assets/tracks/track1.txt create mode 100644 track_selection.gd diff --git a/CarSprite.gd b/CarSprite.gd index f94a134..8f16e26 100644 --- a/CarSprite.gd +++ b/CarSprite.gd @@ -12,8 +12,8 @@ func _ready(): func _process(delta): """ - The sprite has its own representation of rotation, so we need to tweak things. - The sprite inherits orientation from its parent (TrackFollow) that must be canceled. + The sprite contains a representation of rotation in its own, so we need to tweak things. + In particular, the sprite inherits orientation from its parent (TrackFollow) that must be canceled. """ var global = get_global_rotation_degrees() var local = get_rotation_degrees() diff --git a/Global.gd b/Global.gd index 09cec67..c9bbc5c 100644 --- a/Global.gd +++ b/Global.gd @@ -1,10 +1,5 @@ extends Node -const TRACKS = [ - [ Vector2(7,1), Vector2(8,1), Vector2(9,1), Vector2(9,2), Vector2(9,3), - Vector2(8,3), Vector2(7,3), Vector2(7,4), Vector2(7,5), Vector2(7,6), - Vector2(6,6), Vector2(6,5), Vector2(6,4), Vector2(6,3), Vector2(5,3), - Vector2(4,3), Vector2(4,2), Vector2(4,1), Vector2(5,1), Vector2(6,1), ], -] -var selected_track \ No newline at end of file +var race_started = false +var laps = 0 \ No newline at end of file diff --git a/Gui.tscn b/Gui.tscn index 3e43726..89b6dc0 100644 --- a/Gui.tscn +++ b/Gui.tscn @@ -13,7 +13,6 @@ outline_color = Color( 0.25098, 0.25098, 0.25098, 1 ) font_data = ExtResource( 1 ) [node name="GUI" type="MarginContainer"] -editor/display_folded = true margin_left = 10.5631 margin_top = 9.24268 margin_right = 159.563 diff --git a/Main.gd b/Main.gd index 0c0b6a9..0b7cb7d 100644 --- a/Main.gd +++ b/Main.gd @@ -6,7 +6,7 @@ extends Node # Called when the node enters the scene tree for the first time. func _ready(): - Global.selected_track = 0 + pass func start_game(): diff --git a/Player.gd b/Player.gd new file mode 100644 index 0000000..a2407ec --- /dev/null +++ b/Player.gd @@ -0,0 +1,25 @@ +extends PathFollow2D + +export (float) var speed = 0.125 + +var position_on_track := 0.0 +var target_on_track := 0.0 + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +func _process(delta): + # Move the player until target_on_track + if target_on_track - position_on_track > 0.01: + # Speed up car as the target_on_track goes further + var speed_mod = int(clamp((target_on_track - position_on_track) / speed, 1.0, 4.0)) + position_on_track += speed * delta * speed_mod + set_unit_offset(position_on_track) + else: + position_on_track = target_on_track + + +func _on_RaceTrack_player_moved(track_offset): + target_on_track = track_offset \ No newline at end of file diff --git a/PlayerCar.gd b/PlayerCar.gd index 6ce506a..990dcd6 100644 --- a/PlayerCar.gd +++ b/PlayerCar.gd @@ -1,31 +1,17 @@ extends Node2D export (String, "bus", "police", "car") var skin -export (float) var speed = 0.125 + enum { RIGHT, DOWN_RIGHT, DOWN, DOWN_LEFT, LEFT, UP_LEFT, UP, UP_RIGHT } # TODO: # - Move track related logic inside TrackPlayer script ? onready var track = get_node("/root/Track2/RaceTrack/TrackPlayer/") -var position_on_track := 0.0 -var target_on_track := 0.0 + func _ready(): # Set player sprite $CarSprite.set_animation(skin) -func _process(delta): - # Move the player until target_on_track - if target_on_track - position_on_track > 0.01: - # Speed up car as the target_on_track goes further - var speed_mod = int(clamp((target_on_track - position_on_track) / speed, 1.0, 4.0)) - position_on_track += speed * delta * speed_mod - track.set_unit_offset(position_on_track) - else: - position_on_track = target_on_track - - -func _on_TileMap_player_moved(track_offset): - target_on_track = track_offset diff --git a/PlayerCar.tscn b/PlayerCar.tscn index 3baaa41..ea2d755 100644 --- a/PlayerCar.tscn +++ b/PlayerCar.tscn @@ -9,22 +9,22 @@ [ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0000.png" type="Texture" id=7] [ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0005.png" type="Texture" id=8] [ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0006.png" type="Texture" id=9] -[ext_resource path="res://track1/policeCar/policeiso_0003.png" type="Texture" id=10] -[ext_resource path="res://track1/policeCar/policeiso_0004.png" type="Texture" id=11] -[ext_resource path="res://track1/policeCar/policeiso_0001.png" type="Texture" id=12] -[ext_resource path="res://track1/policeCar/policeiso_0002.png" type="Texture" id=13] -[ext_resource path="res://track1/policeCar/policeiso_0007.png" type="Texture" id=14] -[ext_resource path="res://track1/policeCar/policeiso_0000.png" type="Texture" id=15] -[ext_resource path="res://track1/policeCar/policeiso_0005.png" type="Texture" id=16] -[ext_resource path="res://track1/policeCar/policeiso_0006.png" type="Texture" id=17] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0003.png" type="Texture" id=18] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0004.png" type="Texture" id=19] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0001.png" type="Texture" id=20] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0002.png" type="Texture" id=21] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0007.png" type="Texture" id=22] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0000.png" type="Texture" id=23] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0005.png" type="Texture" id=24] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0006.png" type="Texture" id=25] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0003.png" type="Texture" id=10] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0004.png" type="Texture" id=11] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0001.png" type="Texture" id=12] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0002.png" type="Texture" id=13] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0007.png" type="Texture" id=14] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0000.png" type="Texture" id=15] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0005.png" type="Texture" id=16] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0006.png" type="Texture" id=17] +[ext_resource path="res://track1/policeCar/policeiso_0003.png" type="Texture" id=18] +[ext_resource path="res://track1/policeCar/policeiso_0004.png" type="Texture" id=19] +[ext_resource path="res://track1/policeCar/policeiso_0001.png" type="Texture" id=20] +[ext_resource path="res://track1/policeCar/policeiso_0002.png" type="Texture" id=21] +[ext_resource path="res://track1/policeCar/policeiso_0007.png" type="Texture" id=22] +[ext_resource path="res://track1/policeCar/policeiso_0000.png" type="Texture" id=23] +[ext_resource path="res://track1/policeCar/policeiso_0005.png" type="Texture" id=24] +[ext_resource path="res://track1/policeCar/policeiso_0006.png" type="Texture" id=25] [ext_resource path="res://CarSprite.gd" type="Script" id=26] [sub_resource type="SpriteFrames" id=1] @@ -36,12 +36,12 @@ animations = [ { }, { "frames": [ ExtResource( 10 ), ExtResource( 11 ), ExtResource( 12 ), ExtResource( 13 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 16 ), ExtResource( 17 ) ], "loop": true, -"name": "police", +"name": "car", "speed": 5.0 }, { "frames": [ ExtResource( 18 ), ExtResource( 19 ), ExtResource( 20 ), ExtResource( 21 ), ExtResource( 22 ), ExtResource( 23 ), ExtResource( 24 ), ExtResource( 25 ) ], "loop": true, -"name": "car", +"name": "police", "speed": 5.0 } ] diff --git a/RaceTrack.gd b/RaceTrack.gd index 9349f1e..08f8878 100644 --- a/RaceTrack.gd +++ b/RaceTrack.gd @@ -10,19 +10,22 @@ signal wrong_way(coords) # - Build the track Curve2D from track and tiles data # - Keyboard controls !! -const TRACK_TILES = Global.TRACKS[0] - +var laps +var current_cell +onready var track = TrackSelection.get_current_track() onready var map = $TileMap -var laps = 0 -var current_cell = TRACK_TILES[0] func get_track_offset(coords): - var offset = float(TRACK_TILES.find(coords)) / float(len(TRACK_TILES)) + var offset = float(track.find(coords)) / float(len(track)) return offset # Called when the node enters the scene tree for the first time. func _ready(): - pass # Replace with function body. + _reset_progress() + +func _reset_progress(): + laps = 0 + current_cell = track[0] func _input(event): # Check if the mouse if following the tiles track @@ -30,13 +33,13 @@ func _input(event): var hover_cell = map.world_to_map(event.position) if hover_cell != current_cell: # The mouse moved to a new cell # Check the tile is on path - if TRACK_TILES.find(hover_cell) != -1: + if track.find(hover_cell) != -1: # Check if a lap is finished - if hover_cell == TRACK_TILES[0] and current_cell == TRACK_TILES[-1]: + if hover_cell == track[0] and current_cell == track[-1]: laps += 1 emit_signal("lap_completed", laps) # Check we are following the path - if TRACK_TILES[TRACK_TILES.find(hover_cell) - 1] == current_cell: + if track[track.find(hover_cell) - 1] == current_cell: emit_signal("player_moved", laps + get_track_offset(hover_cell)) emit_signal("wrong_way", Vector2(-1, -1)) current_cell = hover_cell diff --git a/RaceTrack.tscn b/RaceTrack.tscn index e1dd3df..26abe79 100644 --- a/RaceTrack.tscn +++ b/RaceTrack.tscn @@ -1,60 +1,136 @@ -[gd_scene load_steps=34 format=2] +[gd_scene load_steps=39 format=2] [ext_resource path="res://RaceTrack.gd" type="Script" id=1] -[ext_resource path="res://TrackPath.gd" type="Script" id=2] -[ext_resource path="res://OpponentCar.gd" type="Script" id=3] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0007.png" type="Texture" id=4] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0004.png" type="Texture" id=5] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0001.png" type="Texture" id=6] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0002.png" type="Texture" id=7] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0003.png" type="Texture" id=8] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0000.png" type="Texture" id=9] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0005.png" type="Texture" id=10] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0006.png" type="Texture" id=11] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0003.png" type="Texture" id=12] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0004.png" type="Texture" id=13] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0001.png" type="Texture" id=14] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0002.png" type="Texture" id=15] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0007.png" type="Texture" id=16] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0000.png" type="Texture" id=17] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0005.png" type="Texture" id=18] -[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0006.png" type="Texture" id=19] -[ext_resource path="res://track1/policeCar/policeiso_0003.png" type="Texture" id=20] -[ext_resource path="res://track1/policeCar/policeiso_0004.png" type="Texture" id=21] -[ext_resource path="res://track1/policeCar/policeiso_0001.png" type="Texture" id=22] -[ext_resource path="res://track1/policeCar/policeiso_0002.png" type="Texture" id=23] -[ext_resource path="res://track1/policeCar/policeiso_0007.png" type="Texture" id=24] -[ext_resource path="res://track1/policeCar/policeiso_0000.png" type="Texture" id=25] -[ext_resource path="res://track1/policeCar/policeiso_0005.png" type="Texture" id=26] -[ext_resource path="res://track1/policeCar/policeiso_0006.png" type="Texture" id=27] -[ext_resource path="res://CarSprite.gd" type="Script" id=28] -[ext_resource path="res://wrong_way.tscn" type="PackedScene" id=29] +[ext_resource path="res://assets/track_tiles/track.png" type="Texture" id=2] +[ext_resource path="res://TileMap.gd" type="Script" id=3] +[ext_resource path="res://TrackPath.gd" type="Script" id=4] +[ext_resource path="res://OpponentCar.gd" type="Script" id=5] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0007.png" type="Texture" id=6] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0004.png" type="Texture" id=7] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0001.png" type="Texture" id=8] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0002.png" type="Texture" id=9] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0003.png" type="Texture" id=10] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0000.png" type="Texture" id=11] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0005.png" type="Texture" id=12] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/bus/busiso_0006.png" type="Texture" id=13] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0003.png" type="Texture" id=14] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0004.png" type="Texture" id=15] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0001.png" type="Texture" id=16] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0002.png" type="Texture" id=17] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0007.png" type="Texture" id=18] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0000.png" type="Texture" id=19] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0005.png" type="Texture" id=20] +[ext_resource path="res://assets/2D_Car_Pack_DevilsWorkShop_V01/car02/car02iso_0006.png" type="Texture" id=21] +[ext_resource path="res://track1/policeCar/policeiso_0003.png" type="Texture" id=22] +[ext_resource path="res://track1/policeCar/policeiso_0004.png" type="Texture" id=23] +[ext_resource path="res://track1/policeCar/policeiso_0001.png" type="Texture" id=24] +[ext_resource path="res://track1/policeCar/policeiso_0002.png" type="Texture" id=25] +[ext_resource path="res://track1/policeCar/policeiso_0007.png" type="Texture" id=26] +[ext_resource path="res://track1/policeCar/policeiso_0000.png" type="Texture" id=27] +[ext_resource path="res://track1/policeCar/policeiso_0005.png" type="Texture" id=28] +[ext_resource path="res://track1/policeCar/policeiso_0006.png" type="Texture" id=29] +[ext_resource path="res://CarSprite.gd" type="Script" id=30] +[ext_resource path="res://Player.gd" type="Script" id=31] +[ext_resource path="res://PlayerCar.tscn" type="PackedScene" id=32] +[ext_resource path="res://wrong_way.tscn" type="PackedScene" id=33] -[sub_resource type="Gradient" id=3] +[sub_resource type="Gradient" id=1] colors = PoolColorArray( 0.284025, 0.4375, 0.0803223, 1, 0.30305, 0.480469, 0.0675659, 1 ) -[sub_resource type="GradientTexture" id=4] -gradient = SubResource( 3 ) +[sub_resource type="GradientTexture" id=2] +gradient = SubResource( 1 ) width = 1920 -[sub_resource type="Curve2D" id=1] +[sub_resource type="TileSet" id=3] +0/name = "dl" +0/texture = ExtResource( 2 ) +0/tex_offset = Vector2( 0, 0 ) +0/modulate = Color( 1, 1, 1, 1 ) +0/region = Rect2( 0, 0, 128, 128 ) +0/tile_mode = 0 +0/occluder_offset = Vector2( 0, 0 ) +0/navigation_offset = Vector2( 0, 0 ) +0/shapes = [ ] +0/z_index = 0 +1/name = "dr" +1/texture = ExtResource( 2 ) +1/tex_offset = Vector2( 0, 0 ) +1/modulate = Color( 1, 1, 1, 1 ) +1/region = Rect2( 128, 0, 128, 128 ) +1/tile_mode = 0 +1/occluder_offset = Vector2( 0, 0 ) +1/navigation_offset = Vector2( 0, 0 ) +1/shapes = [ ] +1/z_index = 0 +2/name = "lr" +2/texture = ExtResource( 2 ) +2/tex_offset = Vector2( 0, 0 ) +2/modulate = Color( 1, 1, 1, 1 ) +2/region = Rect2( 256, 0, 128, 128 ) +2/tile_mode = 0 +2/occluder_offset = Vector2( 0, 0 ) +2/navigation_offset = Vector2( 0, 0 ) +2/shapes = [ ] +2/z_index = 0 +3/name = "start" +3/texture = ExtResource( 2 ) +3/tex_offset = Vector2( 0, 0 ) +3/modulate = Color( 1, 1, 1, 1 ) +3/region = Rect2( 384, 0, 128, 128 ) +3/tile_mode = 0 +3/occluder_offset = Vector2( 0, 0 ) +3/navigation_offset = Vector2( 0, 0 ) +3/shapes = [ ] +3/z_index = 0 +4/name = "ud" +4/texture = ExtResource( 2 ) +4/tex_offset = Vector2( 0, 0 ) +4/modulate = Color( 1, 1, 1, 1 ) +4/region = Rect2( 0, 128, 128, 128 ) +4/tile_mode = 0 +4/occluder_offset = Vector2( 0, 0 ) +4/navigation_offset = Vector2( 0, 0 ) +4/shapes = [ ] +4/z_index = 0 +5/name = "ul" +5/texture = ExtResource( 2 ) +5/tex_offset = Vector2( 0, 0 ) +5/modulate = Color( 1, 1, 1, 1 ) +5/region = Rect2( 128, 128, 128, 128 ) +5/tile_mode = 0 +5/occluder_offset = Vector2( 0, 0 ) +5/navigation_offset = Vector2( 0, 0 ) +5/shapes = [ ] +5/z_index = 0 +6/name = "ur" +6/texture = ExtResource( 2 ) +6/tex_offset = Vector2( 0, 0 ) +6/modulate = Color( 1, 1, 1, 1 ) +6/region = Rect2( 256, 128, 128, 128 ) +6/tile_mode = 0 +6/occluder_offset = Vector2( 0, 0 ) +6/navigation_offset = Vector2( 0, 0 ) +6/shapes = [ ] +6/z_index = 0 + +[sub_resource type="Curve2D" id=4] _data = { "points": PoolVector2Array( 0, 0, 0, 0, -17.3556, 327.792, 0, 0, 0, 0, 1930.1, 452.427 ) } -[sub_resource type="SpriteFrames" id=2] +[sub_resource type="SpriteFrames" id=5] animations = [ { -"frames": [ ExtResource( 4 ), ExtResource( 5 ), ExtResource( 6 ), ExtResource( 7 ), ExtResource( 8 ), ExtResource( 9 ), ExtResource( 10 ), ExtResource( 11 ) ], +"frames": [ ExtResource( 6 ), ExtResource( 7 ), ExtResource( 8 ), ExtResource( 9 ), ExtResource( 10 ), ExtResource( 11 ), ExtResource( 12 ), ExtResource( 13 ) ], "loop": true, "name": "bus", "speed": 5.0 }, { -"frames": [ ExtResource( 12 ), ExtResource( 13 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 16 ), ExtResource( 17 ), ExtResource( 18 ), ExtResource( 19 ) ], +"frames": [ ExtResource( 14 ), ExtResource( 15 ), ExtResource( 16 ), ExtResource( 17 ), ExtResource( 18 ), ExtResource( 19 ), ExtResource( 20 ), ExtResource( 21 ) ], "loop": true, "name": "car", "speed": 5.0 }, { -"frames": [ ExtResource( 20 ), ExtResource( 21 ), ExtResource( 22 ), ExtResource( 23 ), ExtResource( 24 ), ExtResource( 25 ), ExtResource( 26 ), ExtResource( 27 ) ], +"frames": [ ExtResource( 22 ), ExtResource( 23 ), ExtResource( 24 ), ExtResource( 25 ), ExtResource( 26 ), ExtResource( 27 ), ExtResource( 28 ), ExtResource( 29 ) ], "loop": true, "name": "police", "speed": 5.0 @@ -66,21 +142,24 @@ script = ExtResource( 1 ) [node name="TextureRect" type="TextureRect" parent="."] margin_right = 1920.0 margin_bottom = 1080.0 -texture = SubResource( 4 ) +texture = SubResource( 2 ) expand = true [node name="TileMap" type="TileMap" parent="."] +tile_set = SubResource( 3 ) cell_size = Vector2( 128, 128 ) format = 1 +tile_data = PoolIntArray( 131079, 3, 0, 131080, 2, 0, 131081, 0, 0, 196616, 1, 0, 196617, 5, 0, 262152, 4, 0, 327688, 4, 0, 327690, 4, 0, 393224, 6, 0, 393225, 2, 0, 393226, 5, 0 ) +script = ExtResource( 3 ) [node name="TrackPath" type="Path2D" parent="."] -curve = SubResource( 1 ) -script = ExtResource( 2 ) +curve = SubResource( 4 ) +script = ExtResource( 4 ) [node name="Opponent" type="PathFollow2D" parent="TrackPath"] position = Vector2( -17.3556, 327.792 ) rotation = 0.0639077 -script = ExtResource( 3 ) +script = ExtResource( 5 ) [node name="OpponentCar" type="Node2D" parent="TrackPath/Opponent"] position = Vector2( 0, 22 ) @@ -89,11 +168,22 @@ scale = Vector2( 0.25, 0.25 ) [node name="CarSprite" type="AnimatedSprite" parent="TrackPath/Opponent/OpponentCar"] position = Vector2( -3.20422, 3.0376 ) scale = Vector2( 0.8, 0.8 ) -frames = SubResource( 2 ) +frames = SubResource( 5 ) animation = "car" -script = ExtResource( 28 ) -skin = "bus" +script = ExtResource( 30 ) +skin = "police" -[node name="Wrong Way" parent="." instance=ExtResource( 29 )] +[node name="Player" type="PathFollow2D" parent="TrackPath"] +position = Vector2( -17.3556, 327.792 ) +rotation = 0.0639077 +script = ExtResource( 31 ) + +[node name="PlayerCar" parent="TrackPath/Player" instance=ExtResource( 32 )] +position = Vector2( 1.89564, -22.3528 ) +scale = Vector2( 0.25, 0.25 ) +script = null + +[node name="Wrong Way" parent="." instance=ExtResource( 33 )] visible = false +[connection signal="player_moved" from="." to="TrackPath/Player" method="_on_RaceTrack_player_moved"] [connection signal="wrong_way" from="." to="Wrong Way" method="_on_RaceTrack_wrong_way"] diff --git a/TileMap.gd b/TileMap.gd new file mode 100644 index 0000000..2776a44 --- /dev/null +++ b/TileMap.gd @@ -0,0 +1,69 @@ +extends TileMap + +enum { LEFT, RIGHT, UP, DOWN } +# Enum for tiles from tile_set +enum { DOWN_LEFT, DOWN_RIGHT, LEFT_RIGHT, START, UP_DOWN, UP_LEFT, UP_RIGHT } + +# Called when the node enters the scene tree for the first time. +func _ready(): + _clear_tiles() + var track = TrackSelection.get_current_track() + for idx in range(track.size()): + var cell = track[idx] + var tile + if idx == 0: + tile = START + else: + var prev = track[idx - 1] + var next = track[wrapi(idx + 1, 0, track.size())] + tile = _find_tile(cell.direction_to(prev), cell.direction_to(next)) + set_cell(cell.x, cell.y, tile) + +func _find_tile(prev, next): + """ Find the right tile given prev and next directions """ + prev = _as_dir(prev) + next = _as_dir(next) + # Could be smarter + if prev == LEFT: + match next: + DOWN: return DOWN_LEFT + UP: return UP_LEFT + RIGHT: return LEFT_RIGHT + elif prev == RIGHT: + match next: + DOWN: return DOWN_RIGHT + UP: return UP_RIGHT + LEFT: return LEFT_RIGHT + elif prev == UP: + match next: + DOWN: return UP_DOWN + LEFT: return UP_LEFT + RIGHT: return UP_RIGHT + elif prev == DOWN: + match next: + UP: return UP_DOWN + LEFT: return DOWN_LEFT + RIGHT: return DOWN_RIGHT + + +func _as_dir(vector): + """ Returns the vector direction as a LEFT, RIGHT, UP or DOWN variant """ + if abs(vector.x) + abs(vector.y) != 1: + return -1 # This is not a valid variant + if vector.x == -1: + return LEFT + elif vector.x == 1: + return RIGHT + elif vector.y == -1: + return UP + elif vector.y == 1: + return DOWN + return -1 # Impossible case + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func _clear_tiles(): + for cell in get_used_cells(): + self.set_cell(cell.x, cell.y, -1) \ No newline at end of file diff --git a/TrackPath.gd b/TrackPath.gd index a702bb3..6a9c19c 100644 --- a/TrackPath.gd +++ b/TrackPath.gd @@ -1,22 +1,23 @@ extends Path2D enum { UP, RIGHT, DOWN, LEFT } -const TRACK_TILES = Global.TRACKS[0] var tile_size : int = 128 var half_size : int = tile_size / 2 onready var map = get_node("../TileMap/") + # Called when the node enters the scene tree for the first time. func _ready(): - _build_track(TRACK_TILES) + var track = TrackSelection.get_current_track() + _build_track(track) + -""" func _draw(): draw_polyline(curve.get_baked_points(), Color.chartreuse, 4.0) for idx in range(0,curve.get_point_count()): draw_circle(curve.get_point_in(idx), 2.0, Color.green) draw_circle(curve.get_point_out(idx), 2.0, Color.blue) -""" + func _build_track(tiles): """ Build the track curve given a tile path """ diff --git a/assets/track_tiles/dl.png b/assets/track_tiles/dl.png new file mode 100644 index 0000000000000000000000000000000000000000..e981f455481d2d7abe02ab4def6edf6f60cd0855 GIT binary patch literal 5031 zcmV;Y6IkqtP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H16EsOg zK~#90?VWja6ji>*zqhKoJDtu#0-dI_kp)5^5Cp-nsL>;%4+aLG${R+-_e5MlbR2g) zZ{&<};OXE|pYuFs00-288BTo96%d9*lr0Hiiy&bXBJ+ z=??Yzt5fy6_x?Kd?OSzk{qFAqDk>@}Dk>@}Dk>@}Dk>`13&div(4QT118`mb>;&Ke z&;h_l2x+C1wga$HN}B<+0BB|yrpf2?ok>YaX&f-mRb-(z0rZCs0961^0;oJ+u<_`H zEuS2|wX)JGV;d?mBDVmpqI%Io2YH(V%Jb%4PB{s|K1#8RA=q`x$>U{8`JmD_iV1+f(CVnZ=hyKf&8q>jlT!MHQ6ucm zsi^QO;gd>FIHfASSXN#QK&${V0Qv+Wc%sF}w0=J}_e+7`?@pg{=iD=AJWBbf0x(Kd z>^xM`8D!C66m&76^a}&4w-skk_)F2)oZBftWOYylfP%Mx+WY_GfY)lBE@PDq06rB6 z`{C^;kDQaS-s>90dVnr_bF$1;CIfhhq5PTRu@k?kEi0QxDOJq>>jg#rfkJ!x1?uCI zl&Bj38#(!gRE^pErPXRZ-PqXplEdMMRj92Y57*k-TFP-80{{%e7+97S2q9XI<6;qk7#|95h7a)VOs4n@fP`SbgH z28f7=@I*yLwZ+B7b(&13)}*8)m)UHF(P-30MMcHvbh;!$NYs^OY-`>wZr|};z7h^I z(b27$Uu@F?i0tKb7l17+%f4X#JRiuXjy)db(Rmn?oJNdVoOac%e0?qw}Z9ZJl(O$D2!l=s;!Cw{9-s5)!8MquF{w z$ZI1zQn~H)+hb{})3Trbo{p1JwYY zOiWDNsX*N!Pe@OtwrM!?*CR*VvMxO-ZPVt>HSO)~M-*r#1Hksix`vJWX3P-#_HxJ& z(mgQ_+s@L|`JH_o^Z_fs>B>&X$Z{(^s)CoHQ_=$^)vn*M% zq$(>bYdQdZf9mp9*HqU&@`U+vJrooLhG^|?rC&aAGcz-1LBi<9 z_SQSa?cZ#_*3`0_QmnY`)bRp&ybL{ti~#(Y&E}eA%a%16jm8;)Y%h2Hi3sp4K|nS~ zMrocHinoLzCjdW_Cr>`Sbm`J4j^na=J5PDuSN*Gds|2SjM^uFb<)Gx={HkL$vN}4* zg!C}5Ka`i3Pg${IMaG^zdx|NgJtlhWZ?F47^u-4Nipc;iDbAj7r>u?+GDB7X0KoG+ zw`I$g{Fh&T*=e`i5BiUL&YZ1o+rBH9c*WtM5A&y^Zn?_Mw#3jaIQN6_$i5xo%ZL9 z6wgJ5Io_{|DDo)l`+m>pT)D&G2ZZZZ007X+amEibQzx8^HvEA8-OICCmKN>Fz9CH} z*9MI1S^xk*3CLGw_h2wFH7VWWEEaT+#O(|3X z{0tvMbel#c<{gWP`VoMnA#%biFYJo`#q8Mti~x2vH8rIx;-rkI0_X(_VCTpYvvwQf z4&hSLtbioE^1`mzJ7>?n;!v_62;bG!)yWmds0gY6`k*{6Hg8)}!dVbF`m*cg;`_)pX#>MxO#q<1EO-)S(gJYO43c}nSf7KL3ZNg@Y_`PJt5>@yr56HQ_h1ssvhU08ltfek z^pm=}y0rJ-f8T~nY4xS@h{a-gRBoT7pb9_+Dk>_n3kwU6LE^iE%e>dr)HE@$nKGyX zkck~Tc1$ZNDcKi9(Fj2h{#sL0Bilk(DX0RFk@f4>&#JGl59U>Jj!vh0Q+9_$pb9`n zD5Y4tcI_0m+g%kz@n;(v8t#zYsQ{<~keRNoF3lTnyb(t!l^R~gFbwl?eMQB9CaF*b zpa6EeJ)xkWpcVixwhZ-p-Hk85cDCl;``=d3wH~MfP>8a!vPp*y9XcS!)>(F>;_Uo; zEzW}_`IHI|7mb_n3#I+@qY6MlHf-21v!kQq*fkA&zAo$QZxlB^|57&fdb_8Fi9kNu zk()ap@dK&=6ogVrRg{>J{Zr+sv-9t*?kwJ$kDj>?(;~d|wSn+a6@bDx91c@q zVc{A7--6fM)%5xs`|FoIn<2Q}W3O3|;`zNq)qPKk%uL%KJcx%PQya$~l2|OA(M3O_h(k~XFyL%W9+^e~ zsmZBV?#am+sf0hO00x+LttR2fu$aRVi$#+z=2a#9Q3Wsv{KFVOtBVjxtB?u7V@f2U z2w4HJY{;#lkPS+}eml}A^){emIQp{OzJ#Ozj7B3?ty+a~JD^_6Mym=sGXzm+bm^?BLm-adoi&i7BFUjdc z$O&N1oH@wIxb$9xVHnJxKOav$^%No_d)p^6ylK{IGMn@|NnvCZ3n$ zG#W8??%W>7b8~a?>Z`B9XbjtIY}e#}M~)Z+KuVrLEyoDUhN=nKgc%~ek8ckwjgicxq8wQ3QJ9g~ra#SQ2O-)TGFE2+{ zRu*DnuHI-=r_&)XFAp^}HE3yR86*$o=Uiljc4}(}2k{$e>KRI`8(W&C&MNjGq!)B*ov94j7#pO=6=yLQ*e4DW3Zq7WR9r9CAH?AD-t? zUS1B3MuX9#M_+Z0Wm!y_G6f9{4Y1jU#+JZ!2EFFS3+)jQzcFUqh^di>{(QEV9la$G zl0ASQN+}8p3$b<0WO2><|g?AU>wJA3Z+oSU1A zyY9Mc5Im9(N(g)On6#bA1VQ-sVA~5z0RTW@VIj)O%6c4MuwVhkj=grYbvUqX+qNu7 zSXKt$?qHXfhphl8rP#D-Q;&H7hGBXgErb*2&!11}=;)9VH53yO5fRkN;;B-MTdLAWoNcEVZ!z@=&9&6_ua=Xvbd zu>)_t^%k0&n+Myiep6IbG?h~En_3Y<7F1MJXr;CzdXwc)rnIyawY9ad+wFtxifs6N zK7CVDQ>oc(zC~n_xcK<^I{*(l^68xzOV5o8G)G5(D0D!dm z`g&2z$5a7?2}h0`5w#MC@`A-@vmI>xbjuB5?1#k5pzDDXCr)JHQWS9akCyU$v+w-* zTGvmNPUpeWNLNW|n(w?L5kMj(WDT9p^k)674KMnl7}r zCjdz3&7Psi7E`Y(fH30J?_Mwr_jFAcV@n~3ii=a90m6u8t=1>rnuzKF$eytiyC{Ln z&2oqj* z=<##rHfS@_(ibjVNbPp}>21&aF5+0UJ|(CX2P(2-iO?lVv8O(641hibaMdkNDMT5V0@++80M20Oo;*1J$!7ontw2rl znpzT`n)}P627@82mXQrL1VZ2=M0~_6B>@*qb_;-uk2_C+SOB1c(9*Ge*A)LbeeT4) zlNS7H(wa4ET2fO}FG}=VMMk_V5&uqr>3xWJCEWthjTznO|Li(?tb+P{m(rCmtR->v zsv7}7tJNA`dF2(F78@JPUb!kV(8+RM(Z*B|-vdO9AJ-j&-cqo!JEy(r`DYs#gQ0sG z(zSPA={=>#v?iBV%G|VyOtfh@(YIj=BB2M!%Hjcly4{tY%9B|Dpv_48F=o!4H~DQY z7XMIWdHoN!F_ap9(_r;P@Vxp=Fu=5GIh|Nr0tDQHuv-9{QOOYi(E8;!_RFOm$#1Xi zo=osxeE;7Zr6c~;!ygyxjEX$8a-8_x#3%x0*Zijdh7TVOzrL4FLeOCBN!KpF_bOuY)u1yRY=8cizdff4JcwVOgv3xfSPP z=l)A~jG5r^RCn(FhoxoXrfj~&F$Dl(02!;6

-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 literal 0 HcmV?d00001 diff --git a/assets/track_tiles/dl.png.import b/assets/track_tiles/dl.png.import new file mode 100644 index 0000000..39c2a53 --- /dev/null +++ b/assets/track_tiles/dl.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/dl.png-b61487678edbb5d041ecd44844cc359b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/track_tiles/dl.png" +dest_files=[ "res://.import/dl.png-b61487678edbb5d041ecd44844cc359b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/track_tiles/dr.png b/assets/track_tiles/dr.png new file mode 100644 index 0000000000000000000000000000000000000000..437edbb95ab391306aa3e6900057e2ffd7fe79cc GIT binary patch literal 5002 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 UPY47E?*IS*07*qoM6N<$g4sEX(*OVf literal 0 HcmV?d00001 diff --git a/assets/track_tiles/dr.png.import b/assets/track_tiles/dr.png.import new file mode 100644 index 0000000..d174506 --- /dev/null +++ b/assets/track_tiles/dr.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/dr.png-94ada50cc17b446a2958bdfc16ac64ca.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/track_tiles/dr.png" +dest_files=[ "res://.import/dr.png-94ada50cc17b446a2958bdfc16ac64ca.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/track_tiles/lr.png b/assets/track_tiles/lr.png new file mode 100644 index 0000000000000000000000000000000000000000..1b737280b3a1c3b89ce781709099a3542320aeb9 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9vo-U3d6?5L+SSWbNLBJu< zNncXLbwPlp#L)ovnp+&MYfk<7{^#DjAH|RI%zx4Gd6s>T=g4f> ue{V7On)~N7?)|%2rw{TnreA=e#-Q{st3kF?e+H)ji0A3*=d#Wzp$P!yvzD^} literal 0 HcmV?d00001 diff --git a/assets/track_tiles/lr.png.import b/assets/track_tiles/lr.png.import new file mode 100644 index 0000000..4c4fca5 --- /dev/null +++ b/assets/track_tiles/lr.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/lr.png-dae9afde66fc513ed9fbec9a413fcd2e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/track_tiles/lr.png" +dest_files=[ "res://.import/lr.png-dae9afde66fc513ed9fbec9a413fcd2e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/track_tiles/start.png b/assets/track_tiles/start.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fec1d916c6e959b4a8da1cfb80299499eb1246 GIT binary patch literal 2165 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 literal 0 HcmV?d00001 diff --git a/assets/track_tiles/track.png.import b/assets/track_tiles/track.png.import new file mode 100644 index 0000000..babea24 --- /dev/null +++ b/assets/track_tiles/track.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/track.png-07e8d2fd85e34f44aac7c4b2e2ba0f7e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/track_tiles/track.png" +dest_files=[ "res://.import/track.png-07e8d2fd85e34f44aac7c4b2e2ba0f7e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/track_tiles/ud.png b/assets/track_tiles/ud.png new file mode 100644 index 0000000000000000000000000000000000000000..1ed565dc7e710135b5a8e0c4bac82fd79722e5b7 GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7LJzX3_D(1Ysv(fi(0E25_ zlaZ^IRD|-PBoX}sMIk&BxiVJlVGG%^Q90Tp{`;J3@zc7s&9~iqn0L_TyuEk&KcCB6 zzG+DBsjFLWSN(5?%(~e9_kS7m_%akSbqG7mVR*zMpx$7?c!X2I4@GFl<4cX}pHKf< zUR`zLgT|V#KmKj|_u*y9*G=YlG{Ma2{?B~p%iEiF2lnrHDc{R_55;7dB2@ctvP(>; zWhhg|<`xtkwGE6n*%QoBb)&l;sAIqkyra+Fpq!A~dUQ1~h8a9v{an^LB{Ts5bz!;n literal 0 HcmV?d00001 diff --git a/assets/track_tiles/ud.png.import b/assets/track_tiles/ud.png.import new file mode 100644 index 0000000..daf8274 --- /dev/null +++ b/assets/track_tiles/ud.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ud.png-8d239d32473fb1f173314607d502fead.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/track_tiles/ud.png" +dest_files=[ "res://.import/ud.png-8d239d32473fb1f173314607d502fead.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/track_tiles/ul.png b/assets/track_tiles/ul.png new file mode 100644 index 0000000000000000000000000000000000000000..0dbfa95ecdcf65a4bcb521d5e10331a5e659ee71 GIT binary patch literal 4962 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 literal 0 HcmV?d00001 diff --git a/assets/track_tiles/ul.png.import b/assets/track_tiles/ul.png.import new file mode 100644 index 0000000..65929fa --- /dev/null +++ b/assets/track_tiles/ul.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ul.png-7024cf834cdbb918ff81490da18cb8c6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/track_tiles/ul.png" +dest_files=[ "res://.import/ul.png-7024cf834cdbb918ff81490da18cb8c6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/track_tiles/ur.png b/assets/track_tiles/ur.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d15dcc9fc4e2326c2ddc2a05cc5e6e7fb51758 GIT binary patch literal 5091 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 1: + loaded.append(track) + else: + print("Error in track file : ", path) + + if loaded: + print("Successfully loaded ", loaded.size(), " tracks.") + _tracks = loaded + + +func _load_from_txt(content): + var used_cells = [] + var start + # Load the content + var lines = content.split("\n") + for y in range(0, lines.size()): + for x in range(0, lines[y].length()): + if lines[y][x] == "s": + start = Vector2(x,y) + elif lines[y][x] == "x": + used_cells.append(Vector2(x,y)) + # Build an oriented path from start cell going right first + var path = [start] + while used_cells.size() > 0: + var next = __find_adjacent(path[-1], used_cells) + if next == -1: + print("Error while loading path. (Path is invalid)") + else: + path.append(used_cells[next]) + used_cells.remove(next) + #print_debug("Loading map from txt. Starting at : ", start, " | Path : \n", path) + return path + + +func __find_adjacent(coords, cells): + for dir in [Vector2(1,0), Vector2(0,1), Vector2(-1,0), Vector2(0,-1)]: + var idx = cells.find(coords + dir) + if idx != -1: + return idx + return -1 + +func _find_track_files(): + var tracks = [] + var dir = Directory.new() + if dir.open(TRACKS_PATH) == OK: + dir.list_dir_begin(true, true) + while true: + var file = dir.get_next() + if file == "": + break + if file.ends_with(".txt"): + tracks.append(TRACKS_PATH + file) + return tracks + else: + print("An error occured while trying to load tracks. (Folder not found)") \ No newline at end of file