Add loot placer, tweak player rendering, add tile on_step
parent
9b38556cb2
commit
1c8e852140
Binary file not shown.
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.6 KiB |
Binary file not shown.
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 4.2 KiB |
BIN
palette.png
BIN
palette.png
Binary file not shown.
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 1.4 KiB |
|
@ -93,13 +93,14 @@ while 1:
|
|||
# Only render tile if on-screen
|
||||
if pos[0] + scaledsize[0] >= 0 and pos[0] <= winsize[0] and \
|
||||
pos[1] + scaledsize[1] >= 0 and pos[1] <= winsize[1]:
|
||||
tile.on_step(dtime, map, player)
|
||||
screen.blit(pygame.transform.scale(texture, [math.floor(scaledsize[0]), math.ceil(scaledsize[1])]), pos)
|
||||
|
||||
# DEBUG
|
||||
# text = arial.render(str(int(x)) + ", " + str(int(y)), False, (255, 255, 255))
|
||||
# screen.blit(text, [x * 64 - (player.pos.x * round(SCALE * METER)) + camera[0], y * 64 - (player.pos.y * round(SCALE * METER)) + camera[1]])
|
||||
|
||||
if not player_rendered and z == 1 and y == round(player.pos.y + player.sprite.get_rect()[3] / METER):
|
||||
if not player_rendered and z == 1 and y == math.ceil(player.pos.y + 1 + player.sprite.get_rect()[3] / METER):
|
||||
# Draw player
|
||||
screen.blit(pygame.transform.scale(player.sprite.texture.frame, [round(SCALE * player.sprite.texture.width), round(SCALE * player.sprite.texture.height)]), camera)
|
||||
player_rendered = True
|
||||
|
|
20
src/loot.py
20
src/loot.py
|
@ -2,17 +2,27 @@ import random
|
|||
import time
|
||||
import math
|
||||
|
||||
MSIZE = 80
|
||||
|
||||
def rand(*args):
|
||||
random.seed(time.clock())
|
||||
return random.randint(*args)
|
||||
|
||||
class Placer():
|
||||
loot = [
|
||||
["loot_gold", 30],
|
||||
["loot_pile", 5]
|
||||
["loot:coins", 5],
|
||||
["loot:pile", 30],
|
||||
]
|
||||
|
||||
def populate(self, map):
|
||||
map["tiles"].append()
|
||||
if not map.generator:
|
||||
return
|
||||
|
||||
for room in map.generator.rooms:
|
||||
if rand(0, 2) != 0: # 1 in 3 chance of no loot
|
||||
for y in range(1, room.height - 2):
|
||||
for x in range(1, room.width - 1):
|
||||
placed = False
|
||||
for loot in self.loot:
|
||||
if not placed and rand(1, loot[1]) == 1: # 1 in n chance of placing
|
||||
map.set_tile(room.x + x, room.y + y, 1, loot[0])
|
||||
placed = True
|
||||
|
||||
|
|
13
src/map.py
13
src/map.py
|
@ -1,6 +1,6 @@
|
|||
import pygame
|
||||
import json, math
|
||||
from . import assets, dungeon, loot
|
||||
from . import assets, dungeon, loot, tiles
|
||||
from .tiles import Tile
|
||||
from .vector import Vector
|
||||
|
||||
|
@ -17,10 +17,11 @@ class Map:
|
|||
def generate(self):
|
||||
self.generator = dungeon.Generator(80)
|
||||
self.generator.generate(self)
|
||||
# self.placer = loot.Placer()
|
||||
# self.map = self.placer.populate(self.map)
|
||||
self.placer = loot.Placer()
|
||||
self.placer.populate(self)
|
||||
|
||||
def collides(self, pos, rect):
|
||||
# Player position handling really needs to be reworked ...
|
||||
METER = self.METER
|
||||
cx = pos.x + (rect[0] / METER)
|
||||
cy = pos.y + (rect[1] / METER)
|
||||
|
@ -47,8 +48,10 @@ class Map:
|
|||
for _ in range(len(self.map[z][y]), x + 1):
|
||||
self.map[z][y].append(None)
|
||||
|
||||
if name != "":
|
||||
self.map[z][y][x] = Tile(name)
|
||||
if not name:
|
||||
self.map[z][y][x] = None
|
||||
elif tiles.registered_tiles[name]:
|
||||
self.map[z][y][x] = Tile(name, (x, y, z))
|
||||
|
||||
def get_tile(self, x, y, z):
|
||||
try:
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
from . import tiles
|
||||
from .vector import Vector
|
||||
|
||||
tiles.register_tile("map:cobble", {
|
||||
tiles.register_tile("map:floor", {
|
||||
"textures": ["floor.png"],
|
||||
})
|
||||
|
||||
|
@ -31,10 +32,26 @@ tiles.register_tile("map:wall_corner_outer", {
|
|||
],
|
||||
})
|
||||
|
||||
def pick_up(self, dtime, map, player):
|
||||
METER = map.METER
|
||||
rect = player.sprite.get_rect()
|
||||
cx = player.pos.x + (rect[0] / METER)
|
||||
cy = player.pos.y + (rect[1] / METER)
|
||||
|
||||
cw = cx + (rect[2] / METER)
|
||||
ch = cy + (rect[3] / METER)
|
||||
|
||||
if cw >= self.pos[0] and cx <= (self.pos[0] + 1) and ch >= self.pos[1] and cy <= (self.pos[1] + 1):
|
||||
map.set_tile(*self.pos, None)
|
||||
|
||||
tiles.register_tile("loot:coins", {
|
||||
"textures": ["loot_gold.png"],
|
||||
"solid": False,
|
||||
"on_step": pick_up
|
||||
})
|
||||
|
||||
tiles.register_tile("loot:pile", {
|
||||
"textures": ["loot_pile.png"],
|
||||
"solid": False,
|
||||
"on_step": pick_up
|
||||
})
|
||||
|
|
11
src/tiles.py
11
src/tiles.py
|
@ -28,10 +28,13 @@ class Tile:
|
|||
solid = True
|
||||
rotation = 0
|
||||
|
||||
def __init__(self, name):
|
||||
def __init__(self, name, pos):
|
||||
self.name = name
|
||||
self.pos = pos
|
||||
for key in registered_tiles[name]:
|
||||
self.__dict__[key] = registered_tiles[name][key]
|
||||
value = registered_tiles[name][key]
|
||||
if not callable(value):
|
||||
setattr(self, key, value)
|
||||
|
||||
def get(self, key):
|
||||
try:
|
||||
|
@ -47,3 +50,7 @@ class Tile:
|
|||
|
||||
def is_solid(self):
|
||||
return self.get("solid") == True
|
||||
|
||||
def on_step(self, dtime, map, player):
|
||||
if "on_step" in registered_tiles[self.name]:
|
||||
registered_tiles[self.name]["on_step"](self, dtime, map, player)
|
||||
|
|
Loading…
Reference in New Issue