python《从入门到实践》笔记第12章 飞船游戏(上)
首先是介绍了pygame模块的安装,网上找了个教程
pygame安装(超级详细)_请叫我小纯洁-CSDN博客_pygame安装
pygame.init()初始化的解释
12-1蓝色天空:创建一个背景为蓝色的Pygame窗口。
12-2游戏角色:找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。创建一个类,将该角色绘制到屏幕中央,并将该图像的背景色设置为屏幕背景色,或将屏幕背景色设置为该图像的背景色。
1 #创建一个背景为蓝色的pygame窗口12-1 12-2游戏角色 2 # 3 4 import sys #sys模块功能:实现从程序外部向程序传递参数,可以参考当你点击红叉叉时产生了一个参数,把这个参数传递到程序中 5 6 import pygame #导入pygame模块 7 from weitusetting import Suo #导入weirusetting中的Suo函数 8 9 def blue_screen(): #定义蓝色窗口方法 10 #蓝色窗口 11 pygame.init() # 初始化pygame,检查一些需要的硬件调用接口、基础功能是否有问题。如果有,他会在程序运行之前就反馈给你,方便你进行排查和规避。 12 screen = pygame.display.set_mode((800,600)) #将设置好的屏幕模块参数传入到变量screen 13 pygame.display.set_caption("Adasd Csas")#调用pygame模块中的display模块中的set_caption设置标题模块 14 15 #设置背景色 16 suo = Suo(screen) #创建一个名为suo的Suo实例创建在主循环前是因为以免每次循环都创建一张图 17 # bg_color = (0,0,255) #背景色红绿蓝每种都是0-255 18 19 #主循环 20 while True: 21 22 #监视键盘和鼠标对关闭按钮的事件 23 for event in pygame.event.get(): #循环侦听事件,事件指的是用户玩游戏时执行的操作,按键或点击等 24 if event.type == pygame.QUIT: #检测并响应特定的事件 当点击窗口关闭按钮时,将检测到pygame.QUIT事件 25 pygame.quit() 26 sys.exit() #检测到事件后他的反映是调用sys.exit()进行退出 27 28 #重绘屏幕 29 screen.fill(bg_color) #fill()方法:填充 30 suo.blitme() #调用class里的blitme() 31 32 #使绘制的屏幕可见 33 pygame.display.flip()#pygame模块中的filp方法 34 35 blue_screen() #运行 36 37 #weitusetting.py 38 import pygame 39 40 class Suo(): 41 42 def __init__(self, screen): 43 """初始化图片并设置图片的初始位置""" 44 self.screen = screen 45 46 #加载图片并获取其外接矩形 47 self.image = pygame.image.load('weitu.bmp') #pygame.image.load() 48 self.rect = self.image.get_rect() #rect对象 49 self.screen_rect = screen.get_rect() 50 51 #将图片凡在屏幕中央 52 self.rect.centerx = self.screen_rect.centerx 53 #游戏元素居中,可设置相应rect对象的属性center、centerx或centery 54 #让游戏元素与屏幕边缘对齐,可使用属性top、bottom、left或right 55 #要调整游戏元素的水平或垂直位置,可使用属性x和y,它们分别是相应矩形左上角的x和y坐标。 56 def blitme(self): 57 """在指定的位置""" 58 self.screen.blit(self.image, self.rect)
12-3火箭:编写一个游戏,开始时屏幕中央有一个火箭,而玩家可使用四个方向键上下左右移动火箭。请务必确保火箭不会移到屏幕外面。
1 ##具体代码和书上的例子差不多 2 ##只是在移动标志和更新移动标志的方法有所添加 3 4 # 在飞船的属性center, bottom中存储小数值 5 self.center = float(self.rect.centerx) #横轴 6 self.center1 = float(self.rect.centery) #纵轴 7 8 #移动标志 9 self.moving_right = False #初始值为False(0) 10 self.moving_left = False 11 self.moving_up = False 12 self.moving_down = False 13 14 def update(self): 15 """根据移动标志调整飞机位置""" 16 # 更新飞船的center and bottom值,而不是rect 17 if self.moving_right and self.rect.right < self.screen_rect.right: 18 self.center += self.ai_settings.ship_speed_factor 19 if self.moving_left and self.rect.left > 0: 20 self.center -= self.ai_settings.ship_speed_factor 21 22 if self.moving_up and self.rect.top > 0: 23 self.center1 -= self.ai_settings.ship_speed_factor 24 if self.moving_down and self.rect.bottom < self.screen_rect.bottom: 25 self.center1 += self.ai_settings.ship_speed_factor 26 27 # 根据self.center和self.bottom更新rect对象 28 self.rect.centerx = self.center 29 self.rect.centery = self.center1
12-4按 键 : 创 建 一 个 程 序 , 显 示 一 个 空 屏 幕 。 在 事 件 循 环 中 , 每 当 检 测 pygame.KEYDOWN事件时都打印属性event.key。运行这个程序,并按各种键,看看Pygame如何响应。
1 import sys 2 3 import pygame 4 5 def run_game(): 6 7 pygame.init() 8 screen = pygame.display.set_mode((800,600)) 9 pygame.display.set_caption("空屏幕") 10 11 #主循环 12 while True: 13 14 ##监视按键 15 for event in pygame.event.get(): 16 if event.type == pygame.KEYDOWN: 17 print(event.key) 18 19 run_game() 20 21 ##响应: #键盘上每个健对应者一个数值,例如空格健是32
12-5侧面射击:编写一个游戏,将一艘飞船放在屏幕左边,并允许玩家上下移动飞船。在玩家按空格键时,让飞船发射一颗在屏幕中向右穿行的子弹,并在子弹离开屏幕而消失后将其删除。
1 #与书上的例子相同,只是方向不同,需要修改的ship, game_function, bullet这三个文件中的方向属性 2 #ship.pyimport pygame 3 4 class Ship(): 5 6 def __init__(self, ai_settings, screen): 7 """初始化飞船并设置其初始位置""" 8 self.screen = screen 9 self.ai_settings = ai_settings 10 11 # 加载飞船图像并获取其外接矩形 12 self.image = pygame.image.load('images/ship.bmp') #图片载入 13 self.image = pygame.transform.rotate(self.image, -90)#旋转图片 14 self.rect = self.image.get_rect() #图片获取 15 self.screen_rect = screen.get_rect() #加载到背景 16 17 # 将每艘新飞船放在屏幕左边中央 18 self.rect.centery = self.screen_rect.centery #游戏元素居中设置为y轴居中 19 self.rect.left = self.screen_rect.left #修改图形对象的初始地在左边 20 21 # 在飞船的属性center中存储小数值 22 self.center = float(self.rect.centery) #这里使用centery进行y轴中心 23 24 # 移动标志 25 self.moving_up = False 26 self.moving_down = False 27 28 def update(self): 29 """更具移动标志调整飞船的位置""" 30 # 更新飞船的center值,而不是rect 31 if self.moving_up and self.rect.top > 0: #这里使用的是top元素 32 self.rect.centery -= 1 #这里可以用1也可以用书上写得屏幕边值 33 if self.moving_down and self.rect.bottom < self.screen_rect.bottom: #bottom底部 34 self.rect.centery += 1 35 def blitme(self): 36 """在指定位置绘制飞船""" 37 self.screen.blit(self.image, self.rect) 38 39 #game_functions.py 40 import sys 41 import pygame 42 43 from bullet12 import Bullet 44 from ship12 import Ship 45 46 47 def check_keydown_events(event, ai_settings, screen, ship, bullets): 48 """响应按键""" 49 if event.key == pygame.K_UP: #K_UP是pygame模块中的上健事件,如果获取到的事件是上按键,那么 50 #向上移动飞船 51 ship.moving_up = True #moving_up的值变为True 52 elif event.key == pygame.K_DOWN: 53 ship.moving_down = True 54 elif event.key == pygame.K_SPACE: 55 #创建一颗子弹,并将其加入到编组bullets中 56 new_bullet = Bullet(ai_settings, screen, ship) 57 bullets.add(new_bullet) 58 59 def check_keyup_events(event, ship): #按键松开的响应 60 """响应松开""" 61 if event.key == pygame.K_UP: 62 ship.moving_up = False 63 elif event.key == pygame.K_DOWN: 64 ship.moving_down = False 65 66 def check_events(ai_settings, screen, ship, bullets): 67 """响应按键和鼠标事件""" 68 for event in pygame.event.get(): 69 if event.type == pygame.QUIT: 70 pygame.quit() 71 sys.exit() 72 elif event.type == pygame.KEYDOWN: 73 check_keydown_events(event, ai_settings, screen, ship, bullets) 74 elif event.type == pygame.KEYUP: 75 check_keyup_events(event, ship) 76 77 def update_screen(ai_settings, screen, ship, bullets): 78 """更新屏幕上的图像,并切换到新 屏幕""" 79 # 每次循环时都重绘屏幕 80 screen.fill(ai_settings.bg_color) 81 ship.blitme() 82 for bullet in bullets.sprites(): 83 bullet.draw_bullet() 84 85 # 让最近绘制的屏幕可见 86 pygame.display.flip() 87 # 88 ##settings12.py factor 要素,像素 89 class Settings(): 90 """存储《外星人入侵》的所有设置的类""" 91 92 def __init__(self): 93 """初始化游戏的设置""" 94 #屏幕设置 95 self.screen_width = 1200 96 self.screen_height = 800 97 self.bg_color = (230, 230, 230) 98 99 # 飞船的设置 100 self.ship_speed_factor = 1.5 101 102 # 子弹设置 103 self.bullet_speed_factor = 1 104 self.bullet_width = 5 105 self.bullet_height = 5 106 self.bullet_color = 60, 60, 60 107 #self.bullets_allowed = 3 108 109 #alien_invasion12.py 110 import sys 111 112 import pygame 113 114 from settings12 import Settings 115 from ship12 import Ship 116 import game_functions12 as gf 117 from pygame.sprite import Group 118 from bullet12 import Bullet 119 120 121 def run_game(): 122 #初始化pygame、设置和屏幕对象 123 pygame.init() 124 125 ai_settings = Settings() 126 screen = pygame.display.set_mode( 127 (ai_settings.screen_width, ai_settings.screen_height)) 128 pygame.display.set_caption("左边上下串") 129 130 # 创建一艘飞船 131 ship = Ship(ai_settings, screen) 132 #创建一个用于存储子弹的编组 133 bullets = Group() 134 135 # 开始游戏的主循环 136 while True: 137 gf.check_events(ai_settings, screen, ship, bullets) 138 ship.update() 139 bullets.update() 140 gf.update_screen(ai_settings, screen, ship, bullets) 141 142 # 删除已消失的子弹 143 for bullet in bullets.copy(): 144 if bullet.rect.right <= 0: 145 bullets.remove(bullet) 146 print(len(bullets)) 147 148 149 run_game() 150 151 #bullet.py 152 import pygame 153 from pygame.sprite import Sprite 154 155 class Bullet(Sprite): 156 """一个对飞船发射的子弹进行管理的类""" 157 158 def __init__(self, ai_settings, screen, ship): 159 """在飞船所处的位置创建一个子弹对象""" 160 super().__init__() 161 self.screen = screen 162 163 # 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置 164 self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, 165 ai_settings.bullet_height) 166 self.rect.centery = ship.rect.centery 167 self.rect.right = ship.rect.right 168 169 # 存储用小数表示的子弹位置 170 self.x = float(self.rect.x) 171 172 self.color = ai_settings.bullet_color 173 self.speed_factor = ai_settings.bullet_speed_factor 174 175 def update(self): 176 """向上移动子弹""" 177 #更新表示子弹位置的小数值 178 self.x += self.speed_factor 179 #更新表示子弹的rect的位置 180 self.rect.x = self.x 181 182 def draw_bullet(self): 183 """在屏幕上绘制子弹""" 184 pygame.draw.rect(self.screen, self.color, self.rect)
还不熟练,还得多搞写项目,和还有就是pygame中的模块例如rect, draw等,都得百度和看F11,不明确啊