为了账号安全,请及时绑定邮箱和手机立即绑定

pygame 意外显示的表面

pygame 意外显示的表面

一只名叫tom的猫 2021-08-05 17:08:49
我正在制作一个蛇游戏,到目前为止它大部分进展顺利,但它在左上角显示了一个我无法摆脱的蛇块。我检查过我没有在那里绘制表面(0,0)。我被困住了。请帮帮我,谢谢!!顺便说一句,这是我第一次提出问题,因此对任何建议也表示赞赏。编辑:我发现使用常规类而不是精灵解决了这个问题,但我需要精灵中的碰撞和其他函数。import pygameclass snake(pygame.sprite.Sprite):    speed=5    init_length=10    direction=0    x=[]    y=[]    updateCountMax = 2    updateCount = 0    length=10#    image=pygame.Surface((11,11)).convert().fill((0,128,255))    def __init__(self,init_x,init_y,image,screen):        pygame.sprite.Sprite.__init__(self)        for i in range(0,self.init_length):            self.x.append(init_x)            self.y.append(init_y)#        for i in range(0,self.length):#            print(f"{self.x[i]},{self.y[i]}")        for x in self.x:            print(x)        for y in self.y:            print(y)        self.image=image        self.screen=screen        self.rect=self.image.get_rect()#        self.rect.center=(self.x,self.y)    def move_R(self):#        self.x+=self.speed        self.direction=0    def move_L(self):#        self.x-=self.speed        self.direction=1    def move_U(self):#        self.y-=self.speed        self.direction=2    def move_D(self):#        self.y+=self.speed        self.direction=3    def update(self):#        self.updateCount = self.updateCount + 1#        if self.updateCount < self.updateCountMax:        for i in range(self.length-1,0,-1):#                print("self.x[" + str(i) + "] = self.x[" + str(i-1) + "]")            self.x[i] = self.x[i-1]            self.y[i] = self.y[i-1]        if(self.direction==0):            self.x[0]+=self.speed        elif(self.direction==1):            self.x[0]-=self.speed        elif(self.direction==2):            self.y[0]-=self.speed        elif(self.direction==3):            self.y[0]+=self.speed#        self.rect.center=(self.x,self.y)#        self.updateCount = 0#        for i in range(0,self.length):#            print(f"{self.x[i]},{self.y[i]}")        self.draw()
查看完整描述

2 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您在左上角看到的是self.imageplayer1 精灵的 。draw精灵组的方法在精灵image的rect.topleft坐标处blit s并且由于您从不移动player1.rect,图像将在默认的 (0, 0) 坐标处 blit。因此,只需删除该行self.snakes.draw(self.screen)即可解决此问题。


我还建议您使用pygame.Rects 而不是self.xandself.y列表。您可以使用 theinit_x和init_ycoords 作为topleft属性创建 rect 实例并将它们放入self.rects列表中。这允许您简化更新和绘制方法,并且矩形也可用于碰撞检测。我已经重构了你的代码(它变成了一个小型的代码审查):


import pygame



class Snake(pygame.sprite.Sprite):  # Use upper camelcase names for classes (see PEP 8).


    def __init__(self, init_x, init_y, image,screen):

        pygame.sprite.Sprite.__init__(self)

        # These are instance attributes now (use class attributes if

        # the values should be shared between the instances).

        self.speed = 5

        self.init_length = 10

        self.direction = 0

        self.updateCountMax = 2

        self.updateCount = 0

        self.length = 10

        # The body parts are rects now.

        self.rects = []

        for i in range(self.init_length):

            # Append pygame.Rect instances.

            self.rects.append(pygame.Rect(init_x, init_y, 11, 11))


        self.image = image

        self.screen = screen

        self.rect = self.rects[0]  # I use the first rect as the self.rect.


    def update(self):

        for i in range(self.length-1, 0, -1):

            # Update the topleft (x, y) positions of the rects.

            self.rects[i].topleft = self.rects[i-1].topleft


        if self.direction == 0:

            self.rects[0].x += self.speed

        elif self.direction == 1:

            self.rects[0].x -= self.speed

        elif self.direction == 2:

            self.rects[0].y -= self.speed

        elif self.direction == 3:

            self.rects[0].y += self.speed


    def draw(self):

        # Iterate over the rects to blit them (I draw the outlines as well).

        for rect in self.rects:

            self.screen.blit(self.image, rect)

            pygame.draw.rect(self.screen, (0, 255, 0), rect, 1)



class App:

    width = 1200

    height = 900

    title = "Snake"

    done = False


    def __init__(self):

        pygame.init()

        self.image = pygame.Surface((11, 11))

        self.image.fill((0, 128, 255))

        pygame.display.set_caption(self.title)

        self.screen = pygame.display.set_mode((self.width, self.height))

        self.clock = pygame.time.Clock()

        self.snakes = pygame.sprite.Group()

        self.player1 = Snake(500, 10, self.image, self.screen)

        self.snakes.add(self.player1)


    def loop(self):

        while not self.done:

            # Handle the events.

            for event in pygame.event.get():

                if event.type == pygame.QUIT:

                        self.done = True


            keys = pygame.key.get_pressed()

            # In Python we simply set the values of the

            # attributes directly instead of using getter

            # and setter methods.

            if keys[pygame.K_RIGHT]:

                self.player1.direction = 0

            if keys[pygame.K_LEFT]:

                self.player1.direction = 1

            if keys[pygame.K_UP]:

                self.player1.direction = 2

            if keys[pygame.K_DOWN]:

                self.player1.direction = 3

            if keys[pygame.K_ESCAPE]:

                self.done = True


            # Update the game.

            self.player1.update()


            # Draw everything.

            self.screen.fill((0, 0, 0))

            self.player1.draw()

            pygame.draw.rect(self.screen, (255, 0, 0), self.player1.rect, 1)

            pygame.display.update()

            self.clock.tick(60)

        pygame.quit()


if __name__ == "__main__" :

    the_app = App()

    the_app.loop()



查看完整回答
反对 回复 2021-08-05
?
米脂

TA贡献1836条经验 获得超3个赞

您添加player1snakes精灵组并使用self.snakes.draw(self.screen). 但是,您还在self.player1.update(), 最后一行中绘制了播放器。

移除self.snakes.draw(self.screen)以摆脱幻影蛇。

顺便说一句:您创建并设置了 aself.background但您立即用 覆盖了它self.screen.fill((0,0,0)),因此您根本不需要背景。


查看完整回答
反对 回复 2021-08-05
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信