From b6bef3f13a0b6d3f068b94a5c365cf0e0a06e25c Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 31 Mar 2026 13:30:15 +0100 Subject: [PATCH 1/2] Adjusted stock shot spacing and added muzzle flash. --- graphics/muzzle_flash.png | Bin 0 -> 210 bytes graphics/muzzle_flash.png.import | 40 ++++++++++++++ resources/shot_stock.tres | 2 +- scenes/player.tscn | 90 +++++++++++++++++++++++++++++++ scripts/player.gd | 69 ++++++++++-------------- scripts/player_shot.gd | 4 +- 6 files changed, 160 insertions(+), 45 deletions(-) create mode 100644 graphics/muzzle_flash.png create mode 100644 graphics/muzzle_flash.png.import diff --git a/graphics/muzzle_flash.png b/graphics/muzzle_flash.png new file mode 100644 index 0000000000000000000000000000000000000000..f02f0bdb9edf20c394ff48bf6d5b0e3dd671c3c3 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^xcOLl~AeL;g%aiLMVB`3qV_V4d%G}x~GcwYM6^rB5X zkAm#vB$MSQF3RPd&*FK%XRDIfHK8xR_0}KjXujqD_1nVF%%AgrEOvf&^CHk)44$rj JF6*2UngE)UQ|SNz literal 0 HcmV?d00001 diff --git a/graphics/muzzle_flash.png.import b/graphics/muzzle_flash.png.import new file mode 100644 index 0000000..d8bf0de --- /dev/null +++ b/graphics/muzzle_flash.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crmbupr3qg0j" +path="res://.godot/imported/muzzle_flash.png-a4acd317005dff07444b3286deac56f4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/muzzle_flash.png" +dest_files=["res://.godot/imported/muzzle_flash.png-a4acd317005dff07444b3286deac56f4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/resources/shot_stock.tres b/resources/shot_stock.tres index a3817e7..a485b71 100644 --- a/resources/shot_stock.tres +++ b/resources/shot_stock.tres @@ -6,6 +6,6 @@ [resource] script = ExtResource("1_dpne1") shot_name = "Stock" -speed = -300 +speed = -350 cooldown = 0.0 metadata/_custom_type_script = "uid://ccdohs4gduee5" diff --git a/scenes/player.tscn b/scenes/player.tscn index 80abd56..177e4e7 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -3,18 +3,108 @@ [ext_resource type="Script" uid="uid://otm88638j7f8" path="res://scripts/player.gd" id="1_g2els"] [ext_resource type="PackedScene" uid="uid://ddpclu2vdy2ve" path="res://scenes/stock_weapon.tscn" id="2_dqkch"] [ext_resource type="Texture2D" uid="uid://cq4we1m1yv22s" path="res://graphics/ship.png" id="2_qhqgy"] +[ext_resource type="Texture2D" uid="uid://crmbupr3qg0j" path="res://graphics/muzzle_flash.png" id="4_dqkch"] +[ext_resource type="Texture2D" uid="uid://b0iavxi8vaxtj" path="res://graphics/ship_thrusters.png" id="5_qlg0r"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_tuyoq"] +atlas = ExtResource("5_qlg0r") +region = Rect2(28, 0, 14, 6) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fjrip"] +atlas = ExtResource("5_qlg0r") +region = Rect2(42, 0, 14, 6) + +[sub_resource type="AtlasTexture" id="AtlasTexture_smehm"] +atlas = ExtResource("5_qlg0r") +region = Rect2(1, 0, 14, 6) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ur7pv"] +atlas = ExtResource("5_qlg0r") +region = Rect2(15, 0, 14, 6) + +[sub_resource type="SpriteFrames" id="SpriteFrames_y4r1p"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_tuyoq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fjrip") +}], +"loop": true, +"name": &"banked", +"speed": 15.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_smehm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ur7pv") +}], +"loop": true, +"name": &"fwd", +"speed": 15.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_qlg0r"] +atlas = ExtResource("4_dqkch") +region = Rect2(0, 0, 15, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y4r1p"] +atlas = ExtResource("4_dqkch") +region = Rect2(15, 0, 15, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d2wvv"] +atlas = ExtResource("4_dqkch") +region = Rect2(30, 0, 15, 8) + +[sub_resource type="SpriteFrames" id="SpriteFrames_3v2ag"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_qlg0r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y4r1p") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d2wvv") +}], +"loop": true, +"name": &"stock", +"speed": 15.0 +}] [sub_resource type="RectangleShape2D" id="RectangleShape2D_dqkch"] +size = Vector2(10, 11) [node name="Player" type="Area2D" unique_id=652131079] script = ExtResource("1_g2els") +speed = 165 weapon_current = ExtResource("2_dqkch") [node name="Ship" type="Sprite2D" parent="." unique_id=1155866924] unique_name_in_owner = true texture = ExtResource("2_qhqgy") +hframes = 3 +region_rect = Rect2(0, 0, 62, 24.370766) + +[node name="Thrusters" type="AnimatedSprite2D" parent="Ship" unique_id=2096876587] +position = Vector2(0, 15) +sprite_frames = SubResource("SpriteFrames_y4r1p") +animation = &"fwd" +autoplay = "fwd" + +[node name="MuzzleFlash" type="AnimatedSprite2D" parent="Ship" unique_id=1584132038] +unique_name_in_owner = true +position = Vector2(0, -16) +sprite_frames = SubResource("SpriteFrames_3v2ag") +animation = &"stock" +autoplay = "stock" [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=485826453] +position = Vector2(0, -3.5) shape = SubResource("RectangleShape2D_dqkch") [node name="WeaponCooldown" type="Timer" parent="." unique_id=269678170] diff --git a/scripts/player.gd b/scripts/player.gd index 4262e3b..669b58e 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -3,7 +3,8 @@ extends Area2D @export var speed: int = 150 @export var shield_max: int = 10 -var velocity: Vector2 = Vector2.ZERO +#var ship = %Ship + var shield: int = 0: set = shield_set var can_shoot: bool = true var is_shooting: bool = false @@ -27,55 +28,42 @@ func _process(delta): ship_displacement = position.y - previous_position.y travel += bullet_speed * delta + (ship_displacement) travel = clamp(travel, 0, 1.9 * weapon_spacing) - #TODO: sprite frame change on x axis - #if input.x > 0: - #$Ship.frame = 2 - #$Ship/Boosters.animation = "right" - #elif input.x < 0: - #$Ship.frame = 0 - #$Ship/Boosters.animation = "left" - #else: - #$Ship.frame = 1 - #$Ship/Boosters.animation = "forward" + + # Sprite feedback based one player input + if input.x > 0: + %Ship.frame = 2 + %Ship/Thrusters.flip_h = true + %Ship/Thrusters.animation = "banked" + elif input.x < 0: + %Ship.frame = 1 + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "banked" + else: + %Ship.frame = 0 + %Ship/Thrusters.flip_h = false + %Ship/Thrusters.animation = "fwd" previous_position = position position += input * speed * delta position = position.clamp(Vector2(12,12), screensize - Vector2(12,12)) - # Update velocity based on input - #var direction = Vector2.ZERO - #if Input.is_action_pressed("down"): - #direction.y += 1 - #if Input.is_action_pressed("up"): - #direction.y -= 1 -# - ## Normalize direction and apply speed - #if direction.length() > 0: - #velocity = direction.normalized() * speed - - # Update velocity - #velocity += velocity * delta - velocity = input * speed - if Input.is_action_pressed("shoot"): - print("Spacebar pressed!") is_shooting = true else: is_shooting = false if is_shooting == true: + print("Spacebar pressed!") + %MuzzleFlash.show() + %Ship/MuzzleFlash.animation = "stock" + if travel > weapon_spacing: shoot() travel -= weapon_spacing - - #weapon_timer += delta - #print(weapon_timer) - #if weapon_timer >= weapon_rate: - #shoot() - #weapon_timer = 0.0 - - if is_shooting == false: return + + if is_shooting == false: + %MuzzleFlash.hide() func shield_set(_value: int): return @@ -88,16 +76,13 @@ func _on_weapon_cooldown_timeout() -> void: func shoot(): + # Instantiate the bullet var bullet = weapon_current.instantiate() - bullet.position = position + Vector2(0,-20) - #previous_position = position get_tree().root.add_child(bullet) + bullet.position = position + Vector2(0,-23) weapon_rate = bullet.shot_data.rate weapon_spacing = bullet.shot_data.spacing bullet_speed = abs(bullet.shot_data.speed) - #bullet.global_transform = self.global_transform prints(bullet.shot_data.shot_name, "weapon fired") #Print which weapon is firing - #weapon_cooldown = $WeaponCooldown - #weapon_cooldown.wait_time = bullet.shot_data.cooldown - #weapon_cooldown.start() - #can_shoot = not can_shoot + + diff --git a/scripts/player_shot.gd b/scripts/player_shot.gd index 98bf23d..54418e6 100644 --- a/scripts/player_shot.gd +++ b/scripts/player_shot.gd @@ -3,8 +3,8 @@ extends Resource @export var shot_name: String @export var damage: int = 1 -@export var speed: int = 100 +@export var speed: int = 135 @export var rate: float = 0.1 @export var cooldown: float = 0.25 @export var sprite: Texture2D = preload("res://graphics/shot.png") -@export var spacing: float = 50 +@export var spacing: float = 35 From cc8bdb2bfe2c87b73a79957304963d9004fd15a0 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 31 Mar 2026 13:31:05 +0100 Subject: [PATCH 2/2] Set up a temp title screen and added paralax clouds taken from The Third Place. --- graphics/cloud layers.png | Bin 0 -> 1122 bytes graphics/cloud layers.png.import | 40 ++++++++++++++++ scenes/game.tscn | 3 ++ scenes/world.tscn | 77 ++++++++++++++++++++++++++++++- 4 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 graphics/cloud layers.png create mode 100644 graphics/cloud layers.png.import diff --git a/graphics/cloud layers.png b/graphics/cloud layers.png new file mode 100644 index 0000000000000000000000000000000000000000..71fbcb40d66669a072947cdf22e20d000cb8b1ab GIT binary patch literal 1122 zcmV-o1fBbdP)0i00001b5ch_0Itp) z=>Px#8&FJCMF0Q*7#SleEkQUyT})JMZ)kdpd4r{miM5`P`mNnv00009bW%=J0RR90 z|NsC0|2G1g)Bpej;7LS5RCt`_o9&V#AqYh&Yqx6O|B0t2X%!R%1T(!o{Fq6)W5s(K z0Y3tz8Q_0V-xdJ){`38xvp=c{4KMq_-ut5bmeatuTNn41Bs&m3n$BJAnc~C6El@8uP>( z<`!-M3j(PCb_lHep9cUN0AvEU0Kh5-$pySYa7{o1pb^ON045!F0+ae354be|xI!Nv z51^F+WgP#v1F)eVs!-^P+ra48Q5o<=00oZ(c>8`U0I%f8JbVuT@%u9Y?C2*+59*Mw z(-)(?FIK=Xn?5R?em0LcAMj{)zC0LUwPY+&po02cjE13+?rb$>t=(a!)- z`yU6;7J{JrLc513MF9xyGXd;Xf_>IY!d-oVV?zXh^!-8o1Aq+#Xx@*XG%Eg3G~5Ot ze}7Q_1i(#zW&w8kPu9jpyBz>8fl)uL_}WBCTopPAz|#L2fRg|bkC%T7`Hz%$pq=|nRfUELr zs{uny2m{~=NB{ycU<&}WDj4WIIL`xk0&)zTtLtW90c&mG+0WX2ARG8X#gfu zGk_NWN8rE^$OWL;IRLi)rvbpPz=7a~0QRx~a0CqPp8|mH3PV{f0^J^fivU0R%?@zK zAh-!&sDg}H@JSwkcFEd?s7@iM|2_bqSHi{w__hZDAp3)8cQg;ce=!7b8Dt5AE&vRI zp#C!ez!3eErC?J4#K;+2wc)f1ve=dMl35#dO_5ld(IRMcE5`o#^ zNI-8NlYeAI$Sxk{I)I)S%>l4%F9O(I6gBE@hEqTRx)9LLj>k@kEx%s|un_~C+Fv$2 o{XPczuZ5P!1Wp3@#Lwry052wekc6B3asU7T07*qoM6N<$f_6{a82|tP literal 0 HcmV?d00001 diff --git a/graphics/cloud layers.png.import b/graphics/cloud layers.png.import new file mode 100644 index 0000000..0373751 --- /dev/null +++ b/graphics/cloud layers.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3dqvd23nbmrm" +path="res://.godot/imported/cloud layers.png-4d2d52eab55e5e1ba1e0e021786c2357.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://graphics/cloud layers.png" +dest_files=["res://.godot/imported/cloud layers.png-4d2d52eab55e5e1ba1e0e021786c2357.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/scenes/game.tscn b/scenes/game.tscn index bb55de7..18dbab4 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -30,6 +30,7 @@ grow_horizontal = 2 grow_vertical = 2 [node name="Title" type="TextureRect" parent="TitleMenu/HBoxContainer" unique_id=1389062363] +modulate = Color(0.1764706, 0.5686275, 1, 1) layout_mode = 2 size_flags_horizontal = 10 size_flags_vertical = 4 @@ -41,6 +42,8 @@ layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +offset_left = -1.0 +offset_right = -1.0 grow_horizontal = 2 grow_vertical = 2 color = Color(0.67049235, 0.66050816, 0.7086971, 1) diff --git a/scenes/world.tscn b/scenes/world.tscn index 5386ae3..b0110e3 100644 --- a/scenes/world.tscn +++ b/scenes/world.tscn @@ -1,7 +1,82 @@ [gd_scene format=3 uid="uid://bj4fytc3sy482"] [ext_resource type="PackedScene" uid="uid://14fhj8834pkq" path="res://scenes/ui.tscn" id="1_nnsk1"] +[ext_resource type="PackedScene" uid="uid://coix5dqblmu7r" path="res://scenes/player.tscn" id="2_rwgxs"] +[ext_resource type="Texture2D" uid="uid://b3dqvd23nbmrm" path="res://graphics/cloud layers.png" id="3_4wyf3"] [node name="World" type="Node2D" unique_id=1317852169] -[node name="UI" parent="." unique_id=480295610 instance=ExtResource("1_nnsk1")] +[node name="Level" type="Node2D" parent="." unique_id=934289771] + +[node name="UI" parent="Level" unique_id=480295610 instance=ExtResource("1_nnsk1")] + +[node name="Player" parent="Level" unique_id=652131079 instance=ExtResource("2_rwgxs")] +z_index = 1 +position = Vector2(97, 173) + +[node name="Background" type="Node2D" parent="Level" unique_id=485120278] +z_index = -1 + +[node name="BaseBackground" type="ColorRect" parent="Level/Background" unique_id=1360709800] +offset_right = 217.0 +offset_bottom = 410.0 +color = Color(0.2899925, 0.5692833, 0.9110645, 1) + +[node name="Back" type="Parallax2D" parent="Level/Background" unique_id=529215091] +scroll_scale = Vector2(0.25, 0.25) +repeat_size = Vector2(0, 50) +autoscroll = Vector2(0, 150) +repeat_times = 15 +follow_viewport = false + +[node name="CloudLeft" type="Sprite2D" parent="Level/Background/Back" unique_id=1098035995] +position = Vector2(40, 32) +texture = ExtResource("3_4wyf3") +hframes = 4 +frame = 1 + +[node name="CloudRight" type="Sprite2D" parent="Level/Background/Back" unique_id=1729409543] +position = Vector2(177, 32) +texture = ExtResource("3_4wyf3") +flip_h = true +hframes = 4 +frame = 1 + +[node name="Mid" type="Parallax2D" parent="Level/Background" unique_id=906676376] +scroll_scale = Vector2(0.5, 0.5) +repeat_size = Vector2(0, 50) +autoscroll = Vector2(0, 205) +repeat_times = 15 +follow_viewport = false + +[node name="CloudLeft" type="Sprite2D" parent="Level/Background/Mid" unique_id=1179862071] +position = Vector2(40, 32) +texture = ExtResource("3_4wyf3") +hframes = 4 +frame = 2 + +[node name="CloudRight" type="Sprite2D" parent="Level/Background/Mid" unique_id=702118355] +position = Vector2(177, 32) +texture = ExtResource("3_4wyf3") +flip_h = true +hframes = 4 +frame = 2 + +[node name="Fore" type="Parallax2D" parent="Level/Background" unique_id=1005527243] +repeat_size = Vector2(0, 50) +autoscroll = Vector2(0, 425) +repeat_times = 15 +follow_viewport = false + +[node name="CloudLeft" type="Sprite2D" parent="Level/Background/Fore" unique_id=146182935] +position = Vector2(32, 32) +texture = ExtResource("3_4wyf3") +hframes = 4 +frame = 3 + +[node name="CloudRight" type="Sprite2D" parent="Level/Background/Fore" unique_id=1798342457] +position = Vector2(185, 32) +texture = ExtResource("3_4wyf3") +flip_h = true +hframes = 4 +frame = 3