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
|
# Only render tile if on-screen
|
||||||
if pos[0] + scaledsize[0] >= 0 and pos[0] <= winsize[0] and \
|
if pos[0] + scaledsize[0] >= 0 and pos[0] <= winsize[0] and \
|
||||||
pos[1] + scaledsize[1] >= 0 and pos[1] <= winsize[1]:
|
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)
|
screen.blit(pygame.transform.scale(texture, [math.floor(scaledsize[0]), math.ceil(scaledsize[1])]), pos)
|
||||||
|
|
||||||
# DEBUG
|
# DEBUG
|
||||||
# text = arial.render(str(int(x)) + ", " + str(int(y)), False, (255, 255, 255))
|
# 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]])
|
# 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
|
# Draw player
|
||||||
screen.blit(pygame.transform.scale(player.sprite.texture.frame, [round(SCALE * player.sprite.texture.width), round(SCALE * player.sprite.texture.height)]), camera)
|
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
|
player_rendered = True
|
||||||
|
|
20
src/loot.py
20
src/loot.py
|
@ -2,17 +2,27 @@ import random
|
||||||
import time
|
import time
|
||||||
import math
|
import math
|
||||||
|
|
||||||
MSIZE = 80
|
|
||||||
|
|
||||||
def rand(*args):
|
def rand(*args):
|
||||||
random.seed(time.clock())
|
random.seed(time.clock())
|
||||||
return random.randint(*args)
|
return random.randint(*args)
|
||||||
|
|
||||||
class Placer():
|
class Placer():
|
||||||
loot = [
|
loot = [
|
||||||
["loot_gold", 30],
|
["loot:coins", 5],
|
||||||
["loot_pile", 5]
|
["loot:pile", 30],
|
||||||
]
|
]
|
||||||
|
|
||||||
def populate(self, map):
|
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 pygame
|
||||||
import json, math
|
import json, math
|
||||||
from . import assets, dungeon, loot
|
from . import assets, dungeon, loot, tiles
|
||||||
from .tiles import Tile
|
from .tiles import Tile
|
||||||
from .vector import Vector
|
from .vector import Vector
|
||||||
|
|
||||||
|
@ -17,10 +17,11 @@ class Map:
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.generator = dungeon.Generator(80)
|
self.generator = dungeon.Generator(80)
|
||||||
self.generator.generate(self)
|
self.generator.generate(self)
|
||||||
# self.placer = loot.Placer()
|
self.placer = loot.Placer()
|
||||||
# self.map = self.placer.populate(self.map)
|
self.placer.populate(self)
|
||||||
|
|
||||||
def collides(self, pos, rect):
|
def collides(self, pos, rect):
|
||||||
|
# Player position handling really needs to be reworked ...
|
||||||
METER = self.METER
|
METER = self.METER
|
||||||
cx = pos.x + (rect[0] / METER)
|
cx = pos.x + (rect[0] / METER)
|
||||||
cy = pos.y + (rect[1] / METER)
|
cy = pos.y + (rect[1] / METER)
|
||||||
|
@ -47,8 +48,10 @@ class Map:
|
||||||
for _ in range(len(self.map[z][y]), x + 1):
|
for _ in range(len(self.map[z][y]), x + 1):
|
||||||
self.map[z][y].append(None)
|
self.map[z][y].append(None)
|
||||||
|
|
||||||
if name != "":
|
if not name:
|
||||||
self.map[z][y][x] = Tile(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):
|
def get_tile(self, x, y, z):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from . import tiles
|
from . import tiles
|
||||||
|
from .vector import Vector
|
||||||
|
|
||||||
tiles.register_tile("map:cobble", {
|
tiles.register_tile("map:floor", {
|
||||||
"textures": ["floor.png"],
|
"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", {
|
tiles.register_tile("loot:coins", {
|
||||||
"textures": ["loot_gold.png"],
|
"textures": ["loot_gold.png"],
|
||||||
|
"solid": False,
|
||||||
|
"on_step": pick_up
|
||||||
})
|
})
|
||||||
|
|
||||||
tiles.register_tile("loot:pile", {
|
tiles.register_tile("loot:pile", {
|
||||||
"textures": ["loot_pile.png"],
|
"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
|
solid = True
|
||||||
rotation = 0
|
rotation = 0
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name, pos):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.pos = pos
|
||||||
for key in registered_tiles[name]:
|
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):
|
def get(self, key):
|
||||||
try:
|
try:
|
||||||
|
@ -47,3 +50,7 @@ class Tile:
|
||||||
|
|
||||||
def is_solid(self):
|
def is_solid(self):
|
||||||
return self.get("solid") == True
|
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