|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
描述
自己用pygame自制的射击游戏
下面是源代码和相关素材
alienInvasion.py
- import sys
- import pygame
- from settings import Settings
- from ship import Ship
- from bullet import Bullet
- from alien import Alien
- class AlienInvasion:
- def __init__(self):
- #初始化游戏资源
- pygame.init()
- self.settings = Settings()
- self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
- pygame.display.set_caption("Alien Invasion")
- self.ship = Ship(self)
- self.bullets = pygame.sprite.Group()
- self.aliens = pygame.sprite.Group()
- self._create_fleet()
- def run_game(self):
- #开始游戏的主循环
- while True:
- self._check_events()
- self.ship.update()
- self._update_bullets()
- self._update_aliens()
- self._update_screen()
- def _check_events(self):
- """响应按键和鼠标事件"""
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- elif event.type == pygame.KEYDOWN:
- self._check_keydown_events(event)
- elif event.type == pygame.KEYUP:
- self._check_keyup_events(event)
-
- def _check_keydown_events(self, event):
- """响应按键"""
- if event.key == pygame.K_RIGHT:
- self.ship.moving_right = True
- elif event.key == pygame.K_LEFT:
- self.ship.moving_left = True
- elif event.key == pygame.K_ESCAPE:
- sys.exit()
- elif event.key == pygame.K_SPACE:
- self._fire_bullet()
- def _check_keyup_events(self, event):
- """响应松开"""
- if event.key == pygame.K_RIGHT:
- self.ship.moving_right = False
- elif event.key == pygame.K_LEFT:
- self.ship.moving_left = False
- def _fire_bullet(self):
- """创建一颗子弹,并将其加入编组bullets中"""
- new_bullet = Bullet(self)
- self.bullets.add(new_bullet)
- def _update_bullets(self):
- """更新子弹的位置,并删除已消失的子弹"""
- #更新子弹位置
- self.bullets.update()
- #删除已消失的子弹
- for bullet in self.bullets.copy():
- if bullet.rect.bottom <= 0:
- self.bullets.remove(bullet)
- #检查是否有子弹击中了外星人
- #如果是这样,就删除相应的子弹和外星人
- collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
-
- def _create_fleet(self):
- """创建外星人群"""
- #创建一个外星人,并计算一行可以容纳多少外星人
- #外星人的间距为外星人宽度
- alien = Alien(self)
- alien_width, alien_height = alien.rect.size
- available_space_x = self.settings.screen_width - (3 * alien_width)
- number_aliens_x = available_space_x // (3 * alien_width)
- #计算屏幕可容纳多少行外星人
- ship_height = self.ship.rect.height
- available_space_y = (self.settings.screen_height - (3 * alien_height) - ship_height)
- number_rows = available_space_y // (4 * alien_height)
- #创建外星人群
- for row_number in range(number_rows):
- for alien_number in range(number_aliens_x):
- self._create_alien(alien_number, row_number)
- def _create_alien(self, alien_number, row_number):
- """创建一个外星人并将其加入当前行"""
- alien = Alien(self)
- alien_width, alien_height = alien.rect.size
- alien.x = alien_width + 3 * alien_width * alien_number
- alien.rect.x = alien.x
- alien.rect.y = alien_height + 3 * alien_height * row_number
- self.aliens.add(alien)
- def _update_aliens(self):
- """检查是否有外星人位于屏幕边缘,并更新整群外星人的位置"""
- self._check_fleet_edges()
- self.aliens.update()
- def _check_fleet_edges(self):
- """有外星人到达边缘时采取相应的措施"""
- for alien in self.aliens.sprites():
- if alien.check_edges():
- self._change_fleet_direction()
- break
-
- def _change_fleet_direction(self):
- """将整群外星人下移,并改变它们的移动方向"""
- for alien in self.aliens.sprites():
- alien.rect.y += self.settings.fleet_drop_speed
- self.settings.fleet_direction *= -1
- def _update_screen(self):
- """更新屏幕上的图像,并切换到新屏幕"""
- self.screen.fill(self.settings.bg_color)
- self.ship.blitme()
- for bullet in self.bullets.sprites():
- bullet.draw_bullet()
- self.aliens.draw(self.screen)
- #让最近绘制的屏幕可见
- pygame.display.flip()
- if __name__ == '__main__':
- ai = AlienInvasion()
- ai.run_game()
复制代码
settings.py
- class Settings:
- def __init__(self):
- """存储游戏的所有设置的类"""
- #屏幕设置
- self.screen_width = 1200
- self.screen_height = 800
- self.bg_color = (0, 0, 0)
- #飞船设置
- self.ship_speed = 1.5
- #子弹设置
- self.bullet_speed = 1.0
- self.bullet_width = 100
- self.bullet_height = 15
- self.bullet_color = (255, 255, 0)
- #外星人设置
- self.alien_speed = 1.0
- self.fleet_drop_speed = 10
- #fleet_direction为1表示向右移,为-1表示向左移
- self.fleet_direction = 1
复制代码
ship.py
- import pygame
- class Ship:
- """管理飞船的类"""
- def __init__(self, ai_game):
- """初始化飞船并设置其初始位置"""
- self.screen = ai_game.screen
- self.settings = ai_game.settings
- self.screen_rect = ai_game.screen.get_rect()
- #加载飞船图像并获取其外接矩形
- self.image = pygame.image.load('images/ship.png')
- self.rect = self.image.get_rect()
-
- #对于每艘新飞船,都将其放在屏幕底部中央
- self.rect.midbottom = self.screen_rect.midbottom
- #在飞船的属性x中存储小数值
- self.x = float(self.rect.x)
- #移动标志
- self.moving_right = False
- self.moving_left = False
- def update(self):
- """根据移动标志调整飞船的位置"""
- #更新飞船而不是rect对象的x值
- if self.moving_right and self.rect.right < self.screen_rect.right:
- self.x += self.settings.ship_speed
- if self.moving_left and self.rect.left > 0:
- self.x -= self.settings.ship_speed
- #根据self.x更新rect对象
- self.rect.x = self.x
-
- def blitme(self):
- """在指定位置绘制飞船"""
- self.screen.blit(self.image, self.rect)
复制代码
bullet.py
- import pygame
- from pygame.sprite import Sprite
- class Bullet(Sprite):
- """一个对飞船发射的子弹进行管理的类"""
- def __init__(self, ai_game):
- """在飞船所在的位置创建一个子弹对象"""
- super().__init__()
- self.screen = ai_game.screen
- self.settings = ai_game.settings
- self.color = self.settings.bullet_color
- #在(0, 0)处创建一个表示子弹的矩形,再设置正确的位置
- self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height)
- self.rect.midtop = ai_game.ship.rect.midtop
- #存储用小数表示的子弹位置
- self.y = float(self.rect.y)
-
- def update(self):
- """向上移动子弹"""
- #更新表示子弹位置的小数值
- self.y -= self.settings.bullet_speed
- #更新表示子弹的rect的位置
- self.rect.y = self.y
-
- def draw_bullet(self):
- """在屏幕上绘制子弹"""
- pygame.draw.rect(self.screen, self.color, self.rect)
复制代码
alien.py
- import pygame
- from pygame.sprite import Sprite
- class Alien(Sprite):
- """表示单个外星人的类"""
- def __init__(self, ai_game):
- """初始化外星人并设置其起始位置"""
- super().__init__()
- self.screen = ai_game.screen
- self.settings = ai_game.settings
- #加载外星人图像,并设置其rect属性
- self.image = pygame.image.load('images/alien.png')
- self.rect = self.image.get_rect()
- #每个外星人最初都在屏幕左上角附近
- self.rect.x = self.rect.width
- self.rect.y = self.rect.height
- #存储外星人准确水平位置
- self.x = float(self.rect.x)
- def check_edges(self):
- """如果外星人位于屏幕边缘,就返回True"""
- screen_rect = self.screen.get_rect()
- if self.rect.right >= screen_rect.right or self.rect.left <= 0:
- return True
-
- def update(self):
- """向右移动外星人"""
- self.x += (self.settings.alien_speed * self.settings.fleet_direction)
- self.rect.x = self.x
复制代码
没有子弹图片,子弹是用pygame.draw画的矩形
屏幕刷新有点怪怪的,有知道原因的人吗 |
|