Nov-12-2019, 04:31 PM
Here is the whole thing. It runs and makes the map, puts my player and he can move around fine... he just ignores the walls entirely.
How do I "test for equality"? I've used "print" to look at what I know how to.
How do I "test for equality"? I've used "print" to look at what I know how to.
import pygame import random import time pygame.init() blue = (5, 5, 200) green = (4, 80, 4) red = (250, 0, 0) grey = (30, 30, 30) black = (0, 0, 0) brown = (100, 100, 5) width = 600 height = 600 tile_size = 25 wallimage = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/wall1.png") heroimage = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/hero_1.png") diggers = pygame.sprite.Group() players = pygame.sprite.Group() all_sprites = pygame.sprite.Group() base_tiles = pygame.sprite.Group() floor_tiles = pygame.sprite.Group() walls = pygame.sprite.Group() class Player(pygame.sprite.Sprite): def __init__(self, game, x, y): pygame.sprite.Sprite.__init__(self) self.game = game self.image = pygame.transform.scale(heroimage, (tile_size, tile_size)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y def move(self, dx=0, dy=0): if not self.collide_with_walls(dx, dy): self.rect.x += dx * tile_size self.rect.y += dy * tile_size def collide_with_walls(self, dx=0, dy=0): print(walls) for wall in walls: if wall.rect.x==self.rect.x + dx and wall.rect.y == self.rect.y + dy: return True return False def update(self): self.rect.x = self.x * TILESIZE self.rect.y = self.y * TILESIZE class Floor(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.game = game self.image = pygame.Surface((tile_size, tile_size)) self.image.fill(brown) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y class Base(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.game = game self.colour = grey self.image = pygame.draw.rect(game.window, (self.colour), (x, y, tile_size, tile_size), 0) self.rect = pygame.Rect(x, y, tile_size, tile_size) self.x = x self.y = y pygame.display.flip() class Wall(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.colour = red self.game = game self.image = pygame.transform.scale(wallimage, (tile_size, tile_size)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y pygame.display.flip() class Digger(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((tile_size, tile_size)) self.image.fill(red) self.rect = self.image.get_rect() #pygame.Rect(self.rectx, self.recty, tile_size, tile_size) self.rect.x = x self.rect.y = y def Make_map(): for x in range(0, width, tile_size): for y in range(0, height, tile_size): base = Base(x, y) base_tiles.add(base) digger = Digger((width / 2), (height / 2)) diggers.add(digger) all_sprites.add(digger) for i in range(70): (dx, dy) = random.choice([(0, tile_size), (0, -tile_size), (-tile_size, 0), (tile_size, 0)]) digger.rect.x = digger.rect.x + dx digger.rect.y = digger.rect.y + dy pygame.sprite.spritecollide(digger, floor_tiles, True) floor = Floor(digger.rect.x, digger.rect.y) all_sprites.add(floor) floor_tiles.add(floor) pygame.sprite.spritecollide(digger, base_tiles, True) all_sprites.draw(game.window) pygame.display.update() time.sleep(.01) for floor in floor_tiles: for delta_x, delta_y in ((tile_size, 0), (0, tile_size), (-tile_size, 0), (0, -tile_size), (-tile_size, tile_size), (tile_size, -tile_size), (-tile_size, -tile_size), (tile_size, tile_size)): floor.rect.x = floor.rect.x + delta_x floor.rect.y = floor.rect.y + delta_y hits = pygame.sprite.spritecollide(floor, base_tiles, False) floor.rect.x = floor.rect.x - delta_x floor.rect.y = floor.rect.y - delta_y for hit in hits: wall = Wall(hit.rect.x, hit.rect.y) all_sprites.add(wall) walls.add(wall) time.sleep(.01) floor = Floor((width / 2), (height / 2)) all_sprites.add(floor) floor_tiles.add(floor) class Game(): def __init__(self): pygame.init() self.window = pygame.display.set_mode((width, height)) pygame.display.set_caption("Dungeon") self.clock = pygame.time.Clock() pygame.key.set_repeat(500, 100) def New(self): Make_map() self.player = Player(game, (width / 2), (height / 2)) all_sprites.add(self.player) players.add(self.player) self.run() all_sprites.draw(window) pygame.display.flip() def run(self): playing = True while playing: self.update() self.draw() self.events() def quit(self): pygame.quit() sys.exit() def update(self): print("update") all_sprites.draw(game.window) def draw(self): print("draw") self.window.fill(black) all_sprites.draw(self.window) pygame.display.flip() def events(self): # catch all events here check = True while check: for event in pygame.event.get(): if event.type == pygame.QUIT: self.quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: self.quit() if event.key == pygame.K_LEFT: self.player.move(dx=-1) check = False if event.key == pygame.K_RIGHT: self.player.move(dx=1) check = False if event.key == pygame.K_UP: self.player.move(dy=-1) check = False if event.key == pygame.K_DOWN: self.player.move(dy=1) check = False game = Game() game.New()