Initial commit
This commit is contained in:
parent
4aa6a5cabe
commit
d422f172a1
BIN
assets-raw/BBB_Simulator_Black.otf
Normal file
BIN
assets-raw/BBB_Simulator_Black.otf
Normal file
Binary file not shown.
BIN
assets-raw/Background.kra
Normal file
BIN
assets-raw/Background.kra
Normal file
Binary file not shown.
BIN
assets-raw/Ball.kra
Normal file
BIN
assets-raw/Ball.kra
Normal file
Binary file not shown.
BIN
assets-raw/Paddle.kra
Normal file
BIN
assets-raw/Paddle.kra
Normal file
Binary file not shown.
BIN
assets-raw/bounce_sfx-01.mmpz
Normal file
BIN
assets-raw/bounce_sfx-01.mmpz
Normal file
Binary file not shown.
BIN
assets-raw/icon.kra
Normal file
BIN
assets-raw/icon.kra
Normal file
Binary file not shown.
BIN
assets/Background.png
Normal file
BIN
assets/Background.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.7 KiB |
35
assets/Background.png.import
Normal file
35
assets/Background.png.import
Normal file
@ -0,0 +1,35 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/Background.png-6d72d35f07f42b3845e8764c552bb4fb.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/Background.png"
|
||||
dest_files=[ "res://.import/Background.png-6d72d35f07f42b3845e8764c552bb4fb.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
|
||||
process/normal_map_invert_y=false
|
||||
stream=false
|
||||
size_limit=0
|
||||
detect_3d=true
|
||||
svg/scale=1.0
|
BIN
assets/Ball.png
Normal file
BIN
assets/Ball.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 645 B |
35
assets/Ball.png.import
Normal file
35
assets/Ball.png.import
Normal file
@ -0,0 +1,35 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/Ball.png-6366ecb65c8c630ad766823a9365d76e.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/Ball.png"
|
||||
dest_files=[ "res://.import/Ball.png-6366ecb65c8c630ad766823a9365d76e.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=false
|
||||
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
|
||||
process/normal_map_invert_y=false
|
||||
stream=false
|
||||
size_limit=0
|
||||
detect_3d=true
|
||||
svg/scale=1.0
|
BIN
assets/Paddle.png
Normal file
BIN
assets/Paddle.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 730 B |
35
assets/Paddle.png.import
Normal file
35
assets/Paddle.png.import
Normal file
@ -0,0 +1,35 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/Paddle.png-f985def4d60ce45ea6f40458e74985d9.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/Paddle.png"
|
||||
dest_files=[ "res://.import/Paddle.png-f985def4d60ce45ea6f40458e74985d9.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=false
|
||||
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
|
||||
process/normal_map_invert_y=false
|
||||
stream=false
|
||||
size_limit=0
|
||||
detect_3d=true
|
||||
svg/scale=1.0
|
BIN
assets/bounce_sfx-01.ogg
Normal file
BIN
assets/bounce_sfx-01.ogg
Normal file
Binary file not shown.
15
assets/bounce_sfx-01.ogg.import
Normal file
15
assets/bounce_sfx-01.ogg.import
Normal file
@ -0,0 +1,15 @@
|
||||
[remap]
|
||||
|
||||
importer="ogg_vorbis"
|
||||
type="AudioStreamOGGVorbis"
|
||||
path="res://.import/bounce_sfx-01.ogg-e60e59e6d2560efad859e6240ffe51b1.oggstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/bounce_sfx-01.ogg"
|
||||
dest_files=[ "res://.import/bounce_sfx-01.ogg-e60e59e6d2560efad859e6240ffe51b1.oggstr" ]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
BIN
assets/bounce_sfx-02.ogg
Normal file
BIN
assets/bounce_sfx-02.ogg
Normal file
Binary file not shown.
15
assets/bounce_sfx-02.ogg.import
Normal file
15
assets/bounce_sfx-02.ogg.import
Normal file
@ -0,0 +1,15 @@
|
||||
[remap]
|
||||
|
||||
importer="ogg_vorbis"
|
||||
type="AudioStreamOGGVorbis"
|
||||
path="res://.import/bounce_sfx-02.ogg-eb36d4bdfa9c40de823f3eb2a2e506ac.oggstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/bounce_sfx-02.ogg"
|
||||
dest_files=[ "res://.import/bounce_sfx-02.ogg-eb36d4bdfa9c40de823f3eb2a2e506ac.oggstr" ]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
7
assets/pixelfont.tres
Normal file
7
assets/pixelfont.tres
Normal file
@ -0,0 +1,7 @@
|
||||
[gd_resource type="DynamicFont" load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://assets-raw/BBB_Simulator_Black.otf" type="DynamicFontData" id=1]
|
||||
|
||||
[resource]
|
||||
size = 24
|
||||
font_data = ExtResource( 1 )
|
6
assets/ui_theme.tres
Normal file
6
assets/ui_theme.tres
Normal file
@ -0,0 +1,6 @@
|
||||
[gd_resource type="Theme" load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://assets/pixelfont.tres" type="DynamicFont" id=1]
|
||||
|
||||
[resource]
|
||||
default_font = ExtResource( 1 )
|
7
default_env.tres
Normal file
7
default_env.tres
Normal file
@ -0,0 +1,7 @@
|
||||
[gd_resource type="Environment" load_steps=2 format=2]
|
||||
|
||||
[sub_resource type="ProceduralSky" id=1]
|
||||
|
||||
[resource]
|
||||
background_mode = 2
|
||||
background_sky = SubResource( 1 )
|
35
icon.png.import
Normal file
35
icon.png.import
Normal file
@ -0,0 +1,35 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://icon.png"
|
||||
dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.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
|
||||
process/normal_map_invert_y=false
|
||||
stream=false
|
||||
size_limit=0
|
||||
detect_3d=true
|
||||
svg/scale=1.0
|
93
project.godot
Normal file
93
project.godot
Normal file
@ -0,0 +1,93 @@
|
||||
; Engine configuration file.
|
||||
; It's best edited using the editor UI and not directly,
|
||||
; since the parameters that go here are not all obvious.
|
||||
;
|
||||
; Format:
|
||||
; [section] ; section goes between []
|
||||
; param=value ; assign values to parameters
|
||||
|
||||
config_version=4
|
||||
|
||||
_global_script_classes=[ {
|
||||
"base": "KinematicBody2D",
|
||||
"class": "Actor",
|
||||
"language": "GDScript",
|
||||
"path": "res://src/Actors/Actor.gd"
|
||||
} ]
|
||||
_global_script_class_icons={
|
||||
"Actor": ""
|
||||
}
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Pong"
|
||||
run/main_scene="res://src/Screens/MainMenu.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[autoload]
|
||||
|
||||
PlayerData="*res://src/AutoLoad/PlayerData.tscn"
|
||||
|
||||
[display]
|
||||
|
||||
window/size/width=1280
|
||||
window/size/height=720
|
||||
window/stretch/mode="2d"
|
||||
window/stretch/aspect="keep"
|
||||
|
||||
[editor_plugins]
|
||||
|
||||
enabled=PoolStringArray( )
|
||||
|
||||
[global]
|
||||
|
||||
window=false
|
||||
|
||||
[input]
|
||||
|
||||
P1_Up={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
|
||||
]
|
||||
}
|
||||
P1_Down={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
|
||||
]
|
||||
}
|
||||
P2_Up={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":1,"axis":1,"axis_value":-1.0,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
|
||||
]
|
||||
}
|
||||
P2_Down={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":1,"axis":1,"axis_value":1.0,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
|
||||
]
|
||||
}
|
||||
Pause={
|
||||
"deadzone": 0.5,
|
||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":11,"pressure":0.0,"pressed":false,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[layer_names]
|
||||
|
||||
2d_physics/layer_1="World"
|
||||
|
||||
[physics]
|
||||
|
||||
common/enable_pause_aware_picking=true
|
||||
|
||||
[rendering]
|
||||
|
||||
environment/default_environment="res://default_env.tres"
|
13
src/Actors/Actor.gd
Normal file
13
src/Actors/Actor.gd
Normal file
@ -0,0 +1,13 @@
|
||||
extends KinematicBody2D
|
||||
class_name Actor
|
||||
|
||||
export var speed: = Vector2(0, 0)
|
||||
|
||||
|
||||
var _velocity: = Vector2.ZERO
|
||||
var _direction: = Vector2.ZERO
|
||||
|
||||
func calculate_move_velocity(linear_velocity: Vector2, direction: Vector2, current_speed: Vector2) -> Vector2:
|
||||
var move_velocity: = linear_velocity
|
||||
move_velocity = current_speed * direction
|
||||
return move_velocity
|
30
src/Actors/Ball.gd
Normal file
30
src/Actors/Ball.gd
Normal file
@ -0,0 +1,30 @@
|
||||
extends Actor
|
||||
|
||||
export var top_speed: = 1000
|
||||
|
||||
func _ready() -> void:
|
||||
randomize()
|
||||
_direction.x = random_direction()
|
||||
_direction.y = randf() * random_direction()
|
||||
|
||||
func _physics_process(_delta: float) -> void:
|
||||
_velocity = calculate_move_velocity(_velocity, _direction, speed)
|
||||
_velocity = move_and_slide(_velocity)
|
||||
|
||||
func _on_BounceCheck_body_entered(body: PhysicsBody2D) -> void:
|
||||
bounce(body)
|
||||
|
||||
func bounce(object: PhysicsBody2D) -> void:
|
||||
if speed.x <= top_speed:
|
||||
speed.x *= 1.1
|
||||
if object is Actor:
|
||||
_direction.x = -_direction.x
|
||||
$"SFX/BounceSound-2".play()
|
||||
else:
|
||||
_direction.y *= -1
|
||||
$"SFX/BounceSound-1".play()
|
||||
|
||||
func random_direction() -> int:
|
||||
var directions:= [-1, 1]
|
||||
return directions[randi() % directions.size()]
|
||||
|
42
src/Actors/Ball.tscn
Normal file
42
src/Actors/Ball.tscn
Normal file
@ -0,0 +1,42 @@
|
||||
[gd_scene load_steps=7 format=2]
|
||||
|
||||
[ext_resource path="res://src/Actors/Ball.gd" type="Script" id=1]
|
||||
[ext_resource path="res://assets/Ball.png" type="Texture" id=2]
|
||||
[ext_resource path="res://assets/bounce_sfx-01.ogg" type="AudioStream" id=3]
|
||||
[ext_resource path="res://assets/bounce_sfx-02.ogg" type="AudioStream" id=4]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=2]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=1]
|
||||
extents = Vector2( 14.25, 15 )
|
||||
|
||||
[node name="Ball" type="KinematicBody2D"]
|
||||
script = ExtResource( 1 )
|
||||
speed = Vector2( 200, 100 )
|
||||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
shape = SubResource( 2 )
|
||||
disabled = true
|
||||
|
||||
[node name="BounceCheck" type="Area2D" parent="."]
|
||||
position = Vector2( -1, 0 )
|
||||
rotation = -3.14159
|
||||
scale = Vector2( 1.40155, 1.3282 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="BounceCheck"]
|
||||
modulate = Color( 0.815686, 0.854902, 0.113725, 1 )
|
||||
position = Vector2( -0.75, 0 )
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[node name="SFX" type="Node" parent="."]
|
||||
|
||||
[node name="BounceSound-1" type="AudioStreamPlayer" parent="SFX"]
|
||||
stream = ExtResource( 3 )
|
||||
|
||||
[node name="BounceSound-2" type="AudioStreamPlayer" parent="SFX"]
|
||||
stream = ExtResource( 4 )
|
||||
|
||||
[connection signal="body_entered" from="BounceCheck" to="." method="_on_BounceCheck_body_entered"]
|
15
src/Actors/Paddle.gd
Normal file
15
src/Actors/Paddle.gd
Normal file
@ -0,0 +1,15 @@
|
||||
extends Actor
|
||||
|
||||
export var Player: = 1
|
||||
|
||||
|
||||
func _physics_process(_delta: float) -> void:
|
||||
_direction = get_direction()
|
||||
_velocity = calculate_move_velocity(_velocity, _direction, speed)
|
||||
_velocity = move_and_slide(_velocity)
|
||||
|
||||
func get_direction() -> Vector2:
|
||||
return Vector2(
|
||||
0,
|
||||
Input.get_action_strength("P%s_Down" % Player) - Input.get_action_strength("P%s_Up" % Player)
|
||||
)
|
17
src/Actors/Paddle.tscn
Normal file
17
src/Actors/Paddle.tscn
Normal file
@ -0,0 +1,17 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://assets/Paddle.png" type="Texture" id=1]
|
||||
[ext_resource path="res://src/Actors/Paddle.gd" type="Script" id=2]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=1]
|
||||
extents = Vector2( 20, 80 )
|
||||
|
||||
[node name="Paddle" type="KinematicBody2D"]
|
||||
script = ExtResource( 2 )
|
||||
speed = Vector2( 0, 250 )
|
||||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
texture = ExtResource( 1 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
shape = SubResource( 1 )
|
21
src/AutoLoad/PlayerData.gd
Normal file
21
src/AutoLoad/PlayerData.gd
Normal file
@ -0,0 +1,21 @@
|
||||
extends Node
|
||||
|
||||
# TODO: Look into using an array or something to clean this up
|
||||
|
||||
signal p1_score_updated
|
||||
signal p2_score_updated
|
||||
|
||||
var p1_score: = 0 setget set_p1_score
|
||||
var p2_score: = 0 setget set_p2_score
|
||||
|
||||
func reset_scores() -> void:
|
||||
p1_score = 0
|
||||
p2_score = 0
|
||||
|
||||
func set_p1_score(value: int) -> void:
|
||||
p1_score = value
|
||||
emit_signal("p1_score_updated")
|
||||
|
||||
func set_p2_score(value: int) -> void:
|
||||
p2_score = value
|
||||
emit_signal("p2_score_updated")
|
6
src/AutoLoad/PlayerData.tscn
Normal file
6
src/AutoLoad/PlayerData.tscn
Normal file
@ -0,0 +1,6 @@
|
||||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://src/AutoLoad/PlayerData.gd" type="Script" id=1]
|
||||
|
||||
[node name="PlayerData" type="Node"]
|
||||
script = ExtResource( 1 )
|
22
src/Screens/Game.gd
Normal file
22
src/Screens/Game.gd
Normal file
@ -0,0 +1,22 @@
|
||||
extends Node
|
||||
|
||||
export var target_score: = 5
|
||||
|
||||
func _on_Left_area_entered(_area: Area2D) -> void:
|
||||
score_point(2)
|
||||
|
||||
func _on_Right_area_entered(_area: Area2D) -> void:
|
||||
score_point(1)
|
||||
|
||||
func score_point(player_scored: int) -> void:
|
||||
if player_scored == 1:
|
||||
PlayerData.p1_score += 1
|
||||
else:
|
||||
PlayerData.p2_score += 1
|
||||
get_tree().reload_current_scene()
|
||||
check_winner()
|
||||
|
||||
|
||||
func check_winner() -> void:
|
||||
if PlayerData.p1_score >= target_score or PlayerData.p2_score >= target_score:
|
||||
get_tree().change_scene("res://src/Screens/ResultsScreen.tscn")
|
86
src/Screens/Game.tscn
Normal file
86
src/Screens/Game.tscn
Normal file
@ -0,0 +1,86 @@
|
||||
[gd_scene load_steps=9 format=2]
|
||||
|
||||
[ext_resource path="res://src/Actors/Paddle.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://assets/Background.png" type="Texture" id=2]
|
||||
[ext_resource path="res://src/UI/GameHUD.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://src/Screens/Game.gd" type="Script" id=4]
|
||||
[ext_resource path="res://src/Actors/Ball.tscn" type="PackedScene" id=5]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=1]
|
||||
extents = Vector2( 640, 0.5 )
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=2]
|
||||
extents = Vector2( 4, 358.5 )
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=3]
|
||||
extents = Vector2( 4, 358.5 )
|
||||
|
||||
[node name="Game" type="Node2D"]
|
||||
script = ExtResource( 4 )
|
||||
|
||||
[node name="BackgroundLayer" type="CanvasLayer" parent="."]
|
||||
layer = -101
|
||||
|
||||
[node name="Background" type="TextureRect" parent="BackgroundLayer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="UserInterface" type="CanvasLayer" parent="."]
|
||||
layer = 100
|
||||
|
||||
[node name="GameHUD" parent="UserInterface" instance=ExtResource( 3 )]
|
||||
|
||||
[node name="Bounds" type="Node" parent="."]
|
||||
__meta__ = {
|
||||
"_editor_description_": "The bounds of the game map"
|
||||
}
|
||||
|
||||
[node name="Top" type="StaticBody2D" parent="Bounds"]
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Bounds/Top"]
|
||||
position = Vector2( 640, -0.5 )
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[node name="Bottom" type="StaticBody2D" parent="Bounds"]
|
||||
position = Vector2( 0, 720 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Bounds/Bottom"]
|
||||
position = Vector2( 640, -0.5 )
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[node name="Left" type="Area2D" parent="Bounds"]
|
||||
monitorable = false
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Bounds/Left"]
|
||||
position = Vector2( -4, 359.5 )
|
||||
shape = SubResource( 2 )
|
||||
|
||||
[node name="Right" type="Area2D" parent="Bounds"]
|
||||
monitorable = false
|
||||
|
||||
[node name="CollisionShape2D2" type="CollisionShape2D" parent="Bounds/Right"]
|
||||
position = Vector2( 1284, 359.5 )
|
||||
shape = SubResource( 3 )
|
||||
|
||||
[node name="Actors" type="Node" parent="."]
|
||||
__meta__ = {
|
||||
"_editor_description_": "All actors in the game"
|
||||
}
|
||||
|
||||
[node name="Player1" parent="Actors" instance=ExtResource( 1 )]
|
||||
pause_mode = 2
|
||||
modulate = Color( 0.0862745, 0.54902, 0.254902, 1 )
|
||||
position = Vector2( 64, 376 )
|
||||
|
||||
[node name="Player2" parent="Actors" instance=ExtResource( 1 )]
|
||||
modulate = Color( 0.560784, 0.00392157, 0.658824, 1 )
|
||||
position = Vector2( 1216, 376 )
|
||||
Player = 2
|
||||
|
||||
[node name="Ball" parent="Actors" instance=ExtResource( 5 )]
|
||||
modulate = Color( 1, 0.913725, 0, 1 )
|
||||
position = Vector2( 640, 376 )
|
||||
|
||||
[connection signal="area_entered" from="Bounds/Left" to="." method="_on_Left_area_entered"]
|
||||
[connection signal="area_entered" from="Bounds/Right" to="." method="_on_Right_area_entered"]
|
62
src/Screens/MainMenu.tscn
Normal file
62
src/Screens/MainMenu.tscn
Normal file
@ -0,0 +1,62 @@
|
||||
[gd_scene load_steps=9 format=2]
|
||||
|
||||
[ext_resource path="res://assets-raw/BBB_Simulator_Black.otf" type="DynamicFontData" id=1]
|
||||
[ext_resource path="res://assets/Background.png" type="Texture" id=2]
|
||||
[ext_resource path="res://assets/ui_theme.tres" type="Theme" id=3]
|
||||
[ext_resource path="res://src/UI/QuitButton.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://src/UI/ChangeScene.tscn" type="PackedScene" id=5]
|
||||
[ext_resource path="res://src/UI/Title.tscn" type="PackedScene" id=6]
|
||||
|
||||
[sub_resource type="DynamicFont" id=1]
|
||||
font_data = ExtResource( 1 )
|
||||
|
||||
[sub_resource type="Theme" id=2]
|
||||
default_font = SubResource( 1 )
|
||||
|
||||
[node name="MainMenu" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
theme = ExtResource( 3 )
|
||||
|
||||
[node name="Background" type="TextureRect" parent="."]
|
||||
modulate = Color( 0, 0, 0, 1 )
|
||||
margin_right = 40.0
|
||||
margin_bottom = 40.0
|
||||
theme = SubResource( 2 )
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="Title" parent="." instance=ExtResource( 6 )]
|
||||
pause_mode = 2
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -150.5
|
||||
margin_top = -215.5
|
||||
margin_right = 150.5
|
||||
margin_bottom = -148.5
|
||||
text = "Pong"
|
||||
|
||||
[node name="MenuButtons" type="VBoxContainer" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -84.0
|
||||
margin_top = -36.0
|
||||
margin_right = 87.0
|
||||
margin_bottom = 63.0
|
||||
alignment = 1
|
||||
|
||||
[node name="PlayButton" parent="MenuButtons" instance=ExtResource( 5 )]
|
||||
margin_right = 171.0
|
||||
margin_bottom = 47.0
|
||||
size_flags_vertical = 3
|
||||
text = "Play"
|
||||
next_scene_path = "res://src/Screens/Game.tscn"
|
||||
|
||||
[node name="QuitButton" parent="MenuButtons" instance=ExtResource( 4 )]
|
||||
margin_top = 51.0
|
||||
margin_right = 171.0
|
||||
margin_bottom = 99.0
|
||||
size_flags_vertical = 3
|
8
src/Screens/ResultsScreen.gd
Normal file
8
src/Screens/ResultsScreen.gd
Normal file
@ -0,0 +1,8 @@
|
||||
extends Control
|
||||
|
||||
onready var results_title: Label = $Title
|
||||
|
||||
func _ready() -> void:
|
||||
var winner: = 1 if PlayerData.p1_score > PlayerData.p2_score else 2
|
||||
results_title.text = "Player %s Wins!" % winner
|
||||
PlayerData.reset_scores()
|
68
src/Screens/ResultsScreen.tscn
Normal file
68
src/Screens/ResultsScreen.tscn
Normal file
@ -0,0 +1,68 @@
|
||||
[gd_scene load_steps=10 format=2]
|
||||
|
||||
[ext_resource path="res://assets-raw/BBB_Simulator_Black.otf" type="DynamicFontData" id=1]
|
||||
[ext_resource path="res://assets/Background.png" type="Texture" id=2]
|
||||
[ext_resource path="res://assets/ui_theme.tres" type="Theme" id=3]
|
||||
[ext_resource path="res://src/UI/QuitButton.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://src/UI/ChangeScene.tscn" type="PackedScene" id=5]
|
||||
[ext_resource path="res://src/UI/Title.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://src/Screens/ResultsScreen.gd" type="Script" id=7]
|
||||
|
||||
[sub_resource type="DynamicFont" id=1]
|
||||
font_data = ExtResource( 1 )
|
||||
|
||||
[sub_resource type="Theme" id=2]
|
||||
default_font = SubResource( 1 )
|
||||
|
||||
[node name="ResultsScreen" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
theme = ExtResource( 3 )
|
||||
script = ExtResource( 7 )
|
||||
|
||||
[node name="Background" type="TextureRect" parent="."]
|
||||
modulate = Color( 0, 0, 0, 1 )
|
||||
margin_right = 40.0
|
||||
margin_bottom = 40.0
|
||||
theme = SubResource( 2 )
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="Title" parent="." instance=ExtResource( 6 )]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -169.0
|
||||
margin_top = -168.0
|
||||
margin_right = 169.0
|
||||
margin_bottom = -101.0
|
||||
text = "Player %s Wins!"
|
||||
|
||||
[node name="MenuButtons" type="VBoxContainer" parent="."]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -84.0
|
||||
margin_top = -36.0
|
||||
margin_right = 87.0
|
||||
margin_bottom = 63.0
|
||||
alignment = 1
|
||||
|
||||
[node name="Restart" parent="MenuButtons" instance=ExtResource( 5 )]
|
||||
margin_right = 171.0
|
||||
margin_bottom = 40.0
|
||||
text = "Restart"
|
||||
next_scene_path = "res://src/Screens/Game.tscn"
|
||||
|
||||
[node name="MainMenuButton" parent="MenuButtons" instance=ExtResource( 5 )]
|
||||
margin_top = 44.0
|
||||
margin_right = 171.0
|
||||
margin_bottom = 84.0
|
||||
text = "Main Menu"
|
||||
next_scene_path = "res://src/Screens/MainMenu.tscn"
|
||||
|
||||
[node name="QuitButton" parent="MenuButtons" instance=ExtResource( 4 )]
|
||||
margin_top = 88.0
|
||||
margin_right = 171.0
|
||||
margin_bottom = 128.0
|
11
src/UI/ChangeScene.gd
Normal file
11
src/UI/ChangeScene.gd
Normal file
@ -0,0 +1,11 @@
|
||||
tool
|
||||
extends Button
|
||||
|
||||
export(String, FILE) var next_scene_path: = ""
|
||||
|
||||
func _on_ChangeSceneButton_button_up() -> void:
|
||||
get_tree().paused = false
|
||||
get_tree().change_scene(next_scene_path)
|
||||
|
||||
func _on_configuration_warning() -> String:
|
||||
return "Next Level property can't be empty" if next_scene_path == "" else ""
|
13
src/UI/ChangeScene.tscn
Normal file
13
src/UI/ChangeScene.tscn
Normal file
@ -0,0 +1,13 @@
|
||||
[gd_scene load_steps=3 format=2]
|
||||
|
||||
[ext_resource path="res://assets/ui_theme.tres" type="Theme" id=1]
|
||||
[ext_resource path="res://src/UI/ChangeScene.gd" type="Script" id=2]
|
||||
|
||||
[node name="ChangeSceneButton" type="Button"]
|
||||
margin_right = 12.0
|
||||
margin_bottom = 20.0
|
||||
theme = ExtResource( 1 )
|
||||
text = "CHANGE_SCENE"
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[connection signal="button_up" from="." to="." method="_on_ChangeSceneButton_button_up"]
|
30
src/UI/GameHUD.gd
Normal file
30
src/UI/GameHUD.gd
Normal file
@ -0,0 +1,30 @@
|
||||
extends Control
|
||||
|
||||
onready var scene_tree = get_tree()
|
||||
onready var p1_score: Label = $P1Score
|
||||
onready var p2_score: Label = $P2Score
|
||||
onready var pause_overlay: ColorRect = $PauseOverlay
|
||||
|
||||
var paused: = false setget set_paused
|
||||
|
||||
func _ready() -> void:
|
||||
PlayerData.connect("p1_score_updated", self, "update_interface")
|
||||
PlayerData.connect("p2_score_updated", self, "update_interface")
|
||||
update_interface()
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if event.is_action_pressed("Pause"):
|
||||
self.paused = not paused
|
||||
# Prevents other nodes handling the "pause" event
|
||||
scene_tree.set_input_as_handled()
|
||||
|
||||
|
||||
func update_interface() -> void:
|
||||
p1_score.text = "%s" % PlayerData.p1_score
|
||||
p2_score.text = "%s" % PlayerData.p2_score
|
||||
|
||||
|
||||
func set_paused(value: bool) -> void:
|
||||
paused = value
|
||||
scene_tree.paused = value
|
||||
pause_overlay.visible = value
|
75
src/UI/GameHUD.tscn
Normal file
75
src/UI/GameHUD.tscn
Normal file
@ -0,0 +1,75 @@
|
||||
[gd_scene load_steps=7 format=2]
|
||||
|
||||
[ext_resource path="res://src/UI/GameHUD.gd" type="Script" id=4]
|
||||
[ext_resource path="res://src/UI/QuitButton.tscn" type="PackedScene" id=5]
|
||||
[ext_resource path="res://src/UI/Title.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://src/UI/ChangeScene.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://assets-raw/BBB_Simulator_Black.otf" type="DynamicFontData" id=8]
|
||||
|
||||
[sub_resource type="DynamicFont" id=1]
|
||||
size = 48
|
||||
font_data = ExtResource( 8 )
|
||||
|
||||
[node name="GameHUD" type="Control"]
|
||||
pause_mode = 2
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
script = ExtResource( 4 )
|
||||
__meta__ = {
|
||||
"_edit_vertical_guides_": [ 640.0 ]
|
||||
}
|
||||
|
||||
[node name="P1Score" parent="." instance=ExtResource( 6 )]
|
||||
margin_left = 576.0
|
||||
margin_right = 632.0
|
||||
margin_bottom = 67.0
|
||||
text = "%s"
|
||||
|
||||
[node name="P2Score" parent="." instance=ExtResource( 6 )]
|
||||
margin_left = 648.0
|
||||
margin_right = 704.0
|
||||
margin_bottom = 67.0
|
||||
text = "%s"
|
||||
|
||||
[node name="PauseOverlay" type="ColorRect" parent="."]
|
||||
visible = false
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
color = Color( 0, 0, 0, 0.235294 )
|
||||
|
||||
[node name="Title" parent="PauseOverlay" instance=ExtResource( 6 )]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -150.5
|
||||
margin_top = -215.5
|
||||
margin_right = 150.5
|
||||
margin_bottom = -148.5
|
||||
custom_fonts/font = SubResource( 1 )
|
||||
text = "Paused"
|
||||
|
||||
[node name="MenuButtons" type="VBoxContainer" parent="PauseOverlay"]
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
margin_left = -84.0
|
||||
margin_top = -36.0
|
||||
margin_right = 87.0
|
||||
margin_bottom = 63.0
|
||||
alignment = 1
|
||||
|
||||
[node name="MainMenuButton" parent="PauseOverlay/MenuButtons" instance=ExtResource( 7 )]
|
||||
margin_top = 7.0
|
||||
margin_right = 171.0
|
||||
margin_bottom = 47.0
|
||||
text = "Main Menu"
|
||||
next_scene_path = "res://src/Screens/MainMenu.tscn"
|
||||
|
||||
[node name="QuitButton" parent="PauseOverlay/MenuButtons" instance=ExtResource( 5 )]
|
||||
margin_top = 51.0
|
||||
margin_right = 171.0
|
||||
margin_bottom = 91.0
|
4
src/UI/QuitButton.gd
Normal file
4
src/UI/QuitButton.gd
Normal file
@ -0,0 +1,4 @@
|
||||
extends Button
|
||||
|
||||
func _on_QuitButton_button_up() -> void:
|
||||
get_tree().quit()
|
13
src/UI/QuitButton.tscn
Normal file
13
src/UI/QuitButton.tscn
Normal file
@ -0,0 +1,13 @@
|
||||
[gd_scene load_steps=3 format=2]
|
||||
|
||||
[ext_resource path="res://assets/ui_theme.tres" type="Theme" id=1]
|
||||
[ext_resource path="res://src/UI/QuitButton.gd" type="Script" id=2]
|
||||
|
||||
[node name="QuitButton" type="Button"]
|
||||
margin_right = 12.0
|
||||
margin_bottom = 20.0
|
||||
theme = ExtResource( 1 )
|
||||
text = "Quit"
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[connection signal="button_up" from="." to="." method="_on_QuitButton_button_up"]
|
16
src/UI/Title.tscn
Normal file
16
src/UI/Title.tscn
Normal file
@ -0,0 +1,16 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://assets-raw/BBB_Simulator_Black.otf" type="DynamicFontData" id=1]
|
||||
[ext_resource path="res://assets/ui_theme.tres" type="Theme" id=2]
|
||||
|
||||
[sub_resource type="DynamicFont" id=1]
|
||||
size = 48
|
||||
font_data = ExtResource( 1 )
|
||||
|
||||
[node name="Title" type="Label"]
|
||||
margin_right = 40.0
|
||||
margin_bottom = 14.0
|
||||
theme = ExtResource( 2 )
|
||||
custom_fonts/font = SubResource( 1 )
|
||||
text = "TITLE_TEXT"
|
||||
align = 1
|
Loading…
Reference in New Issue
Block a user