| 
 | 
 
 
发表于 2021-9-13 09:00:28
|
显示全部楼层
 
 
 
 
先看第9行,乌龟初始速度设为 [-2,1],再看第129至138行,不按下方向键就是斜向碰壁反弹的效果。 
 
能否设置一个按键,将乌龟绕着屏幕边界走和碰到边界反弹的效果区分开  
可以设置一个 around_mode 保存状态,同时要保存之前的速度,位置和朝向等。 
 
在第40行加上: 
- around_mode = False
 
 - speed_0 = speed
 
 - position_0 = position
 
 - turtle_0 = turtle
 
  复制代码 
 
再将第45行至55行方向键加上 around_mode 的条件,并加上 f 键切换模式: 
-             if event.key == K_f:
 
 -                 if around_mode:
 
 -                     speed = speed_0
 
 -                     position = position_0
 
 -                     turtle = turtle_0
 
 -                 else:
 
 -                     speed_0 = speed
 
 -                     position_0 = position
 
 -                     turtle_0 = turtle
 
 -                 around_mode = not around_mode
 
 -                 
 
 -             if not around_mode:
 
 -                 if event.key == K_LEFT:
 
 -                     turtle = l_head 
 
 -                     speed = [-2,0]
 
 -                 elif event.key == K_RIGHT:
 
 -                     turtle = r_head
 
 -                     speed = [2,0]
 
 -                 elif event.key == K_UP:
 
 -                     speed = [0,-1]
 
 -                 elif event.key == K_DOWN:
 
 -                     speed = [0,1]
 
  复制代码 
 
再将第95行至120行移动到下面132行的的位置,删去 pressed_keys 变量, 
改为判断 around_mode,同时在标题栏上显示状态: 
-     if around_mode:
 
 -         pygame.display.set_caption('初次见面,请大家多多关照 (环绕模式: 开启)')
 
 -         if position.right > width:
 
 -             turtle = turtle_right
 
 -             position = turtle_rect = turtle.get_rect()
 
 -             #改变乌龟(0,0)的位置
 
 -             position.left = width- turtle_rect.width
 
 -             speed =[0,5]
 
 -             #之后同理
 
 -         if position.bottom > height:
 
 -             turtle = turtle_bottom
 
 -             position = turtle_rect = turtle.get_rect()
 
 -             position.left = width - turtle_rect.width
 
 -             position.top = height - turtle_rect.height
 
 -             speed = [-5, 0]
 
  
-         if position.left < 0:
 
 -             turtle = turtle_left
 
 -             position = turtle_rect = turtle.get_rect()
 
 -             position.top = height - turtle_rect.height
 
 -             speed = [0, -5]
 
  
-         if position.top < 0:
 
 -             turtle = turtle_top
 
 -             position = turtle_rect = turtle.get_rect()
 
 -             speed = [5, 0]
 
 -     
 
 -     else: 
 
 -         # 方向键控制
 
 -         pygame.display.set_caption('初次见面,请大家多多关照 (环绕模式: 关闭)')
 
 -         if position.left < 0 or position.right > width:
 
 -             turtle = pygame.transform.flip(turtle,True,False)
 
 -             #第一个参数是surface对象,第二个是水平翻转,第三个是竖直翻转
 
 -             speed[0] = -speed[0]
 
  
-         if position.top < 0 or position.bottom > height:
 
 -             speed[1] = -speed[1]
 
  复制代码 
 
完整的代码如下: 
- import pygame
 
 - import sys
 
 - from pygame.locals import *
 
  
- #初始化pygame
 
 - pygame.init()
 
  
- size = width,height = 1500,700
 
 - speed = [-2,1]
 
 - bg = (255,255,255) #RGB白色
 
 - fullscreen = False
 
 - ratio = 1.0
 
  
- clock = pygame.time.Clock()
 
  
 
- #创建指定大小窗口 Surface
 
 - #Surface对象就是pygame中用来表示图像的对象
 
 - screen = pygame.display.set_mode(size,RESIZABLE)
 
 - #设置窗口标题
 
 - pygame.display.set_caption('初次见面,请大家多多关照')
 
  
- #加载图片 也是Surface对象
 
 - #一个Surface对象不能经过两次加工,否则会很难看
 
 - oturtle = pygame.image.load('turtle.jpeg').convert_alpha()
 
 - turtle = oturtle
 
 - oturtle_rect = oturtle.get_rect()
 
 - position = turtle_rect = oturtle_rect  
 
 - #获得图片位置矩形
 
 - #position = turtle.get_rect()
 
 - ol_head = l_head = turtle
 
 - or_head = r_head = pygame.transform.flip(turtle,True,False)
 
 - #自动翻转
 
  
- #rotate方向为逆时针
 
 - turtle_right = pygame.transform.rotate(oturtle,90)
 
 - turtle_top = pygame.transform.rotate(oturtle,180)
 
 - turtle_left = pygame.transform.rotate(oturtle,270)
 
 - turtle_bottom = oturtle
 
  
- # 环绕模式
 
 - around_mode = False
 
 - speed_0 = speed
 
 - position_0 = position
 
 - turtle_0 = turtle
 
  
