python--从入门到实践--chapter 12 pygame_Alien_Invasion
发布日期:2021-07-01 03:39:39
浏览次数:2
分类:技术文章
本文共 7538 字,大约阅读时间需要 25 分钟。
- 安装pygame包,把安装好的包copy一份到pycharm工程目录下,不然找不到pygame包 抄一遍书上的代码:
class Settings(): def __init__(self): self.screen_width = 1200 self.screen_height = 800 self.bg_color = (255, 255, 255) self.ship_speed_factor = 1.5
import pygameclass Ship(): def __init__(self, ai_settings, screen): self.screen = screen self.ai_settings = ai_settings self.image = pygame.image.load("images/ship.bmp") self.rect = self.image.get_rect() #图像矩形 self.screen_rect = screen.get_rect() #屏幕矩形,左上角原点,右下角如1200,800 self.rect.centerx = self.screen_rect.centerx #图像x中心,在屏幕中心 self.rect.bottom = self.screen_rect.bottom #图像底边,在屏幕底边 self.center = float(self.rect.centerx) #图像x中心坐标转成浮点型,存在center中 self.moving_right = False self.moving_left = False def update(self): if self.moving_right and self.rect.right < self.screen_rect.right: #限制位置在屏幕内 self.center += self.ai_settings.ship_speed_factor if self.moving_left and self.rect.left > 0: self.center -= self.ai_settings.ship_speed_factor self.rect.centerx = self.center def blitme(self): self.screen.blit(self.image, self.rect) #blit实现动画效果
game_functions.py
import sysimport pygamedef check_keydown_events(event, ship): #检测键盘按下事件 if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = Truedef check_keyup_events(event, ship): #检测键盘松开事件 if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key == pygame.K_LEFT: ship.moving_left = Falsedef check_events(ship): for event in pygame.event.get(): if event.type == pygame.QUIT: #退出事件 sys.exit() elif event.type == pygame.KEYDOWN: #键盘按下事件 check_keydown_events(event, ship) elif event.type == pygame.KEYUP: #键盘松开事件 check_keyup_events(event, ship)def update_screen(ai_settings, screen, ship): screen.fill(ai_settings.bg_color) #屏幕填充背景色 ship.blitme() #ship的动画效果 pygame.display.flip() #让动画尽可能流畅
alien_invasion.py
import sysimport pygamefrom settings import Settingsfrom ship import Shipimport game_functions as gfdef run_game(): pygame.init() ai_settings = Settings() #创建游戏设置 screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") #设置标题 ship = Ship(ai_settings, screen) #创建游戏对象 while True: gf.check_events(ship) #检测事件 ship.update() #更新ship位置 gf.update_screen(ai_settings, screen, ship) #刷新屏幕run_game()练习题: 2.创建一个程序,显示一个空屏幕。在事件循环中,每当检测到 pygame.KEYDOWN 事件时都打印属性event.key。运行这个程序,并按各种键,看看Pygame如何响应
import pygameimport sysdef check_events(screen): for event in pygame.event.get(): if event.type == pygame.QUIT: #退出事件 sys.exit() elif event.type == pygame.KEYDOWN: #键盘按下事件 while True: font = pygame.font.SysFont("宋体", 80) #设置字体 font_surface = font.render(str(event.key), True, (0, 0, 0), (255, 255, 255)) #渲染内容为面 pygame.image.save(font_surface, "text.bmp") #面保存成图片 image = pygame.image.load("text.bmp") #获取图片 image_rect = image.get_rect() #获取图片的矩形 image_rect.centerx = 200 #设置图片矩形位置 image_rect.centery = 150 screen.blit(image, image_rect) #屏幕呈现该图片 pygame.display.flip() #屏幕刷新显示出来 if pygame.event.poll().type == pygame.KEYUP: #键盘松开 break #退出def run_game(): pygame.init() pygame.font.init() screen = pygame.display.set_mode((400, 300)) pygame.display.set_caption("测试按键......") #设置标题 while True: screen.fill((255, 255, 255)) # 屏幕填充背景色 pygame.display.flip() #刷新屏幕 check_events(screen) #检测事件run_game()添加子弹模块后的代码
class Settings(): def __init__(self): self.screen_width = 1200 self.screen_height = 800 self.bg_color = (255, 255, 255) self.ship_speed_factor = 1.5 #飞船速度 self.bullet_speed_factor = 1 #子弹速度 self.bullet_width = 3 #子弹宽高 self.bullet_height = 15 self.bullet_color = 60, 60, 60 #子弹颜色 self.bullets_allowed = 2 #屏幕中允许的子弹数量
不变
import pygamefrom pygame.sprite import Spriteclass Bullet(Sprite): def __init__(self, ai_settings, screen, ship): super().__init__() self.screen = screen self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height) #绘制子弹的矩形 self.rect.centerx = ship.rect.centerx #子弹x与飞船相同 self.rect.top = ship.rect.top #子弹从飞船顶部起飞 self.y = float(self.rect.y) # y存一份浮点的,可以精调位置 self.color = ai_settings.bullet_color #子弹颜色 self.speed_factor = ai_settings.bullet_speed_factor #子弹速度 def update(self): self.y -= self.speed_factor #位置更新 self.rect.y = self.y #浮点y位置付给矩形图形 def draw_bullet(self): pygame.draw.rect(self.screen, self.color, self.rect) #把子弹矩形画到屏幕上
game_functions.py
import sysimport pygamefrom bullet import Bulletdef fire_bullet(ai_settings, screen, ship, bullets): #发射子弹 if len(bullets) < ai_settings.bullets_allowed: #子弹没超数量 new_bullet = Bullet(ai_settings, screen, ship) #生成新子弹 bullets.add(new_bullet) #新子弹加入组def check_keydown_events(event,ai_settings, screen, ship, bullets): #检测键盘按下事件 if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True elif event.key == pygame.K_SPACE: #按下空格键,发射子弹 fire_bullet(ai_settings, screen, ship, bullets)def check_keyup_events(event, ship): #检测键盘松开事件 if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key == pygame.K_LEFT: ship.moving_left = Falsedef check_events(ai_settings, screen, ship, bullets): for event in pygame.event.get(): if event.type == pygame.QUIT: #退出事件 sys.exit() elif event.type == pygame.KEYDOWN: #键盘按下事件 check_keydown_events(event, ai_settings, screen, ship, bullets) elif event.type == pygame.KEYUP: #键盘松开事件 check_keyup_events(event, ship)def update_screen(ai_settings, screen, ship, bullets): screen.fill(ai_settings.bg_color) #屏幕填充背景色 for bullet in bullets.sprites(): #把每个子弹画在屏幕上 bullet.draw_bullet() ship.blitme() #ship的动画效果 pygame.display.flip() #刷新,让动画尽可能流畅def update_bullets(bullets): bullets.update() #更新子弹位置 for bullet in bullets.copy(): #删除飞出屏幕的子弹 if bullet.rect.bottom <= 0: bullets.remove(bullet)
alien_invasion.py
import sysimport pygamefrom settings import Settingsfrom ship import Shipimport game_functions as gffrom pygame.sprite import Groupdef run_game(): pygame.init() ai_settings = Settings() #创建游戏设置 screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") #设置标题 ship = Ship(ai_settings, screen) #创建游戏飞船对象 bullets = Group() #创建子弹组 while True: gf.check_events(ai_settings, screen, ship, bullets) #检测事件 ship.update() #更新ship位置 gf.update_bullets(bullets) #更新子弹位置,删除飞出去的子弹 # print(len(bullets)) #调试时,确认子弹飞出屏幕后被删除 gf.update_screen(ai_settings, screen, ship, bullets) #刷新屏幕run_game()作业3:更改上述代码,使之横向发射子弹 添加 pygame.transform.rotozoom(surface, angle, scale) (缩放和旋转) 代码连接
转载地址:https://michael.blog.csdn.net/article/details/89496636 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月17日 14时13分24秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python 多进程之进程池的操作
2019-05-01
flask整理之 flask程序中的debug模式
2019-05-01
比特币,父母这一辈能接受吗?
2019-05-01
为什么要反对比特币,这不代表是空气币
2019-05-01
SnapEx的新感觉,对新手很友好
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01
当博士进入币圈会怎么样
2019-05-01
《增长黑客》(肖恩·艾利斯)学习笔记——第二部分 实战
2019-05-01
python使用HTMLTestRunner查看运行函数
2019-05-01
python的ImportError
2019-05-01
linux下安装jenkins+git+python
2019-05-01
解决uiautomatorviewer中添加xpath的方法
2019-05-01
性能测试的必要性评估以及评估方法
2019-05-01
Spark学习——利用Mleap部署spark pipeline模型
2019-05-01
Oracle创建表,修改表(添加列、修改列、删除列、修改表的名称以及修改列名)
2019-05-01
使用redis实现订阅功能
2019-05-01
对称加密整个过程
2019-05-01