Pygame. Как сделать так, чтобы игрок не мог проходить сквозь стены?

Иллюминат

Новичок
Пользователь
Авг 2, 2020
18
0
1
Windows 7
Python 3.7.0
Библиотека pygame 1.9.6

Файл main.py
Python:
import pygame as pg
from player import *
from feild_sc import *
from map import *


FPS = 60
clock = pg.time.Clock()

pg.init()
pg.mixer.init()
pg.display.set_caption('Green square')
icon = pg.image.load('icon.png')
pg.display.set_icon(icon)

game_end = False
while not game_end:

    for event in pg.event.get():
        if event.type == pg.QUIT:
            game_end = True


        if event.type == pg.KEYDOWN:
            if event.key == pg.K_LEFT:
                player.rect.x -= 30
            if event.key == pg.K_RIGHT:
                player.rect.x += 30
            if event.key == pg.K_UP:
                player.rect.y -= 30
            if event.key == pg.K_DOWN:
                player.rect.y += 30


    clock.tick(FPS)
    screen.fill((100, 100, 100))
    feild()
    pg.draw.rect(screen, player.green, (player.rect.x, player.rect.y, *player.size))
    walls()
    pg.display.update()
    pg.display.flip()

Файл map.py

Python:
import pygame as pg
from feild_sc import *

text_map = [
    'wwwwwwwwwwwwwwwwwwwwwwwwwww',
    'w..w......w.w....w........w',
    'w..www..www.w....w........w',
    'w..w....w........w...w....w',
    'w...........w........w....w',
    'wwwwwww....wwwwwww...www..w',
    'w.....w....w.....w........w',
    'w.....w....w.....w........w',
    'w..........ww.wwww........w',
    'w..wwwwwww................w',
    'w..w.....w........w.......w',
    'w..w.www.w.....wwww.......w',
    'w..w.....w................w',
    'w..w.wwwww..........wwwwwww',
    'w...................w.....w',
    'w...........w.w.....w.www.w',
    'w...........wwwwwwwww.w.w.w',
    'w...........w.w.....w...w.w',
    'w...................wwwww.w',
    'w...ww....................w',
    'w...................wwwwwww',
    'w.........................w',
    'w.........................w',
    'wwwwwwwwwwwwwwwwwwwwwwwwwww'
]

def walls():

    for index, value in enumerate(text_map):
        for index2, value2 in enumerate(value):
            if value2 == 'w':
                pg.draw.rect(screen, (0, 0, 150), (index2*30-1, index*30-1, 31, 31))

Файл player.py

Python:
import pygame as pg

class Player:
    def __init__(self):
        self.size = (31, 31)
        self.image = pg.Surface((31, 31))
        self.green = (0, 255, 0)
        self.image.fill(self.green)
        self.rect = self.image.get_rect()
        self.rect.x = 359
        self.rect.y = 359

player = Player()

Файл feild.py

Python:
import pygame as pg

x = 810
y = 720
screen = pg.display.set_mode((x, y))

def feild():
    for string in range(27):
        for row in range(24):
            y = row * 30
            x = string * 30
            pg.draw.rect(screen, (0, 0, 0), (x + 0.5, y + 0.5, 29, 29))

Здравствуйте. Я решил сделать игру на pygame , но не знаю, как сделать так, чтобы нельзя было проходить сквозь стены. Как это сделать? Сверху я написал файлы, которые находятся в моём проекте
 

Вложения

  • icon.png
    icon.png
    9,8 КБ · Просмотры: 4

floordiv

Пух
Команда форума
Модератор
Авг 14, 2020
21
7
3
Почитайте про коллизию. На вашем месте, я бы проверял, не является ли символ (куда игрок хочет переместиться) стеной
 

Иллюминат

Новичок
Пользователь
Авг 2, 2020
18
0
1
Почитайте про коллизию. На вашем месте, я бы проверял, не является ли символ (куда игрок хочет переместиться) стеной
Типо как-то так?(у меня после этого всё заработало) Я кое-что добавил в 3-х файлах

Файл main.py


Python:
import pygame as pg
from player import *
from feild_sc import *
from map import *


FPS = 60
clock = pg.time.Clock()

pg.init()
pg.mixer.init()
pg.display.set_caption('Green square')
icon = pg.image.load('icon.png')
pg.display.set_icon(icon)

game_end = False
while not game_end:

    for event in pg.event.get():
        if event.type == pg.QUIT:
            game_end = True


        if event.type == pg.KEYDOWN:
            if event.key == pg.K_LEFT:
                 if not (player.rect.x-30, player.rect.y) in wall_cords:
                    player.rect.x -= 30
            if event.key == pg.K_RIGHT:
                if not (player.rect.x+30, player.rect.y) in wall_cords:
                    player.rect.x += 30
            if event.key == pg.K_UP:
                if not (player.rect.x, player.rect.y-30) in wall_cords:
                    player.rect.y -= 30
            if event.key == pg.K_DOWN:
                if not (player.rect.x, player.rect.y+30) in wall_cords:
                    player.rect.y += 30


    clock.tick(FPS)
    screen.fill((100, 100, 100))
    feild()
    pg.draw.rect(screen, player.green, (player.rect.x, player.rect.y, *player.size))
    walls()
    pg.display.update()
    pg.display.flip()

Файл map.py

Python:
import pygame as pg
from feild_sc import *

text_map = [
    'wwwwwwwwwwwwwwwwwwwwwwwwwww',
    'w..w......w.w....w........w',
    'w..www..www.w....w........w',
    'w..w....w........w...w....w',
    'w...........w........w....w',
    'wwwwwww....wwwwwww...www..w',
    'w.....w....w.....w........w',
    'w.....w....w.....w........w',
    'w..........ww.wwww........w',
    'w..wwwwwww................w',
    'w..w.....w........w.......w',
    'w..w.www.w.....wwww.......w',
    'w..w.....w................w',
    'w..w.wwwww..........wwwwwww',
    'w...................w.....w',
    'w...........w.w.....w.www.w',
    'w...........wwwwwwwww.w.w.w',
    'w...........w.w.....w...w.w',
    'w...................wwwww.w',
    'w...ww....................w',
    'w...................wwwwwww',
    'w.........................w',
    'w.........................w',
    'wwwwwwwwwwwwwwwwwwwwwwwwwww'
]

wall_cords = []

def walls():

    for index, value in enumerate(text_map):
        for index2, value2 in enumerate(value):
            if value2 == 'w':
                pg.draw.rect(screen, (0, 0, 150), (index2*30-1, index*30-1, 31, 31))
                global wall_cords
                wall_cords.append((index2*30-1, index*30-1))

Файл player.py

Python:
import pygame as pg

class Player:
    def __init__(self):
        self.size = (31, 31)
        self.image = pg.Surface((31, 31))
        self.green = (0, 255, 0)
        self.image.fill(self.green)
        self.rect = self.image.get_rect()
        self.rect.x = 359
        self.rect.y = 359
        self.cords = (self.rect.x, self.rect.y)

player = Player()
 

Форум IT Специалистов