#python #pygame #pygame-surface
#python #pygame #pygame-поверхность
Вопрос:
Я пытаюсь сделать свою рыбу больше каждый раз, когда она ест рыбу, но я не уверен, почему она не работает, это то, что я сделал
все остальное работает, но моя высота или ширина игрока не суммирует видео
# our main loop
runninggame = True
while runninggame:
clock.tick(fps)
for event in pygame.event.get():
if event.type == pygame.QUIT:
runninggame = False
#[...........]
for blac in blacs:
if playerman.rect.colliderect(blac.rect):
playerman.width = 10
playerman.height = 10
blac.x = 880
Мой полный код:
https://pastebin.com/iL5h4fst
Комментарии:
1.
playerman
является экземпляром классаplayer
(вы должны использовать этоPlayer
с большой буквы для правильного стиля Python PEP-8). Когда вы изменяетеplayerman.width = 10
и.height
, это лучший стиль для создания методаresize(new_width, new_height)
, а не для доступа к переменным-членам экземпляра, как вы это делаете. Можете ли вы провести подобный рефакторинг, перезапустить его и сообщить нам, происходит ли это по-прежнему? (с таким же успехом можно было бы ввести подробный флагresize(new_width, new_height, verbose=True)
и заставить его распечатать свои аргументы, когда он будет вызван.
Ответ №1:
Вам нужно масштабировать все изображения проигрывателя pygame.transform.smoothscale()
, когда размер увеличивается:
if playerman.rect.colliderect(blac.rect):
playerman.width = 10
playerman.height = 10
blac.x = 880
playerman.right = [pygame.transform.scale(image, (playerman.width,playerman.height)) for image in playerman.right]
playerman.left = [pygame.transform.scale(image, (playerman.width,playerman.height)) for image in playerman.left]
playerman.rect = pygame.Rect(playerman.x, playerman.y, playerman.width, playerman.height)
Атрибуты self.width
и self.height
должны быть инициализированы уменьшенным размером изображений ( image.get_width()//8
соответственно image.get_height()//8
)
По мере роста плеера вам нужно будет умножать размер плеера на масштабный коэффициент, чтобы сохранить соотношение сторон. При использовании pygame.transform.scale
округляйте ширину и высоту до целых чисел:
class player:
def __init__(self,x,y,height,width,color):
# [...]
self.right_original = [pygame.image.load("r" str(i) ".png") for i in range(1, 13)]
self.left_original = [pygame.image.load("l" str(i) ".png") for i in range(1, 13)]
self.width = self.right_original[0].get_width() / 8
self.height = self.right_original[0].get_height() / 8
self.scale_images()
# [...]
def scale_images(self):
w, h = round(self.width), round(self.height)
self.right = [pygame.transform.scale(image, (w, h)) for image in self.right_original]
self.left = [pygame.transform.scale(image, (w, h)) for image in self.left_original]
self.rect = pygame.Rect(self.x, self.y, w, h)
def collide(self, other_rect):
return self.rect.colliderect(other_rect)
def grow(self, scale):
self.width *= scale
self.height *= scale
self.scale_images()
for blac in blacs:
if playerman.collide(blac):
blac.x = 880
playerman.grow(1.1)
Комментарии:
1. это хорошо, но gyazo.com/29bc7258e91aa195244aa2e1f3f173aa пиксели моего спрайта намного
2. @HabibIsmail Попробуйте масштабировать исходные изображения, а не масштабировать масштабированные изображения. Смотрите 2-ю часть ответа.
3. могу я спросить еще одну вещь Извините, если я вас беспокою, но я не уверен, почему моя ширина на порядок больше, чем моя высота gyazo.com / … также есть ли способ, которым я мог бы сделать так, чтобы ширина и высота моей рыбы росли медленнее, потому что, если я ставлю 1, она все равно растет с той же скоростью, что и 10.для быстрого
4. @HabibIsmail
self.width
иself.height
должны быть инициализированыimage.get_width()//8
соответственноimage.get_height()//8
5. @HabibIsmail я улучшил ответ.