- while True:
 
 -     for event in pygame.event.get():
 
 -         if event.type == pygame.QUIT:
 
 -             sys.exit()
 
 -         if event.type == pygame.KEYDOWN:
 
 -             # f 键切换环绕模式
 
 -             if event.key == K_f:
 
 -                 if around_mode:
 
 -                     speed = speed_0
 
 -                     position = position_0
 
 -                     turtle = turtle_0
 
 -                 else:
 
 -                     speed_0 = speed
 
 -                     position_0 = position
 
 -                     turtle_0 = turtle
 
 -                 around_mode = not around_mode
 
 -                 
 
 -             # 非环绕模式,方向键有效
 
 -             if not around_mode:
 
 -                 if event.key == K_LEFT:
 
 -                     turtle = l_head 
 
 -                     speed = [-2,0]
 
 -                 elif event.key == K_RIGHT:
 
 -                     turtle = r_head
 
 -                     speed = [2,0]
 
 -                 elif event.key == K_UP:
 
 -                     speed = [0,-1]
 
 -                 elif event.key == K_DOWN:
 
 -                     speed = [0,1]
 
  
-             #全屏a
 
 -             if event.key == K_a:
 
 -                 fullscreen = not fullscreen
 
 -                 if fullscreen:
 
 -                     screen = pygame.display.set_mode((3840, 2160),FULLSCREEN | HWSURFACE)
 
 -                     width,height = 1920,1080
 
 -                     #改尺寸
 
 -                 else:
 
 -                     screen = pygame.display.set_mode(size)
 
 -             #放大缩小乌龟(=,-),空格键恢复尺寸
 
 -             if event.key == K_EQUALS or event.key == K_MINUS or event.key == K_SPACE:
 
 -                 if event.key == K_EQUALS and ratio < 1.4:
 
 -                     ratio += 0.1
 
 -                 if event.key == K_MINUS and ratio > 0.5:
 
 -                     ratio -= 0.1
 
 -                 if event.key == K_SPACE:
 
 -                     ratio = 1.0
 
 -                 #此时注意乌龟大小会变
 
 -                 if turtle == l_head:
 
 -                     oturtle = ol_head
 
 -                     oturtle_rect = oturtle.get_rect()
 
 -                     l_head = turtle = pygame.transform.smoothscale(oturtle,\
 
 -                                              (int(oturtle_rect.width * ratio),\
 
 -                                               int(oturtle_rect.height * ratio)))
 
 -                     r_head = pygame.transform.flip(turtle,True,False)
 
 -                     
 
 -                 if turtle == r_head:
 
 -                     oturtle = or_head
 
 -                     oturtle_rect = oturtle.get_rect()
 
 -                     r_head = turtle = pygame.transform.smoothscale(oturtle,\
 
 -                                              (int(oturtle_rect.width * ratio),\
 
 -                                               int(oturtle_rect.height * ratio)))
 
 -                     l_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)
 
 -     #调用rect对象的move方法
 
  
-     # 环绕模式
 
 -     if around_mode:
 
 -         pygame.display.set_caption('初次见面,请大家多多关照 (环绕模式: 开启)')
 
 -         if position.right > width:
 
 -             turtle = turtle_right
 
 -             position = turtle_rect = turtle.get_rect()
 
 -             #改变乌龟(0,0)的位置
 
 -             position.left = width- turtle_rect.width
 
 -             speed =[0,5]
 
 -             #之后同理
 
 -         if position.bottom > height:
 
 -             turtle = turtle_bottom
 
 -             position = turtle_rect = turtle.get_rect()
 
 -             position.left = width - turtle_rect.width
 
 -             position.top = height - turtle_rect.height
 
 -             speed = [-5, 0]
 
  
-         if position.left < 0:
 
 -             turtle = turtle_left
 
 -             position = turtle_rect = turtle.get_rect()
 
 -             position.top = height - turtle_rect.height
 
 -             speed = [0, -5]
 
  
-         if position.top < 0:
 
 -             turtle = turtle_top
 
 -             position = turtle_rect = turtle.get_rect()
 
 -             speed = [5, 0]
 
 -     
 
 -     else: 
 
 -         # 方向键控制
 
 -         pygame.display.set_caption('初次见面,请大家多多关照 (环绕模式: 关闭)')
 
 -         if position.left < 0 or position.right > width:
 
 -             turtle = pygame.transform.flip(turtle,True,False)
 
 -             #第一个参数是surface对象,第二个是水平翻转,第三个是竖直翻转
 
 -             speed[0] = -speed[0]
 
  
-         if position.top < 0 or position.bottom > height:
 
 -             speed[1] = -speed[1]
 
 -                                 
 
 -     
 
 -     #填充背景(看不到乌龟了)
 
 -     screen.fill(bg)
 
 -     #更新图像,但是每刻都是一个图像(只有像素)
 
 -     screen.blit(turtle,position)
 
 -     #双缓冲flip更新界面,重要!!!
 
 -     pygame.display.flip()
 
 -     #延迟10毫秒
 
 -     pygame.time.delay(10)
 
 -     clock.tick(200)
 
 -     #不高于200帧
 
  复制代码 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |