diff --git a/assets/_RAW_/invader.pxo b/assets/_RAW_/invader.pxo new file mode 100644 index 0000000..22b7755 Binary files /dev/null and b/assets/_RAW_/invader.pxo differ diff --git a/assets/img/invader.png b/assets/img/invader.png new file mode 100644 index 0000000..7dbec67 Binary files /dev/null and b/assets/img/invader.png differ diff --git a/assets/img/invader.png.import b/assets/img/invader.png.import new file mode 100644 index 0000000..9487f53 --- /dev/null +++ b/assets/img/invader.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7n0aykgeuaaw" +path="res://.godot/imported/invader.png-e15e275fc7b6a81f2ac56e1169e2bfc2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/img/invader.png" +dest_files=["res://.godot/imported/invader.png-e15e275fc7b6a81f2ac56e1169e2bfc2.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/assets/sfx/crash2.wav b/assets/sfx/crash2.wav new file mode 100644 index 0000000..a18174f Binary files /dev/null and b/assets/sfx/crash2.wav differ diff --git a/assets/sfx/crash2.wav.import b/assets/sfx/crash2.wav.import new file mode 100644 index 0000000..2d5210f --- /dev/null +++ b/assets/sfx/crash2.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://tvb2iqqjjsnq" +path="res://.godot/imported/crash2.wav-7a2662502c34f1d9181d94c8e86425a0.sample" + +[deps] + +source_file="res://assets/sfx/crash2.wav" +dest_files=["res://.godot/imported/crash2.wav-7a2662502c34f1d9181d94c8e86425a0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/sfx/invader.wav b/assets/sfx/invader.wav new file mode 100644 index 0000000..596faaa Binary files /dev/null and b/assets/sfx/invader.wav differ diff --git a/assets/sfx/invader.wav.import b/assets/sfx/invader.wav.import new file mode 100644 index 0000000..532443a --- /dev/null +++ b/assets/sfx/invader.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bb8i4s5bv1r4j" +path="res://.godot/imported/invader.wav-17eecca55097f63b87a6a4e28e915787.sample" + +[deps] + +source_file="res://assets/sfx/invader.wav" +dest_files=["res://.godot/imported/invader.wav-17eecca55097f63b87a6a4e28e915787.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/assets/sfx/shoot2.wav b/assets/sfx/shoot2.wav new file mode 100644 index 0000000..395642e Binary files /dev/null and b/assets/sfx/shoot2.wav differ diff --git a/assets/sfx/shoot2.wav.import b/assets/sfx/shoot2.wav.import new file mode 100644 index 0000000..e8c3fb7 --- /dev/null +++ b/assets/sfx/shoot2.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bg2eft275t8xi" +path="res://.godot/imported/shoot2.wav-93cee12f82dd277d215b2c88cec2c4c4.sample" + +[deps] + +source_file="res://assets/sfx/shoot2.wav" +dest_files=["res://.godot/imported/shoot2.wav-93cee12f82dd277d215b2c88cec2c4c4.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/scenes/invader.tscn b/scenes/invader.tscn new file mode 100644 index 0000000..f8095d6 --- /dev/null +++ b/scenes/invader.tscn @@ -0,0 +1,154 @@ +[gd_scene load_steps=15 format=3 uid="uid://du1namnd5kxs4"] + +[ext_resource type="Texture2D" uid="uid://7n0aykgeuaaw" path="res://assets/img/invader.png" id="1_3tryp"] +[ext_resource type="Script" path="res://scripts/invader.gd" id="1_vblvx"] +[ext_resource type="Shader" path="res://assets/shaders/PixelExplosion.gdshader" id="2_bav6d"] +[ext_resource type="AudioStream" uid="uid://bb8i4s5bv1r4j" path="res://assets/sfx/invader.wav" id="3_orakw"] +[ext_resource type="AudioStream" uid="uid://tvb2iqqjjsnq" path="res://assets/sfx/crash2.wav" id="4_5jebg"] +[ext_resource type="AudioStream" uid="uid://bg2eft275t8xi" path="res://assets/sfx/shoot2.wav" id="5_c2cqd"] + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_2etwc"] +noise_type = 0 +seed = -13 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_ca84o"] +width = 64 +height = 64 +generate_mipmaps = false +noise = SubResource("FastNoiseLite_2etwc") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_wjoqq"] +noise_type = 0 +seed = -13 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_vfidg"] +width = 64 +height = 64 +generate_mipmaps = false +noise = SubResource("FastNoiseLite_wjoqq") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_7qjt1"] +resource_local_to_scene = true +shader = ExtResource("2_bav6d") +shader_parameter/progress = null +shader_parameter/strength = 1.0 +shader_parameter/noise_tex_normal = SubResource("NoiseTexture2D_vfidg") +shader_parameter/noise_tex = SubResource("NoiseTexture2D_ca84o") + +[sub_resource type="Animation" id="Animation_l62j8"] +resource_name = "crash" +length = 0.4 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CrashSound:playing") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/1/type = "method" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.4, 0.4001), +"transitions": PackedFloat32Array(1, 1), +"values": [{ +"args": [], +"method": &"queue_free" +}, { +"args": [], +"method": &"queue_free" +}] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:material:shader_parameter/progress") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [null, 0.33, 0.66, 1.0] +} + +[sub_resource type="Animation" id="Animation_cojig"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CrashSound:playing") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:material:shader_parameter/progress") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [null] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_1dk2o"] +_data = { +"RESET": SubResource("Animation_cojig"), +"crash": SubResource("Animation_l62j8") +} + +[node name="Invader" type="Area2D"] +collision_layer = 3 +collision_mask = 3 +script = ExtResource("1_vblvx") + +[node name="Sprite2D" type="Sprite2D" parent="."] +material = SubResource("ShaderMaterial_7qjt1") +texture = ExtResource("1_3tryp") + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] +polygon = PackedVector2Array(12, -15, 16, -10, 24, -10, 29, -6, 32, -2, 10, 15, -3, 15, -31, -1, -31, -3, -23, -10, -15, -10, -10, -15) + +[node name="FlyingTone" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("3_orakw") +autoplay = true + +[node name="ShootSound" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("5_c2cqd") + +[node name="CrashSound" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource("4_5jebg") + +[node name="ShootTimer" type="Timer" parent="."] +autostart = true + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_1dk2o") +} + +[node name="GunMarker" type="Marker2D" parent="."] +position = Vector2(2, 17) + +[node name="Projectiles" type="Node" parent="."] + +[connection signal="area_entered" from="." to="." method="_on_area_entered"] +[connection signal="body_entered" from="." to="." method="_on_body_entered"] +[connection signal="finished" from="FlyingTone" to="." method="_on_flying_tone_finished"] +[connection signal="timeout" from="ShootTimer" to="." method="_on_shoot_timer_timeout"] diff --git a/scripts/game.gd b/scripts/game.gd index 9590e80..acb3427 100644 --- a/scripts/game.gd +++ b/scripts/game.gd @@ -1,7 +1,5 @@ extends Node2D -# TODO: MAYBE make ufo enemey that randomly flies in from ones side to the other - const COMET_SPAWNER = preload("res://scenes/comet_spawner.tscn") @export var level : int = 1 diff --git a/scripts/invader.gd b/scripts/invader.gd new file mode 100644 index 0000000..e1472e6 --- /dev/null +++ b/scripts/invader.gd @@ -0,0 +1,66 @@ +extends Area2D + +# TODO: Make a random spawner for invaders +# TODO: Give points if shot + +signal shot + +const BULLET = preload("res://scenes/bullet.tscn") + +@export var move_speed := 100.0 +var movement_direction := Vector2.ZERO +var random_position := Vector2.ZERO +var can_shoot := false +var viewport_size : Vector2 + +func _ready() -> void: + viewport_size = get_viewport_rect().size + + # I am sorry to who has to make sense of this + random_position.x = randi_range(1, 2) + if random_position.x == 2: + random_position.x = viewport_size.x-1 + movement_direction.x = -1 + else: + movement_direction.x = 1 + random_position.y = randi_range(32, viewport_size.y + 32) + position = random_position + + +func _process(delta: float) -> void: + position += move_speed * movement_direction * delta + + if can_shoot: + # FIXME: Proper shoot angle and not able to sudoku + shoot($GunMarker.global_position, randf_range(90.0, 100.0)) + + # "Die", if off screen + if position.x > viewport_size.x or position.x < 0: + queue_free() + +func _on_flying_tone_finished() -> void: + $FlyingTone.play() + +func _on_body_entered(body: Node2D) -> void: + if body.is_in_group("ship"): + body.crash() + +func _on_area_entered(area: Area2D) -> void: + if area.is_in_group("bullet"): + shot.emit() + crash() + +func shoot(pos : Vector2, rot : float) -> void: + var bullet := BULLET.instantiate() + bullet.position = pos + bullet.rotation = rot + $Projectiles.add_child(bullet) + $ShootSound.play() + can_shoot = false + $ShootTimer.start() + +func crash() -> void: + $AnimationPlayer.play("crash") + +func _on_shoot_timer_timeout() -> void: + can_shoot = true