From 28e1cdb2cb0d6ad9d4cd54fd261eb3232fc4663d Mon Sep 17 00:00:00 2001 From: Matt Jenkins Date: Sat, 4 May 2024 22:41:29 +0100 Subject: [PATCH] Added first round of graphics --- Arkanoid.gdshader | 17 +++ Ball/Ball.gd | 4 + Ball/Ball.png | Bin 0 -> 591 bytes Ball/Ball.png.import | 34 +++++ Ball/Ball.tscn | 12 +- Brick/BaseBrick.png | Bin 0 -> 593 bytes Brick/BaseBrick.png.import | 34 +++++ Brick/Brick.gd | 67 +++++++--- Brick/Brick.tscn | 17 ++- Brick/InvulBrick.png | Bin 0 -> 657 bytes Brick/InvulBrick.png.import | 34 +++++ Brick/ShinyBrick.png | Bin 0 -> 614 bytes Brick/ShinyBrick.png.import | 34 +++++ Dunkanoid.gd | 185 +++++++++++++++++++++++---- Dunkanoid.tscn | 93 ++++++++++++-- Fonts/arkanoid/ARKANOID.TTF | Bin 0 -> 25736 bytes Fonts/arkanoid/ARKANOID.TTF.import | 33 +++++ Fonts/arkanoid/Arka_solid.ttf | Bin 0 -> 37044 bytes Fonts/arkanoid/Arka_solid.ttf.import | 33 +++++ Fonts/arkanoid/Readme.txt | 27 ++++ Fonts/arkanoid/copy.txt | 6 + MainTheme.tres | 9 +- Upgrade/Upgrade.tscn | 1 + default_bus_layout.tres | 4 + export_presets.cfg | 37 ++++++ project.godot | 5 + 26 files changed, 627 insertions(+), 59 deletions(-) create mode 100644 Arkanoid.gdshader create mode 100644 Ball/Ball.png create mode 100644 Ball/Ball.png.import create mode 100644 Brick/BaseBrick.png create mode 100644 Brick/BaseBrick.png.import create mode 100644 Brick/InvulBrick.png create mode 100644 Brick/InvulBrick.png.import create mode 100644 Brick/ShinyBrick.png create mode 100644 Brick/ShinyBrick.png.import create mode 100644 Fonts/arkanoid/ARKANOID.TTF create mode 100644 Fonts/arkanoid/ARKANOID.TTF.import create mode 100644 Fonts/arkanoid/Arka_solid.ttf create mode 100644 Fonts/arkanoid/Arka_solid.ttf.import create mode 100644 Fonts/arkanoid/Readme.txt create mode 100644 Fonts/arkanoid/copy.txt create mode 100644 default_bus_layout.tres create mode 100644 export_presets.cfg diff --git a/Arkanoid.gdshader b/Arkanoid.gdshader new file mode 100644 index 0000000..72ce966 --- /dev/null +++ b/Arkanoid.gdshader @@ -0,0 +1,17 @@ +shader_type canvas_item; + +void vertex() { + // Called for every vertex the material is visible on. +} + +void fragment() { + // Called for every pixel the material is visible on. + if (COLOR.rgba == vec4(1.0, 0.0, 1.0, 1.0)) { + COLOR.rgb = vec3(UV.y * 8.0, UV.y * 6.0, 1.0 - (UV.y * 14.0)); + } +} + +//void light() { + // Called for every pixel for every light affecting the CanvasItem. + // Uncomment to replace the default light processing function with this one. +//} diff --git a/Ball/Ball.gd b/Ball/Ball.gd index c4dfb6c..454e497 100644 --- a/Ball/Ball.gd +++ b/Ball/Ball.gd @@ -12,6 +12,8 @@ var capture_object : Node2D var capture_offset : Vector2 = Vector2.ZERO func _physics_process(delta: float) -> void: + angular_velocity = 0 + rotation = 0 if captured: PhysicsServer2D.body_set_state( get_rid(), @@ -27,6 +29,8 @@ func _physics_process(delta: float) -> void: func _on_body_entered(body: Node) -> void: if body is Brick: + if not body.visible: + return #linear_velocity = (linear_velocity.normalized() + (Vector2(randf() - 0.5, randf() - 0.5) / 2.0)).normalized() * linear_velocity.length() $BrickSound.play() body.hit() diff --git a/Ball/Ball.png b/Ball/Ball.png new file mode 100644 index 0000000000000000000000000000000000000000..b24d32939eba1971703678095c26ff6f2b928d8b GIT binary patch literal 591 zcmV-V0EX>4Tx04R}tkv&MmKpe$i(-uXlB6bi_$WWc^q9Ts93Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#J2)x2NQwVT3N2ziIPS;0dyl(!fKV?p%?iW-O}EWd zA}(gKt76wHf(T#$eHfLQWz0!Z5*^3aJ$!t(`8@D`M&FbL25*6$HLthkK29HiGn@6RSivU45N`w>u-Mu-es)z|Q695%}HI|C{3yTL= dF;nq6{{VXQ7AZ50KFk0B002ovPDHLkV1jZo_9*}W literal 0 HcmV?d00001 diff --git a/Ball/Ball.png.import b/Ball/Ball.png.import new file mode 100644 index 0000000..a84ae21 --- /dev/null +++ b/Ball/Ball.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wye1kea3ts48" +path="res://.godot/imported/Ball.png-586f401d09fe0752614fb4e34d1b45f6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Ball/Ball.png" +dest_files=["res://.godot/imported/Ball.png-586f401d09fe0752614fb4e34d1b45f6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Ball/Ball.tscn b/Ball/Ball.tscn index d74a845..9903115 100644 --- a/Ball/Ball.tscn +++ b/Ball/Ball.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=7 format=3 uid="uid://clfo2nrropg8y"] +[gd_scene load_steps=8 format=3 uid="uid://clfo2nrropg8y"] [ext_resource type="Script" path="res://Ball/Ball.gd" id="1_2xu4j"] +[ext_resource type="Texture2D" uid="uid://wye1kea3ts48" path="res://Ball/Ball.png" id="2_cpnep"] [ext_resource type="AudioStream" uid="uid://7kjt62y3t8lc" path="res://Sounds/WallHit.wav" id="3_bwkax"] [ext_resource type="AudioStream" uid="uid://b6vosap1la1ts" path="res://Sounds/BrickHit.wav" id="4_ly8mo"] [ext_resource type="AudioStream" uid="uid://d3g30x1n2ncjj" path="res://Sounds/PaddleHit.wav" id="5_f8nt3"] @@ -13,6 +14,7 @@ bounce = 1.0 radius = 3.0 [node name="Ball" type="RigidBody2D"] +collision_layer = 0 physics_material_override = SubResource("PhysicsMaterial_tqihs") gravity_scale = 0.0 continuous_cd = 1 @@ -20,8 +22,12 @@ max_contacts_reported = 5 contact_monitor = true script = ExtResource("1_2xu4j") -[node name="Polygon2D" type="Polygon2D" parent="."] -polygon = PackedVector2Array(-3, -3, 3, -3, 3, 3, -3, 3) +[node name="TextureRect" type="TextureRect" parent="."] +offset_left = -3.0 +offset_top = -3.0 +offset_right = 3.0 +offset_bottom = 3.0 +texture = ExtResource("2_cpnep") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_nwcsc") diff --git a/Brick/BaseBrick.png b/Brick/BaseBrick.png new file mode 100644 index 0000000000000000000000000000000000000000..9c48f5a4aa7677fd81742d026c1e86e40d23e841 GIT binary patch literal 593 zcmV-X0EX>4Tx04R}tkv&MmKpe$i(-uXlB6bi_$WWc^q9Ts93Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#J2)x2NQwVT3N2ziIPS;0dyl(!fKV?p%?iW-O}EWd zA}(gKt76wHf(T#$eHfLQWz0!Z5*^3aJ$!t(`8@D`M&FbL25*6$HLthkK29HiG void: - name = "Brick" +var hits : int = 1 +var value : int = 100 +var original_color : Color = Color.WHITE +var my_type : int = NORMAL func _ready() -> void: pass @@ -24,14 +24,47 @@ func hit() -> void: if hits <= 0: return hits -= 1 - var tween = create_tween() - $Polygon2D.color = Color(1, 1, 1) - tween.tween_property($Polygon2D, "color", color, 0.25) - tween.tween_callback(_hitfade_done) if hits <= 0: + collision_layer = 0 + if my_type == INVULNERABLE: + hits = 2 + visible = false + get_tree().create_timer(5).timeout.connect(_show_block) + return brick_destroyed.emit(self) - -func _hitfade_done() -> void: - if hits <= 0: get_parent().remove_child(self) queue_free() + else: + var tween = create_tween() + $TextureRect.modulate = Color(1, 1, 1) + tween.tween_property($TextureRect, "modulate", original_color, 0.25) + +func _show_block() -> void: + $TextureRect.modulate = Color(1, 1, 1) + var tween = create_tween() + tween.tween_property($TextureRect, "modulate", original_color, 0.25) + visible = true + collision_layer = 1 + + +func type(base : int, color : Color) -> void: + my_type = base + original_color = color + match base: + NORMAL: + $TextureRect.texture = load("res://Brick/BaseBrick.png") + $TextureRect.modulate = color + hits = 1 + value = 100 + SHINY: + $TextureRect.texture = load("res://Brick/ShinyBrick.png") + $TextureRect.modulate = color + hits = 2 + value = 200 + INVULNERABLE: + $TextureRect.texture = load("res://Brick/InvulBrick.png") + $TextureRect.modulate = color + hits = 2 + value = 0 + + diff --git a/Brick/Brick.tscn b/Brick/Brick.tscn index 9818e37..56199d1 100644 --- a/Brick/Brick.tscn +++ b/Brick/Brick.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=4 format=3 uid="uid://wld2y5cseki8"] +[gd_scene load_steps=5 format=3 uid="uid://wld2y5cseki8"] [ext_resource type="Script" path="res://Brick/Brick.gd" id="1_eylhu"] +[ext_resource type="Texture2D" uid="uid://cipjurqgguse7" path="res://Brick/BaseBrick.png" id="2_v230s"] [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_s6ufd"] rough = true @@ -14,13 +15,19 @@ input_pickable = true physics_material_override = SubResource("PhysicsMaterial_s6ufd") constant_linear_velocity = Vector2(0, 50) script = ExtResource("1_eylhu") -color = Color(0.203922, 0.682353, 0.4, 1) [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_xxkpg") -[node name="Polygon2D" type="Polygon2D" parent="."] -color = Color(0.203922, 0.682353, 0.4, 1) -polygon = PackedVector2Array(-15, -7, 15, -7, 15, 7, -15, 7) +[node name="TextureRect" type="TextureRect" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_v230s") +stretch_mode = 2 [connection signal="input_event" from="." to="." method="_on_input_event"] diff --git a/Brick/InvulBrick.png b/Brick/InvulBrick.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ebe82007245c8c0130ec07b4b394f4dc065018 GIT binary patch literal 657 zcmV;C0&e|@P)EX>4Tx04R}tkv&MmKpe$i(-uXlB6bi_$WWc^q9Ts93Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#J2)x2NQwVT3N2ziIPS;0dyl(!fKV?p%?iW-O}EWd zA}(gKt76wHf(T#$eHfLQWz0!Z5*^3aJ$!t(`8@D`M&FbL25*6$HLthkK29HiG+{*BAMzz^zPleEnBvr_<-hdKwam<*(|susP6+>m`=wyc=zs|iHQj$-YEoV=Flr2 roH=ub>VX6C2MaQXR&hYBz`+Ut-jg|jn2GT500000NkvXXu0mjf$zvCM literal 0 HcmV?d00001 diff --git a/Brick/InvulBrick.png.import b/Brick/InvulBrick.png.import new file mode 100644 index 0000000..14bc5a6 --- /dev/null +++ b/Brick/InvulBrick.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dn3h7kulxisb0" +path="res://.godot/imported/InvulBrick.png-ebb3673dfb058ac03c9a8fc9a31748cd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Brick/InvulBrick.png" +dest_files=["res://.godot/imported/InvulBrick.png-ebb3673dfb058ac03c9a8fc9a31748cd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Brick/ShinyBrick.png b/Brick/ShinyBrick.png new file mode 100644 index 0000000000000000000000000000000000000000..4d864d3526160d475cb488a3142f957001fa685a GIT binary patch literal 614 zcmV-s0-61ZP)EX>4Tx04R}tkv&MmKpe$i(-uXlB6bi_$WWc^q9Ts93Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#J2)x2NQwVT3N2ziIPS;0dyl(!fKV?p%?iW-O}EWd zA}(gKt76wHf(T#$eHfLQWz0!Z5*^3aJ$!t(`8@D`M&FbL25*6$HLthkK29HiG58%#6q#{fS z>id8erqeMFXyp81kx@H1q+a*rO2u0O&v(OOOVbcmMzZ07*qoM6N<$g6JCq AzW@LL literal 0 HcmV?d00001 diff --git a/Brick/ShinyBrick.png.import b/Brick/ShinyBrick.png.import new file mode 100644 index 0000000..f6855a1 --- /dev/null +++ b/Brick/ShinyBrick.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ct1ksbbjc61lr" +path="res://.godot/imported/ShinyBrick.png-08da15e371535310e14a8c7f17275a06.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Brick/ShinyBrick.png" +dest_files=["res://.godot/imported/ShinyBrick.png-08da15e371535310e14a8c7f17275a06.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Dunkanoid.gd b/Dunkanoid.gd index c4dc0de..1c14b12 100644 --- a/Dunkanoid.gd +++ b/Dunkanoid.gd @@ -1,51 +1,138 @@ extends Node2D -var Brick = preload("res://Brick/Brick.tscn") -var Ball = preload("res://Ball/Ball.tscn") -var Upgrade = preload("res://Upgrade/Upgrade.tscn") +var _Brick = preload("res://Brick/Brick.tscn") +var _Ball = preload("res://Ball/Ball.tscn") +var _Upgrade = preload("res://Upgrade/Upgrade.tscn") var bricks : Array = [] var balls : Array[Node] = [] +enum { + MODE_WAIT, + MODE_PLAY, + MODE_EXIT, + MODE_LEAVE +} + +var mode = MODE_WAIT + signal update_score +const levels = { + "DUNKANOID": { + "data": [ + " ", + " ", + "sssssssssssss", + "YYYBYYsCCRCCC", + "YYBBYYsCCRRCC", + "YBBBBBsRRRRRC", + "BBBBBBsRRRRRR", + "YBBBBBsRRRRRC", + "YYBBYYsCCRRCC", + "YYYBYYsCCRCCC", + "ssisssssssiss" + ], + "left": "RAINBOW", + "right": "SATERRANOID", + "round": 1 + }, + "RAINBOW": { + "data": [ + " ", + " ", + " RRRRR ", + " RRRRRRR ", + " RROOOOORR ", + " RROOOOORR ", + " RROOYYYOORR ", + " ROOYBBBYOOR ", + " ROYBBBBBYOR ", + "RROYB BYORR", + "ROYBg gBYOR", + "ROYB BYOR", + "ROYB BYOR", + "ROYB BYOR", + "ROYB BYOR", + "ROYB BYOR", + "sssss s sssss" + ], + "left": "DUNKANOID", + "right": "DUNKANOID", + "round": 2 + }, + "SATERRANOID": { + "data": [ + " ", + " ", + "WWOOCCgGGRRBB", + "WWOOCCgGGRRBB", + "OOCCGGgRRBBMM", + "OOCCGGgRRBBMM", + "CCGGRRgBBMMYY", + "CCGGRRgBBMMYY", + "GGRRBBgMMYYWW", + "GGRRBBgMMYYWW", + "RRBBMMgYYWWOO", + "RRBBMMgYYWWOO", + "BBMMYYgWWOOCC", + "BBMMYYgWWOOCC", + "MMYYWWgOOCCGG", + "MMYYWWgOOCCGG" + ], + "left": "DUNKANOID", + "right": "DUNKANOID", + "round": 2 + } +} + var capture_mode : bool = false var lives : int = 3 var score : int = 0 : set(x): score = x update_score.emit() +var level : String = "SATERRANOID" func _ready() -> void: Input.set_mouse_mode(Input.MOUSE_MODE_CONFINED_HIDDEN) new_level() +func _process(_delta : float) -> void: + if mode == MODE_EXIT: + if $Paddle.global_position.x == 32: + level = levels[level].left + new_level() + if $Paddle.global_position.x == 416: + level = levels[level].right + new_level() + func new_level() -> void: + mode = MODE_WAIT + $Exits.visible = false for ball in balls: remove_child(ball) ball.queue_free() - for y in 8: - for x in 16: - var brick = Brick.instantiate() - brick.color = Color(randf(), randf(), randf()) - brick.position = Vector2(x * 32 + 16, y * 16 + 8 + 32) - bricks.push_back(brick) - brick.brick_destroyed.connect(_brick_destroyed) - add_child(brick) - var ball = Ball.instantiate() + balls.clear() + + $Start/Title.text = level + $Start/Round.text = "ROUND %3d" % [levels[level].round] + load_level(levels[level].data) + var ball = _Ball.instantiate() ball.capture($Paddle, Vector2((randf() * 32) - 16, 8)) ball.hit_paddle.connect(_on_hit_paddle) ball.hit_floor.connect(_on_hit_floor) add_child(ball) balls.push_back(ball) - + + $Start.visible = true $StartRound.play() func _brick_destroyed(brick) -> void: score += brick.value if randf() > 0.9: - var upgrade = Upgrade.instantiate() + var upgrade = _Upgrade.instantiate() upgrade.position = brick.position upgrade.upgrade_collected.connect(_on_upgrade_collected) match randi() % 3: @@ -57,18 +144,27 @@ func _brick_destroyed(brick) -> void: upgrade.set_upgrade("X", Color.RED) add_child(upgrade) bricks.erase(brick) - if bricks.size() == 0: + var brick_count = 0 + for abrick in bricks: + if abrick.my_type != Brick.INVULNERABLE: + brick_count += 1 + + if brick_count == 0: for ball in balls: remove_child(ball) ball.queue_free() - balls.erase(ball) + balls.clear() + mode = MODE_EXIT + $Exits.visible = true $RoundWon.play() func _input(event: InputEvent) -> void: if event is InputEventMouseMotion: - $Paddle.position = Vector2(min(max(16, event.position.x), 512-16), 340) + $Paddle.position = Vector2(min(max(32, event.position.x), 432-16), 340) if event is InputEventMouseButton: + if mode != MODE_PLAY: + return for ball in balls: if (ball.captured): ball.release() @@ -80,12 +176,11 @@ func _on_hit_paddle(ball) -> void: func _on_hit_floor(ball) -> void: $FloorSound.play() - print("Hit floor!") balls.erase(ball) remove_child(ball) ball.call_deferred("queue_free") if balls.size() == 0: - ball = Ball.instantiate() + ball = _Ball.instantiate() ball.capture($Paddle, Vector2((randf() * 32) - 16, 8)) ball.hit_paddle.connect(_on_hit_paddle) ball.hit_floor.connect(_on_hit_floor) @@ -95,7 +190,7 @@ func _on_hit_floor(ball) -> void: func _on_round_won_finished() -> void: - new_level() + pass func _on_update_score() -> void: @@ -115,15 +210,61 @@ func _on_upgrade_collected(code : String) -> void: add_ball() func add_ball() -> void: - var newball = Ball.instantiate() + var newball = _Ball.instantiate() newball.position = balls[0].position - newball.linear_velocity = balls[0].linear_velocity - Vector2((randf() - 0.5) * 30 , 0) + newball.linear_velocity = (balls[0].linear_velocity - Vector2((randf() - 0.5) * 100 , 0)).normalized() * balls[0].linear_velocity.length() newball.angular_velocity = 0 newball.hit_paddle.connect(_on_hit_paddle) newball.hit_floor.connect(_on_hit_floor) + if balls[0].captured: + newball.capture($Paddle, Vector2((randf() - 0.5) * 32, 8)) add_child(newball) balls.push_back(newball) func _cancel_capture_mode() -> void: capture_mode = false + +func load_level(data) -> void: + for y in data.size(): + var line : String = data[y] + for x in line.length(): + var c = line.substr(x, 1) + if c == " ": + continue + + var brick = _Brick.instantiate() + match c: + "R": + brick.type(Brick.NORMAL, Color.RED) + "G": + brick.type(Brick.NORMAL, Color.GREEN) + "Y": + brick.type(Brick.NORMAL, Color.YELLOW) + "B": + brick.type(Brick.NORMAL, Color.BLUE) + "M": + brick.type(Brick.NORMAL, Color.MAGENTA) + "C": + brick.type(Brick.NORMAL, Color.CYAN) + "W": + brick.type(Brick.NORMAL, Color.WHITE) + "O": + brick.type(Brick.NORMAL, Color.ORANGE) + "s": + brick.type(Brick.SHINY, Color.SILVER) + "g": + brick.type(Brick.SHINY, Color.GOLD) + "i": + brick.type(Brick.INVULNERABLE, Color.GRAY) + + brick.position = Vector2(x * 32 + 16 + 16, y * 16 + 8 + 16) + bricks.push_back(brick) + brick.brick_destroyed.connect(_brick_destroyed) + add_child(brick) + + + +func _on_start_round_finished() -> void: + $Start.visible = false + mode = MODE_PLAY diff --git a/Dunkanoid.tscn b/Dunkanoid.tscn index 2803537..19087e9 100644 --- a/Dunkanoid.tscn +++ b/Dunkanoid.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://4q0epdnb0x4s"] +[gd_scene load_steps=16 format=3 uid="uid://4q0epdnb0x4s"] [ext_resource type="Script" path="res://Dunkanoid.gd" id="1_kv4if"] [ext_resource type="PackedScene" uid="uid://dndemjw7up2r6" path="res://Paddle/Paddle.tscn" id="2_26c5i"] @@ -8,6 +8,7 @@ [ext_resource type="AudioStream" uid="uid://818gpo5mes22" path="res://Sounds/Start.wav" id="6_s0pha"] [ext_resource type="AudioStream" uid="uid://bh2blx1uovmyt" path="res://Sounds/Win.wav" id="7_xrjor"] [ext_resource type="Theme" uid="uid://cfvww0geatnnk" path="res://MainTheme.tres" id="8_wcf7g"] +[ext_resource type="Shader" path="res://Arkanoid.gdshader" id="9_20w5w"] [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_yf4r2"] rough = true @@ -15,19 +16,24 @@ bounce = 1.0 [sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_jsudl"] normal = Vector2(0, 1) -distance = 1.0 +distance = 16.0 [sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_3e48c"] normal = Vector2(1, 0) +distance = 16.0 [sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_jt2f6"] normal = Vector2(-1, 0) -distance = -512.0 +distance = -432.0 [sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_48dqy"] distance = -360.0 +[sub_resource type="ShaderMaterial" id="ShaderMaterial_6dsnv"] +shader = ExtResource("9_20w5w") + [node name="Dunkanoid" type="Node2D"] +texture_filter = 1 script = ExtResource("1_kv4if") [node name="Paddle" parent="." instance=ExtResource("2_26c5i")] @@ -64,21 +70,86 @@ stream = ExtResource("6_s0pha") stream = ExtResource("7_xrjor") [node name="ScoreLabel" type="Label" parent="."] -offset_left = 551.0 -offset_top = 16.0 -offset_right = 602.0 -offset_bottom = 39.0 +offset_left = 509.0 +offset_top = 29.0 +offset_right = 560.0 +offset_bottom = 52.0 theme = ExtResource("8_wcf7g") text = "SCORE" [node name="ScoreBox" type="Label" parent="."] -offset_left = 518.0 -offset_top = 41.0 -offset_right = 636.0 -offset_bottom = 64.0 +offset_left = 479.0 +offset_top = 54.0 +offset_right = 597.0 +offset_bottom = 77.0 theme = ExtResource("8_wcf7g") theme_type_variation = &"Numbers" text = "00000000" +[node name="ColorRect" type="ColorRect" parent="."] +offset_right = 16.0 +offset_bottom = 360.0 + +[node name="ColorRect2" type="ColorRect" parent="."] +offset_left = 432.0 +offset_right = 448.0 +offset_bottom = 360.0 + +[node name="ColorRect3" type="ColorRect" parent="."] +offset_right = 432.0 +offset_bottom = 16.0 + +[node name="Start" type="Node2D" parent="."] +z_index = 1 + +[node name="Title" type="Label" parent="Start"] +material = SubResource("ShaderMaterial_6dsnv") +offset_left = 16.0 +offset_top = 199.0 +offset_right = 432.0 +offset_bottom = 224.0 +theme = ExtResource("8_wcf7g") +theme_type_variation = &"Arkanoid" +text = "DUNKANOID" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Round" type="Label" parent="Start"] +offset_left = 16.0 +offset_top = 224.0 +offset_right = 432.0 +offset_bottom = 247.0 +theme = ExtResource("8_wcf7g") +text = "ROUND 1" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Ready" type="Label" parent="Start"] +offset_left = 16.0 +offset_top = 247.0 +offset_right = 432.0 +offset_bottom = 270.0 +theme = ExtResource("8_wcf7g") +text = "READY" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Exits" type="Node2D" parent="."] +visible = false + +[node name="Left" type="ColorRect" parent="Exits"] +offset_top = 312.0 +offset_right = 16.0 +offset_bottom = 360.0 +color = Color(0, 0, 1, 1) + +[node name="Right" type="ColorRect" parent="Exits"] +offset_left = 432.0 +offset_top = 312.0 +offset_right = 448.0 +offset_bottom = 360.0 +color = Color(0, 0, 1, 1) + [connection signal="update_score" from="." to="." method="_on_update_score"] +[connection signal="finished" from="StartRound" to="." method="_on_start_round_finished"] [connection signal="finished" from="RoundWon" to="." method="_on_round_won_finished"] diff --git a/Fonts/arkanoid/ARKANOID.TTF b/Fonts/arkanoid/ARKANOID.TTF new file mode 100644 index 0000000000000000000000000000000000000000..829a780495f6a138e809a9ce2259893313581588 GIT binary patch literal 25736 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
    a_v!Q{(jnJU;9%yJl4dd@q7D0X) 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