yanghp 发表于 前天 16:22

pygame模块rect问题

import pygame as pg
from pygame.sprite import Sprite

class Animation(Sprite):
    def __init__(self,pos:tuple,filenames):
      super().__init__()
      self.images = []
      for filename in filenames:
            self.images.append(pg.image.load(filename))
      self.index = 0
      self.counter = 0
      

      self.image = self.images
      self.rect = pg.rect.Rect(pos,pos,self.image.get_width(),self.image.get_height())
    def update(self,*Args,**kwargs):
      self.counter += 1
      if self.counter > 10:
            self.index += 1
            if self.index == len(self.images):
                self.index = 0
            self.counter = 0
      self.image = self.images
该程序中 pg.rect.Rect(pos,pos,self.image.get_width(),self.image.get_height())是否有问题,程序可以运行,但用pg.Rect(pos,pos,self.image.get_width(),self.image.get_height())是否更可以理解

FishC 发表于 前天 16:23

你的代码中有几个rect相关的问题:

问题分析:

1. Rect创建参数错误:
   pg.rect.Rect(pos,pos,self.image.get_width(),self.image.get_height())
   应该传递4个参数:x, y, width, height,但你传递了pos两次(都是元组)。

2. self.image类型错误:
   self.image = self.images 将整个图片列表赋值给了self.image,但self.image应该是单个Surface对象。

修正后的代码:

import pygame as pg
from pygame.sprite import Sprite

class Animation(Sprite):
    def __init__(self, pos: tuple, filenames):
      super().__init__()
      self.images = []
      for filename in filenames:
            self.images.append(pg.image.load(filename))
      self.index = 0
      self.counter = 0
      
      # 修正1:获取当前图片
      self.image = self.images
      
      # 修正2:正确创建Rect
      # 方法1:使用元组解包(推荐)
      self.rect = pg.Rect(*pos, self.image.get_width(), self.image.get_height())
      # 或者方法2:显式指定xy坐标
      # self.rect = pg.Rect(pos, pos, self.image.get_width(), self.image.get_height())
   
    def update(self, *args, **kwargs):
      self.counter += 1
      if self.counter > 10:
            self.index += 1
            if self.index == len(self.images):
                self.index = 0
            self.counter = 0
            
            # 修正3:更新当前显示的图片
            self.image = self.images

解释说明:


[*] pg.Rect vs pg.rect.Rect:两者完全相同,pg.Rect 是 pg.rect.Rect 的简写,建议使用更简洁的 pg.Rect。

[*] Rect参数:正确格式是 pg.Rect(x, y, width, height)。
    - *pos 会将元组 (x, y) 解包为两个单独参数
    - 也可以直接用 pos, pos

[*] self.image修正:必须存储单个图片(Surface),而不是整个列表,否则 get_width() 会失败。


这样就解决了rect创建的问题,并且动画也能正常切换图片了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: pygame模块rect问题