From dd3774689105a9baa8bfb1e1ebc561668e0ea689 Mon Sep 17 00:00:00 2001 From: Skullheadx <704277@pdsb.net> Date: Tue, 12 Jul 2022 23:59:25 -0400 Subject: [PATCH] attack by itself done --- Assets/ARROW.png | Bin 677 -> 6168 bytes Enemy.py | 18 ++++++++---- Game.py | 7 ++++- Player.py | 2 +- RangedAttack.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++ Weapon.py | 2 +- 6 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 RangedAttack.py diff --git a/Assets/ARROW.png b/Assets/ARROW.png index d79c4e019d45ba8b8a8f5d92a982a36b634a8ca7..d0f2ac271e274fe4fb00fdba97648476d0b56c44 100644 GIT binary patch literal 6168 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 delta 426 zcmbPXu#|Ozay?^frn7T^r?ay{K~a8MW=<*tgT}<#iMAex9VFWBFY|KMQYsS=JQ*N+ zq-jOR;*gCTVqVb;L)j;L|6kzgJn7LRjU8e#eVXzVlf6QppI?_=(4%tC zg|0p2GT%Sk`@Zi^Ej!0oqu{fBoDNrYlqI{nX1-Y^QQ_Kwhw~UguI8{8i>9?@AQR7dW32W%a!Fk$|=r*GJ2bI~>JT>YnU+^GW)7 z(_yCbJd!V;*c5g|=xo_|=h&Kz6-O=~Np!uc5r1OGnu2?e)=XQyrqci4p#;BZ&%(La z1d<}0WH>t}1iEsjMs!?QS3faH$@6(2|NjM#{U>;&}EaIbJ^ee&br{|DvyXa8JT zGFzmFX|DdZzlKaKWsPoUx9#uG-CfA^V}7Id+NbNUG~V>Tl&z~%O{ z@`gtBSR)npPnU&0RX+IJvrm)z%YCN1*?IS8J-4W3xO8RpQ|Si}1SE6=zU?|Lw0rlh m-{10mH`m)w$S&GkcRJ(2WL0q^4t7B+L$9?9CryqQ-w6P-_sd!U diff --git a/Enemy.py b/Enemy.py index 2a24c12..49ef9a8 100644 --- a/Enemy.py +++ b/Enemy.py @@ -214,6 +214,7 @@ class Skeleton(Actor): # self.buffer.append(self.get_collision_rect()) # pg.draw.rect(surf, (0, 255, 0), get_display_rect(self.get_collision_rect()), 2) class King(Actor): + width, height = Actor.width * 2, Actor.height * 2 speed = Actor.speed * 0.4 jump_strength = Actor.jump_strength * 1.1 colour = (235, 64, 52) @@ -226,7 +227,7 @@ class King(Actor): attack_gif = Image.open("Assets/skeleton/skeleton_king_summon.gif") attack_frames = [] for i in range(attack_gif.n_frames): - attack_frames.append(pg.transform.scale(pil_to_game(get_gif_frame(attack_gif, i)), (180, 180))) + attack_frames.append(pg.transform.scale(pil_to_game(get_gif_frame(attack_gif, i)), (120, 180))) def __init__(self, pos, collision_layer, collision_mask): super().__init__(pos, collision_layer, collision_mask) @@ -241,9 +242,11 @@ class King(Actor): self.health = 1000 # for debugging without getting killed - self.weapon = Lightning(self.position, (-100 - self.width/2,0), self.width, -1) + self.weapon = Lightning(self.position, (-125 - self.width/2,0), self.width, -1) self.buffer = [] + self.attack_cooldown = random.randint(2,5) * 1000 + self.display_offsets = {"enemy":pg.Vector2(0,0)} self.current_frame = 0 @@ -252,15 +255,20 @@ class King(Actor): def update(self, delta, target=None): super().update(delta) - if not self.attacked and target is not None and self.stun_time == 0: + self.attack_cooldown -= delta + self.attack_cooldown = max(0, self.attack_cooldown) + + if self.attack_cooldown == 0 and not self.attacked and target is not None and self.stun_time == 0: # self.follow_target(target, follow_range=750,stop_dist=target.width/2+self.weapon.width) if not target.attacked and get_display_rect(self.weapon.get_collision_rect()).colliderect( get_display_rect(target.get_collision_rect())): if self.state != "ATTACK": self.state = "ATTACK" self.current_frame = 0 - elif 4 < self.current_frame: - target.attack(self, self.weapon, math.copysign(1, target.position.x - self.position.x)) + self.attack_cooldown = random.randint(2,5) * 1000 + if (self.state == "ATTACK") and (4 < self.current_frame) and (not self.attacked) and (target is not None) and (self.stun_time == 0) and (not target.attacked) and get_display_rect(self.weapon.get_collision_rect()).colliderect( + get_display_rect(target.get_collision_rect())): + target.attack(self, self.weapon, math.copysign(1, target.position.x - self.position.x)) # Deals with collision and applying velocity self.position, self.velocity = self.move_and_collide(self.position.copy(), self.velocity.copy(), delta) diff --git a/Game.py b/Game.py index 763a14a..48f90da 100644 --- a/Game.py +++ b/Game.py @@ -15,7 +15,7 @@ from UI.Dialogue import DialogueUI from UI.HealthBar import HealthBar from UI.PotionUI import PotionUI from World import World - +from RangedAttack import RangedAttack class Game: cloud_density = 1 / 100000 @@ -24,6 +24,7 @@ class Game: self.collision_layer = {"none": set(), "world": set(), "player": set(), "enemy": set(), "pet": set(), "body": set(), "potion": set(), "spike": set()} + # self.load_world(level) self.levels = [[], [], [3, 4]] @@ -109,10 +110,12 @@ class Game: pg.mixer.music.play(-1) except: pass; + self.test = RangedAttack((1650,1250),self.collision_layer["world"]) # def load_world(self, level): def update(self, delta): + self.test.update(delta) if self.paused == True: self.level = self.PauseMenu.level pass @@ -237,6 +240,8 @@ class Game: self.healthBar.draw(surf, self.player.health) self.potionUI.draw(surf, self.player.potion_bag, self.player.potion_cooldown) + self.test.draw(surf) + # print(self.player.get_collision_rect())s # Debug Lines. DO NOT CROSS THEM! # pg.draw.line(surf, (255, 0, 0), -Setup.camera_offset, pg.Vector2(SCREEN_WIDTH, -Setup.camera_offset.y), 10) diff --git a/Player.py b/Player.py index 0fe06eb..3ae919f 100644 --- a/Player.py +++ b/Player.py @@ -63,7 +63,7 @@ class Player(Actor): self.heal_layer = heals self.potion_cooldown = 0 - self.starting_potions = 3 + self.starting_potions = 1 self.potion_bag = [Potion(self)] for i in range(self.starting_potions - 1): self.potion_bag.append(Potion(self)) # use one liner diff --git a/RangedAttack.py b/RangedAttack.py new file mode 100644 index 0000000..68a5bcb --- /dev/null +++ b/RangedAttack.py @@ -0,0 +1,75 @@ +import random + +from Setup import * + +class RangedAttack: + attack_gif = Image.open("Assets/skeleton/portal.gif") + attack_frames = [] + for i in range(attack_gif.n_frames): + attack_frames.append(pg.transform.scale(pil_to_game(get_gif_frame(attack_gif, i)), (480, 320))) + def __init__(self, pos, ground): + self.position = pg.Vector2(pos) + self.timer = 0 + self.ground = ground + self.arrows = [] + self.anim_done = False + self.current_frame = 0 + self.display = self.attack_frames[self.current_frame] + + def update(self, delta): + self.timer += delta + if not self.anim_done: + self.display = self.attack_frames[math.floor(self.current_frame)] + self.current_frame = (self.current_frame + 0.1) + if math.floor(self.current_frame) >= self.attack_gif.n_frames - 1: + self.anim_done = True + if math.floor(self.current_frame) % 2 == 0 and random.random() < 0.5: + self.arrows.append(Arrow(self.position,(random.randint(-2,2),random.random() * 2), self.ground)) + + for arrow in self.arrows: + arrow.update(delta) + # return True + # return False + + def draw(self, surf): + # pg.draw.rect(surf, (255,0,0), pg.Rect(self.position, self.display.get_size())) + if not self.anim_done: + surf.blit(self.display, get_display_point(self.position - pg.Vector2(self.display.get_size()) / 2)) + + for arrow in self.arrows: + arrow.draw(surf) + + +class Arrow: + gravity = 0.098 + terminal_velocity = 1 + arrow = pg.transform.scale(pg.image.load("Assets/ARROW.png"), (60,60)) + + def __init__(self, pos, vel, ground): + self.position = pg.Vector2(pos) + self.velocity = pg.Vector2(vel) + self.time = 0 + self.display = self.arrow + self.ground = ground + self.in_ground = False + + def update(self, delta): + if self.in_ground: + return + for block in self.ground: + if block.get_collision_rect().colliderect(pg.Rect(self.position, self.display.get_size())): + self.in_ground = True + + + + self.velocity.y += self.gravity + + self.position.x += self.velocity.x * delta / 5 + self.position.y += self.velocity.y * delta / 5 + + self.time += delta + + self.display = pg.transform.rotate(pg.transform.flip(self.arrow,bool(math.copysign(1,self.velocity.x)-1),False), -math.copysign(1,self.velocity.x) * min(90, round(90/(500 ** 2) * self.time * self.time))) + + def draw(self, surf): + surf.blit(self.display, get_display_point(self.position)) diff --git a/Weapon.py b/Weapon.py index 74bedd4..c22ade9 100644 --- a/Weapon.py +++ b/Weapon.py @@ -94,7 +94,7 @@ class Sword: def draw(self, surf, display_offset = pg.Vector2(0,0)): surf.blit(self.display, get_display_rect(self.get_collision_rect()).topleft + display_offset) class Lightning: - width,height = (200,200) + width,height = (250,250) damage = -35 def __init__(self, pos, offset, width,direction): -- 2.54.0