Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyGame窗口中放大和缩小所有对象的位置_Python_Python 3.x_Pygame_Zooming_Pygame Surface - Fatal编程技术网

Python 在PyGame窗口中放大和缩小所有对象的位置

Python 在PyGame窗口中放大和缩小所有对象的位置,python,python-3.x,pygame,zooming,pygame-surface,Python,Python 3.x,Pygame,Zooming,Pygame Surface,我和PyGame有个问题,我无法解决。因此: 我的想法是我有一张可以放大/缩小的地图。放大效果很好。但缩小显示图片的其余部分已被删除,现在只有以前在窗口上可见的部分图像存在。 这是我的代码: 导入pygame 从pygame.locals导入* 导入操作系统 类应用程序: 定义初始化(自): self.running=True self.size=(800600) #创建窗口 self.window=pygame.display.set_模式(self.size,pygame.DOUBLEBUF

我和PyGame有个问题,我无法解决。因此: 我的想法是我有一张可以放大/缩小的地图。放大效果很好。但缩小显示图片的其余部分已被删除,现在只有以前在窗口上可见的部分图像存在。 这是我的代码:

导入pygame
从pygame.locals导入*
导入操作系统
类应用程序:
定义初始化(自):
self.running=True
self.size=(800600)
#创建窗口
self.window=pygame.display.set_模式(self.size,pygame.DOUBLEBUF | pygame.HWSURFACE | pygame.resiable)
#创建地图
currentdir=os.path.dirname(os.path.realpath(_文件__))
imagedir=currentdir+'/images/europe.png'
self.map=pygame.image.load(imagedir)
self.maprect=self.map.get_rect()
self.mapsurface=pygame.Surface(self.size)
blit(pygame.transform.scale(self.map,(self.size)),(0,0))
self.window.blit(self.mapssurface,(0,0))
self.scale=1
#创建窗口
pygame.display.flip()
初始(自我)上的def:
self.country=country()
def on_清除(自):
pygame.quit()
def检查_事件(自身、事件):
如果event.type==pygame.QUIT:
self.running=False
elif event.type==pygame.VIDEORESIZE:
self.window=pygame.display.set_模式(event.dict['size'],pygame.DOUBLEBUF | pygame.HWSURFACE | pygame.resize)
blit(pygame.transform.scale(self.map,(event.dict['size']),(0,0))
elif event.type==pygame.MOUSEBUTTONDOWN:
如果event.button==4:
缩放=2
wnd_w,wnd_h=self.window.get_size()
缩放大小=(圆形(宽/缩放)、圆形(宽/缩放))
zoom_area=pygame.Rect(0,0,*缩放大小)
pos_x,pos_y=pygame.mouse.get_pos()
缩放面积中心=(位置x,位置y)
zoom\u surf=pygame.Surface(zoom\u area.size)
缩放浏览窗口(self.window,(0,0),缩放区域)
zoom_-surf=pygame.transform.smoothscale(zoom_-surf,(wnd_-w,wnd_-h))
self.window.blit(缩放(0,0))
elif event.button==5:
缩放=0.5
wnd_w,wnd_h=self.window.get_size()
缩放大小=(圆形(宽/缩放)、圆形(宽/缩放))
zoom_area=pygame.Rect(0,0,*缩放大小)
pos_x,pos_y=pygame.mouse.get_pos()
缩放面积中心=(位置x,位置y)
zoom\u surf=pygame.Surface(zoom\u area.size)
缩放浏览窗口(self.window,(0,0),缩放区域)
zoom_-surf=pygame.transform.smoothscale(zoom_-surf,(wnd_-w,wnd_-h))
self.window.blit(缩放(0,0))
pygame.display.flip()
pygame.display.update()
def on_执行(自):
当self.running==True时:
对于pygame.event.get()中的事件:
自我检查事件(事件)
self.on_cleanup()
国家/地区(应用程序):
定义初始化(自):
super()。\uuuu init\uuuuu()
start=App()
start.on_init()
start.on_execute()
以下是我的问题的截图:

到目前为止一切顺利:

放大效果很好:

缩小会导致以下情况:


缩放时,您需要缩放原始图像。使用属性
maprect
定义地图的缩放大小和相对位置。添加一个方法
blit
map,该方法可以缩放和blit地图。使用类
App
的构造函数中的方法:

class应用程序:
定义初始化(自):
# [...]
self.map=pygame.image.load(imagedir)
self.maprect=self.map.get_rect(center=self.window.get_rect().center)
self.blitmap()
#创建窗口
pygame.display.flip()
def blitmap(自):
self.mapsurface=pygame.transform.smoothscale(self.map,self.maprect.size)
self.window.fill(0)
self.window.blit(self.mapsurface、self.maprect)
# [...]
缩放图像时,计算新的映射矩形(
self.maprect
),然后再次调用该方法:

class应用程序:
# [...]
def检查_事件(自身、事件):
如果event.type==pygame.QUIT:
self.running=False
elif event.type==pygame.VIDEORESIZE:
self.window=pygame.display.set_模式(event.dict['size'],pygame.DOUBLEBUF | pygame.HWSURFACE | pygame.resize)
self.blitmap()
elif event.type==pygame.MOUSEBUTTONDOWN:
如果event.button==4或event.button==5:
如果event.button==4,则缩放=2,否则为0.5
mx,my=event.pos
左=mx+(self.maprect.left-mx)*缩放
右=mx+(self.maprect.right-mx)*缩放
top=my+(self.maprect.top-my)*缩放
底部=我的+(self.maprect.bottom-我的)*缩放
self.maprect=pygame.Rect(左、上、右、左、下、上)
self.blitmap()
另见


完整示例:

导入pygame
从pygame.locals导入*
导入操作系统
类应用程序:
定义初始化(自):
self.running=True
self.size=(800600)
#创建窗口
self.window=pygame.display.set_模式(self.size,pygame.DOUBLEBUF | pygame.HWSURFACE | pygame.resiable)
#创建地图
currentdir=os.path.dirname(os.path.realpath(_文件__))
imagedir=currentdir+'/images/europe.png'
self.map=pygame.image.load(imagedir)
self.maprect=self.map.get_rect(center=self.window.get_rect().center)
self.blitmap()
#创建窗口
pygame.display.flip()
def blitmap(自):
self.mapssurface=pygame.transform.smoothscale(self.map,sel