From c1c439b7714759364ef68de006fd387ab749b26a Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Tue, 6 Apr 2021 00:28:17 -0700 Subject: [PATCH 1/3] More beautifull collision check --- Drakora.pyw | 3 +-- Player.py | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 25dd92b..03f43cd 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -240,9 +240,8 @@ class Drakora(): else: return 300 - def collideCheck(self): - if sum([1 if pygame.sprite.spritecollideany(i, self.enemies) else 0 for i in self.player.getCollisionBoxes()]): + if pygame.sprite.groupcollide(self.player.getCollisionBoxes(), self.enemies, None, None): if not self.isGodmode: self.isGameOver = True if self.player.isOnFloor: diff --git a/Player.py b/Player.py index 6df48cc..52edbc5 100644 --- a/Player.py +++ b/Player.py @@ -71,14 +71,14 @@ class Player(pygame.sprite.Sprite): self.gameSpeed = 1 self.updateCount = 0 - self.collisionBoxes = [] + self.collisionBoxes = pygame.sprite.Group() collision = CollisionBox(0, 20, 60, 20, self.rect.center) - self.collisionBoxes.append(collision) + self.collisionBoxes.add(collision) collision = CollisionBox(-10, 5, 30, 20, self.rect.center) - self.collisionBoxes.append(collision) + self.collisionBoxes.add(collision) collision = CollisionBox(0, 35, 25, 40, self.rect.center) - self.collisionBoxes.append(collision) + self.collisionBoxes.add(collision) def crouch(self): From c40653ed23198bc7af45f3413f55177f4fb39ebb Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Tue, 6 Apr 2021 01:25:25 -0700 Subject: [PATCH 2/3] Fix standing enemies collision --- CollisionBox.py | 3 +++ Drakora.pyw | 12 ++++++++---- Enemy.py | 9 +++++++++ StandingEnemy.py | 8 ++++++-- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/CollisionBox.py b/CollisionBox.py index 77ce5fc..33de459 100644 --- a/CollisionBox.py +++ b/CollisionBox.py @@ -19,3 +19,6 @@ class CollisionBox(pygame.sprite.Sprite): def setY(self, y): self.rect.y = y + self.offset[1] + + def setX(self, x): + self.rect.x = x + self.offset[0] diff --git a/Drakora.pyw b/Drakora.pyw index 03f43cd..b594119 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -178,10 +178,11 @@ class Drakora(): if self.drawBoxes: for player in self.players: - for collision in self.player.getCollisionBoxes(): + for collision in player.getCollisionBoxes(): pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1) for enemy in self.enemies: - pygame.draw.rect(self.screen, (255, 0, 0), enemy.rect, 1) + for collision in enemy.getCollisionBoxes(): + pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1) for floor in self.floors: pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1) @@ -241,8 +242,11 @@ class Drakora(): return 300 def collideCheck(self): - if pygame.sprite.groupcollide(self.player.getCollisionBoxes(), self.enemies, None, None): - if not self.isGodmode: self.isGameOver = True + for enemy in self.enemies: + if pygame.sprite.groupcollide(self.player.getCollisionBoxes(), enemy.getCollisionBoxes(), None, None): + if not self.isGodmode: + self.isGameOver = True + break if self.player.isOnFloor: self.player.rect.y += 1 diff --git a/Enemy.py b/Enemy.py index 3322e44..88d27f8 100644 --- a/Enemy.py +++ b/Enemy.py @@ -16,6 +16,12 @@ class Enemy(pygame.sprite.Sprite): self.height = (mainGameClass.getScreenHeight() - mainGameClass.getFloorHeight()) + self.collisionBoxes = pygame.sprite.Group() + + + def getCollisionBoxes(self): + return self.collisionBoxes + def update(self): if (self.rect.x < -self.rect.width): @@ -23,3 +29,6 @@ class Enemy(pygame.sprite.Sprite): self.thisGame.addScore(1) self.rect.x -= self.speed + + for i in self.collisionBoxes: + i.setX(self.rect.x) diff --git a/StandingEnemy.py b/StandingEnemy.py index d5f923d..d15384b 100644 --- a/StandingEnemy.py +++ b/StandingEnemy.py @@ -8,6 +8,7 @@ import random import os from Enemy import Enemy +from CollisionBox import CollisionBox class StandingEnemy(Enemy): @@ -73,9 +74,9 @@ class StandingEnemy(Enemy): image.set_colorkey((255,0,255)) - self.subtype = random.randint(1, len(StandingEnemy.images)) + self.subtype = random.randint(0, len(StandingEnemy.images) - 1) - self.image = random.choice(StandingEnemy.images[self.subtype-1]) + self.image = random.choice(StandingEnemy.images[self.subtype]) # if self.subtype == 1: self.image = pygame.Surface((32, 96)) # elif self.subtype == 2: self.image = pygame.Surface((32, 64)) @@ -91,4 +92,7 @@ class StandingEnemy(Enemy): self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, self.height) + collision = CollisionBox(9, 3, self.rect.w - 18, self.rect.h - 6, self.rect.center) + self.collisionBoxes.add(collision) + self.speed = self.thisGame.getGameSpeed() From 145bda62db86b15ed764fd1ad5961f5e2bda1ac8 Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Tue, 6 Apr 2021 01:31:59 -0700 Subject: [PATCH 3/3] Fix flying enemies collision --- FlyingEnemy.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/FlyingEnemy.py b/FlyingEnemy.py index ed16cce..31b0857 100644 --- a/FlyingEnemy.py +++ b/FlyingEnemy.py @@ -9,6 +9,7 @@ import math import os from Enemy import Enemy +from CollisionBox import CollisionBox class FlyingEnemy(Enemy): @@ -39,6 +40,9 @@ class FlyingEnemy(Enemy): self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, self.height) + collision = CollisionBox(2, 0, self.rect.w - 28, self.rect.h - 8, self.rect.center) + self.collisionBoxes.add(collision) + self.speed = self.thisGame.getGameSpeed()*2