|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 lixiangyv 于 2019-12-1 07:30 编辑
问题就是《零基础入门学习Python》的第81讲:提高游戏的颜值,
那个放大缩小的那个例子,应该怎么改呀?这节课的课后题也没有。
源代码:
- import pygame
- from pygame.locals import *
- import sys
- # 初始化Pygame
- pygame.init()
- size = width, height = 600, 400
- fsize = fwidth, fheight = pygame.display.list_modes()[0]
- speed = [-2, 1]
- bg = (255, 255, 255)
- fullscreen = False
- # 创建窗口
- screen = pygame.display.set_mode(size, RESIZABLE)
- pygame.display.set_caption("turtle")
- # 加载图片
- oturtle = pygame.image.load("images.png")
- turtle = oturtle
- # 获取图像位置矩形
- oturtle_rect = oturtle.get_rect()
- position = turtle_rect = oturtle_rect
- # 设置放大缩小的比例
- ratio = 1.0
- lhead = turtle
- rhead = pygame.transform.flip(turtle, True, False)
- clock = pygame.time.Clock()
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- if event.type == KEYDOWN:
- if event.key == K_LEFT:
- turtle = lhead
- speed = [-3, 0]
- if event.key == K_RIGHT:
- turtle = rhead
- speed = [3, 0]
- if event.key == K_UP:
- speed = [0, -3]
- if event.key == K_DOWN:
- speed = [0, 3]
- # 全屏(F11)
- if event.key == K_F11:
- fullscreen = not fullscreen
- if fullscreen :
- screen = pygame.display.set_mode(
- fsize,
- FULLSCREEN | HWSURFACE)
- width, height = fwidth, fheight
- else:
- screen = pygame.display.set_mode(size)
- width, height = 600, 400
- # 放大、缩小小乌龟
- if event.key == K_EQUALS or event.key == K_MINUS or event.key == K_SPACE:
- # 最大只能放大一倍,缩小50%
- if event.key == K_EQUALS and ratio < 2:
- ratio += 0.1
- if event.key == K_MINUS and ratio > 0.5:
- ratio -= 0.1
- if event.key == K_SPACE:
- ratio = 1.0
- turtle = pygame.transform.smoothscale(oturtle,
- (int(oturtle_rect.width * ratio),
- int(oturtle_rect.height * ratio)))
- lhead = turtle
- rhead = pygame.transform.flip(turtle, True, False)
- # 用和调整矿口尺寸
- if event.type == VIDEORESIZE:
- size = event.size
- width, height = size
- screen = pygame.display.set_mode(size, RESIZABLE)
-
- # 移动图像
- position = position.move(speed)
- if position.left < 0:
- turtle = pygame.transform.flip(turtle, True, False)
- position.left = 0
- speed[0] = -speed[0]
- if position.right > width:
- position.right = width
- turtle = pygame.transform.flip(turtle, True, False)
- speed[0] = -speed[0]
- if position.top < 0:
- position.top = 0
- speed[1] = -speed[1]
- if position.bottom > height:
- position.bottom = height
- speed[1] = -speed[1]
- screen.fill(bg)
- screen.blit(turtle, position)
- pygame.display.flip()
- clock.tick(150)
复制代码
问题:
放大的时候,小龟会跑到外面去。
放大的时候,小龟会向左边转
这该怎么改呀
自己对着这个代码看看你在设置乌龟的头那出问题了
- import pygame
- import sys #退出程序时使用
- from pygame.locals import *
- #初始化Pygame
- pygame.init()#初始化Pygame,其中pygame实际是一个包,一个包里包含着各种功能不同的模块
- size = width,height = 600,400#其中使用元组指定窗口的大小
- speed = [-2,1]
- bg = (255,255,255)#RGB颜色值
- fullscreen = False
- #创建指定大小的窗口
- screen = pygame.display.set_mode(size)#其中pygame.display.set_mode方法会返回一个Surface的对象
- #设置窗口标题
- pygame.display.set_caption("初次见面,请大家多多关照!")
- #加载图片
- oturtle = pygame.image.load("turtle2.jpg")#表示原始的画布对象
- turtle = oturtle
- #设置放大缩小的比率
- ratio = 1.0
- #获取图像的位置矩形
- oturtle_rect = oturtle.get_rect()#其中每一个Surface对象都有一个rect矩形对象,用于表示矩形区域的位置和大小信息
- position = turtle_rect = oturtle_rect
- l_head = turtle#设置向左走时的头部朝向
- r_head = pygame.transform.flip(turtle,True,False)#设置向右走时的头部朝向,其中第一个参数为翻转对象,第二个为是否水平翻转,第三个参数为是否垂直翻转。
- while True:#设置死循环,让动画一直执行
- for event in pygame.event.get():
- print(event)
- if event.type == pygame.QUIT:#当执行pygame的退出事件
- sys.exit()
- if event.type == KEYUP:#此时使用键盘事项
- if event.key == K_LEFT:
- turtle = l_head
- speed = [-1,0]
- if event.key == K_RIGHT:
- turtle = r_head
- speed = [1,0]
- if event.key == K_UP:
- speed =[0,-1]
- if event.key == K_DOWN:
- speed = [0,1]
-
- #全屏(F11)
- if event.key == K_F11:
- fullscreen = not fullscreen#需要取反这样才可以从全屏和非全屏间切换
- if fullscreen:
- screen = pygame.display.set_mode((1920,1080),FULLSCREEN|HWSURFACE,RESIZABLE)
- width,height =1920,1080
- else:
- screen = pygame.display.set_mode(size,RESIZABLE)
- width,height = 600,400#此处需要重新给width和height重新赋值,要不然就还是1024和768
- #放大、缩小乌龟(+,-),空格键恢复原始尺寸
- if event.key == K_KP_PLUS or event.key == K_MINUS or event.key ==K_SPACE:
- #其中小甲鱼用K_EQUALS来代替了,因为默认按下-表示减号,按下=表示等号,除非使用shift但是使用功能shift后获取的键值不对,K_KP_PLUS表示小键盘的+号
- #最大只能放大一倍,缩小50%
- if event.key == K_KP_PLUS and ratio < 2:
- ratio += 0.1
- if event.key == K_MINUS and ratio > 0.5:
- ratio -= 0.1
- if event.key == K_SPACE:
- ratio = 1.0
-
- turtle = pygame.transform.smoothscale(oturtle,\
- (int(oturtle_rect.width*ratio),int(oturtle_rect.height*ratio)))#此处使用oturtle对象进行转换,而且转换后的宽和高必须是整形,要以元组形式展示,然后必须赋值给turtle
- #但是上方代码在点击左键或右键后就又重新恢复原来大小了。这是应为原来的l_head和r_head在赋值是给的初始的大小,所以在更改后得重新再次赋值。
- l_head = turtle#此时当变大后它无论在哪边,头都会往左边走,因为原始的oturtle的头就是向左的,而且放大后图片超出边界,加入一个方向位置的判断。
- r_head = pygame.transform.flip(turtle,True,False)
-
- #用户调整窗口尺寸
- if event.type == VIDEORESIZE:
- size = event.size
- width,height =size
- print(size)
- screen = pygame.display.set_mode(size,RESIZABLE)#重新画这个屏幕
-
- #移动图像
- position = position.move(speed)
-
- if position.left < 0 or position.right > width:#用于检测是否达到左右的边界,其中左上角(0,0),右下角为(600,400)
- #翻转图像
- turtle = pygame.transform.flip(turtle,True,False)#其中pygame.transform.flip()用来翻转对象,第一个参数为翻转对象,第二个为是否水平翻转,第三个参数为是否垂直翻转。
- #反方向移动
- speed[0] = -speed[0]
-
- if position.top < 0 or position.bottom > height:#用于检测是否达到上下的边界
- speed[1] = -speed[1]#其中speed为一个列表,可以实时更改
-
- #填充背景
- screen.fill(bg)
- #更新图像
- screen.blit(turtle,position)#screen.blit()方法就是把图像画到另一个图像上去,position用来表示覆盖到另一个画布上的位置
- #更新界面
- pygame.display.flip()#由于pygame采用的是双缓冲模式,所以要调用display.flip()将缓冲好的画面一次性刷新到我们的显示器。
- #其中双缓冲就在在内存中建立一个与屏幕绘制区一模一样的对象
- #延迟10毫秒显示
- pygame.time.delay(10)
复制代码
|
|