Прокрутка фонов с помощью карты обнаружения столкновений Pygame - PullRequest
1 голос
/ 02 мая 2019

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

Размер каждой точки столкновения увеличивается с 16 на 16, до 1 на 1. Этооказалось довольно проблематичным, и любая помощь по исправлению будет принята с благодарностью

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

import pygame, sys

clock = pygame.time.Clock()

from pygame.locals import *
pygame.init() # initiates pygame

pygame.display.set_caption('The Game')

WINDOW_SIZE = (600,400)

screen = pygame.display.set_mode(WINDOW_SIZE,0,32)

display = pygame.Surface((300,200))

moving_right = False
moving_left = False
moving_up = False
moving_down = False

game_map = [['2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2'],
           ['2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2'],
           ['2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2'],
           ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
           ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
           ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
           ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
           ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
           ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
           ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
           ['2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2'],
           ['2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2','2'],
           ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0']]

player_rect = pygame.Rect(100,100,16,16)
black = (45,45,45)
black1 = (60,60,60)

def collision_test(rect,tiles):
   hit_list = []
   for tile in tiles:
       if rect.colliderect(tile):
           hit_list.append(tile)
   return hit_list

def move(rect,movement,tiles):
   collision_types = {'top':False,'bottom':False,'right':False,'left':False}
   rect.x += movement[0]
   hit_list = collision_test(rect,tiles)
   for tile in hit_list:
       if movement[0] > 0:
           rect.right = tile.left
           collision_types['right'] = True
       elif movement[0] < 0:
           rect.left = tile.right
           collision_types['left'] = True
   rect.y += movement[1]
   hit_list = collision_test(rect,tiles)
   for tile in hit_list:
       if movement[1] > 0:
           rect.bottom = tile.top
           collision_types['bottom'] = True
       elif movement[1] < 0:
           rect.top = tile.bottom
           collision_types['top'] = True
   return rect, collision_types

while True:
   display.fill((155,155,155))
   tile_rects = []
   y = 0
   for layer in game_map:
       x = 0
       for tile in layer: # tiles
           if tile == '2':
               pygame.draw.rect(display,black,(x*16-player_rect.x,y*16-player_rect.y,16,16))
           if tile != '0':
               tile_rects.append(pygame.Rect(x*16-player_rect.x,y*16-player_rect.y,16,16))
           x += 1
       y += 1

   player_movement = [0,0]
   if moving_right == True:
       player_movement[0] += 2
   if moving_left == True:
       player_movement[0] -= 2
   if moving_up == True:
       player_movement[1] -= 2
   if moving_down == True:
       player_movement[1] += 2
   player_rect,collisions = move(player_rect,player_movement,tile_rects)

   pygame.draw.rect(display,black1,(142,100,16,16)) #replacing the 142 and 100 with the rect.x and y, and remove the rect.x and y from the tiles, will make it work like the original


   for event in pygame.event.get(): # event loop
       if event.type == QUIT:
           pygame.quit()
           sys.exit()
       if event.type == KEYDOWN:
           if event.key == K_RIGHT:
               moving_right = True
           if event.key == K_LEFT:
               moving_left = True
           if event.key == K_UP:
               moving_up = True
           if event.key == K_DOWN:
               moving_down = True
       if event.type == KEYUP:
           if event.key == K_RIGHT:
               moving_right = False
           if event.key == K_LEFT:
               moving_left = False
           if event.key == K_UP:
               moving_up = False
           if event.key == K_DOWN:
               moving_down = False
   screen.blit(pygame.transform.scale(display,WINDOW_SIZE),(0,0))
   pygame.display.update()
   clock.tick(60)

Мой ожидаемый результат состоял в том, что точки столкновения не изменились и остались 16 на 16, к сожалению, вместо этого точки столкновения для плиток сократились до 1 на 1,приводит ко многим проблемам.

1 Ответ

3 голосов
/ 02 мая 2019

Ваш код немного сложен, но я понял, в чем проблема.

В вашей функции move вы меняете координаты player_rect, чтобы заставить его двигаться. Но затем, когда вы рисуете его (pygame.draw.rect(display,black1,(142,100,16,16))), вы рисуете его в центре. Таким образом, существует несоответствие между тем, что вы рисуете, и тем, что проверяется на движение.

Честно говоря, я не могу найти способ решить его, не изменив много кода.
Если вы хотите сохранить прокрутку фона, не перемещайте игрока, а перемещайте плитки в противоположном направлении. Я имею в виду, если игрок идет налево, переместите плитки вправо и т. Д.
В настоящее время вы создаете плитки каждую итерацию. Я бы рекомендовал создавать их вне основного цикла, а в цикле перемещать их (редактируя координаты их rect s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...