mirror of
https://github.com/JohnBreaux/Boat-Battle.git
synced 2024-11-15 05:25:57 +00:00
Major restructuring to better support object-oriented design of the main game logic and UI. This was necessary, I swear.
This commit is contained in:
parent
b0995cbd0d
commit
1cb400361d
@ -16,8 +16,8 @@ config/icon="res://icon.png"
|
|||||||
|
|
||||||
[autoload]
|
[autoload]
|
||||||
|
|
||||||
MessageBus="*res://script/game/Message Bus.gd"
|
MessageBus="*res://script/Message Bus.gd"
|
||||||
AudioBus="*res://script/game/Audio Bus.gd"
|
AudioBus="*res://script/audio controller/Audio Bus.gd"
|
||||||
OptionsController="*res://script/options/OptionsController.gd"
|
OptionsController="*res://script/options/OptionsController.gd"
|
||||||
AudioController="*res://scenes/AudioController.tscn"
|
AudioController="*res://scenes/AudioController.tscn"
|
||||||
|
|
||||||
|
47
godot_ship/scenes/Game/Fire.tscn
Normal file
47
godot_ship/scenes/Game/Fire.tscn
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
[gd_scene load_steps=5 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/game/RedCrosshair.png" type="Texture" id=1]
|
||||||
|
[ext_resource path="res://script/game/Gameplay/Fire.gd" type="Script" id=2]
|
||||||
|
[ext_resource path="res://script/game/Gameplay/Crosshair.gd" type="Script" id=3]
|
||||||
|
[ext_resource path="res://assets/game/board_blue.png" type="Texture" id=4]
|
||||||
|
|
||||||
|
[node name="Fire" type="Control"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
rect_pivot_offset = Vector2( 147.423, 85.3825 )
|
||||||
|
mouse_filter = 2
|
||||||
|
script = ExtResource( 2 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="board_blue" type="Sprite" parent="."]
|
||||||
|
position = Vector2( 18, 18 )
|
||||||
|
texture = ExtResource( 4 )
|
||||||
|
centered = false
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_lock_": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Crosshair" type="Sprite" parent="."]
|
||||||
|
texture = ExtResource( 1 )
|
||||||
|
script = ExtResource( 3 )
|
||||||
|
|
||||||
|
[node name="Fire" type="Button" parent="."]
|
||||||
|
margin_left = 443.545
|
||||||
|
margin_top = 264.473
|
||||||
|
margin_right = 528.545
|
||||||
|
margin_bottom = 318.473
|
||||||
|
text = "FIRE"
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="FireDialog" type="AcceptDialog" parent="."]
|
||||||
|
pause_mode = 2
|
||||||
|
margin_right = 83.0
|
||||||
|
margin_bottom = 58.0
|
||||||
|
dialog_text = "You can't fire outside the board"
|
||||||
|
|
||||||
|
[connection signal="pressed" from="Fire" to="." method="_on_Fire_pressed"]
|
||||||
|
[connection signal="confirmed" from="FireDialog" to="." method="_on_FireDialog_confirmed"]
|
42
godot_ship/scenes/Game/Game.tscn
Normal file
42
godot_ship/scenes/Game/Game.tscn
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://script/title screen/Title-Screen-Background.png" type="Texture" id=1]
|
||||||
|
[ext_resource path="res://script/game/Gameplay/Game.gd" type="Script" id=3]
|
||||||
|
|
||||||
|
[node name="Game" type="Control"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
mouse_filter = 2
|
||||||
|
script = ExtResource( 3 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Background" type="Sprite" parent="."]
|
||||||
|
show_behind_parent = true
|
||||||
|
position = Vector2( 321.081, 179.931 )
|
||||||
|
texture = ExtResource( 1 )
|
||||||
|
flip_h = true
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_lock_": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Buttons" type="VBoxContainer" parent="."]
|
||||||
|
anchor_left = 0.912
|
||||||
|
anchor_top = 0.932
|
||||||
|
anchor_right = 0.912
|
||||||
|
anchor_bottom = 0.932
|
||||||
|
margin_left = -3.68005
|
||||||
|
margin_top = -4.52002
|
||||||
|
margin_right = 49.3199
|
||||||
|
margin_bottom = 15.48
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Forfeit" type="Button" parent="Buttons"]
|
||||||
|
margin_right = 53.0
|
||||||
|
margin_bottom = 20.0
|
||||||
|
text = "Forfeit"
|
||||||
|
|
||||||
|
[connection signal="pressed" from="Buttons/Forfeit" to="." method="_on_Forfeit_pressed"]
|
@ -1,17 +1,14 @@
|
|||||||
[gd_scene load_steps=11 format=2]
|
[gd_scene load_steps=8 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://assets/game/board_blue.png" type="Texture" id=1]
|
[ext_resource path="res://assets/game/board_blue.png" type="Texture" id=1]
|
||||||
[ext_resource path="res://script/title screen/Title-Screen-Background.png" type="Texture" id=2]
|
[ext_resource path="res://scenes/ships/3ShipB.tscn" type="PackedScene" id=4]
|
||||||
[ext_resource path="res://script/game/Gameplay.gd" type="Script" id=3]
|
[ext_resource path="res://scenes/ships/3shipA.tscn" type="PackedScene" id=5]
|
||||||
[ext_resource path="res://scenes/ships/2Ship.tscn" type="PackedScene" id=4]
|
[ext_resource path="res://scenes/ships/4Ship.tscn" type="PackedScene" id=6]
|
||||||
[ext_resource path="res://scenes/ships/5Ship.tscn" type="PackedScene" id=5]
|
[ext_resource path="res://scenes/ships/5Ship.tscn" type="PackedScene" id=7]
|
||||||
[ext_resource path="res://scenes/ships/3ShipB.tscn" type="PackedScene" id=6]
|
[ext_resource path="res://scenes/ships/2Ship.tscn" type="PackedScene" id=8]
|
||||||
[ext_resource path="res://scenes/ships/3shipA.tscn" type="PackedScene" id=7]
|
[ext_resource path="res://script/game/Setup.gd" type="Script" id=10]
|
||||||
[ext_resource path="res://scenes/ships/4Ship.tscn" type="PackedScene" id=8]
|
|
||||||
[ext_resource path="res://assets/game/RedCrosshair.png" type="Texture" id=9]
|
|
||||||
[ext_resource path="res://script/game/Gameplay/Crosshair.gd" type="Script" id=10]
|
|
||||||
|
|
||||||
[node name="Game" type="Control"]
|
[node name="Setup" type="Control"]
|
||||||
anchor_top = 0.00123732
|
anchor_top = 0.00123732
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 0.890237
|
anchor_bottom = 0.890237
|
||||||
@ -19,7 +16,8 @@ margin_left = -0.5
|
|||||||
margin_top = 0.740086
|
margin_top = 0.740086
|
||||||
margin_right = -0.5
|
margin_right = -0.5
|
||||||
margin_bottom = 40.7
|
margin_bottom = 40.7
|
||||||
script = ExtResource( 3 )
|
mouse_filter = 2
|
||||||
|
script = ExtResource( 10 )
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
@ -32,38 +30,6 @@ __meta__ = {
|
|||||||
"_edit_lock_": true
|
"_edit_lock_": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="Title-Screen-Background" type="Sprite" parent="."]
|
|
||||||
show_behind_parent = true
|
|
||||||
position = Vector2( 321.081, 179.931 )
|
|
||||||
texture = ExtResource( 2 )
|
|
||||||
flip_h = true
|
|
||||||
__meta__ = {
|
|
||||||
"_edit_lock_": true
|
|
||||||
}
|
|
||||||
|
|
||||||
[node name="Crosshair" type="Sprite" parent="."]
|
|
||||||
visible = false
|
|
||||||
texture = ExtResource( 9 )
|
|
||||||
script = ExtResource( 10 )
|
|
||||||
|
|
||||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
|
||||||
anchor_left = 0.912
|
|
||||||
anchor_top = 0.932
|
|
||||||
anchor_right = 0.912
|
|
||||||
anchor_bottom = 0.932
|
|
||||||
margin_left = -3.68005
|
|
||||||
margin_top = -4.52002
|
|
||||||
margin_right = 49.3199
|
|
||||||
margin_bottom = 15.48
|
|
||||||
__meta__ = {
|
|
||||||
"_edit_use_anchors_": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[node name="Forfeit" type="Button" parent="VBoxContainer"]
|
|
||||||
margin_right = 53.0
|
|
||||||
margin_bottom = 20.0
|
|
||||||
text = "Forfeit"
|
|
||||||
|
|
||||||
[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."]
|
[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."]
|
||||||
margin_left = 199.156
|
margin_left = 199.156
|
||||||
margin_top = 155.6
|
margin_top = 155.6
|
||||||
@ -75,32 +41,32 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="2Ship" parent="." instance=ExtResource( 4 )]
|
[node name="2Ship" parent="." instance=ExtResource( 8 )]
|
||||||
position = Vector2( 529.802, 70.7151 )
|
position = Vector2( 490.802, 90.7151 )
|
||||||
collision_layer = 3
|
collision_layer = 3
|
||||||
contacts_reported = 1
|
contacts_reported = 1
|
||||||
contact_monitor = true
|
contact_monitor = true
|
||||||
|
|
||||||
[node name="3ShipA" parent="." instance=ExtResource( 7 )]
|
[node name="3ShipA" parent="." instance=ExtResource( 5 )]
|
||||||
position = Vector2( 434.236, 114.21 )
|
position = Vector2( 429.236, 124.21 )
|
||||||
collision_layer = 3
|
collision_layer = 3
|
||||||
contacts_reported = 1
|
contacts_reported = 1
|
||||||
contact_monitor = true
|
contact_monitor = true
|
||||||
|
|
||||||
[node name="3ShipB" parent="." instance=ExtResource( 6 )]
|
[node name="3ShipB" parent="." instance=ExtResource( 4 )]
|
||||||
position = Vector2( 443.216, 266.865 )
|
position = Vector2( 427.216, 248.865 )
|
||||||
collision_layer = 3
|
collision_layer = 3
|
||||||
contacts_reported = 1
|
contacts_reported = 1
|
||||||
contact_monitor = true
|
contact_monitor = true
|
||||||
|
|
||||||
[node name="4Ship" parent="." instance=ExtResource( 8 )]
|
[node name="4Ship" parent="." instance=ExtResource( 6 )]
|
||||||
position = Vector2( 522.911, 218.599 )
|
position = Vector2( 491.911, 217.599 )
|
||||||
collision_layer = 3
|
collision_layer = 3
|
||||||
contacts_reported = 1
|
contacts_reported = 1
|
||||||
contact_monitor = true
|
contact_monitor = true
|
||||||
|
|
||||||
[node name="5Ship" parent="." instance=ExtResource( 5 )]
|
[node name="5Ship" parent="." instance=ExtResource( 7 )]
|
||||||
position = Vector2( 607.096, 211.864 )
|
position = Vector2( 557.096, 213.864 )
|
||||||
collision_layer = 3
|
collision_layer = 3
|
||||||
contacts_reported = 1
|
contacts_reported = 1
|
||||||
contact_monitor = true
|
contact_monitor = true
|
||||||
@ -125,17 +91,6 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="Fire" type="Button" parent="."]
|
|
||||||
visible = false
|
|
||||||
margin_left = 443.545
|
|
||||||
margin_top = 264.473
|
|
||||||
margin_right = 528.545
|
|
||||||
margin_bottom = 318.473
|
|
||||||
text = "FIRE"
|
|
||||||
__meta__ = {
|
|
||||||
"_edit_use_anchors_": false
|
|
||||||
}
|
|
||||||
|
|
||||||
[node name="PlaceShipDialog" type="AcceptDialog" parent="."]
|
[node name="PlaceShipDialog" type="AcceptDialog" parent="."]
|
||||||
anchor_left = 0.5
|
anchor_left = 0.5
|
||||||
anchor_top = 0.5
|
anchor_top = 0.5
|
||||||
@ -150,15 +105,6 @@ __meta__ = {
|
|||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="FireDialog" type="AcceptDialog" parent="."]
|
|
||||||
pause_mode = 2
|
|
||||||
margin_right = 83.0
|
|
||||||
margin_bottom = 58.0
|
|
||||||
dialog_text = "You can't fire outside the board"
|
|
||||||
|
|
||||||
[connection signal="pressed" from="VBoxContainer/Forfeit" to="." method="_on_Forfeit_pressed"]
|
|
||||||
[connection signal="about_to_show" from="ConfirmationDialog" to="." method="_on_ConfirmationDialog_about_to_show"]
|
[connection signal="about_to_show" from="ConfirmationDialog" to="." method="_on_ConfirmationDialog_about_to_show"]
|
||||||
[connection signal="pressed" from="Confirm Placement" to="." method="_on_Confirm_Placement_pressed"]
|
[connection signal="pressed" from="Confirm Placement" to="." method="_on_Confirm_Placement_pressed"]
|
||||||
[connection signal="pressed" from="Clear" to="." method="_on_Clear_pressed"]
|
[connection signal="pressed" from="Clear" to="." method="_on_Clear_pressed"]
|
||||||
[connection signal="pressed" from="Fire" to="." method="_on_Fire_pressed"]
|
|
||||||
[connection signal="confirmed" from="FireDialog" to="." method="_on_FireDialog_confirmed"]
|
|
@ -1,11 +1,11 @@
|
|||||||
[gd_scene load_steps=2 format=2]
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://script/game/Main.gd" type="Script" id=5]
|
[ext_resource path="res://script/Main.gd" type="Script" id=5]
|
||||||
|
|
||||||
[node name="Main" type="Control"]
|
[node name="Main" type="Control"]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
mouse_filter = 1
|
mouse_filter = 2
|
||||||
script = ExtResource( 5 )
|
script = ExtResource( 5 )
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
[gd_scene format=2]
|
|
||||||
|
|
||||||
[node name="Control" type="Control"]
|
|
||||||
__meta__ = {
|
|
||||||
"_edit_use_anchors_": false
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://script/game/moveShip.gd" type="Script" id=1]
|
[ext_resource path="res://script/game/SetupShip.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/game/2Ship.png" type="Texture" id=2]
|
[ext_resource path="res://assets/game/2Ship.png" type="Texture" id=2]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=1]
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://script/game/moveShip.gd" type="Script" id=1]
|
[ext_resource path="res://script/game/SetupShip.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/game/3ShipB.png" type="Texture" id=2]
|
[ext_resource path="res://assets/game/3ShipB.png" type="Texture" id=2]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=1]
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
@ -16,7 +16,7 @@ script = ExtResource( 1 )
|
|||||||
texture = ExtResource( 2 )
|
texture = ExtResource( 2 )
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||||
scale = Vector2( 0.9, 0.966 )
|
scale = Vector2( 0.5, 0.833 )
|
||||||
shape = SubResource( 1 )
|
shape = SubResource( 1 )
|
||||||
|
|
||||||
[node name="Area2D" type="Area2D" parent="."]
|
[node name="Area2D" type="Area2D" parent="."]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://script/game/moveShip.gd" type="Script" id=1]
|
[ext_resource path="res://script/game/SetupShip.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/game/3ShipA.png" type="Texture" id=2]
|
[ext_resource path="res://assets/game/3ShipA.png" type="Texture" id=2]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=1]
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://script/game/moveShip.gd" type="Script" id=1]
|
[ext_resource path="res://script/game/SetupShip.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/game/4Ship.png" type="Texture" id=2]
|
[ext_resource path="res://assets/game/4Ship.png" type="Texture" id=2]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=1]
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://script/game/moveShip.gd" type="Script" id=1]
|
[ext_resource path="res://script/game/SetupShip.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/game/5Ship.png" type="Texture" id=2]
|
[ext_resource path="res://assets/game/5Ship.png" type="Texture" id=2]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=1]
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
|
@ -2,7 +2,7 @@ extends Control
|
|||||||
|
|
||||||
# Scenes
|
# Scenes
|
||||||
onready var title_screen = preload("res://scenes/Title Screen.tscn")
|
onready var title_screen = preload("res://scenes/Title Screen.tscn")
|
||||||
onready var gameplay = preload("res://scenes/Gameplay.tscn" )
|
onready var game = preload("res://scenes/Game/Game.tscn" )
|
||||||
onready var options = preload("res://scenes/Options.tscn" )
|
onready var options = preload("res://scenes/Options.tscn" )
|
||||||
onready var debug_menu = preload("res://scenes/Debug Menu.tscn" )
|
onready var debug_menu = preload("res://scenes/Debug Menu.tscn" )
|
||||||
|
|
||||||
@ -48,10 +48,12 @@ func _on_scene_start(scene):
|
|||||||
#print ("_on_scene_start(",scene,")")
|
#print ("_on_scene_start(",scene,")")
|
||||||
match scene:
|
match scene:
|
||||||
"Singleplayer":
|
"Singleplayer":
|
||||||
add_child (gameplay.instance())
|
add_child (game.instance())
|
||||||
return true
|
return true
|
||||||
"Multiplayer":
|
"Multiplayer":
|
||||||
add_child (gameplay.instance())
|
game = game.instance()
|
||||||
|
game.is_multiplayer = true
|
||||||
|
add_child (game)
|
||||||
# add_child (multiplayercontroller.instance())
|
# add_child (multiplayercontroller.instance())
|
||||||
return true
|
return true
|
||||||
"Options":
|
"Options":
|
@ -1,18 +0,0 @@
|
|||||||
extends Area2D
|
|
||||||
|
|
||||||
# Declare member variables here. Examples:
|
|
||||||
# var a = 2
|
|
||||||
# var b = "text"
|
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready():
|
|
||||||
pass # Replace with function body.
|
|
||||||
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
#func _process(delta):
|
|
||||||
# pass
|
|
||||||
|
|
||||||
func _on_Border_body_entered(body):
|
|
||||||
print(body)
|
|
@ -1,91 +0,0 @@
|
|||||||
extends Control
|
|
||||||
|
|
||||||
onready var Ships = ["2Ship", "3ShipA", "3ShipB", "4Ship", "5Ship"]
|
|
||||||
onready var Crosshair
|
|
||||||
|
|
||||||
class Location:
|
|
||||||
var Coor: Vector2
|
|
||||||
var Length: int
|
|
||||||
var Orientation: bool #vertical is true, (Trueship = vertical) (Falseship = horizontal)
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready():
|
|
||||||
if find_next_valid_focus(): find_next_valid_focus().grab_focus()
|
|
||||||
|
|
||||||
|
|
||||||
func _on_Forfeit_pressed():
|
|
||||||
AudioBus.emit_signal("button_clicked")
|
|
||||||
queue_free();
|
|
||||||
MessageBus.emit_signal("change_scene", "Title")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func _on_Confirm_Placement_pressed():
|
|
||||||
var valid = true
|
|
||||||
for ship in Ships:
|
|
||||||
# validate_placement returns the x-axis distance from the board
|
|
||||||
# if this is more than zero, the ship is invalid
|
|
||||||
if get_node(ship).validate_placement():
|
|
||||||
valid = false
|
|
||||||
print ("Placement: ", valid)
|
|
||||||
if valid == false:
|
|
||||||
get_node("PlaceShipDialog").popup()
|
|
||||||
else:
|
|
||||||
#Saves the location of ships and length of ship into an array
|
|
||||||
var shipLocation = []
|
|
||||||
for ship in Ships:
|
|
||||||
var location = Location.new()
|
|
||||||
location.Coor = get_node(ship).position
|
|
||||||
location.Length = get_node(ship).get("ship_length")
|
|
||||||
location.Orientation = get_node(ship).get("vertical")
|
|
||||||
shipLocation.append(location)
|
|
||||||
|
|
||||||
#print out the array for testing
|
|
||||||
for x in shipLocation:
|
|
||||||
print("Ship Length: ", x.Length, ", Ship Orientation: ", x.Orientation, "Ship Coor: ", x.Coor)
|
|
||||||
|
|
||||||
#Hides the ship placement UI
|
|
||||||
var confirmButton = get_node("Confirm Placement")
|
|
||||||
var clearButton = get_node("Clear")
|
|
||||||
var ship1 = get_node("2Ship")
|
|
||||||
var ship2 = get_node("3ShipA")
|
|
||||||
var ship3 = get_node("3ShipB")
|
|
||||||
var ship4 = get_node("4Ship")
|
|
||||||
var ship5 = get_node("5Ship")
|
|
||||||
confirmButton.visible = false
|
|
||||||
clearButton.visible = false
|
|
||||||
ship1.visible = false
|
|
||||||
ship2.visible = false
|
|
||||||
ship3.visible = false
|
|
||||||
ship4.visible = false
|
|
||||||
ship5.visible = false
|
|
||||||
|
|
||||||
#Changes to firing mode, makes the fireing mode UI visible (The location of this can be changed later. This position is for testing)
|
|
||||||
var crosshair = get_node("Crosshair")
|
|
||||||
var fireButton = get_node("Fire")
|
|
||||||
crosshair.visible = true
|
|
||||||
fireButton.visible = true
|
|
||||||
return valid # Replace with function body.
|
|
||||||
|
|
||||||
func _on_Clear_pressed():
|
|
||||||
for ship in Ships:
|
|
||||||
get_node(ship).clear()
|
|
||||||
pass # Replace with function body.
|
|
||||||
|
|
||||||
|
|
||||||
func _on_Fire_pressed():
|
|
||||||
var crosshair = get_node("Crosshair")
|
|
||||||
# hides crosshair
|
|
||||||
crosshair.visible = false
|
|
||||||
if crosshair.validate_position(crosshair.position) == true:
|
|
||||||
# fires at position
|
|
||||||
print("Fire at position: ", crosshair.position)
|
|
||||||
else:
|
|
||||||
#if invalid position popup appears
|
|
||||||
var dialog = get_node("FireDialog")
|
|
||||||
dialog.popup_centered()
|
|
||||||
pass # Replace with function body.
|
|
||||||
|
|
||||||
func _on_FireDialog_confirmed():
|
|
||||||
get_node("Crosshair").visible = true
|
|
||||||
pass # Replace with function body.
|
|
@ -1,24 +1,28 @@
|
|||||||
extends Sprite
|
extends Sprite
|
||||||
|
|
||||||
|
|
||||||
# Declare member variables here. Examples:
|
|
||||||
# var a = 2
|
|
||||||
# var b = "text"
|
|
||||||
|
|
||||||
var snapped = false #when snapped if true crosshair stops following mouse
|
var snapped = false #when snapped if true crosshair stops following mouse
|
||||||
|
const world_offset = Vector2(36,36)
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready():
|
func _ready():
|
||||||
|
# Move the cursor to 0,0
|
||||||
|
position = board_to_world_space(Vector2(-2,-2))
|
||||||
pass # Replace with function body.
|
pass # Replace with function body.
|
||||||
|
|
||||||
func _physics_process(delta):
|
func _physics_process(_delta):
|
||||||
if snapped == false:
|
var mousePos = get_global_mouse_position()
|
||||||
position += (get_global_mouse_position() - position)/10
|
# If the cursor is not snapped, and the mouse is over the board
|
||||||
|
if snapped == false and validate_position(mousePos):
|
||||||
|
# Snap the crosshair to the grid, but following the mouse
|
||||||
|
position = (mousePos - world_offset).snapped(Vector2(32,32)) + world_offset
|
||||||
|
|
||||||
func _input(event):
|
func _input(event):
|
||||||
# Check if left click is being clicked and the sprite is visible (i.e only checks for inputs after ship positions are confirmed)
|
# Check if left click is being clicked and the sprite is visible (i.e only checks for inputs after ship positions are confirmed)
|
||||||
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and visible == true:
|
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and visible and not event.is_pressed():
|
||||||
# Locks the position of the crosshair with left click
|
# Make a noise
|
||||||
|
AudioBus.emit_signal("button_clicked")
|
||||||
|
# Locks the position of the crosshair with left click release
|
||||||
if validate_position(position) == true:
|
if validate_position(position) == true:
|
||||||
# rounds the board position to the nearest integer
|
# rounds the board position to the nearest integer
|
||||||
snapped = true
|
snapped = true
|
||||||
@ -26,16 +30,15 @@ func _input(event):
|
|||||||
position.y = int(round(world_to_board_space(position).y))
|
position.y = int(round(world_to_board_space(position).y))
|
||||||
position = board_to_world_space(position)
|
position = board_to_world_space(position)
|
||||||
# Check if left click is being clicked and the sprite is visible (i.e only checks for inputs after ship positions are confirmed)
|
# Check if left click is being clicked and the sprite is visible (i.e only checks for inputs after ship positions are confirmed)
|
||||||
if event is InputEventMouseButton and event.button_index == BUTTON_RIGHT and visible == true:
|
elif event is InputEventMouseButton and event.button_index == BUTTON_LEFT and visible == true:
|
||||||
# Unlocks the position of the crosshair with right click
|
# Unlocks the position of the crosshair with left click
|
||||||
snapped = false
|
snapped = false
|
||||||
|
|
||||||
func validate_position(vector):
|
func validate_position(vector):
|
||||||
# rounds the board position to the nearest integer
|
# rounds the board position to the nearest integer
|
||||||
var boardx = int(round(world_to_board_space(vector).x))
|
var board = world_to_board_space(vector)
|
||||||
var boardy = int(round(world_to_board_space(vector).y))
|
|
||||||
# Checks if the board position is within bounds of the board
|
# Checks if the board position is within bounds of the board
|
||||||
if boardx < 11 and boardx > 0 and boardy < 11 and boardy > 0:
|
if board.x < 9.5 and board.x >= -0.5 and board.y < 9.5 and board.y >= -0.5:
|
||||||
# changes the position of the crosshair
|
# changes the position of the crosshair
|
||||||
return true
|
return true
|
||||||
else:
|
else:
|
||||||
@ -45,15 +48,11 @@ func validate_position(vector):
|
|||||||
# Convert the world-space coordinates to positions on the board
|
# Convert the world-space coordinates to positions on the board
|
||||||
func world_to_board_space(vector):
|
func world_to_board_space(vector):
|
||||||
# Do math
|
# Do math
|
||||||
var res = (vector - offset) / 32 # Basically Fahrenheit/Celcius conversion, but in 2D
|
var res = (vector - world_offset) / 32 # Basically Fahrenheit/Celcius conversion, but in 2D
|
||||||
return res
|
return res
|
||||||
|
|
||||||
# Inverse of the above function.
|
# Inverse of the above function.
|
||||||
func board_to_world_space(vector):
|
func board_to_world_space(vector):
|
||||||
# Do math
|
# Do math
|
||||||
var res = (vector * 32) + offset #Invert the above function
|
var res = (vector * 32) + world_offset #Invert the above function
|
||||||
return res #Truncate decimals
|
return res #Truncate decimals
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
#func _process(delta):
|
|
||||||
# pass
|
|
||||||
|
30
godot_ship/script/game/Gameplay/Fire.gd
Normal file
30
godot_ship/script/game/Gameplay/Fire.gd
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
extends Control
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
pass # Replace with function body.
|
||||||
|
|
||||||
|
# Signal to pass the fire location back to yet-unknown nodes
|
||||||
|
signal fire_at
|
||||||
|
|
||||||
|
|
||||||
|
func _on_Fire_pressed():
|
||||||
|
var crosshair = get_node("Crosshair")
|
||||||
|
# hides crosshair
|
||||||
|
crosshair.visible = false
|
||||||
|
if crosshair.validate_position(crosshair.position) == true:
|
||||||
|
var crosshair_pos = crosshair.world_to_board_space(crosshair.position)
|
||||||
|
# fires at position
|
||||||
|
print("Fire at position: ", crosshair_pos)
|
||||||
|
emit_signal("fire_at", crosshair_pos)
|
||||||
|
# Close the Firing menu
|
||||||
|
queue_free()
|
||||||
|
else:
|
||||||
|
#if invalid position popup appears
|
||||||
|
var dialog = get_node("FireDialog")
|
||||||
|
dialog.popup_centered()
|
||||||
|
pass # Replace with function body.
|
||||||
|
|
||||||
|
func _on_FireDialog_confirmed():
|
||||||
|
get_node("Crosshair").visible = true
|
||||||
|
pass # Replace with function body.
|
@ -1,8 +1,18 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
|
class ShipData:
|
||||||
|
var Coor: Vector2
|
||||||
|
var Length: int
|
||||||
|
var Orientation: bool #vertical is true, (Trueship = vertical) (Falseship = horizontal)
|
||||||
|
|
||||||
|
# Preloaded assets, to be used later
|
||||||
|
onready var Setup = preload("res://scenes/Game/Setup.tscn")
|
||||||
|
onready var Fire = preload("res://scenes/Game/Fire.tscn")
|
||||||
|
|
||||||
# Path to Player class, for instantiating new Players in code
|
# Path to Player class, for instantiating new Players in code
|
||||||
var Player = "res://script/game/Gameplay/Player.gd"
|
var Player = "res://script/game/Gameplay/Player.gd"
|
||||||
|
|
||||||
|
|
||||||
# Array of instances of the Player class; stores the Players
|
# Array of instances of the Player class; stores the Players
|
||||||
var players # = player1, player2, ...
|
var players # = player1, player2, ...
|
||||||
# turn counter
|
# turn counter
|
||||||
@ -15,7 +25,13 @@ var is_multiplayer = false
|
|||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready():
|
func _ready():
|
||||||
game_start()
|
var setup = Setup.instance()
|
||||||
|
setup.connect("game_ready", self, "game_setup")
|
||||||
|
add_child(setup)
|
||||||
|
|
||||||
|
func game_setup(_ships):
|
||||||
|
print_debug("Congrats! Setup complete.")
|
||||||
|
add_child(Fire.instance())
|
||||||
|
|
||||||
# Member functions:
|
# Member functions:
|
||||||
# game_start: starts the game
|
# game_start: starts the game
|
||||||
@ -29,3 +45,10 @@ func victory_screen():
|
|||||||
# display_turn(): display which turn it is on the screen
|
# display_turn(): display which turn it is on the screen
|
||||||
func display_turn():
|
func display_turn():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
func _on_Forfeit_pressed():
|
||||||
|
AudioBus.emit_signal("button_clicked")
|
||||||
|
end()
|
||||||
|
|
||||||
|
func end():
|
||||||
|
queue_free()
|
||||||
|
54
godot_ship/script/game/Setup.gd
Normal file
54
godot_ship/script/game/Setup.gd
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
extends Control
|
||||||
|
|
||||||
|
signal forfeit
|
||||||
|
signal game_ready
|
||||||
|
|
||||||
|
onready var Ships = ["2Ship", "3ShipA", "3ShipB", "4Ship", "5Ship"]
|
||||||
|
|
||||||
|
class ShipData:
|
||||||
|
var Position: Vector2
|
||||||
|
var Length: int
|
||||||
|
var Orientation: bool # (True = vertical) (False = horizontal)
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
# Moves the focus to this menu
|
||||||
|
if find_next_valid_focus(): find_next_valid_focus().grab_focus()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_Confirm_Placement_pressed():
|
||||||
|
# Make the button noise
|
||||||
|
AudioBus.emit_signal("button_clicked")
|
||||||
|
var valid = true
|
||||||
|
for ship in Ships:
|
||||||
|
# validate_placement returns the x-axis distance from the board
|
||||||
|
# if this is more than zero, the ship is invalid
|
||||||
|
if get_node(ship).validate_placement():
|
||||||
|
valid = false
|
||||||
|
print ("Placement: ", valid)
|
||||||
|
if valid == false:
|
||||||
|
get_node("PlaceShipDialog").popup()
|
||||||
|
else:
|
||||||
|
#Saves the location of ships and length of ship into an array
|
||||||
|
var shipLocation = []
|
||||||
|
for ship in Ships:
|
||||||
|
var location = ShipData.new()
|
||||||
|
location.Position = get_node(ship).position
|
||||||
|
location.Length = get_node(ship).get("ship_length")
|
||||||
|
location.Orientation = get_node(ship).get("vertical")
|
||||||
|
shipLocation.append(location)
|
||||||
|
|
||||||
|
#print out the array for testing
|
||||||
|
for x in shipLocation:
|
||||||
|
print("Ship Length: ", x.Length, ", Ship Orientation: ", x.Orientation, ", Ship Position: ", x.Position)
|
||||||
|
|
||||||
|
# Return the shipLocation array to those listening on game_ready
|
||||||
|
emit_signal("game_ready", shipLocation)
|
||||||
|
queue_free()
|
||||||
|
return valid # Replace with function body.
|
||||||
|
|
||||||
|
func _on_Clear_pressed():
|
||||||
|
AudioBus.emit_signal("button_clicked")
|
||||||
|
for ship in Ships:
|
||||||
|
get_node(ship).clear()
|
||||||
|
pass # Replace with function body.
|
@ -141,11 +141,9 @@ func checkOriginalPos():
|
|||||||
|
|
||||||
# Called when *this* ship collides with another ship
|
# Called when *this* ship collides with another ship
|
||||||
func ship_stacked(_body):
|
func ship_stacked(_body):
|
||||||
print("stacked")
|
|
||||||
collision = true
|
collision = true
|
||||||
# Called when *this* ship stops colliding with another ship
|
# Called when *this* ship stops colliding with another ship
|
||||||
func ship_unstacked(_body):
|
func ship_unstacked(_body):
|
||||||
print("unstacked")
|
|
||||||
collision = false
|
collision = false
|
||||||
|
|
||||||
# Calculate the extents (front to back) of the ship and check whether they're on the board
|
# Calculate the extents (front to back) of the ship and check whether they're on the board
|
@ -1,16 +0,0 @@
|
|||||||
extends Node
|
|
||||||
|
|
||||||
|
|
||||||
# Declare member variables here. Examples:
|
|
||||||
# var a = 2
|
|
||||||
# var b = "text"
|
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
|
||||||
func _ready():
|
|
||||||
pass # Replace with function body.
|
|
||||||
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
||||||
#func _process(delta):
|
|
||||||
# pass
|
|
Loading…
Reference in New Issue
Block a user