Live and let die (player death)
parent
50980bedf4
commit
e1d0133096
Binary file not shown.
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 16 KiB |
|
@ -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))
|
||||
|
||||
|
||||
|
10
src/game.py
10
src/game.py
|
@ -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()
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -129,3 +129,8 @@ class Map:
|
|||
x += 0.5
|
||||
|
||||
return result
|
||||
|
||||
def reset(self):
|
||||
self.map = []
|
||||
self.sprites = []
|
||||
self.generators = {}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue