运动和交互的实现

1)让小球动起来无外乎需要小球的球心位置不断改变,这就需要在小球对象里面添加一个更新小球位置的函数update

2)让小球动起来需要知道每次改变小球位置的速度量,因此需要初始化小球的速度

3)小球动起来不能让小球的跑出界面外,因此需要有一个修改小球速度的过程,比如碰到右壁应该使得x方向的速度为负

4)木板动起来需要外设输入的响应,基本设置为w,s控制左板上下,上下键控制右板上下

5)木板的移动和小球一样,只是运动的维数降低。当然这里为了使得按住不放生效,需要多定义两个bool量,反映上下移动的许可

6)因为游戏退出其实也是外设的输入导致的,因此可以集成到一个函数里面去检查外设输入事件

五个模块中代码的更新

game_main.py不变:import pygame

from game_settings import Settings

from board import Board

from ball import Ball

import game_function as gf

pygame.init()#初始化

settings=Settings()#获取设置参数

screen=pygame.display.set_mode((settings.screen_width,settings.screen_height))#创建一个界面,限制长宽

screen.fill(settings.screen_color)#界面上色

pygame.display.set_caption(settings.screen_text)#界面上文字

bd1=Board(screen,settings,'left')#定义左板,定义只需要一次

bd2=Board(screen,settings,'right')#定义右板

ball=Ball(screen,settings)#定义球

while True:

#gf.check_event(bd1)

gf.update_screen(settings,screen,ball,bd1,bd2)

game_settings.py添加速度相关量class Settings():

def __init__(self):

self.setting_screen()

self.setting_board()

self.setting_ball()

def setting_screen(self):#设置界面

self.screen_color=[0,250,250]

self.screen_width=420

self.screen_height=600

self.screen_text='弹球游戏'

def setting_board(self):#设置板子

self.board_height=100

self.board_width=5

self.board_color=[250,0,250]

self.board_location=int(self.screen_height/2-self.board_height/2)

self.board_speed=0.6#只有一个维度运动

self.board_increase_speed=1.1#木板灵敏度增加系数

def setting_ball(self):#设置弹球参数

self.ball_color=[253,122,70]

self.ball_rad=10

self.ball_width=3

self.ball_speedx=0.3#运动速度

self.ball_speedy=0.3

self.ball_increase_speed=1.01#每次碰撞后加速因子

board.py添加一个函数和运动相关变量import pygame

class Board():

def __init__(self,screen,settings,option):

self.screen=screen

self.settings=settings

self.option=option

if option=='left':#如果创建左板,那么左边距为0

self.left=0

if option=='right':#如果创建右板,左边距为如下

self.left=screen.get_rect().right-self.settings.board_width

self.color=settings.board_color#board具有四个参数,游戏进程中可能会改变的量

self.y=settings.board_location

self.width=settings.board_width

self.height=settings.board_height

self.speed=settings.board_speed

self.moving_up=False#初始两个方向都不许移动,只有在按下按键才移动

self.moving_down=False

self.prey=float(self.y)#储存y方向像素距离的浮点值,因为速度可以是小数,所以该值需要小数

def draw_board(self):

pygame.draw.rect(self.screen,self.color,[self.left,self.y,self.width,self.height])#画板子

def update(self):

if self.moving_up and self.y>self.screen.get_rect().top:

self.prey-=self.speed

if self.moving_down and self.y

self.prey+=self.speed

self.y=int(self.prey)

ball.py添加两个函数和运动相关量class Ball():

def __init__(self,screen,settings):

self.screen=screen

self.rad=settings.ball_rad#球相关的参数,游戏进程中可能会有所改变

self.color=settings.ball_color

self.width=settings.ball_width

self.centerx=int(screen.get_rect().width/2)

self.centery=int(screen.get_rect().height/2)

self.prex=float(self.centerx)#因为后面速度可能是小数,因此需要一个变量储存精确的位置信息

self.prey=float(self.centery)

self.xspeed=settings.ball_speedx

self.yspeed=settings.ball_speedy

self.increase=settings.ball_increase_speed

self.screen_left=screen.get_rect().left

self.screen_right=screen.get_rect().right

self.screen_top=screen.get_rect().top

self.screen_bottom=screen.get_rect().bottom

def draw_ball(self):

pygame.draw.circle(self.screen,self.color,[self.centerx,self.centery],self.rad,self.width)

def update(self):

self.update_speed()#更新速度

self.prex+=self.xspeed#精确值

self.prey+=self.yspeed

self.centerx=int(self.prex)#转换为可在屏幕上显示的整点值

self.centery=int(self.prey)

def update_speed(self):#更新速度

if self.centerx>self.screen_right-self.rad:#达到最右边

self.xspeed=-abs(self.xspeed)

if self.centerx

self.xspeed=abs(self.xspeed)

if self.centery>self.screen_bottom-self.rad:#达到最下边

self.yspeed=-abs(self.yspeed)

if self.centery

self.yspeed=abs(self.yspeed)

game_function.py添加外设事件处理函数,改动较大import sys

import pygame

def update_screen(settings,screen,ball,boardl,boardr):#游戏第一个函数,更新界面

screen.fill(settings.screen_color)#在screen中填充一定颜色

check_event(boardl,boardr)

boardl.update()

boardr.update()

ball.update()

boardl.draw_board()#画左板

boardr.draw_board()#画右板

ball.draw_ball()#画圆形

pygame.display.flip()#更新所有display对象

def check_event(bd1,bd2):#所有外端输入都在这个函数中响应

for event in pygame.event.get():

if event.type==pygame.QUIT:#点击'x'离开

sys.exit()

if event.type==pygame.KEYDOWN:#按下键盘

response_keydown(event,bd1,bd2)

if event.type==pygame.KEYUP:#松开键盘

response_keyup(event,bd1,bd2)

def response_keydown(event,bd1,bd2):#对按下键盘作出响应

if event.key==pygame.K_w:#w对应允许bd1上移

bd1.moving_up=True

if event.key==pygame.K_s:#s对应允许bd1下移

bd1.moving_down=True

if event.key==pygame.K_UP:#上键对应bd2上移

bd2.moving_up=True

if event.key==pygame.K_DOWN:#下键对应bd2下移

bd2.moving_down=True

if event.key==pygame.K_ESCAPE:#按下ESC退出游戏

sys.exit()

def response_keyup(event,bd1,bd2):#松开按键的响应,和按下对应相反

if event.key==pygame.K_w:

bd1.moving_up=False

if event.key==pygame.K_s:

bd1.moving_down=False

if event.key==pygame.K_UP:

bd2.moving_up=False

if event.key==pygame.K_DOWN:

bd2.moving_down=False老样子,放在一个文件夹中,运行主函数game_main.py,就可以看到一个弹来弹去的球和可以上下移动的板子了

python 弹球游戏 python弹球游戏的精髓_python编写一个弹球游戏