Add tilemap support, add map border collision

This commit is contained in:
eugenep 2021-04-10 12:44:54 +02:00
parent d0d7376ad8
commit 63cc9c0ab2
5 changed files with 100 additions and 29 deletions

55
grid.py Normal file
View File

@ -0,0 +1,55 @@
from copy import copy, deepcopy
class Grid:
#def __init__(self, width, height, locationGrid=[[]], graph={}, translationGrid)=:
def __init__(self, width, height):
self.width = width
self.heigth = height
self.locationGrid = [[0 for x in range(width)] for y in range(height)]
#self.locationGrid = []
self.graph={}
self.translationGrid = [[0 for x in range(width)] for y in range(height)]
def fillTraslationGrid(self):
self.translationGrid[0] = ['0x0', '0x1', '0x2', '0x3', '0x4', '0x5']
self.translationGrid[1] = ['1x0', '1x1', '1x2', '1x3', '1x4', '1x5']
self.translationGrid[2] = ['2x0', '2x1', '2x2', '2x3', '2x4', '2x5']
self.translationGrid[3] = ['3x0', '3x1', '3x2', '3x3', '3x4', '3x5']
self.translationGrid[4] = ['4x0', '4x1', '4x2', '4x3', '4x4', '4x5']
self.translationGrid[5] = ['5x0', '5x1', '5x2', '5x3', '5x4', '5x5']
def fillLocationGrid(self):
pass
"""self.locationGrid[0] =
self.locationGrid[1] =
self.locationGrid[2] =
self.locationGrid[3] =
self.locationGrid[4] =
self.locationGrid[5] = """
def printLocationGrid(self):
for r in self.locationGrid:
for c in r:
print(c, end = " ")
print()
def copyLocationGrid(self, x):
self.locationGrid = deepcopy(x)
def printTranslationGrid(self):
for r in self.translationGrid:
for c in r:
print(c, end = " ")
print()
def printGraph(self):
print(self.graph)
def setLocationGridCell(self, x, y, value):
self.locationGrid[x][y] = value
def setTranslationGridCell(self, x, y, value):
self.translationGrid[x][y] = value

37
main.py
View File

@ -1,5 +1,7 @@
import pygame as pg
import sys
from os import path
from grid import *
from settings import *
from sprites import *
@ -13,23 +15,26 @@ class Game:
self.load_data()
def load_data(self):
pass
game_folder = path.dirname(__file__)
self.map_data = []
with open(path.join(game_folder, 'map.txt'), 'rt') as f:
for line in f:
self.map_data.append(line)
def new(self):
# initialize all variables and do all the setup for a new game
self.all_sprites = pg.sprite.Group()
self.walls = pg.sprite.Group()
self.player = Player(self, 1, 1)
self.mine1 = Mine(self, 8, 6)
self.mine2 = Mine(self, 7, 6)
self.mine3 = Mine(self, 2, 3)
self.grenade1 = Grenade(self, 1, 8)
self.grenade2 = Grenade(self, 3, 4)
self.grenade3 = Grenade(self, 9, 5)
self.bomb1 = Bomb(self, 6, 7)
self.bomb2 = Bomb(self, 3, 3)
self.bomb3 = Bomb(self, 4, 9)
for row, tiles in enumerate(self.map_data):
for col, tile in enumerate(tiles):
if tile == '2':
Mine(self, col, row)
if tile == '3':
Bomb(self, col, row)
if tile == '4':
Grenade(self, col, row)
if tile == 'A':
self.player = Player(self, col, row)
def run(self):
@ -55,14 +60,6 @@ class Game:
for y in range(0, HEIGHT, TILESIZE):
pg.draw.line(self.screen, LIGHTGREY, (0, y), (WIDTH, y))
def draw_grid(self):
for x in range(0, WIDTH, TILESIZE):
pg.draw.line(self.screen, LIGHTGREY, (x, 0), (x, HEIGHT))
for y in range(0, WIDTH, TILESIZE):
pg.draw.line(self.screen, LIGHTGREY, (0, y), (WIDTH, y))
def draw(self):
self.screen.fill(BGCOLOR)
self.draw_grid()

4
map.txt Normal file
View File

@ -0,0 +1,4 @@
.A....
..222.
.222..
......

View File

@ -8,12 +8,14 @@ RED = (255, 0, 0)
YELLOW = (255, 255, 0)
# game settings
WIDTH = 800 # 16 * 64 or 32 * 32 or 64 * 16
HEIGHT = 600 # 16 * 48 or 32 * 24 or 64 * 12
MAP_SIZE = 6
TILESIZE = 100
WIDTH = TILESIZE * MAP_SIZE # 16 * 64 or 32 * 32 or 64 * 16
HEIGHT = TILESIZE * MAP_SIZE # 16 * 48 or 32 * 24 or 64 * 12
FPS = 60
TITLE = "Sweeper Demo"
BGCOLOR = DARKGREY
TILESIZE = 50
GRIDWIDTH = WIDTH / TILESIZE
GRIDHEIGHT = HEIGHT / TILESIZE

View File

@ -22,19 +22,23 @@ class Player(pg.sprite.Sprite):
if direction == self.direction:
if self.direction == Direction.Right.name:
if dx > 0:
self.x += dx
if self.check_border(dx):
self.x += dx
if self.direction == Direction.Up.name:
if dy < 0:
self.y += dy
if self.check_border(0, dy):
self.y += dy
if self.direction == Direction.Down.name:
if dy > 0:
self.y += dy
if self.check_border(0, dy):
self.y += dy
if self.direction == Direction.Left.name:
if dx < 0:
self.x += dx
if self.check_border(dx):
self.x += dx
elif direction != self.direction:
self.direction = direction
@ -47,7 +51,16 @@ class Player(pg.sprite.Sprite):
self.image == pg.transform.rotate(self.baseImage, -90)
if self.direction == Direction.Left.name:
self.image == pg.transform.rotate(self.baseImage, -180)"""
def check_border(self, dx=0, dy=0):
if (self.x + dx) < 0 or (self.y + dy) < 0 or (self.x + dx) >= MAP_SIZE or (self.y + dy) >= MAP_SIZE :
return False
else:
return True
def collide_with_walls(self, dx=0, dy=0):
pass
def update(self):
self.rect.x = self.x * TILESIZE
@ -60,7 +73,7 @@ class Direction(enum.Enum):
Down = 3;
Right = 4;
class Mine(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites