pygame之小练习飞机
1、飞机+云彩+子弹
import random import pygame from pygame.locals import * class Airplane(pygame.sprite.Sprite): # 继承pygame.sprite.Sprite精灵对象 def __init__(self, speed): super().__init__() self.image = pygame.image.load('resource/jet.png').convert() # 加载图片 self.rect = self.image.get_rect() # 获取X,Y坐标和大小 self.image.set_colorkey('white', RLEACCEL) # 显示时设置白色为透明 print(f'rect:{self.rect}') # 不设置默认是0,0 self.rect.x = 20 # 重新设置X轴坐标 self.rect.y = 100 # 重新设置Y轴坐标 self.speed = speed def update(self, pressed_keys, *args, **kwargs): if pressed_keys[K_UP]: # 如果按下的是方向上键 self.rect.move_ip(0, -self.speed) # 更新rect的X,Y move_up_sound.play() if pressed_keys[K_DOWN]: # 如果按下的是方向下键 self.rect.move_ip(0, self.speed) # 更新rect的X,Y move_down_sound.play() if pressed_keys[K_LEFT]: # 如果按下的是方向左键 self.rect.move_ip(-self.speed, 0) # 更新rect的X,Y if pressed_keys[K_RIGHT]: # 如果按下的是方向右键 self.rect.move_ip(self.speed, 0) # 更新rect的X,Y self.stay_inside() # 保证一直在窗口里面 def stay_inside(self): # 保证一直在窗口里面 if self.rect.top < 0: # 如果上边界小于0 self.rect.top = 0 # 设置上边界为0 if self.rect.bottom > screen.get_height(): # 如果下边界超过窗口高度 self.rect.bottom = screen.get_height() # 设置下边界为窗口高度 if self.rect.left < 0: # 如果左边界小于0 self.rect.left = 0 # 设置左边界为0 if self.rect.right > screen.get_width(): # 如果右边界超过窗口宽度 self.rect.right = screen.get_width() # 设置右边界为窗口宽度 def display(self): screen.blit(self.image, self.rect) class Bullet(pygame.sprite.Sprite): # 继承pygame.sprite.Sprite精灵对象 def __init__(self): super().__init__() self.image = pygame.image.load('resource/missile.png').convert() # 加载图片 self.image.set_colorkey('white', RLEACCEL) # 显示时设置白色为透明 self.rect = self.image.get_rect() # 获取X,Y坐标和大小 self.rect.centerx = screen.get_width() + 20 # 设置中心X轴坐标,设置在窗口最右边距离20 self.rect.centery = random.randint(0, screen.get_height()) # 设置中心Y轴坐标,随机坐标 self.speed = random.randint(4, 8) # 设置速度随机 self.stay_inside() # 保证一直在窗口里面 def update(self, *args, **kwargs): self.rect.move_ip(-self.speed, 0) # 一直向左跑,速度随机 if self.rect.right < 0: # 如果跑到头 self.kill() # 从精灵组移除自己 def stay_inside(self): # 保证一直在窗口里面 if self.rect.top < 0: # 如果上边界小于0 self.rect.top = 0 # 设置上边界为0 if self.rect.bottom > screen.get_height(): # 如果下边界超过窗口高度 self.rect.bottom = screen.get_height() # 设置下边界为窗口高度 if self.rect.left < 0: # 如果左边界小于0 self.rect.left = 0 # 设置左边界为0 if self.rect.right > screen.get_width(): # 如果右边界超过窗口宽度 self.rect.right = screen.get_width() # 设置右边界为窗口宽度 class Cloud(pygame.sprite.Sprite): # 继承pygame.sprite.Sprite精灵对象 def __init__(self): super().__init__() self.image = pygame.image.load('resource/cloud.png').convert() # 加载图片 self.image.set_colorkey('black', RLEACCEL) # 显示时设置黑色为透明 self.rect = self.image.get_rect() # 获取X,Y坐标和大小 self.rect.x = random.randint(screen.get_width() + 20, screen.get_width() + 100) # 设置X轴坐标 self.rect.y = random.randint(0, screen.get_height()) # 设置Y轴坐标,随机坐标 self.speed = 3 # 设置速度 # self.stay_inside() # 保证一直在窗口里面 def update(self, *args, **kwargs): self.rect.move_ip(-self.speed, 0) # 一直向左跑,速度随机 if self.rect.right < 0: # 如果跑到头 self.kill() # 从精灵组移除自己 def stay_inside(self): # 保证一直在窗口里面 if self.rect.top < 0: # 如果上边界小于0 self.rect.top = 0 # 设置上边界为0 if self.rect.bottom > screen.get_height(): # 如果下边界超过窗口高度 self.rect.bottom = screen.get_height() # 设置下边界为窗口高度 if self.rect.left < 0: # 如果左边界小于0 self.rect.left = 0 # 设置左边界为0 if self.rect.right > screen.get_width(): # 如果右边界超过窗口宽度 self.rect.right = screen.get_width() # 设置右边界为窗口宽度 pygame.init() # 初始化pygame pygame.mixer.init() # 初始化mixer pygame.mixer.music.load('resource/Apoxode_-_Electric_1.mp3') # 加载背景音乐 pygame.mixer.music.set_volume(0.5) # 设置音量 pygame.mixer.music.play() # 播放背景音乐 move_up_sound = pygame.mixer.Sound("resource/Rising_putter.ogg") # 加载音乐 move_up_sound.set_volume(0.8) # 设置音量 move_down_sound = pygame.mixer.Sound("resource/Falling_putter.ogg") # 加载音乐 move_down_sound.set_volume(0.8) # 设置音量 collision_sound = pygame.mixer.Sound("resource/Collision.ogg") # 加载音乐 collision_sound.set_volume(0.8) # 设置音量 ADDENEMY = USEREVENT + 1 # 自定义事件的值,必须大于USEREVENT,因为在USEREVENT之下的数值都被pygame用完了 ADDCLOUD = USEREVENT + 2 # 自定义事件的值,必须大于USEREVENT,因为在USEREVENT之下的数值都被pygame用完了 pygame.time.set_timer(ADDENEMY, 500) # 定时器,用于生成子弹,负责把事件传入PyGame的事件队列中 pygame.time.set_timer(ADDCLOUD, 1000) # 定时器,用于生成云彩,负责把事件传入PyGame的事件队列中 screen = pygame.display.set_mode((800, 600)) # 创建窗口 airplane = Airplane(5) # 创建Player对象 running = True clock = pygame.time.Clock() # 创建Clock用于跟踪时间 bullets = pygame.sprite.Group() # 定义精灵组 clouds = pygame.sprite.Group() # 定义精灵组 all_sprite = pygame.sprite.Group() # 定义精灵组,用于存放所有精灵 all_sprite.add(airplane) # 添加player到精灵组 while running: for event in pygame.event.get(): # 获取所有事件 if event.type == KEYDOWN: # 获取按钮按下事件 if event.key == K_ESCAPE: # 如果是按下了ESC键 running = False if event.type == QUIT: # 如果是QUIT事件,如点击关闭窗口按钮 running = False if event.type == ADDENEMY: # 监控自定义事件 bullet = Bullet() # 创建敌人 bullets.add(bullet) # 添加到精灵组 all_sprite.add(bullet) # 添加到all_sprite精灵组 if event.type == ADDCLOUD: # 监控自定义事件 cloud = Cloud() # 创建云彩 clouds.add(cloud) # 添加到all_sprite精灵组 clock.tick(60) # 每秒刷新多少帧,不设置按键后移动的飞快 screen.fill((135, 206, 250)) # 为窗口填充颜色 clouds.update() # 更新组中的精灵位置 clouds.draw(screen) # 显示整个精灵组中的精灵 bullets.update() # 更新组中的精灵位置 bullets.draw(screen) # 显示整个精灵组中的精灵 pressed_key = pygame.key.get_pressed() # 获取按键 airplane.update(pressed_key) airplane.display() # 碰撞检测,检测player和enemies精灵组中精灵是否碰撞 collide_sprite = pygame.sprite.spritecollideany(airplane, bullets) if collide_sprite: # 如果碰撞,返回精灵组中的碰撞精灵 collide_sprite.kill() # 从精灵组移除自己 collision_sound.play() pygame.display.update() # 刷新整个平面 或者 pygame.display.flip() pygame.mixer.music.stop() pygame.mixer.quit() pygame.quit() # 退出pygame
运行
参考链接 https://python.freelycode.com/contribution/detail/51
图片声音资源链接 https://github.com/realpython/materials/blob/master/pygame-a-primer/ (侵权告知删)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示