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 0000000..e981f45 Binary files /dev/null and b/assets/track_tiles/dl.png differ 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 0000000..437edbb Binary files /dev/null and b/assets/track_tiles/dr.png differ 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 0000000..1b73728 Binary files /dev/null and b/assets/track_tiles/lr.png differ 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 0000000..e8fec1d Binary files /dev/null and b/assets/track_tiles/start.png differ diff --git a/assets/track_tiles/start.png.import b/assets/track_tiles/start.png.import new file mode 100644 index 0000000..b260f9c --- /dev/null +++ b/assets/track_tiles/start.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/start.png-422062d2659d16a0a9668325f28ede9d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/track_tiles/start.png" +dest_files=[ "res://.import/start.png-422062d2659d16a0a9668325f28ede9d.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/track.png b/assets/track_tiles/track.png new file mode 100644 index 0000000..57d55b0 Binary files /dev/null and b/assets/track_tiles/track.png differ 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 0000000..1ed565d Binary files /dev/null and b/assets/track_tiles/ud.png differ 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 0000000..0dbfa95 Binary files /dev/null and b/assets/track_tiles/ul.png differ 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 0000000..d7d15dc Binary files /dev/null and b/assets/track_tiles/ur.png differ diff --git a/assets/track_tiles/ur.png.import b/assets/track_tiles/ur.png.import new file mode 100644 index 0000000..3ba3ca0 --- /dev/null +++ b/assets/track_tiles/ur.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ur.png-8d1a716720fdad1dcbdaaab4c29c0007.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/track_tiles/ur.png" +dest_files=[ "res://.import/ur.png-8d1a716720fdad1dcbdaaab4c29c0007.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/tracks/demo.txt b/assets/tracks/demo.txt new file mode 100644 index 0000000..7a7eef1 --- /dev/null +++ b/assets/tracks/demo.txt @@ -0,0 +1,8 @@ +............... +.xxxsxxx....... +.x.....x....... +.x.....x....... +.xxxxxxx....... +............... +............... +............... diff --git a/assets/tracks/track1.txt b/assets/tracks/track1.txt new file mode 100644 index 0000000..60a0151 --- /dev/null +++ b/assets/tracks/track1.txt @@ -0,0 +1,8 @@ +............... +....xxxsxxxxx.. +....xxxxxxxxx.. +....xx..xx..... +....xx..xxxxx.. +........xxxxx.. +............... +............... diff --git a/project.godot b/project.godot index a5f3bb3..8602756 100644 --- a/project.godot +++ b/project.godot @@ -23,6 +23,7 @@ config/icon="res://icon.png" [autoload] Global="*res://Global.gd" +TrackSelection="*res://track_selection.gd" [debug] diff --git a/track_selection.gd b/track_selection.gd new file mode 100644 index 0000000..59b81ec --- /dev/null +++ b/track_selection.gd @@ -0,0 +1,89 @@ +extends Node + +const TRACKS_PATH = "res://assets/tracks/" + +var _tracks = [ + [ Vector2(2, 1), Vector2(3, 1), Vector2(4, 1), + Vector2(4, 2), Vector2(3, 2), Vector2(2, 2), Vector2(1, 2), Vector2(1, 1), + + ], + [ 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 : int = 1 + +func _ready(): + _load_tracks() + +func set_next_track(): + _selected = wrapi(_selected + 1, 0, _tracks.size()) + +func set_previous_track(): + _selected = wrapi(_selected - 1, 0, _tracks.size()) + +func get_current_track(): + return _tracks[_selected] + +func _load_tracks(): + var loaded = [] + for path in _find_track_files(): + var file = File.new() + file.open(path, File.READ) + var track = _load_from_txt(file.get_as_text()) + if track.size() > 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