diff --git a/Assets/Sprites/cross.png b/Assets/Sprites/cross.png new file mode 100644 index 0000000..fe41fdb Binary files /dev/null and b/Assets/Sprites/cross.png differ diff --git a/Assets/Sprites/cross.png.import b/Assets/Sprites/cross.png.import new file mode 100644 index 0000000..44788ca --- /dev/null +++ b/Assets/Sprites/cross.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tpths2rjfgbh" +path="res://.godot/imported/cross.png-fa240eff0c5791115699b08cead3dd87.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Sprites/cross.png" +dest_files=["res://.godot/imported/cross.png-fa240eff0c5791115699b08cead3dd87.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/Prefabs/bunny.tscn b/Prefabs/bunny.tscn new file mode 100644 index 0000000..172503b --- /dev/null +++ b/Prefabs/bunny.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=3 uid="uid://cpl4tllohhyel"] + +[ext_resource type="Script" path="res://Scripts/EntitySystem/Bunny.gd" id="1_1kj2b"] +[ext_resource type="Texture2D" uid="uid://tv804qpxy44n" path="res://Assets/Sprites/EvilBunny/bunny_down.png" id="2_80q10"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_sedmr"] + +[node name="Bunny" type="CharacterBody2D"] +collision_layer = 4 +collision_mask = 11 +script = ExtResource("1_1kj2b") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_80q10") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_sedmr") diff --git a/Prefabs/projectile.tscn b/Prefabs/projectile.tscn new file mode 100644 index 0000000..8cc4da1 --- /dev/null +++ b/Prefabs/projectile.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=4 format=3 uid="uid://csxh42o8twxwn"] + +[ext_resource type="Texture2D" uid="uid://tpths2rjfgbh" path="res://Assets/Sprites/cross.png" id="1_80ojj"] +[ext_resource type="Script" path="res://Scripts/WeaponSystem/Projectile.gd" id="1_os652"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_oix85"] +radius = 8.06226 + +[node name="Projectile" type="Area2D"] +scale = Vector2(0.7, 0.7) +collision_layer = 8 +collision_mask = 5 +script = ExtResource("1_os652") +map_collision_layer = 1 +bunny_collision_layer = 4 + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("1_80ojj") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_oix85") + +[connection signal="body_entered" from="." to="." method="_on_collision"] diff --git a/Scenes/WeaponSystem.tscn b/Scenes/WeaponSystem.tscn new file mode 100644 index 0000000..21a659c --- /dev/null +++ b/Scenes/WeaponSystem.tscn @@ -0,0 +1,165 @@ +[gd_scene load_steps=16 format=3 uid="uid://cd45icxf4gxpp"] + +[ext_resource type="TileSet" uid="uid://bj7uu2180mie3" path="res://Assets/Tileset.tres" id="1_m1wkd"] +[ext_resource type="Script" path="res://Scripts/MapGenerator.gd" id="2_emsq7"] +[ext_resource type="Script" path="res://Scripts/EntitySystem/BunnyGenerator.gd" id="3_6eopc"] +[ext_resource type="Script" path="res://Scripts/PlayerController.gd" id="3_i7s0m"] +[ext_resource type="Texture2D" uid="uid://bl7vfn05ul1vu" path="res://Assets/Sprites/Jesus/Jesus Spritesheet.png" id="4_a6mi0"] +[ext_resource type="PackedScene" uid="uid://cpl4tllohhyel" path="res://Prefabs/bunny.tscn" id="4_vn6q1"] +[ext_resource type="Script" path="res://Scripts/WeaponSystem/WeaponController.gd" id="6_fdum6"] +[ext_resource type="PackedScene" uid="uid://csxh42o8twxwn" path="res://Prefabs/projectile.tscn" id="7_5vpb2"] + +[sub_resource type="Animation" id="Animation_kdxam"] +resource_name = "Idle" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_dwpep"] +resource_name = "MoveDown" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = false +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3] +} + +[sub_resource type="Animation" id="Animation_2jvl5"] +resource_name = "MoveLeft" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [12, 13, 14, 15] +} + +[sub_resource type="Animation" id="Animation_4ig1u"] +resource_name = "MoveRight" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [4, 5, 6, 7] +} + +[sub_resource type="Animation" id="Animation_pswkh"] +resource_name = "MoveUp" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [8, 9, 10, 11] +} + +[sub_resource type="Animation" id="Animation_o3hln"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_bi1h3"] +_data = { +"Idle": SubResource("Animation_kdxam"), +"MoveDown": SubResource("Animation_dwpep"), +"MoveLeft": SubResource("Animation_2jvl5"), +"MoveRight": SubResource("Animation_4ig1u"), +"MoveUp": SubResource("Animation_pswkh"), +"RESET": SubResource("Animation_o3hln") +} + +[node name="Player Movement" type="Node2D"] + +[node name="Map Generator" type="TileMap" parent="."] +tile_set = ExtResource("1_m1wkd") +cell_quadrant_size = 32 +collision_visibility_mode = 1 +format = 2 +script = ExtResource("2_emsq7") +start_area_corner_size = 3 + +[node name="Bunny Generator" type="Node" parent="."] +script = ExtResource("3_6eopc") +bunny_prefab = ExtResource("4_vn6q1") + +[node name="Player" type="CharacterBody2D" parent="." node_paths=PackedStringArray("animation_player")] +position = Vector2(960, 512) +scale = Vector2(0.5, 0.5) +collision_layer = 0 +script = ExtResource("3_i7s0m") +speed = 60 +animation_player = NodePath("Player Animator") + +[node name="Player Sprite" type="Sprite2D" parent="Player"] +position = Vector2(0, -20) +texture = ExtResource("4_a6mi0") +hframes = 4 +vframes = 4 + +[node name="Player Collider" type="CollisionPolygon2D" parent="Player"] +polygon = PackedVector2Array(12, 32, -16, 32, -16, -24, 12, -24) + +[node name="Player Camera" type="Camera2D" parent="Player"] +zoom = Vector2(3, 3) +position_smoothing_enabled = true +drag_horizontal_enabled = true +drag_vertical_enabled = true +editor_draw_drag_margin = true + +[node name="Player Animator" type="AnimationPlayer" parent="Player"] +libraries = { +"": SubResource("AnimationLibrary_bi1h3") +} + +[node name="WeaponController" type="Node2D" parent="Player"] +script = ExtResource("6_fdum6") +projectile_prefab = ExtResource("7_5vpb2") diff --git a/Scripts/EntitySystem/Bunny.gd b/Scripts/EntitySystem/Bunny.gd new file mode 100644 index 0000000..f95b4b3 --- /dev/null +++ b/Scripts/EntitySystem/Bunny.gd @@ -0,0 +1,26 @@ +extends CharacterBody2D +class_name Bunny + +@export var health : int + +var team : int + +var on_death_callbacks : Array + +func damage(damage : int): + health -= health + if(health <= 0): on_death() + pass + +func heal(health : int): + health += health + pass + +func on_death(): + for callback in on_death_callbacks: + callback.call(self) + pass + +func sub_on_death(callback : Callable): + on_death_callbacks.push_front(callback) + pass diff --git a/Scripts/EntitySystem/BunnyGenerator.gd b/Scripts/EntitySystem/BunnyGenerator.gd new file mode 100644 index 0000000..71bcc9f --- /dev/null +++ b/Scripts/EntitySystem/BunnyGenerator.gd @@ -0,0 +1,17 @@ +extends Node + +@export var bunny_prefab : Resource +@onready var BunnyPrefab : PackedScene = load(bunny_prefab.resource_path) + +func spawn_bunny(x : float, y : float, team : int, health : int) -> Bunny: + var bunny = BunnyPrefab.instantiate() + self.add_child(bunny) + bunny.global_position = Vector2(x,y) + bunny.health = health + bunny.team = team + return bunny + +func _ready(): + var bunny = spawn_bunny(960, 512, TEAM.EVIL, 3) + bunny.sub_on_death(func(bunny): bunny.queue_free()) + diff --git a/Scripts/EntitySystem/TEAM.gd b/Scripts/EntitySystem/TEAM.gd new file mode 100644 index 0000000..ff383b8 --- /dev/null +++ b/Scripts/EntitySystem/TEAM.gd @@ -0,0 +1,5 @@ +class_name TEAM +enum { + EVIL = 0, + GOOD = 1 +} diff --git a/Scripts/WeaponSystem/Projectile.gd b/Scripts/WeaponSystem/Projectile.gd new file mode 100644 index 0000000..f36d4b2 --- /dev/null +++ b/Scripts/WeaponSystem/Projectile.gd @@ -0,0 +1,29 @@ +extends Area2D + +@export var speed : float = 250.0 +@export var damage : int = 1 + +@export_flags_2d_physics var map_collision_layer : int +@export_flags_2d_physics var bunny_collision_layer : int + +const bunny_script = preload("res://Scripts/EntitySystem/Bunny.gd") + +func _process(delta): + self.translate(Vector2(cos(self.rotation), sin(self.rotation)) * speed * delta) + pass + + +func _on_collision(body): + var collision_layer = null; + match body.get_class(): + "TileMap": + collision_layer = body.tile_set.get_physics_layer_collision_layer(0) + _: + if(body.has_method("get_collision_layer")): collision_layer = body.get_collision_layer() + + if collision_layer & map_collision_layer: + queue_free() + if collision_layer & bunny_collision_layer: + var bunny = body as Bunny + bunny.damage(damage) + queue_free() diff --git a/Scripts/WeaponSystem/WeaponController.gd b/Scripts/WeaponSystem/WeaponController.gd new file mode 100644 index 0000000..f3b93ec --- /dev/null +++ b/Scripts/WeaponSystem/WeaponController.gd @@ -0,0 +1,22 @@ +extends Node2D + +@export var projectile_prefab : Resource +@onready var projectilePrefab : PackedScene = load(projectile_prefab.resource_path) + +func _process(delta): + rotate_to_pointer() + + if Input.is_action_just_pressed("attack"): + spawn_projectile(self.global_position, self.rotation, 100, 1) + pass + +func rotate_to_pointer(): + look_at(get_global_mouse_position()) + #TODO Implement Joystick Aiming + +func spawn_projectile(pos : Vector2, dir : float, speed: float, damage : int): + var projectile = projectilePrefab.instantiate() + projectile.global_position = pos + projectile.rotation = dir + get_tree().root.add_child(projectile) + pass diff --git a/project.godot b/project.godot index 4d58277..d8c92a8 100644 --- a/project.godot +++ b/project.godot @@ -49,14 +49,23 @@ move_down={ , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) ] } +attack={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(139, 6),"global_position":Vector2(143, 49),"factor":1.0,"button_index":1,"pressed":true,"double_click":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) +] +} [layer_names] 2d_physics/layer_1="Map" 2d_physics/layer_2="Player" +2d_physics/layer_3="Bunny" +2d_physics/layer_4="Projectile" +2d_physics/layer_5="Layer 5" [rendering] +textures/canvas_textures/default_texture_filter=0 renderer/rendering_method="gl_compatibility" renderer/rendering_method.mobile="gl_compatibility" -textures/canvas_textures/default_texture_filter=0