From 29f250adf0e1dfda5e7fc85d949cf015363d4fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Tue, 18 Jun 2024 23:03:36 -0300 Subject: [PATCH 1/2] Block code: Don't use get_class for custom classes Overriding the native get_class is not supported and raises an error. Add a method to get either the custom or the native class. --- addons/block_code/block_code_node/block_code.gd | 16 ++++++++++++---- .../simple_character/simple_character.gd | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/addons/block_code/block_code_node/block_code.gd b/addons/block_code/block_code_node/block_code.gd index 62dab20b..61da4dea 100644 --- a/addons/block_code/block_code_node/block_code.gd +++ b/addons/block_code/block_code_node/block_code.gd @@ -14,6 +14,12 @@ func _ready(): _update_parent_script() +func _get_custom_or_native_class(node: Node): + if node.has_method("get_custom_class"): + return node.get_custom_class() + return node.get_class() + + func _enter_tree(): if not Engine.is_editor_hint(): return @@ -21,7 +27,7 @@ func _enter_tree(): # Create script if bsd == null: var new_bsd: BlockScriptData = load("res://addons/block_code/ui/bsd_templates/default_bsd.tres").duplicate(true) - new_bsd.script_inherits = get_parent().call("get_class") # For whatever reason this works instead of just .get_class :) + new_bsd.script_inherits = _get_custom_or_native_class(get_parent()) new_bsd.generated_script = new_bsd.generated_script.replace("INHERIT_DEFAULT", new_bsd.script_inherits) bsd = new_bsd @@ -44,6 +50,8 @@ func _update_parent_script(): func _get_configuration_warnings(): - if bsd: - if get_parent().call("get_class") != bsd.script_inherits: - return ["The parent is not a %s. Create a new BlockCode node and reattach." % bsd.script_inherits] + var warnings = [] + if bsd and _get_custom_or_native_class(get_parent()) != bsd.script_inherits: + var warning = "The parent is not a %s. Create a new BlockCode node and reattach." % bsd.script_inherits + warnings.append(warning) + return warnings diff --git a/addons/block_code/simple_nodes/simple_character/simple_character.gd b/addons/block_code/simple_nodes/simple_character/simple_character.gd index 4c560ad4..5b4de358 100644 --- a/addons/block_code/simple_nodes/simple_character/simple_character.gd +++ b/addons/block_code/simple_nodes/simple_character/simple_character.gd @@ -9,7 +9,7 @@ func _ready(): $Sprite2D.texture = sprite_texture -func get_class(): +func get_custom_class(): return "SimpleCharacter" From 98f8ba0eac8dd5d2cb378a6de94b14e91532ab85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Tue, 18 Jun 2024 23:05:46 -0300 Subject: [PATCH 2/2] Add Pong demo And make it the main scene. The paddles have 2 custom blocks for movement, borrowing from the SimpleCharacter example. But the speed parameter is a Vector2 so the movement can be limited to the Y axis. The HUD has methods to change the scoring labels. For now a BlockCode node is added to the root node for setting arbitrary score as example. All components have been copied from Moddable Pong and removing the logic. The ball properties were left for now. The project window viewport is adjusted to match Moddable Pong. Also the gravity setting was set to zero. --- pong_game/ball.gd | 39 +++++++ pong_game/ball.png | Bin 0 -> 6901 bytes pong_game/ball.png.import | 34 ++++++ pong_game/ball.tscn | 39 +++++++ pong_game/hud.gd | 19 ++++ pong_game/hud.tscn | 57 ++++++++++ pong_game/line.png | Bin 0 -> 179 bytes pong_game/line.png.import | 34 ++++++ pong_game/paddle.gd | 33 ++++++ pong_game/paddle.png | Bin 0 -> 6940 bytes pong_game/paddle.png.import | 34 ++++++ pong_game/paddle.tscn | 19 ++++ pong_game/paddle_hit.ogg | Bin 0 -> 6665 bytes pong_game/paddle_hit.ogg.import | 19 ++++ pong_game/pong_game.gd | 29 ++++++ pong_game/pong_game.tscn | 178 ++++++++++++++++++++++++++++++++ pong_game/score.ogg | Bin 0 -> 11421 bytes pong_game/score.ogg.import | 19 ++++ pong_game/space.png | Bin 0 -> 49671 bytes pong_game/space.png.import | 34 ++++++ pong_game/space.tscn | 61 +++++++++++ pong_game/wall_hit.ogg | Bin 0 -> 6946 bytes pong_game/wall_hit.ogg.import | 19 ++++ project.godot | 14 ++- 24 files changed, 680 insertions(+), 1 deletion(-) create mode 100644 pong_game/ball.gd create mode 100644 pong_game/ball.png create mode 100644 pong_game/ball.png.import create mode 100644 pong_game/ball.tscn create mode 100644 pong_game/hud.gd create mode 100644 pong_game/hud.tscn create mode 100644 pong_game/line.png create mode 100644 pong_game/line.png.import create mode 100644 pong_game/paddle.gd create mode 100644 pong_game/paddle.png create mode 100644 pong_game/paddle.png.import create mode 100644 pong_game/paddle.tscn create mode 100644 pong_game/paddle_hit.ogg create mode 100644 pong_game/paddle_hit.ogg.import create mode 100644 pong_game/pong_game.gd create mode 100644 pong_game/pong_game.tscn create mode 100644 pong_game/score.ogg create mode 100644 pong_game/score.ogg.import create mode 100644 pong_game/space.png create mode 100644 pong_game/space.png.import create mode 100644 pong_game/space.tscn create mode 100644 pong_game/wall_hit.ogg create mode 100644 pong_game/wall_hit.ogg.import diff --git a/pong_game/ball.gd b/pong_game/ball.gd new file mode 100644 index 00000000..ff108d6a --- /dev/null +++ b/pong_game/ball.gd @@ -0,0 +1,39 @@ +@tool +class_name Ball +extends RigidBody2D + +const _INITIAL_RADIUS: int = 64 + +## This is how fast your ball moves. +@export_range(0.0, 10000.0, 0.5, "suffix:px/s") var initial_speed: float = 500.0 + +## This is the initial angle of the ball. +@export_range(-180, 180, 0.5, "radians_as_degrees") var initial_direction: float = PI / 4 + +## How big is this ball? +@export_range(0.1, 5.0, 0.1) var size: float = 1.0: + set = _set_size + +@onready var _shape: CollisionShape2D = %CollisionShape2D +@onready var _sprite: Sprite2D = %Sprite2D + + +func _set_size(new_size: float): + size = new_size + if not is_node_ready(): + await ready + _shape.shape.radius = _INITIAL_RADIUS * size + _sprite.scale = Vector2(size, size) + + +func _ready(): + if Engine.is_editor_hint(): + set_process(false) + set_physics_process(false) + reset() + + +func reset(): + linear_velocity = Vector2.from_angle(initial_direction) * initial_speed + angular_velocity = 0.0 + _set_size(size) diff --git a/pong_game/ball.png b/pong_game/ball.png new file mode 100644 index 0000000000000000000000000000000000000000..157995c280141b3c42b21c82cbd3503a595b3ad4 GIT binary patch literal 6901 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 literal 0 HcmV?d00001 diff --git a/pong_game/ball.png.import b/pong_game/ball.png.import new file mode 100644 index 00000000..efad73c2 --- /dev/null +++ b/pong_game/ball.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bcgr5amsq3jfl" +path="res://.godot/imported/ball.png-207b87d36613f4458c4a15d56cdcf75a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://pong_game/ball.png" +dest_files=["res://.godot/imported/ball.png-207b87d36613f4458c4a15d56cdcf75a.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/pong_game/ball.tscn b/pong_game/ball.tscn new file mode 100644 index 00000000..2a640af9 --- /dev/null +++ b/pong_game/ball.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=7 format=3 uid="uid://c7l70grmkauij"] + +[ext_resource type="Script" path="res://pong_game/ball.gd" id="1_vdrab"] +[ext_resource type="Texture2D" uid="uid://bcgr5amsq3jfl" path="res://pong_game/ball.png" id="2_xkrmm"] +[ext_resource type="AudioStream" uid="uid://bc7jd3d8m5spt" path="res://pong_game/wall_hit.ogg" id="3_mjbsd"] +[ext_resource type="AudioStream" uid="uid://jk0oapxjw354" path="res://pong_game/paddle_hit.ogg" id="4_skr8k"] + +[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_c3m63"] +friction = 0.0 +bounce = 1.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_sntrn"] +radius = 64.0 + +[node name="Ball" type="RigidBody2D" groups=["balls"]] +collision_layer = 2 +collision_mask = 15 +physics_material_override = SubResource("PhysicsMaterial_c3m63") +continuous_cd = 1 +max_contacts_reported = 1 +contact_monitor = true +linear_velocity = Vector2(353.553, 353.553) +script = ExtResource("1_vdrab") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +unique_name_in_owner = true +shape = SubResource("CircleShape2D_sntrn") + +[node name="Sprite2D" type="Sprite2D" parent="."] +unique_name_in_owner = true +texture = ExtResource("2_xkrmm") + +[node name="WallAudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("3_mjbsd") + +[node name="PaddleAudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource("4_skr8k") + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/pong_game/hud.gd b/pong_game/hud.gd new file mode 100644 index 00000000..2eb5ede0 --- /dev/null +++ b/pong_game/hud.gd @@ -0,0 +1,19 @@ +extends CanvasLayer + +@onready var _score_labels = { + "left": %PlayerLeftScore, + "right": %PlayerRightScore, +} + + +## Sets the score for one player. +func set_player_score(player: String, score: int): + var text = _score_labels[player].text + if str(score) != text: + _score_labels[player].text = str(score) + + +## Sets the score for each player. +func set_players_scores(left_score: int, right_score: int): + set_player_score("left", left_score) + set_player_score("right", right_score) diff --git a/pong_game/hud.tscn b/pong_game/hud.tscn new file mode 100644 index 00000000..b5449a0c --- /dev/null +++ b/pong_game/hud.tscn @@ -0,0 +1,57 @@ +[gd_scene load_steps=3 format=3 uid="uid://bis7afjjuwypq"] + +[ext_resource type="Script" path="res://pong_game/hud.gd" id="1_yyb01"] +[ext_resource type="Texture2D" uid="uid://dijemw7iilr2m" path="res://pong_game/line.png" id="2_jon51"] + +[node name="HUD" type="CanvasLayer" groups=["hud"]] +script = ExtResource("1_yyb01") + +[node name="Control" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="Control"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Lines" type="Sprite2D" parent="Control/HBoxContainer"] +unique_name_in_owner = true +texture_repeat = 2 +position = Vector2(960, 536) +texture = ExtResource("2_jon51") +region_enabled = true +region_rect = Rect2(0, 0, 20, 1100) + +[node name="PlayerLeftScore" type="Label" parent="Control"] +unique_name_in_owner = true +layout_mode = 2 +offset_left = 240.0 +offset_right = 717.0 +offset_bottom = 1080.0 +pivot_offset = Vector2(240, 176) +size_flags_horizontal = 3 +size_flags_vertical = 1 +theme_override_font_sizes/font_size = 200 +text = "0" +horizontal_alignment = 1 + +[node name="PlayerRightScore" type="Label" parent="Control"] +unique_name_in_owner = true +layout_mode = 2 +offset_left = 1200.0 +offset_right = 1677.0 +offset_bottom = 1080.0 +pivot_offset = Vector2(240, 176) +size_flags_horizontal = 3 +size_flags_vertical = 1 +theme_override_font_sizes/font_size = 200 +text = "0" +horizontal_alignment = 1 diff --git a/pong_game/line.png b/pong_game/line.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce5b41fee0f0a5cf7ee62c394552e07a39ef7dd GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^B0%iG!3HFyriH%&Qk(@Ik;M!Q{D~mUxWayUCQvZd z)5S3);_%z6hFk{}cv>GWDf!T_GquQJ`>JO46W)c-q=l!NB7F9>q3K-q){UpZ~IYb2Gr>;qE)1C;VQVE}zt)*d_rb65|fD9Zs`N UJ?X;j478BJ)78&qol`;+03?t?;{X5v literal 0 HcmV?d00001 diff --git a/pong_game/line.png.import b/pong_game/line.png.import new file mode 100644 index 00000000..9264e7d6 --- /dev/null +++ b/pong_game/line.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dijemw7iilr2m" +path="res://.godot/imported/line.png-452af046907249a8ef12695e48447ab1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://pong_game/line.png" +dest_files=["res://.godot/imported/line.png-452af046907249a8ef12695e48447ab1.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/pong_game/paddle.gd b/pong_game/paddle.gd new file mode 100644 index 00000000..7d073e89 --- /dev/null +++ b/pong_game/paddle.gd @@ -0,0 +1,33 @@ +@tool +class_name Paddle +extends CharacterBody2D + + +func get_custom_class(): + return "Paddle" + + +static func get_exposed_properties() -> Array[String]: + return ["position"] + + +static func get_custom_blocks() -> Array[BlockCategory]: + var b: Block + + # Movement + var movement_list: Array[Block] = [] + b = CategoryFactory.BLOCKS["statement_block"].instantiate() + b.block_type = Types.BlockType.EXECUTE + b.block_format = "Move with player 1 buttons, speed {speed: VECTOR2}" + b.statement = 'velocity = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")*{speed}\n' + "move_and_slide()" + movement_list.append(b) + + b = CategoryFactory.BLOCKS["statement_block"].instantiate() + b.block_type = Types.BlockType.EXECUTE + b.block_format = "Move with player 2 buttons, speed {speed: VECTOR2}" + b.statement = 'velocity = Input.get_vector("player_2_left", "player_2_right", "player_2_up", "player_2_down")*{speed}\n' + "move_and_slide()" + movement_list.append(b) + + var movement_category: BlockCategory = BlockCategory.new("Movement", movement_list, Color("4a86d5")) + + return [movement_category] diff --git a/pong_game/paddle.png b/pong_game/paddle.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea6181cfe51e197c9680f3c8a4ca3d66b82d56a GIT binary patch literal 6940 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 KH>lRb$NmrQB$BfL literal 0 HcmV?d00001 diff --git a/pong_game/paddle.png.import b/pong_game/paddle.png.import new file mode 100644 index 00000000..e7956273 --- /dev/null +++ b/pong_game/paddle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tplpgtnfeda0" +path="res://.godot/imported/paddle.png-2fbcaaf37bbbddd482a4ad5b20dde0a2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://pong_game/paddle.png" +dest_files=["res://.godot/imported/paddle.png-2fbcaaf37bbbddd482a4ad5b20dde0a2.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/pong_game/paddle.tscn b/pong_game/paddle.tscn new file mode 100644 index 00000000..b5ed8a81 --- /dev/null +++ b/pong_game/paddle.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://s7enbp56f256"] + +[ext_resource type="Script" path="res://pong_game/paddle.gd" id="1_74lee"] +[ext_resource type="Texture2D" uid="uid://tplpgtnfeda0" path="res://pong_game/paddle.png" id="1_eucti"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_bbbjr"] +size = Vector2(128, 384) + +[node name="Paddle" type="CharacterBody2D" groups=["paddles"]] +collision_mask = 68 +motion_mode = 1 +script = ExtResource("1_74lee") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_bbbjr") + +[node name="Sprite2D" type="Sprite2D" parent="."] +unique_name_in_owner = true +texture = ExtResource("1_eucti") diff --git a/pong_game/paddle_hit.ogg b/pong_game/paddle_hit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..692386de4eb99bab8d34a57ae45fbc135702d0c7 GIT binary patch literal 6665 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 literal 0 HcmV?d00001 diff --git a/pong_game/paddle_hit.ogg.import b/pong_game/paddle_hit.ogg.import new file mode 100644 index 00000000..17035730 --- /dev/null +++ b/pong_game/paddle_hit.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://jk0oapxjw354" +path="res://.godot/imported/paddle_hit.ogg-78978cea7a35465f97568c50bd227ec1.oggvorbisstr" + +[deps] + +source_file="res://pong_game/paddle_hit.ogg" +dest_files=["res://.godot/imported/paddle_hit.ogg-78978cea7a35465f97568c50bd227ec1.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/pong_game/pong_game.gd b/pong_game/pong_game.gd new file mode 100644 index 00000000..e88a8a87 --- /dev/null +++ b/pong_game/pong_game.gd @@ -0,0 +1,29 @@ +@tool +class_name Pong +extends Node2D + + +func get_custom_class(): + return "Pong" + + +static func get_custom_blocks() -> Array[BlockCategory]: + var b: Block + + # TODO: Only for testing. Move these blocks where they belong. + var score_list: Array[Block] = [] + b = CategoryFactory.BLOCKS["statement_block"].instantiate() + b.block_type = Types.BlockType.EXECUTE + b.block_format = "Change player 1 score by {score: INT}" + b.statement = 'get_tree().call_group("hud", "set_player_score", "right", {score})' + score_list.append(b) + + b = CategoryFactory.BLOCKS["statement_block"].instantiate() + b.block_type = Types.BlockType.EXECUTE + b.block_format = "Change player 2 score by {score: INT}" + b.statement = 'get_tree().call_group("hud", "set_player_score", "left", {score})' + score_list.append(b) + + var score_category: BlockCategory = BlockCategory.new("Scoring", score_list, Color("4a86d5")) + + return [score_category] diff --git a/pong_game/pong_game.tscn b/pong_game/pong_game.tscn new file mode 100644 index 00000000..f3565ace --- /dev/null +++ b/pong_game/pong_game.tscn @@ -0,0 +1,178 @@ +[gd_scene load_steps=31 format=3 uid="uid://tf7b8c64ecc0"] + +[ext_resource type="PackedScene" uid="uid://s7enbp56f256" path="res://pong_game/paddle.tscn" id="1_1k5k2"] +[ext_resource type="Script" path="res://pong_game/pong_game.gd" id="1_bjkc8"] +[ext_resource type="PackedScene" uid="uid://cg8ibi18um3vg" path="res://pong_game/space.tscn" id="1_y56ac"] +[ext_resource type="Script" path="res://addons/block_code/block_code_node/block_code.gd" id="3_6jaq8"] +[ext_resource type="Script" path="res://addons/block_code/ui/block_canvas/serialized_block_tree_node.gd" id="4_qtggh"] +[ext_resource type="Script" path="res://addons/block_code/ui/block_canvas/serialized_block.gd" id="5_wr38c"] +[ext_resource type="Script" path="res://addons/block_code/ui/block_canvas/serialized_block_tree_node_array.gd" id="6_ppdc3"] +[ext_resource type="Script" path="res://addons/block_code/block_script_data/block_script_data.gd" id="7_uuuue"] +[ext_resource type="PackedScene" uid="uid://bis7afjjuwypq" path="res://pong_game/hud.tscn" id="8_yg457"] +[ext_resource type="PackedScene" uid="uid://c7l70grmkauij" path="res://pong_game/ball.tscn" id="9_xrqll"] + +[sub_resource type="Resource" id="Resource_535fl"] +script = ExtResource("5_wr38c") +block_class = &"StatementBlock" +serialized_props = [["block_name", "statement_block"], ["label", "StatementBlock"], ["color", Color(0.290196, 0.52549, 0.835294, 1)], ["block_type", 2], ["position", Vector2(0, 0)], ["block_format", "Move with player 2 buttons, speed {speed: VECTOR2}"], ["statement", "velocity = Input.get_vector(\"player_2_left\", \"player_2_right\", \"player_2_up\", \"player_2_down\")*{speed} +move_and_slide()"], ["param_input_strings", { +"speed": "0, 1000" +}]] + +[sub_resource type="Resource" id="Resource_qwdfx"] +script = ExtResource("4_qtggh") +serialized_block = SubResource("Resource_535fl") +path_child_pairs = [] + +[sub_resource type="Resource" id="Resource_ob4a5"] +script = ExtResource("5_wr38c") +block_class = &"EntryBlock" +serialized_props = [["block_name", "process_block"], ["label", "EntryBlock"], ["color", Color(0.980392, 0.34902, 0.337255, 1)], ["block_type", 1], ["position", Vector2(53, 164)], ["block_format", "On Process"], ["statement", "func _process(delta):"], ["param_input_strings", {}]] + +[sub_resource type="Resource" id="Resource_53uyg"] +script = ExtResource("4_qtggh") +serialized_block = SubResource("Resource_ob4a5") +path_child_pairs = [[NodePath("VBoxContainer/SnapPoint"), SubResource("Resource_qwdfx")]] + +[sub_resource type="Resource" id="Resource_85hm7"] +script = ExtResource("6_ppdc3") +array = Array[ExtResource("4_qtggh")]([SubResource("Resource_53uyg")]) + +[sub_resource type="Resource" id="Resource_t7nl4"] +script = ExtResource("7_uuuue") +script_inherits = "Paddle" +block_trees = SubResource("Resource_85hm7") +generated_script = "extends Paddle + +var VAR_DICT := {} + +func _process(delta): + velocity = Input.get_vector(\"player_2_left\", \"player_2_right\", \"player_2_up\", \"player_2_down\")*Vector2(0, 1000) + move_and_slide() + +" + +[sub_resource type="Resource" id="Resource_jkl87"] +script = ExtResource("5_wr38c") +block_class = &"StatementBlock" +serialized_props = [["block_name", "statement_block"], ["label", "StatementBlock"], ["color", Color(0.290196, 0.52549, 0.835294, 1)], ["block_type", 2], ["position", Vector2(0, 0)], ["block_format", "Move with player 1 buttons, speed {speed: VECTOR2}"], ["statement", "velocity = Input.get_vector(\"ui_left\", \"ui_right\", \"ui_up\", \"ui_down\")*{speed} +move_and_slide()"], ["param_input_strings", { +"speed": "0, 1000" +}]] + +[sub_resource type="Resource" id="Resource_dsoim"] +script = ExtResource("4_qtggh") +serialized_block = SubResource("Resource_jkl87") +path_child_pairs = [] + +[sub_resource type="Resource" id="Resource_1xs00"] +script = ExtResource("5_wr38c") +block_class = &"EntryBlock" +serialized_props = [["block_name", "process_block"], ["label", "EntryBlock"], ["color", Color(0.980392, 0.34902, 0.337255, 1)], ["block_type", 1], ["position", Vector2(90, 95)], ["block_format", "On Process"], ["statement", "func _process(delta):"], ["param_input_strings", {}]] + +[sub_resource type="Resource" id="Resource_lgfia"] +script = ExtResource("4_qtggh") +serialized_block = SubResource("Resource_1xs00") +path_child_pairs = [[NodePath("VBoxContainer/SnapPoint"), SubResource("Resource_dsoim")]] + +[sub_resource type="Resource" id="Resource_w0goe"] +script = ExtResource("6_ppdc3") +array = Array[ExtResource("4_qtggh")]([SubResource("Resource_lgfia")]) + +[sub_resource type="Resource" id="Resource_52r02"] +script = ExtResource("7_uuuue") +script_inherits = "Paddle" +block_trees = SubResource("Resource_w0goe") +generated_script = "extends Paddle + +var VAR_DICT := {} + +func _process(delta): + velocity = Input.get_vector(\"ui_left\", \"ui_right\", \"ui_up\", \"ui_down\")*Vector2(0, 1000) + move_and_slide() + +" + +[sub_resource type="Resource" id="Resource_ve47i"] +script = ExtResource("5_wr38c") +block_class = &"StatementBlock" +serialized_props = [["block_name", "statement_block"], ["label", "StatementBlock"], ["color", Color(0.290196, 0.52549, 0.835294, 1)], ["block_type", 2], ["position", Vector2(0, 0)], ["block_format", "Change player 1 score by {score: INT}"], ["statement", "get_tree().call_group(\"hud\", \"set_player_score\", \"right\", {score})"], ["param_input_strings", { +"score": "2" +}]] + +[sub_resource type="Resource" id="Resource_asygo"] +script = ExtResource("4_qtggh") +serialized_block = SubResource("Resource_ve47i") +path_child_pairs = [] + +[sub_resource type="Resource" id="Resource_xnfno"] +script = ExtResource("5_wr38c") +block_class = &"StatementBlock" +serialized_props = [["block_name", "statement_block"], ["label", "StatementBlock"], ["color", Color(0.290196, 0.52549, 0.835294, 1)], ["block_type", 2], ["position", Vector2(0, 0)], ["block_format", "Change player 2 score by {score: INT}"], ["statement", "get_tree().call_group(\"hud\", \"set_player_score\", \"left\", {score})"], ["param_input_strings", { +"score": "4" +}]] + +[sub_resource type="Resource" id="Resource_6ul1j"] +script = ExtResource("4_qtggh") +serialized_block = SubResource("Resource_xnfno") +path_child_pairs = [[NodePath("VBoxContainer/SnapPoint"), SubResource("Resource_asygo")]] + +[sub_resource type="Resource" id="Resource_6o8ws"] +script = ExtResource("5_wr38c") +block_class = &"EntryBlock" +serialized_props = [["block_name", "ready_block"], ["label", "EntryBlock"], ["color", Color(0.980392, 0.34902, 0.337255, 1)], ["block_type", 1], ["position", Vector2(54, 47)], ["block_format", "On Ready"], ["statement", "func _ready():"], ["param_input_strings", {}]] + +[sub_resource type="Resource" id="Resource_tceso"] +script = ExtResource("4_qtggh") +serialized_block = SubResource("Resource_6o8ws") +path_child_pairs = [[NodePath("VBoxContainer/SnapPoint"), SubResource("Resource_6ul1j")]] + +[sub_resource type="Resource" id="Resource_jvpy2"] +script = ExtResource("6_ppdc3") +array = Array[ExtResource("4_qtggh")]([SubResource("Resource_tceso")]) + +[sub_resource type="Resource" id="Resource_f070g"] +script = ExtResource("7_uuuue") +script_inherits = "Pong" +block_trees = SubResource("Resource_jvpy2") +generated_script = "extends Pong + +var VAR_DICT := {} + +func _ready(): + get_tree().call_group(\"hud\", \"set_player_score\", \"left\", 4) + get_tree().call_group(\"hud\", \"set_player_score\", \"right\", 2) + +" + +[node name="Pong" type="Node2D"] +script = ExtResource("1_bjkc8") + +[node name="Space" parent="." instance=ExtResource("1_y56ac")] + +[node name="PaddleLeft" parent="." instance=ExtResource("1_1k5k2")] +modulate = Color(0.511, 0.362, 0.972, 1) +position = Vector2(64, 576) + +[node name="BlockCode" type="Node" parent="PaddleLeft"] +script = ExtResource("3_6jaq8") +bsd = SubResource("Resource_t7nl4") + +[node name="PaddleRight" parent="." instance=ExtResource("1_1k5k2")] +modulate = Color(0.511, 0.362, 0.972, 1) +position = Vector2(1856, 576) + +[node name="BlockCode" type="Node" parent="PaddleRight"] +script = ExtResource("3_6jaq8") +bsd = SubResource("Resource_52r02") + +[node name="Ball" parent="." instance=ExtResource("9_xrqll")] +modulate = Color(0.511, 0.362, 0.972, 1) +position = Vector2(960, 576) +linear_velocity = Vector2(353.553, 353.553) + +[node name="HUD" parent="." instance=ExtResource("8_yg457")] + +[node name="BlockCode" type="Node" parent="."] +script = ExtResource("3_6jaq8") +bsd = SubResource("Resource_f070g") diff --git a/pong_game/score.ogg b/pong_game/score.ogg new file mode 100644 index 0000000000000000000000000000000000000000..66858bd7bfe3a25486714c8354e8aa168c625c16 GIT binary patch literal 11421 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 literal 0 HcmV?d00001 diff --git a/pong_game/space.png.import b/pong_game/space.png.import new file mode 100644 index 00000000..b348001d --- /dev/null +++ b/pong_game/space.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ceiq8wmlnnnif" +path="res://.godot/imported/space.png-c14c9aa7839fab1f6152227ec9686ae5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://pong_game/space.png" +dest_files=["res://.godot/imported/space.png-c14c9aa7839fab1f6152227ec9686ae5.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/pong_game/space.tscn b/pong_game/space.tscn new file mode 100644 index 00000000..0f7326f9 --- /dev/null +++ b/pong_game/space.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=5 format=3 uid="uid://cg8ibi18um3vg"] + +[ext_resource type="Texture2D" uid="uid://ceiq8wmlnnnif" path="res://pong_game/space.png" id="1_un3yo"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_q267f"] +size = Vector2(2688, 512) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_bqkwh"] +size = Vector2(64, 1080) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_lyev5"] +size = Vector2(256, 1080) + +[node name="Space" type="Node2D"] + +[node name="NinePatchRect" type="NinePatchRect" parent="."] +unique_name_in_owner = true +offset_right = 1920.0 +offset_bottom = 1080.0 +texture = ExtResource("1_un3yo") +patch_margin_left = 64 +patch_margin_top = 64 +patch_margin_right = 64 +patch_margin_bottom = 64 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 + +[node name="Walls" type="RigidBody2D" parent="."] +collision_layer = 4 +collision_mask = 3 +collision_priority = 10.0 +mass = 9999.0 +lock_rotation = true +freeze = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Walls"] +position = Vector2(960, -256) +shape = SubResource("RectangleShape2D_q267f") + +[node name="CollisionShape2D2" type="CollisionShape2D" parent="Walls"] +position = Vector2(960, 1336) +shape = SubResource("RectangleShape2D_q267f") + +[node name="PaddleBounds" type="RigidBody2D" parent="."] +collision_layer = 64 +collision_mask = 0 +mass = 9999.0 +lock_rotation = true +freeze = true + +[node name="CollisionShape2D3" type="CollisionShape2D" parent="PaddleBounds"] +position = Vector2(-32, 540) +shape = SubResource("RectangleShape2D_bqkwh") + +[node name="CollisionShape2D4" type="CollisionShape2D" parent="PaddleBounds"] +position = Vector2(1952, 540) +shape = SubResource("RectangleShape2D_bqkwh") + +[node name="CollisionShape2D5" type="CollisionShape2D" parent="PaddleBounds"] +position = Vector2(960, 540) +shape = SubResource("RectangleShape2D_lyev5") diff --git a/pong_game/wall_hit.ogg b/pong_game/wall_hit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..af3b1e33a5f5157bac30929f1a7d98ba23b85aa7 GIT binary patch literal 6946 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 literal 0 HcmV?d00001 diff --git a/pong_game/wall_hit.ogg.import b/pong_game/wall_hit.ogg.import new file mode 100644 index 00000000..e4a2b346 --- /dev/null +++ b/pong_game/wall_hit.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bc7jd3d8m5spt" +path="res://.godot/imported/wall_hit.ogg-9bf2dc2dc85cc008d84f97acca92da34.oggvorbisstr" + +[deps] + +source_file="res://pong_game/wall_hit.ogg" +dest_files=["res://.godot/imported/wall_hit.ogg-9bf2dc2dc85cc008d84f97acca92da34.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/project.godot b/project.godot index 9386eb3a..a34b7030 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="block-programming-plugin" -run/main_scene="res://test_game/test_game.tscn" +run/main_scene="res://pong_game/pong_game.tscn" config/features=PackedStringArray("4.2", "GL Compatibility") config/icon="res://icon.svg" @@ -19,6 +19,14 @@ config/icon="res://icon.svg" SignalManager="*res://addons/block_code/block_code_node/utilities/signal_manager.gd" +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 +window/size/window_width_override=960 +window/size/window_height_override=540 +window/stretch/mode="canvas_items" + [editor_plugins] enabled=PackedStringArray("res://addons/block_code/plugin.cfg", "res://addons/gut/plugin.cfg", "res://addons/plugin_refresher/plugin.cfg") @@ -46,6 +54,10 @@ player_2_right={ ] } +[physics] + +2d/default_gravity=0.0 + [rendering] renderer/rendering_method="gl_compatibility"