Перемещение мозаичной карты в Pygame в соответствии с движением игроков - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу иметь возможность перемещать карту и персонажа 2D-игры, которую я делаю, я делаю плитки, выполняя это:

for x in range(20):
    for y in range(20):
        pygame.draw.rect(screen, white, (x*32,y*32,32,32), 2)

и перемещая карту, я делаю y + = 32но это не работает, и карта просто остается прежней.Так как же заставить карту двигаться, используя приведенный выше код!Мой вопрос отличается от вопроса с тегами, так как я просто хочу переместить карту, когда игрок нажимает W, A, S или D, используя приведенный выше код!Я попытался добавить ширину и высоту плитки, которые составляют 32 пикселя к целым числам x и y, но некоторые поля не отображаются.

Вот мой полный код: Main.py

import pygame, math
from scripts.Engine import *

black = (0,0,0)
white = (255,255,255)
blue = (0,0,255)


pygame.init()

size = (600,600)
width = size[0]
height = size[1]
screen = pygame.display.set_mode((size), pygame.RESIZABLE)
face = "North"

playerN = pygame.image.load("Sprites\\Uplayer.png")
playerS = pygame.image.load("Sprites\\Dplayer.png")
playerE = pygame.image.load("Sprites\\Rplayer.png")
playerW = pygame.image.load("Sprites\\Lplayer.png")


grass = pygame.image.load("Tiles\\grass.png")

camera_x = 0
camera_y = 0
TileSize = 32
player_w, player_h = 40, 52
player_x = (width / 2 - player_w / 2 - camera_x) / TileSize
player_y = (height / 2 - player_h / 2 - camera_y) / TileSize

while True:
    screen.fill(blue)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
    Engine.Map(screen, 20, 20, grass, 32)
    move = pygame.key.get_pressed()
    if move[pygame.K_w]:
        face = "North"
        camera_y -= 32 # Move map This doesnt work
        player_y -= 10 # Move Sprite around map This works
    elif move[pygame.K_s]:
        camera_y += 32
        player_y += 10
        face = "South"
    elif move[pygame.K_a]:
        face = "West"
        camera_x -= 32
        player_x -= 10
    elif move[pygame.K_d]:
        face = "East"
        camera_x += 32
        player_x += 10


    if face == "North":
        screen.blit(playerN, (player_x, player_y))
    elif face == "South":
        screen.blit(playerS, (player_x, player_y))
    elif face == "East":
        screen.blit(playerE, (player_x, player_y))
    elif face == "West":
        screen.blit(playerW, (player_x, player_y))
    pygame.display.flip()

Движок игры: здесь сделаны плитки

import pygame

class Engine:

    def Map(surface, w, h, tileType,TileSize):
        global x,y
        for x in range(w):
            for y in range(h):
                surface.blit(tileType, (x*TileSize,y*TileSize))

Это мой полный код, пока я могу перемещать игрока, но не сами плитки, я не знаю, почему

1 Ответ

0 голосов
/ 14 декабря 2018

Я понял это, но когда я двигаюсь вверх или влево, карта продолжает генерироваться после того, как сумма карты в настоящее время составляет 40, но она будет продолжать создавать плитки.Но когда я иду вниз или вправо, он показывает синий экран за плитками, когда я добираюсь до последней плитки.Я напишу еще один вопрос о том, как это исправить.

Main.py:

import pygame, math
from scripts.Engine import *

black = (0,0,0)
white = (255,255,255)
blue = (0,0,255)

pygame.init()

size = (600,600)
width = size[0]
height = size[1]
screen = pygame.display.set_mode((size), pygame.RESIZABLE)
face = "North"

playerN = pygame.image.load("Sprites\\Uplayer.png")
playerS = pygame.image.load("Sprites\\Dplayer.png")
playerE = pygame.image.load("Sprites\\Rplayer.png")
playerW = pygame.image.load("Sprites\\Lplayer.png")


grass = pygame.image.load("Tiles\\grass.png")

TileSize = 32
player_w, player_h = 40, 52
player_x = (width / 2 - player_w / 2 - camera_x) / TileSize
player_y = (height / 2 - player_h / 2 - camera_y) / TileSize

mapW = camera_x
mapH = camera_y

while True:
    print(camera_x, camera_y)
    screen.fill(blue)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
    Engine.Map(screen, camera_x, camera_y, grass, 32, camera_x, camera_y)
    move = pygame.key.get_pressed()
    if move[pygame.K_w]:
        if camera_x > mapH:
            pass
        else:
            face = "North"
            camera_y += 1 # Move map This doesnt work
    elif move[pygame.K_s]:
        camera_y -= 1
        face = "South"
    elif move[pygame.K_a]:
        face = "West"
        if camera_x > mapW:
            pass
        else:
            camera_x += 1
    elif move[pygame.K_d]:
        face = "East"
        camera_x -= 1
        #player_x += 10


    if face == "North":
        screen.blit(playerN, (player_x, player_y))
    elif face == "South":
        screen.blit(playerS, (player_x, player_y))
    elif face == "East":
        screen.blit(playerE, (player_x, player_y))
    elif face == "West":
        screen.blit(playerW, (player_x, player_y))
    pygame.display.flip()

Game Engine.py:

import pygame

class Engine:

    def Map(surface, w, h, tileType,TileSize, camera_x, camera_y):
        for x in range(w):
            for y in range(h):
                surface.blit(tileType, (x*TileSize,y*TileSize))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...