Python游戏编程笔记_BGDwPaP_0303

        本文中的程序来源于《Beginning Game Development with Python and Pygame》一书第72页,注释部分为PosPro原创(PosPro正在尝试通过直接通过在Python代码中增加注释来完成程序分析和进行教学)。

        本程序的目标是:建立一个窗口,通过键盘上的方向键改变背景图位置。


         以下为书中给出的代码,运行后可以通过键盘方向键调整背景图片位置,按一次调整一次,多次按同一个方向键,最终可以把背景图移出窗口范围。然而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()
			


你可能感兴趣的:(python,学习笔记,pygame,BGDwPaP)