Python 使用图片绘制墙壁地图

Python 使用图片绘制墙壁地图,python,pygame,Python,Pygame,我想知道是否可以使用图片地图在我的游戏中创建实心墙,示例如下: 我该如何制作一个程序,根据图片上的黑墙位置生成地图 虽然到目前为止,Iv只是简单地使用python.draw绘制线条,但它已经研究了一段时间了。我还研究了海龟的使用,但我认为这不是我目前对程序的期望。你可以读取每个像素的颜色值 最简单的方法是对类使用函数,但要获得更多功能和性能,还可以使用或模块 另一种方法是从图像中创建一个碰撞检测,并将其用于碰撞检测 下面是一个简单、刻薄但有效的示例: import pygame class

我想知道是否可以使用图片地图在我的游戏中创建实心墙,示例如下:

我该如何制作一个程序,根据图片上的黑墙位置生成地图


虽然到目前为止,Iv只是简单地使用python.draw绘制线条,但它已经研究了一段时间了。我还研究了海龟的使用,但我认为这不是我目前对程序的期望。

你可以读取每个像素的颜色值

最简单的方法是对类使用函数,但要获得更多功能和性能,还可以使用或模块

另一种方法是从图像中创建一个碰撞检测,并将其用于碰撞检测

下面是一个简单、刻薄但有效的示例:

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, image, pos, background):
        super().__init__()
        self.image = image
        self.pos = pygame.Vector2(pos)
        self.rect = self.image.get_rect(center=self.pos)
        self.background = background

    def update(self, events, dt):
        pressed = pygame.key.get_pressed()
        move = pygame.Vector2((0, 0))
        if pressed[pygame.K_w]: move += (0, -1)
        if pressed[pygame.K_a]: move += (-1, 0)
        if pressed[pygame.K_s]: move += (0, 1)
        if pressed[pygame.K_d]: move += (1, 0)
        if move.length() > 0: move.normalize_ip()

        new_pos = self.pos + move*(dt/5)
        new_rect = self.rect.copy()
        new_rect.center = new_pos
        new_rect.clamp_ip(self.background.get_rect())
        new_pos = new_rect.center

        hit_box = self.background.subsurface(new_rect)
        for x in range(new_rect.width):
            for y in range(new_rect.height):
                if sum(hit_box.get_at((x, y))) < 500:
                    return

        self.pos = new_pos
        self.rect.center = self.pos

def main():
    pygame.init()
    screen = pygame.display.set_mode((284, 384))
    screen_rect = screen.get_rect()

    clock = pygame.time.Clock()
    sprites = pygame.sprite.Group()

    background = pygame.transform.scale2x(pygame.image.load('maze.jpg'))
    pimg = pygame.Surface((10, 10))
    pimg.fill((200, 20, 20))
    sprites.add(Player(pimg, (50, 50), background))

    dt = 0
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return

        sprites.update(events, dt)
        screen.fill(pygame.Color('grey'))
        screen.blit(background, (0, 0))
        sprites.draw(screen)
        pygame.display.flip()
        dt = clock.tick(60)

if __name__ == '__main__':
    main()
导入pygame
职业玩家(pygame.sprite.sprite):
定义初始(自身、图像、位置、背景):
super()。\uuuu init\uuuuu()
self.image=image
self.pos=pygame.Vector2(pos)
self.rect=self.image.get_rect(中心=self.pos)
self.background=背景
def更新(自身、事件、dt):
pressed=pygame.key.get_pressed()
move=pygame.Vector2((0,0))
如果按下[pygame.K_w]:移动+=(0,-1)
如果按下[pygame.K_a]:移动+=(-1,0)
如果按下[pygame.K_s]:移动+=(0,1)
如果按下[pygame.K_d]:移动+=(1,0)
如果move.length()>0:move.normalize_ip()
新位置=自身位置+移动*(dt/5)
new_rect=self.rect.copy()
新建直线中心=新建位置
new_-rect.clamp_-ip(self.background.get_-rect())
新建位置=新建直线中心
点击框=self.background.subground(新建)
对于范围内的x(新矩形宽度):
对于范围内的y(新的垂直高度):
如果总和(点击方框,在((x,y))<500时获得:
返回
self.pos=新位置
self.rect.center=self.pos
def main():
pygame.init()
screen=pygame.display.set_模式((284384))
screen\u rect=screen.get\u rect()
clock=pygame.time.clock()
sprites=pygame.sprite.Group()
background=pygame.transform.scale2x(pygame.image.load('maze.jpg'))
pimg=pygame.Surface((10,10))
pimg.填充((200,20,20))
精灵。添加(玩家(皮姆,(50,50),背景)
dt=0
尽管如此:
events=pygame.event.get()
对于事件中的e:
如果e.type==pygame.QUIT:
返回
sprites.update(事件,dt)
screen.fill(pygame.Color('grey'))
屏幕光点(背景,(0,0))
精灵。绘制(屏幕)
pygame.display.flip()
dt=时钟滴答声(60)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()


当然,这是可以改进的,例如,通过使用具有alpha值的图像,您可以轻松创建遮罩;但你会明白:只要“看”一下你表面的像素…

你可以尝试使用来分析图像上像素的区域,但我个人建议使用and来创建地图,因为它们比一点一点地分析图像文件容易得多。这可扩展到添加更多迷宫吗?我的想法是让界面获得精灵的位置,然后检测它何时通过-15和+815的间隙,从而产生一个新的level@KallumHancox当然,为什么不呢。您还可以删除
new\u rect.climp\u ip
部分,然后检查
是否不是background.get\u rect().contains(new\u rect)
或类似内容。如果您还没有阅读pygame文档,只需阅读一点即可。你可能会发现很多有用的东西。