【问题标题】:Scaling Problem with PygamePygame 的缩放问题
【发布时间】:2011-09-19 00:56:10
【问题描述】:

当我尝试缩放对象时,只有图像的顶部和左侧变大了。其余的保持不变。我想要一个均匀的比例。

import pygame._view
import pygame, sys
from pygame.locals import *
import random
pygame.init()    


barrel = pygame.image.load("images\Barrel.gif")
barrelx = 0
barrely = 0

while running:

    barrel = pygame.transform.scale(barrel, (int(barrely/4), int(barrely/4)))
    screen.blit(barrel, (barrelx, barrely))

barrely 总是越来越大(作为一个数字),直到它离开屏幕。 我在 Windows XP 上使用 Python 2.7。

【问题讨论】:

  • 将位置存储为pygame.Rect() bucket_loc = pygame.Rect(0,0) 使其他事情变得更容易。像barrel_loc.center = (100,100)一样,很多函数都可以用rect。

标签: python image transform scale pygame


【解决方案1】:

我发现了问题!我编写程序的方式是不断重复使用新的桶形图像。所以,在我展示了桶之后,我在最后放了:

while running:

...

barrel = pygame.transform.scale(barrel, (init(barrely/4),init(barrely/4)))
screen.blit(barrel, (barrelx, barrely))
barrel = pygame.image.load("images\Barrel.gif")

这样,当比例变量发生变化时,它会影响新图像,而不是修改后的图像。

【讨论】:

  • 将桶原件作为表面保留在内存中。第二个表面,也就是结果,是你实际使用 blit 的表面。这也用于使用 rotozoom 或旋转。这可以防止需要重新加载图像每次缩放和或旋转。
【解决方案2】:

不应该是这样的:

import pygame._view
import pygame, sys
from pygame.locals import *
import random
pygame.init()    


barrel = pygame.image.load("images\Barrel.gif")
barrelx = 0
barrely = 0

while running:

    barrel = pygame.transform.scale(barrel, (int(barrelx/4), int(barrely/4)))
    screen.blit(barrel, (barrelx, barrely))

在您的代码中,您为宽度 pygame.transform.scale() 的高度提供桶

我也看不到你在哪里更新桶和桶。在您粘贴的代码中,barrelx 和 buckety 将始终为 0。

【讨论】:

  • barrelx 是“x”坐标,barrely 是“y”坐标和比例变量。
  • 这不是您的代码所做的。您能否发布您实际使用的代码?
【解决方案3】:

我并不完全清楚你的问题是什么。你是说只有左边和上边变大了?这可能是 pygame 中的一个错误,因为 scale 不应该那样工作。一个矩形仍然是一个矩形(每个图像都是一个矩形)。

如果图片向左和向上扩展,这意味着在循环中的某个位置,在调整图像大小之前或之后,您将桶图像向左和向上移动,与桶增长的量相同。只需删除它。 (当您缩放图像时,左上角始终保持在同一位置)。

如果这不能解决您的问题,您可能应该详细说明一下。

【讨论】:

  • 桶应该是垂直向下移动,但是当它缩放时,桶会向右和向下移动。
【解决方案4】:

“图像的顶部和左侧变大”是否意味着图像不会在中间变大,左上角始终保持在同一位置? 如果我理解正确,你可以试试这个:

import pygame._view
import pygame, sys
from pygame.locals import *
import random
pygame.init()    


barrel1 = pygame.image.load("images\Barrel.gif")
barrel1x = 0
barrel1y = 0
#get width,height of image
width1,height1 = barrel1.get_size()
running = True


while running:

    barrel2 = pygame.transform.scale(barrel1, (int(barrely/4), int(barrely/4)))
    width2,height2 = barrel2.get_size()
    #position - difference of width or height /2
    screen.blit(barrel, [round(barrelx - (width1 - width2)/2), 
                         round(barrely - (height1 - height2)/2)])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2013-02-13
    • 2023-04-02
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    相关资源
    最近更新 更多