Live and let die (player death)

master
GreenXenith 2020-05-02 14:17:35 -07:00
parent 50980bedf4
commit e1d0133096
8 changed files with 88 additions and 29 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 16 KiB

26
src/fade.py Normal file
View File

@ -0,0 +1,26 @@
import pygame
class Fade():
def __init__(self, start, rate):
rect = pygame.display.get_surface().get_rect()
self.image = pygame.Surface(rect.size, flags=pygame.SRCALPHA)
self.alpha = start
self.rate = rate
self.text = ""
def update(self, surface, dtime):
self.alpha = max(0, min(self.alpha + int(self.rate * dtime), 255))
if self.alpha >= 0:
rect = pygame.display.get_surface().get_rect()
self.image = pygame.transform.scale(self.image, rect.size)
self.image.fill((0, 0, 0, self.alpha))
surface.blit(self.image, (0, 0))
text = pygame.font.SysFont("Times New Roman", round(rect.width / 16)).render(self.text, True, (255, 255, 255))
alphasurf = pygame.Surface(text.get_size(), pygame.SRCALPHA)
alphasurf.fill((255, 255, 255, self.alpha))
text.blit(alphasurf, (0, 0), special_flags=pygame.BLEND_RGBA_MULT)
surface.blit(text, (rect.width / 2 - text.get_rect().width / 2, rect.height / 2 - text.get_rect().height / 2))

View File

@ -21,7 +21,7 @@ SCALE = 2
METER = 32
FPS = 60
from . import controller, register, spritesheet, vector
from . import controller, fade, register, spritesheet, vector
from .map import Map
from .player import Player
@ -31,9 +31,7 @@ map = Map(METER)
map.generate(0)
# Player
player = Player(map)
player.texture = spritesheet.SpriteSheet(assets.get("character.png"), 32, 48)
player.rect = pygame.Rect(8, 32, 16, 16)
player = Player(spritesheet.SpriteSheet(assets.get("character.png"), 32, 48), pygame.Rect(8, 32, 16, 16))
# TODO: Use asset loader for spritesheets
player.texture.set_animation(0, 0, 0)
mroom = map.generators[0].rooms[int(math.ceil(len(map.generators[0].rooms) / 2))]
@ -42,7 +40,7 @@ player.set_pos(mroom.cx, mroom.cy)
CENTER = [winsize[0] / 2, winsize[1] / 2]
BGCOLOR = pygame.Color("#2d1003")
arial = pygame.font.SysFont("Arial", 10)
player.fade = fade.Fade(255, -96)
def get_screenpos(x, y):
return [
@ -119,4 +117,6 @@ while 1:
player.hud.render(screen, SCALE)
player.fade.update(screen, dtime)
pygame.display.update()

View File

@ -7,7 +7,7 @@ def make_element(defn, scale):
if defn["type"] == "text":
defaults = {
"font": "Arial",
"font": "Times New Roman",
"color": (255, 255, 255),
"size": 45,
}

View File

@ -129,3 +129,8 @@ class Map:
x += 0.5
return result
def reset(self):
self.map = []
self.sprites = []
self.generators = {}

View File

@ -1,34 +1,35 @@
import pygame
import math, time
from . import controller, rand, vector
from . import controller, map, rand, vector
from .vector import Vector
from .hud import Hud
class Player:
pos = Vector(0, 0)
z = 1
last_level_change = 0
def __init__(self, texture = "none.png", rect = pygame.Rect(0, 0, 0, 0)):
self.pos = Vector(0, 0)
self.z = 1
self.last_level_change = 0
rect = pygame.Rect(0, 0, 0, 0)
texture = "none.png"
self.rect = rect
self.texture = texture
hp = 30
xp = 0
coins = 0
self.hp = 15
self.dead = False
self.death_timer = 0
key = False
self.xp = 0
self.coins = 0
dir = 1
vel = Vector(0, 0)
look = Vector(1, 0)
self.key = False
speed = 3 # meters per second
self.dir = 1
self.vel = Vector(0, 0)
self.look = Vector(1, 0)
attacking = False
last_attack = 0
self.speed = 3 # meters per second
def __init__(self, map):
self.map = map # Bind to map for use later
self.attacking = False
self.last_attack = 0
# Add HUD info
self.hud = Hud()
@ -73,6 +74,21 @@ class Player:
self.pos = vector.vec_or_num(vec_or_x, y)
def update(self, dtime, map):
if self.dead:
self.death_timer += dtime
if self.death_timer >= 6:
map.reset()
map.generate(0)
self.__init__(self.texture, self.rect)
mroom = map.generators[0].rooms[int(math.ceil(len(map.generators[0].rooms) / 2))]
self.set_pos(mroom.cx, mroom.cy)
self.fade.text = "You died."
self.fade.rate = -64
self.fade.start = 255
return
# Input handling
self.vel = Vector(0, 0)
@ -131,7 +147,7 @@ class Player:
(0, -0.5),
]
at = self.pos + Vector(*dirs[self.dir])
slash = self.map.add_sprite(at.x, at.y, self.z, "player:slash")
slash = map.add_sprite(at.x, at.y, self.z, "player:slash")
slash.rot = ((self.dir + 1) % 4) * -90
slash.texture.set_animation(0, 3, 5)
@ -155,8 +171,6 @@ class Player:
item.amount = rand.rand(3, 6)
item.texture.set_animation(0, 4, 4)
self.attacking = True
else:
self.attacking = False
@ -167,5 +181,12 @@ class Player:
"text": self.hp
})
if self.hp == 0:
self.dead = True
self.texture.set_animation(16, 19, 8, False)
self.fade.rate = 96
self.fade.start = 0
self.fade.text = "You died."
def get_hp(self):
return self.hp

View File

@ -17,7 +17,7 @@ def slime_logic(self, dtime, map, player):
self.vel = vector.direction(self.pos, self.target_pos) * 1.5
if vector.distance(self.pos, player.pos) <= 1:
if rand(0, 20) == 0:
if rand(0, 15) == 0:
player.set_hp(player.hp - 2)
if self.target_pos == self.pos:

View File

@ -45,18 +45,20 @@ class SpriteSheet():
self.start = 0
self.end = total - 1
self.speed = speed
self.loop = True
spritesheets.append(self)
def minmax(self, frame):
return min(max(0, frame), self.xframes * self.yframes - 1)
def set_animation(self, start, end, speed):
def set_animation(self, start, end, speed, loop = True):
if self.start == start and self.end == end and self.speed == speed:
return
self.start = self.minmax(start)
self.end = self.minmax(end)
self.speed = max(0, speed)
self.loop = loop
self.frame_index = self.start
self.frame = self.frames[self.frame_index]
@ -68,7 +70,12 @@ class SpriteSheet():
if self.speed > 0 and self.clock >= 1 / self.speed:
self.clock = self.clock - 1 / self.speed
last_frame = self.frame_index
self.frame_index = max(self.start, (self.frame_index + 1) % (self.end + 1))
if not self.loop and last_frame == self.end and self.frame_index == self.start:
self.frame_index = self.end
self.frame = self.frames[self.frame_index]
def update(dtime):