pygameで画像のサイズを大きくする方法[複製]
私が作成しているゲームでは、(old_width、old_height)から(new_width、new_height)に拡大縮小する必要がある画像があるため、大きくなっているように見えます。ゲーム中に何度もそれを行う必要があります。 。
これまでpygame.trasform.smoothscaleを試してみましたが、何らかの理由で、画面に沿って画像を右隅に移動するだけです。
何が起こっているのかわからないので、とても奇妙に思えます。
画像を処理するクラスは次のとおりです。
class GrowingImage:
def __init__(self, image_path, x, y, width, height):
self.width = width
self.height = height
self.object_image = pygame.image.load(image_path)
self.image = pygame.transform.scale(self.object_image, (self.width, self.height))
self.x_pos = x
self.y_pos = y
def draw(self, background):
background.blit(self.image, (self.x_pos, self.y_pos))
def grow(self):
self.image = pygame.transform.smoothscale(self.object_image, (self.width, self.height))
self.width += 1
self.height += 1
そして、これがメソッドgrowが呼び出される場所です。この質問に不要な残りの部分をすべて削除したので、理論的には、この時点で画像が際限なく大きくなるはずです。
image = GrowingImage('image.png', 400, 100, 405, 640)
while not is_game_over:
for event in pygame.event.get():
# Bunch of stuffs
# Redraw the screen
self.game_screen.fill(WHITE_COLOR)
image.grow()
image.draw()
# Display the screen
pygame.display.update()
# Tick the clock to update everything within the game.
clock.tick(self.TICK_RATE)
まあ、そうではなく、なぜこれが起こるのか私にはまったくわかりません。私がここで間違っていることを誰かが知っていますか?
回答
2 hippozhipos
画像は実際には動いていません。大きくなる、つまり幅と高さが増加するため、右下隅に向かって移動しているように見える場合があります。これは、画像の左上隅から始まることを覚えています。それも描かれているところです。したがって、成長しているように見せるために、幅と高さの半分を描画した場所をオフセットできます。これは、基本的に、中央に描画されるようにオフセットすることを意味します。交換
background.blit(self.image, (self.x_pos, self.y_pos))
と
background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))
実例
import pygame
class GrowingImage:
def __init__(self, image_path, x, y, width, height):
self.width = width
self.height = height
self.object_image = image_path
self.image = pygame.transform.scale(self.object_image, (self.width, self.height))
self.x_pos = x
self.y_pos = y
def draw(self, background):
background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))
def grow(self):
self.image = pygame.transform.smoothscale(self.object_image, (self.width, self.height))
self.width += 1
self.height += 1
pygame.init()
d = pygame.display.set_mode((600, 600))
image = pygame.Surface((1, 1))
growingImage = GrowingImage(image, 300, 300, 20, 20)
while True:
d.fill((255, 255, 255))
pygame.event.get()
growingImage.draw(d)
growingImage.grow()
pygame.display.update()
1 Rabbid76
の2番目の引数はblit長方形にすることができます。pygame.Rectオブジェクトを使用して、画像をその中心に対して拡大縮小します。
class GrowingImage:
def __init__(self, image_path, x, y, width, height):
self.object_image = pygame.image.load(image_path)
self.image = pygame.transform.scale(self.object_image, (self.width, self.height))
self.rect = self.image.get_rect(topleft = (x, y))
def draw(self, background):
background.blit(self.image, self.rect)
def grow(self):
w = self.rect.width + 1
h = self.rect.height + 1
self.image = pygame.transform.smoothscale(self.object_image, (w, h))
self.rect = self.image.get_rect(center = self.rect.center)
スケールとズームサーフェスの変換も参照してください。