From 5731c026e947218835c09a6c6522a4fe9f7342b7 Mon Sep 17 00:00:00 2001 From: frigginglorious Date: Tue, 25 Oct 2016 23:16:29 -0500 Subject: [PATCH] some english translations. Modified game to be faster, more competitive --- gameRole.py | 164 ++++++++++----------- mainGame.py | 400 ++++++++++++++++++++++++++-------------------------- 2 files changed, 285 insertions(+), 279 deletions(-) diff --git a/gameRole.py b/gameRole.py index 2d04a68..4db7bc5 100644 --- a/gameRole.py +++ b/gameRole.py @@ -1,83 +1,83 @@ -# -*- coding: utf-8 -*- -""" -Created on Wed Sep 11 16:36:03 2013 - -@author: Leo -""" - -import pygame - -SCREEN_WIDTH = 480 -SCREEN_HEIGHT = 800 - -TYPE_SMALL = 1 -TYPE_MIDDLE = 2 -TYPE_BIG = 3 - -# 子弹类 -class Bullet(pygame.sprite.Sprite): - def __init__(self, bullet_img, init_pos): - pygame.sprite.Sprite.__init__(self) - self.image = bullet_img - self.rect = self.image.get_rect() - self.rect.midbottom = init_pos - self.speed = 10 - - def move(self): - self.rect.top -= self.speed - -# 玩家类 -class Player(pygame.sprite.Sprite): - def __init__(self, plane_img, player_rect, init_pos): - pygame.sprite.Sprite.__init__(self) - self.image = [] # 用来存储玩家对象精灵图片的列表 - for i in range(len(player_rect)): - self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha()) - self.rect = player_rect[0] # 初始化图片所在的矩形 - self.rect.topleft = init_pos # 初始化矩形的左上角坐标 - self.speed = 8 # 初始化玩家速度,这里是一个确定的值 - self.bullets = pygame.sprite.Group() # 玩家飞机所发射的子弹的集合 - self.img_index = 0 # 玩家精灵图片索引 - self.is_hit = False # 玩家是否被击中 - - def shoot(self, bullet_img): - bullet = Bullet(bullet_img, self.rect.midtop) - self.bullets.add(bullet) - - def moveUp(self): - if self.rect.top <= 0: - self.rect.top = 0 - else: - self.rect.top -= self.speed - - def moveDown(self): - if self.rect.top >= SCREEN_HEIGHT - self.rect.height: - self.rect.top = SCREEN_HEIGHT - self.rect.height - else: - self.rect.top += self.speed - - def moveLeft(self): - if self.rect.left <= 0: - self.rect.left = 0 - else: - self.rect.left -= self.speed - - def moveRight(self): - if self.rect.left >= SCREEN_WIDTH - self.rect.width: - self.rect.left = SCREEN_WIDTH - self.rect.width - else: - self.rect.left += self.speed - -# 敌人类 -class Enemy(pygame.sprite.Sprite): - def __init__(self, enemy_img, enemy_down_imgs, init_pos): - pygame.sprite.Sprite.__init__(self) - self.image = enemy_img - self.rect = self.image.get_rect() - self.rect.topleft = init_pos - self.down_imgs = enemy_down_imgs - self.speed = 2 - self.down_index = 0 - - def move(self): +# -*- coding: utf-8 -*- +""" +Created on Wed Sep 11 16:36:03 2013 + +@author: Leo +""" + +import pygame + +SCREEN_WIDTH = 480 +SCREEN_HEIGHT = 800 + +TYPE_SMALL = 1 +TYPE_MIDDLE = 2 +TYPE_BIG = 3 + +# 子弹类 +class Bullet(pygame.sprite.Sprite): + def __init__(self, bullet_img, init_pos): + pygame.sprite.Sprite.__init__(self) + self.image = bullet_img + self.rect = self.image.get_rect() + self.rect.midbottom = init_pos + self.speed = 10 + + def move(self): + self.rect.top -= self.speed + +# 玩家类 +class Player(pygame.sprite.Sprite): + def __init__(self, plane_img, player_rect, init_pos): + pygame.sprite.Sprite.__init__(self) + self.image = [] # 用来存储玩家对象精灵图片的列表 + for i in range(len(player_rect)): + self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha()) + self.rect = player_rect[0] # 初始化图片所在的矩形 + self.rect.topleft = init_pos # 初始化矩形的左上角坐标 + self.speed = 8 # 初始化玩家速度,这里是一个确定的值 + self.bullets = pygame.sprite.Group() # 玩家飞机所发射的子弹的集合 + self.img_index = 0 # 玩家精灵图片索引 + self.is_hit = False # 玩家是否被击中 + + def shoot(self, bullet_img): + bullet = Bullet(bullet_img, self.rect.midtop) + self.bullets.add(bullet) + + def moveUp(self): + if self.rect.top <= 0: + self.rect.top = 0 + else: + self.rect.top -= self.speed + + def moveDown(self): + if self.rect.top >= SCREEN_HEIGHT - self.rect.height: + self.rect.top = SCREEN_HEIGHT - self.rect.height + else: + self.rect.top += self.speed + + def moveLeft(self): + if self.rect.left <= 0: + self.rect.left = 0 + else: + self.rect.left -= self.speed + + def moveRight(self): + if self.rect.left >= SCREEN_WIDTH - self.rect.width: + self.rect.left = SCREEN_WIDTH - self.rect.width + else: + self.rect.left += self.speed + +# 敌人类 +class Enemy(pygame.sprite.Sprite): + def __init__(self, enemy_img, enemy_down_imgs, init_pos): + pygame.sprite.Sprite.__init__(self) + self.image = enemy_img + self.rect = self.image.get_rect() + self.rect.topleft = init_pos + self.down_imgs = enemy_down_imgs + self.speed = 5 + self.down_index = 0 + + def move(self): self.rect.top += self.speed \ No newline at end of file diff --git a/mainGame.py b/mainGame.py index 07d4295..756c6db 100644 --- a/mainGame.py +++ b/mainGame.py @@ -1,197 +1,203 @@ -# -*- coding: utf-8 -*- -""" -Created on Wed Sep 11 11:05:00 2013 - -@author: Leo -""" - -import pygame -from sys import exit -from pygame.locals import * -from gameRole import * -import random - - -# 初始化游戏 -pygame.init() -screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) -pygame.display.set_caption('飞机大战') - -# 载入游戏音乐 -bullet_sound = pygame.mixer.Sound('resources/sound/bullet.wav') -enemy1_down_sound = pygame.mixer.Sound('resources/sound/enemy1_down.wav') -game_over_sound = pygame.mixer.Sound('resources/sound/game_over.wav') -bullet_sound.set_volume(0.3) -enemy1_down_sound.set_volume(0.3) -game_over_sound.set_volume(0.3) -pygame.mixer.music.load('resources/sound/game_music.wav') -pygame.mixer.music.play(-1, 0.0) -pygame.mixer.music.set_volume(0.25) - -# 载入背景图 -background = pygame.image.load('resources/image/background.png').convert() -game_over = pygame.image.load('resources/image/gameover.png') - -filename = 'resources/image/shoot.png' -plane_img = pygame.image.load(filename) - -# 设置玩家相关参数 -player_rect = [] -player_rect.append(pygame.Rect(0, 99, 102, 126)) # 玩家精灵图片区域 -player_rect.append(pygame.Rect(165, 360, 102, 126)) -player_rect.append(pygame.Rect(165, 234, 102, 126)) # 玩家爆炸精灵图片区域 -player_rect.append(pygame.Rect(330, 624, 102, 126)) -player_rect.append(pygame.Rect(330, 498, 102, 126)) -player_rect.append(pygame.Rect(432, 624, 102, 126)) -player_pos = [200, 600] -player = Player(plane_img, player_rect, player_pos) - -# 定义子弹对象使用的surface相关参数 -bullet_rect = pygame.Rect(1004, 987, 9, 21) -bullet_img = plane_img.subsurface(bullet_rect) - -# 定义敌机对象使用的surface相关参数 -enemy1_rect = pygame.Rect(534, 612, 57, 43) -enemy1_img = plane_img.subsurface(enemy1_rect) -enemy1_down_imgs = [] -enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267, 347, 57, 43))) -enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(873, 697, 57, 43))) -enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267, 296, 57, 43))) -enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(930, 697, 57, 43))) - -enemies1 = pygame.sprite.Group() - -# 存储被击毁的飞机,用来渲染击毁精灵动画 -enemies_down = pygame.sprite.Group() - -shoot_frequency = 0 -enemy_frequency = 0 - -player_down_index = 16 - -score = 0 - -clock = pygame.time.Clock() - -running = True - -while running: - # 控制游戏最大帧率为60 - clock.tick(60) - - # 控制发射子弹频率,并发射子弹 - if not player.is_hit: - if shoot_frequency % 15 == 0: - bullet_sound.play() - player.shoot(bullet_img) - shoot_frequency += 1 - if shoot_frequency >= 15: - shoot_frequency = 0 - - # 生成敌机 - if enemy_frequency % 50 == 0: - enemy1_pos = [random.randint(0, SCREEN_WIDTH - enemy1_rect.width), 0] - enemy1 = Enemy(enemy1_img, enemy1_down_imgs, enemy1_pos) - enemies1.add(enemy1) - enemy_frequency += 1 - if enemy_frequency >= 100: - enemy_frequency = 0 - - # 移动子弹,若超出窗口范围则删除 - for bullet in player.bullets: - bullet.move() - if bullet.rect.bottom < 0: - player.bullets.remove(bullet) - - # 移动敌机,若超出窗口范围则删除 - for enemy in enemies1: - enemy.move() - # 判断玩家是否被击中 - if pygame.sprite.collide_circle(enemy, player): - enemies_down.add(enemy) - enemies1.remove(enemy) - player.is_hit = True - game_over_sound.play() - break - if enemy.rect.top > SCREEN_HEIGHT: - enemies1.remove(enemy) - - # 将被击中的敌机对象添加到击毁敌机Group中,用来渲染击毁动画 - enemies1_down = pygame.sprite.groupcollide(enemies1, player.bullets, 1, 1) - for enemy_down in enemies1_down: - enemies_down.add(enemy_down) - - # 绘制背景 - screen.fill(0) - screen.blit(background, (0, 0)) - - # 绘制玩家飞机 - if not player.is_hit: - screen.blit(player.image[player.img_index], player.rect) - # 更换图片索引使飞机有动画效果 - player.img_index = shoot_frequency // 8 - else: - player.img_index = player_down_index // 8 - screen.blit(player.image[player.img_index], player.rect) - player_down_index += 1 - if player_down_index > 47: - running = False - - # 绘制击毁动画 - for enemy_down in enemies_down: - if enemy_down.down_index == 0: - enemy1_down_sound.play() - if enemy_down.down_index > 7: - enemies_down.remove(enemy_down) - score += 1000 - continue - screen.blit(enemy_down.down_imgs[enemy_down.down_index // 2], enemy_down.rect) - enemy_down.down_index += 1 - - # 绘制子弹和敌机 - player.bullets.draw(screen) - enemies1.draw(screen) - - # 绘制得分 - score_font = pygame.font.Font(None, 36) - score_text = score_font.render(str(score), True, (128, 128, 128)) - text_rect = score_text.get_rect() - text_rect.topleft = [10, 10] - screen.blit(score_text, text_rect) - - # 更新屏幕 - pygame.display.update() - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - pygame.quit() - exit() - - # 监听键盘事件 - key_pressed = pygame.key.get_pressed() - # 若玩家被击中,则无效 - if not player.is_hit: - if key_pressed[K_w] or key_pressed[K_UP]: - player.moveUp() - if key_pressed[K_s] or key_pressed[K_DOWN]: - player.moveDown() - if key_pressed[K_a] or key_pressed[K_LEFT]: - player.moveLeft() - if key_pressed[K_d] or key_pressed[K_RIGHT]: - player.moveRight() - - -font = pygame.font.Font(None, 48) -text = font.render('Score: '+ str(score), True, (255, 0, 0)) -text_rect = text.get_rect() -text_rect.centerx = screen.get_rect().centerx -text_rect.centery = screen.get_rect().centery + 24 -screen.blit(game_over, (0, 0)) -screen.blit(text, text_rect) - -while 1: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - pygame.quit() - exit() - pygame.display.update() +# -*- coding: utf-8 -*- +""" +Created on Wed Sep 11 11:05:00 2013 + +@author: Leo +""" + +import pygame +from sys import exit +from pygame.locals import * +from gameRole import * +import random + + +# 初始化游戏 +pygame.init() +screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) +# pygame.display.set_caption('飞机大战') +pygame.display.set_caption('Chinese Python Shooter Game') + +# 载入游戏音乐 +bullet_sound = pygame.mixer.Sound('resources/sound/bullet.wav') +enemy1_down_sound = pygame.mixer.Sound('resources/sound/enemy1_down.wav') +game_over_sound = pygame.mixer.Sound('resources/sound/game_over.wav') +bullet_sound.set_volume(0.3) +enemy1_down_sound.set_volume(0.3) +game_over_sound.set_volume(0.3) +pygame.mixer.music.load('resources/sound/game_music.wav') +pygame.mixer.music.play(-1, 0.0) +pygame.mixer.music.set_volume(0.25) + +# 载入背景图 +background = pygame.image.load('resources/image/background.png').convert() +game_over = pygame.image.load('resources/image/gameover.png') + +filename = 'resources/image/shoot.png' +plane_img = pygame.image.load(filename) + +# 设置玩家相关参数 +player_rect = [] +player_rect.append(pygame.Rect(0, 99, 102, 126)) # 玩家精灵图片区域 +player_rect.append(pygame.Rect(165, 360, 102, 126)) +player_rect.append(pygame.Rect(165, 234, 102, 126)) # 玩家爆炸精灵图片区域 +player_rect.append(pygame.Rect(330, 624, 102, 126)) +player_rect.append(pygame.Rect(330, 498, 102, 126)) +player_rect.append(pygame.Rect(432, 624, 102, 126)) +player_pos = [200, 600] +player = Player(plane_img, player_rect, player_pos) + +# 定义子弹对象使用的surface相关参数 +bullet_rect = pygame.Rect(1004, 987, 9, 21) +bullet_img = plane_img.subsurface(bullet_rect) + +# 定义敌机对象使用的surface相关参数 +enemy1_rect = pygame.Rect(534, 612, 57, 43) +enemy1_img = plane_img.subsurface(enemy1_rect) +enemy1_down_imgs = [] +enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267, 347, 57, 43))) +enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(873, 697, 57, 43))) +enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267, 296, 57, 43))) +enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(930, 697, 57, 43))) + +enemies1 = pygame.sprite.Group() + +# 存储被击毁的飞机,用来渲染击毁精灵动画 +enemies_down = pygame.sprite.Group() + +shoot_frequency = 0 + +shoot_timing = 15 + +enemy_frequency = 0 + +player_down_index = 16 + +score = 0 + +clock = pygame.time.Clock() + +running = True + +while running: + # 控制游戏最大帧率为60 + # Translation? Clock.tick is just for processing efficiency? + clock.tick(60) + + # 控制发射子弹频率,并发射子弹 + # Translation? for calculating when and how fast player shoots + if not player.is_hit: + if shoot_frequency % shoot_timing == 0: + bullet_sound.play() + player.shoot(bullet_img) + shoot_frequency += 1 + if shoot_frequency >= shoot_timing: + shoot_frequency = 0 + + # 生成敌机 + if enemy_frequency % 40 == 0: + enemy1_pos = [random.randint(0, SCREEN_WIDTH - enemy1_rect.width), 0] + enemy1 = Enemy(enemy1_img, enemy1_down_imgs, enemy1_pos) + enemies1.add(enemy1) + enemy_frequency += 1 + if enemy_frequency >= 80: + enemy_frequency = 0 + + # 移动子弹,若超出窗口范围则删除 + for bullet in player.bullets: + bullet.move() + if bullet.rect.bottom < 0: + player.bullets.remove(bullet) + + # 移动敌机,若超出窗口范围则删除 + for enemy in enemies1: + enemy.move() + # 判断玩家是否被击中 + if pygame.sprite.collide_circle(enemy, player): + enemies_down.add(enemy) + enemies1.remove(enemy) + player.is_hit = True + game_over_sound.play() + break + if enemy.rect.top > SCREEN_HEIGHT: + enemies1.remove(enemy) + + # 将被击中的敌机对象添加到击毁敌机Group中,用来渲染击毁动画 + enemies1_down = pygame.sprite.groupcollide(enemies1, player.bullets, 1, 1) + for enemy_down in enemies1_down: + enemies_down.add(enemy_down) + + # 绘制背景 + screen.fill(0) + screen.blit(background, (0, 0)) + + # 绘制玩家飞机 + if not player.is_hit: + screen.blit(player.image[player.img_index], player.rect) + # 更换图片索引使飞机有动画效果 + player.img_index = shoot_frequency // 8 + else: + player.img_index = player_down_index // 8 + screen.blit(player.image[player.img_index], player.rect) + player_down_index += 1 + if player_down_index > 47: + running = False + + # 绘制击毁动画 + for enemy_down in enemies_down: + if enemy_down.down_index == 0: + enemy1_down_sound.play() + if enemy_down.down_index > 7: + enemies_down.remove(enemy_down) + score += 1000 + continue + screen.blit(enemy_down.down_imgs[enemy_down.down_index // 2], enemy_down.rect) + enemy_down.down_index += 1 + + # 绘制子弹和敌机 + player.bullets.draw(screen) + enemies1.draw(screen) + + # 绘制得分 + score_font = pygame.font.Font(None, 36) + score_text = score_font.render(str(score), True, (128, 128, 128)) + text_rect = score_text.get_rect() + text_rect.topleft = [10, 10] + screen.blit(score_text, text_rect) + + # 更新屏幕 + pygame.display.update() + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + exit() + + # 监听键盘事件 + key_pressed = pygame.key.get_pressed() + # 若玩家被击中,则无效 + if not player.is_hit: + if key_pressed[K_w] or key_pressed[K_UP]: + player.moveUp() + if key_pressed[K_s] or key_pressed[K_DOWN]: + player.moveDown() + if key_pressed[K_a] or key_pressed[K_LEFT]: + player.moveLeft() + if key_pressed[K_d] or key_pressed[K_RIGHT]: + player.moveRight() + +# calculate +font = pygame.font.Font(None, 48) +text = font.render('Score: '+ str(score), True, (255, 0, 0)) +text_rect = text.get_rect() +text_rect.centerx = screen.get_rect().centerx +text_rect.centery = screen.get_rect().centery + 24 +screen.blit(game_over, (0, 0)) +screen.blit(text, text_rect) + +while 1: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + exit() + pygame.display.update()