#python #pygame #sos
Вопрос:
В последнее время я возился с pygame
этим, и я столкнулся с проблемой. Я пишу платформер, и я дал класс для создания карты. В модуле карты у меня есть функция, которая создает фрагменты на основе движения-в частности, «прокрутки» камеры. Моя проблема в том, что моя игровая карта разделена на сетку из 16х16 плиток, а плитки моей платформы имеют размер 48х16 пикселей, что может составлять 3 плитки в моей сетке. Я действительно не знаю, как заставить мой код понять, что это 3 плитки, поэтому я могу случайным образом генерировать платформы по мере роста игрока. Дайте мне знать, если вы знаете, как это реализовать.
import pygame, sys, random
from pygame.locals import *
class Map:
def __init__(self):
self.path_img = pygame.image.load("assets/imgs/path.png").convert()
self.walls_img = pygame.image.load("assets/imgs/walls.png").convert()
self.mossy_wall_img = pygame.image.load("assets/imgs/mossy_wall.png").convert()
self.game_map = {}
self.TILE_SIZE = self.walls_img.get_width()
self.CHUNK_SIZE = 8
self.tile_index = {1:self.path_img,
2:self.walls_img,
3:self.mossy_wall_img}
self.platforms = []
def draw_map(self, screen, scroll):
self.tile_rects = []
for y in range(3):
for x in range(4):
self.target_x = x - 1 int(round(scroll[0]/(self.CHUNK_SIZE*16)))
self.target_y = y - 1 int(round(scroll[1]/(self.CHUNK_SIZE*16)))
self.target_chunk = str(self.target_x) ';' str(self.target_y)
if self.target_chunk not in self.game_map:
self.game_map[self.target_chunk] = self.generate_chunk(self.target_x,self.target_y)
for tile in self.game_map[self.target_chunk]:
screen.blit(self.tile_index[tile[1]],(tile[0][0]*16-scroll[0],tile[0][1]*16-scroll[1]))
if tile[1] in [1,2,3,4]:
self.tile_rects.append(pygame.Rect(tile[0][0]*16,tile[0][1]*16,16,16))
def generate_chunk(self,x,y):
self.chunk_data = []
platform = False
for y_pos in range(self.CHUNK_SIZE):
for x_pos in range(self.CHUNK_SIZE):
self.target_x = x * self.CHUNK_SIZE x_pos
self.target_y = y * self.CHUNK_SIZE y_pos
tile_type = 0
if self.target_x > 30:
if random.randint(1,5) == 1:
tile_type = 3
else:
tile_type = 2
if self.target_x < 0:
if random.randint(1,5) == 1:
tile_type = 3
else:
tile_type = 2
if self.target_y > 10:
if random.randint(1,5) == 1:
tile_type = 3
else:
tile_type = 2
if self.target_y == 10:
if self.target_x > 30 or self.target_x < 0:
if random.randint(1,5) == 1:
tile_type = 3
else:
tile_type = 2
else:
tile_type = 1
if self.target_y < 10 and self.target_x < 30 and self.target_x > 0:
if random.randint(1,100) == 1:
platform = True
if tile_type != 0:
self.chunk_data.append([[self.target_x, self.target_y],tile_type])
if platform:
self.chunk_data.append([[self.target_x, self.target_y],1])
self.chunk_data.append([[self.target_x 1, self.target_y],1])
self.chunk_data.append([[self.target_x 2, self.target_y],1])
return self.chunk_data
Ответ №1:
Нужно было бы увидеть, как он сгенерирован, чтобы получить лучшую идею. Что-то подобное может сработать, но тогда я предполагаю, что вы хотели бы, чтобы ваш CHUNK_SIZE
размер был равномерно делим на 3, так self.CHUNK_SIZE = 9
что вместо этого?
for y_pos in range( self.CHUNK_SIZE ):
for x_pos in range( self.CHUNK_SIZE /3 ):
...
self.target_x = x *self.CHUNK_SIZE x_pos *3
...
if tile_type != 0:
self.chunk_data.append([ [ self.target_x, self.target_y ], tile_type ])
self.chunk_data.append([ [ self.target_x 1, self.target_y ], tile_type 1 ])
self.chunk_data.append([ [ self.target_x 2, self.target_y ], tile_type 2 ])
Комментарии:
1. Вашего решения было недостаточно (главным образом потому, что я не был достаточно конкретен при публикации своей проблемы), но вы дали мне более простой способ подойти к проблеме; просто создайте отдельные плитки для платформ, а не плитки 3×1. Спасибо!