本程序的目标是:建立一个窗口,通过键盘上的方向键改变背景图位置。
以下为书中给出的代码,运行后可以通过键盘方向键调整背景图片位置,按一次调整一次,多次按同一个方向键,最终可以把背景图移出窗口范围。然而PosPro认为,作者本意并非如此,因为若仅仅要实现此功能的话,无需监控KEYUP事件。
(PS: 如果完全删除KEYUP部分的话,move_x无法归零,由于x还是会累积之前的move_x结果,而且是在每次执行while循环之后都累加,所以只需要点一下某一个方向键,背景图就会如同冰场上的冰块一样,唰地划出去,效果也很炫)
#-*- coding=utf-8 -*- # 若无上句,即便是在注释中有中文,也会报错,且这一句必须放在第一句!! #本程序来源于《Beginning Game Development with Python and Pygame》 P72 #注释 by PosPro #### 程序目标:#### #建立一个窗口,通过键盘上的方向键可以改变背景图位置 # #### 程序框架:#### #1 引入所需模块 #2 初始化 #3 一个循环构成程序核心 ### 代码重复部分未做详细注释,详情可参考前一篇博客 #1 引入所需模块 import pygame from pygame.locals import * from sys import exit #2 初始化 pygame.init() SCREEN_SIZE=(640,480) screen=pygame.display.set_mode(SCREEN_SIZE,0,32) background_image_filename='sushiplate.jpg' backgrd = pygame.image.load(background_image_filename).convert() x,y=0,0 move_x, move_y=0,0 #3 一个循环构成程序核心 while True: for event in pygame.event.get(): if event.type==QUIT: exit() #若按下的是方向键,则根据具体方向将背景图位移一个像素 if event.type==KEYDOWN: if event.key==K_LEFT: move_x=-1 elif event.key==K_RIGHT: move_x=+1 elif event.key==K_UP: move_y=-1 elif event.key==K_DOWN: move_y=+1 #Pospro认为,作者的本意是:在按键弹起后,背景图复位,但其实并未达到此效果 elif event.type==KEYUP: if event.key==K_LEFT: move_x=0 elif event.key==K_RIGHT: move_x=0 elif event.key==K_UP: move_y=0 elif event.key==K_DOWN: move_y=0 x+=move_x y+=move_y ###由于x的值是累加的(因为move_x只有0,1两种可能),所以连续按向上键之后 ###背景图会最终完全离开窗口!!! ###PosPro认为,这恐怕不是作者想要的效果,因为这样的话KEYUP部分就失去了意义 screen.fill((0,0,0)) screen.blit(backgrd,(x,y)) pygame.display.update()
第二部分代码为PosPro调整后的——运行后的效果是:放开方向键,背景图就回到原位的效果(橡皮筋效果)
import pygame from pygame.locals import * from sys import exit #2 初始化 pygame.init() SCREEN_SIZE=(640,480) screen=pygame.display.set_mode(SCREEN_SIZE,0,32) background_image_filename='sushiplate.jpg' backgrd = pygame.image.load(background_image_filename).convert() x,y=0,0 move_x, move_y=0,0 SLIDE_VAL=10 ##稍微增加一些偏移量以便使效果更明显 #3 一个循环构成程序核心 while True: x,y=0,0 ##增加了上面这一句,便可以产生放开方向键,背景图就回到原位的效果(橡皮筋效果) for event in pygame.event.get(): if event.type==QUIT: exit() #若按下的是方向键,则根据具体方向将背景图位移SLIDE_VAL个像素 if event.type==KEYDOWN: if event.key==K_LEFT: move_x=-SLIDE_VAL elif event.key==K_RIGHT: move_x=+SLIDE_VAL elif event.key==K_UP: move_y=-SLIDE_VAL elif event.key==K_DOWN: move_y=+SLIDE_VAL elif event.type==KEYUP: if event.key==K_LEFT: move_x=0 elif event.key==K_RIGHT: move_x=0 elif event.key==K_UP: move_y=0 elif event.key==K_DOWN: move_y=0 x+=move_x y+=move_y screen.fill((0,0,0)) screen.blit(backgrd,(x,y)) pygame.display.update()
第三部分代码是对第二部分的优化:因为我们可以发现move_x, move_y这个变量完全可以省略。
#-*- coding=utf-8 -*- # 若无上句,即便是在注释中有中文,也会报错,且这一句必须放在第一句!! #本程序来源于《Beginning Game Development with Python and Pygame》 P72 #注释 by PosPro #### 程序目标:#### #建立一个窗口,通过键盘上的方向键可以改变背景图位置 # #### 程序框架:#### #1 引入所需模块 #2 初始化 #3 一个循环构成程序核心 ### 代码重复部分未做详细注释,详情可参考前一篇博客 #1 引入所需模块 import pygame from pygame.locals import * from sys import exit #2 初始化 pygame.init() SCREEN_SIZE=(640,480) screen=pygame.display.set_mode(SCREEN_SIZE,0,32) background_image_filename='sushiplate.jpg' backgrd = pygame.image.load(background_image_filename).convert() x,y=0,0 SLIDE_VAL=10 ##稍微增加一些偏移量以便使效果更明显 #3 一个循环构成程序核心 while True: ##增加了上面这一句,便可以产生放开方向键,背景图就回到原位的效果(橡皮筋效果) for event in pygame.event.get(): if event.type==QUIT: exit() #若按下的是方向键,则根据具体方向将背景图位移SLIDE_VAL个像素 if event.type==KEYDOWN: if event.key==K_LEFT: x=-SLIDE_VAL elif event.key==K_RIGHT: x=+SLIDE_VAL elif event.key==K_UP: y=-SLIDE_VAL elif event.key==K_DOWN: y=+SLIDE_VAL elif event.type==KEYUP: if event.key==K_LEFT: x=0 elif event.key==K_RIGHT: x=0 elif event.key==K_UP: y=0 elif event.key==K_DOWN: y=0 screen.fill((0,0,0)) screen.blit(backgrd,(x,y)) pygame.display.update()