【问题标题】:How do I code a platformer generator that suits the map module I've created?如何编写适合我创建的地图模块的平台游戏生成器?
【发布时间】:2021-09-02 18:41:15
【问题描述】:

我最近一直在搞乱pygame,遇到了一个问题。我正在编写一个平台游戏,并为地图创建提供了一个类。在地图模块上,我有一个函数可以根据运动创建块 - 特别是相机的“滚动”。我的问题是我的游戏地图被划分在一个 16x16 块的网格上,而我的平台块是 48x16 像素,这可能是我网格上的 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

【问题讨论】:

    标签: python pygame sos


    【解决方案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 ])
    

    【讨论】:

    • 您的解决方案还不够(主要是因为我在发布我的问题时不够具体)但是您给了我一个更简单的方法来解决问题;只需为平台创建单独的图块,而不是 3x1 图块。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多