首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用图片来映射墙壁

问使用图片来映射墙壁
EN

Stack Overflow用户
提问于 2019-04-05 20:02:07
回答 1查看 172关注 0票数 2

我想知道我是否可以在我的游戏中使用图片地图来创建实体墙,下面是一个例子:

​

​

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

我已经研究了一段时间了,尽管到目前为止,Iv还停留在使用python.draw简单地绘制线条上。Iv也研究了乌龟的使用,但我认为这不是我现在对我的程序的渴望。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-05 20:57:51

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

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

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

下面是一个简单的、有些老生常谈但很实用的例子:

代码语言:javascript
复制
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()

​

​

当然,这是可以改进的,例如,通过使用具有alpha值的图像,这样您就可以轻松地创建蒙版;但您将获得这样的想法:只需“查看”您的Surface的像素……

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55534937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档