66
Έπειτα γίνεται έλεγχος για συγκρούσεις μεταξύ του παίκτη και των ενεργών εχθρών.
Αν ο παίκτης πατήσει SPACE, ο εχθρός θεωρείται ηττημένος, επανεμφανίζεται enemy.respawn
σε νέα θέση που δεν συγκρούεται με εμπόδια και αρχίζει να κινείται τυχαία
enemy.random_move(). Αν δεν πατηθεί το SPACE, τότε ο παίκτης δέχεται φθορά από τον
εχθρό. Το χρονόμετρο του εχθρού αυξάνεται με βάση τον χρόνο που έχει περάσει ανά καρέ και
για κάθε 1 δευτερόλεπτο, μειώνεται η ζωή του παίκτη.
#check if player collides with enemy
for enemy in enemies:
if not enemy.active:
continue
enemy_rect = pygame.Rect(enemy.pos.x, enemy.pos.y,
tile_size * 2, tile_size * 2)
if new_player_rect.colliderect(enemy_rect):
keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
print("Enemy defeated!")
# Deactivate the enemy if the player attacks
enemy.respawn(map_size,obstacles)
enemy.random_move(frame_time, screen_width,
screen_height,obstacles)
else:
#handle damage when colliding with enemy with a timer
enemy.collision_timer += frame_time
if enemy.collision_timer >= 1:
hearts_amount -= 1
enemy.collision_timer = 0
print("Attacked by enemy!")
Αν το χρονόμετρο collision_timer είναι μεγαλύτερο ή ίσο με 1, τότε υπολογίζεται ένα
διάνυσμα direction_vector από τον παίκτη προς τον εχθρό και αν το διάνυσμα έχει μήκος
μεγαλύτερο από μηδέν, κανονικοποιείται και ο εχθρός απωθείται μακριά από τον παίκτη.
Παράλληλα διασφαλίζεται ότι ο εχθρός παραμένει εντός των ορίων του χάρτη, αποτρέποντας
την έξοδο από την περιοχή του παιχνιδιού, με τη χρήση των συναρτήσεων max() και min(), οι
οποίες χρησιμοποιούνται για να περιοριστούν οι συντεταγμένες x και y του εχθρού.
#push the enemy away
if enemy.collision_timer >= 1:
direction_vector=pygame.Vector2(enemy.pos.x- player_pos.x, enemy.pos.y - player_pos.y)
if direction_vector.length() > 0:
direction_vector = direction_vector.normalize()
enemy.pos.x += direction_vector.x * tile_size * 10
enemy.pos.y += direction_vector.y * tile_size * 10
#make sure the enemy stays within map boundaries
enemy.pos.x=max(0,min(enemy.pos.x,(map_size- 1)* tile_size))
enemy.pos.y=max(0,min(enemy.pos.y,(map_size-1) * tile_size))