太空射击python


import random
import pygame
from os import path

img_dir = path.join(path.dirname(__file__), 'assets')
sound_folder = path.join(path.dirname(__file__), 'sounds')

WIDTH = 480
HEIGHT = 600
FPS = 60

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

pygame.init()

pygame.mixer.init()

screen = pygame.display.set_mode((WIDTH, HEIGHT))

pygame.display.set_caption("太空射击")

clock = pygame.time.Clock()

background = pygame.image.load(path.join(img_dir, 'starfield.png')).convert()

background_rect = background.get_rect()

font_name = pygame.font.match_font('楷体', 16)

player_img = pygame.image.load(path.join(img_dir, 'playerShip1_orange.png')).convert()

bullet_img = pygame.image.load(path.join(img_dir, 'laserRed16.png')).convert()

meteor_images = []
meteor_list = [
    'meteorBrown_tiny1.png',
    'meteorBrown_small2.png',
    'meteorBrown_small1.png',
    'meteorBrown_med3.png',
    'meteorBrown_med1.png',
    'meteorBrown_big2.png',
    'meteorBrown_big1.png',
]

for image in meteor_list:
    meteor_images.append(pygame.image.load(path.join(img_dir, image)).convert())

explosion_anim = {}
explosion_anim['lg'] = []
explosion_anim['sm'] = []
for i in range(9):
    filename = 'regularExplosion0{}.png'.format(i)
    img = pygame.image.load(path.join(img_dir, filename)).convert()
    img.set_colorkey(BLACK)
    img_lg = pygame.transform.scale(img, (75, 75))
    explosion_anim['lg'].append(img_lg)
    img_sm = pygame.transform.scale(img, (32, 32))
    explosion_anim['sm'].append(img_sm)

shooting_sound = pygame.mixer.Sound(path.join(sound_folder, 'pew.wav'))

expl_sounds = []
for sound in ['expl3.wav', 'expl6.wav']:
    expl_sounds.append(pygame.mixer.Sound(path.join(sound_folder, sound)))

def draw_text(surf, text, size, x, y):

    font = pygame.font.Font(font_name, size)

    text_surface = font.render(text, True, WHITE)

    text_rect = text_surface.get_rect()

    text_rect.midtop = (x, y)

    surf.blit(text_surface, text_rect)

def main_menu():

    global screen

    menu_song = pygame.mixer.music.load(path.join(sound_folder, 'menu.ogg'))

    pygame.mixer.music.play(-1)

    title = pygame.image.load(path.join(img_dir, 'main.png')).convert()

    title = pygame.transform.scale(title, (WIDTH, HEIGHT), screen)

    screen.blit(title, (0, 0))

    pygame.display.update()

    while True:
        ev = pygame.event.poll()

        if ev.type == pygame.KEYDOWN:

            if ev.key == pygame.K_RETURN:
                break

            elif ev.key == pygame.K_q:

                pygame.quit()

                quit()

        elif ev.type == pygame.QUIT:

            pygame.quit()

            quit()

        else:

            draw_text(screen, "Press [ENTER] TO Begin", 30, WIDTH / 2, HEIGHT / 2)

            draw_text(screen, "or [Q] To Quit", 30, WIDTH / 2, (HEIGHT / 2) + 40)

            pygame.display.update()

    ready_song = pygame.mixer.Sound(path.join(sound_folder, 'getready.ogg'))

    ready_song.play()

    screen.fill(BLACK)

    draw_text(screen, "GET READY!", 60, WIDTH / 2, HEIGHT / 2)

    pygame.display.update()

class Bullet(pygame.sprite.Sprite):

    def __init__(self, x, y):

        pygame.sprite.Sprite.__init__(self)

        self.image = bullet_img
        self.image.set_colorkey(BLACK)

        self.rect = self.image.get_rect()

        self.rect.centerx = x

        self.rect.bottom = y

        self.speedy = -10

    def update(self):

        self.rect.y += self.speedy

        if self.rect.bottom < 0:
            self.kill()

class Mob(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image_orig = random.choice(meteor_images)
        self.image_orig.set_colorkey(BLACK)

        self.image = self.image_orig.copy()

        self.rect = self.image.get_rect()

        self.rect.x = random.randrange(0, WIDTH - self.rect.width)

        self.rect.y = random.randrange(-150, -100)

        self.speedy = random.randrange(5, 20)

        self.speedx = random.randrange(-3, 3)

        self.radius = int(self.rect.width * .90 / 2)

        self.rotation = 0

        self.rotation_speed = random.randrange(-8, 8)

        self.last_update = pygame.time.get_ticks()

    def rotate(self):

        time_now = pygame.time.get_ticks()

        if time_now - self.last_update > 50:

            self.last_update = time_now

            self.rotation = (self.rotation + self.rotation_speed) % 360

            new_image = pygame.transform.rotate(self.image_orig, self.rotation)

            old_center = self.rect.center

            self.image = new_image

            self.rect = self.image.get_rect()

            self.rect.center = old_center

    def update(self):

        self.rotate()

        self.rect.x += self.speedx

        self.rect.y += self.speedy

        if (self.rect.top > HEIGHT + 10) or (self.rect.left < -25) or (self.rect.right > WIDTH + 20):

            self.rect.x = random.randrange(0, WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, 8)

def newmob():

    mob_element = Mob()

    all_sprites.add(mob_element)

    mobs.add(mob_element)

class Explosion(pygame.sprite.Sprite):

    def __init__(self, center, size):

        self.size = size
        pygame.sprite.Sprite.__init__(self)

        self.image = explosion_anim[self.size][0]

        self.rect = self.image.get_rect()

        self.rect.center = center

        self.frame = 0

        self.frame_rete = 75

        self.last_update = pygame.time.get_ticks()

    def update(self):

        now = pygame.time.get_ticks()

        if now - self.last_update > self.frame_rete:

            self.last_update = now
            self.frame += 1
            if self.frame == len(explosion_anim[self.size]):
                self.kill()
            else:
                center = self.rect.center
                self.image = explosion_anim[self.size][self.frame]
                self.rect = self.image.get_rect()
                self.rect.center = center

class Player(pygame.sprite.Sprite):

    def __init__(self):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.transform.scale(player_img, (50, 38))
        self.image.set_colorkey(BLACK)

        self.rect = self.image.get_rect()

        self.redius = 20

        self.rect.centerx = WIDTH / 2

        self.rect.bottom = HEIGHT - 10

        self.speedx = 0

        self.shoot_delay = 250

        self.last_shoot = pygame.time.get_ticks()

    def update(self):

        self.speedx = 0
        pygame.event.poll()

        keystate = pygame.key.get_pressed()

        if keystate[pygame.K_LEFT]:
            self.speedx = -5

        elif keystate[pygame.K_RIGHT]:
            self.speedx = 5

        if keystate[pygame.K_SPACE]:

            self.shoot()

        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

        self.rect.x += self.speedx

    def shoot(self):

        now = pygame.time.get_ticks()

        if now - self.last_shoot > self.shoot_delay:

            self.last_shoot = now

            bullet = Bullet(self.rect.centerx, self.rect.top)

            all_sprites.add(bullet)

            bullets.add(bullet)

            shooting_sound.play()

running = True

menu_display = True
while running:

    if menu_display:
        main_menu()

        pygame.time.wait(2000)

        pygame.mixer.music.stop()

        pygame.mixer.music.load(path.join(sound_folder, 'tgfcoder-FrozenJam-SeamlessLoop.ogg'))

        pygame.mixer.music.play(-1)

        menu_display = False

        all_sprites = pygame.sprite.Group()

        player = Player()

        all_sprites.add(player)

        bullets = pygame.sprite.Group()

        mobs = pygame.sprite.Group()

        for i in range(8):

            newmob()

    clock.tick(FPS)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE:

                running = False

    all_sprites.update()

    hits = pygame.sprite.groupcollide(mobs, bullets, True, True)

    for hit in hits:

        random.choice(expl_sounds).play()

        expl = Explosion(hit.rect.center, 'lg')
        all_sprites.add(expl)

        newmob()

    screen.fill(BLACK)

    screen.blit(background, background_rect)

    all_sprites.draw(screen)

    pygame.display.flip()
pygame.quit()

Original: https://www.cnblogs.com/stblack/p/16637208.html
Author: 司徒小夜
Title: 太空射击python

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610760/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Eureka详解系列(三)–探索Eureka强大的配置体系

    通过前面的两篇博客,我们知道了:什么是 Eureka?为什么使用 Eureka?如何使用 Eureka?今天,我们开始来研究 Eureka 的源码,先从配置部分的源码开始看,其他部…

    Java 2023年6月13日
    085
  • mysql sql语法

    show index from 表名; 查询某一张表的索引 explain select * from 表名 where 条件; 使用explain查看查询优化器对索引的使用情况 …

    Java 2023年6月5日
    087
  • Maven 依赖调解源码解析(五):同一个文件内声明,后者覆盖前者

    这次我们让 A 直接依赖 X,且在 A 的 pom.xml 中声明两次 X,分别为 1.0 和 2.0 版本。内容如下: 这个场景比较简单,不涉及调解器,我们直接对着图看一下主流程…

    Java 2023年6月16日
    052
  • 配置SpringBoot方便的切换jar和war

    网上关于如何切换,其实说的很明确,本文主要通过profile进行快速切换已实现在不同场合下,用不同的打包方式。 jar到war修改步骤 pom文件修改 packaging配置由ja…

    Java 2023年5月30日
    078
  • 并发bug之源(一)-可见性

    CPU三级缓存 要聊可见性,这事儿还得从计算机的组成开始说起,我们都知道,计算机由CPU、内存、磁盘、显卡、外设等几部分组成,对于我们程序员而言,写代码主要关注CPU和内存两部分。…

    Java 2023年6月9日
    077
  • Doug Lea文章阅读记录-JUC系列

    3.3 QueuesThe heart of the framework is maintenance of queues of blocked threads, which ar…

    Java 2023年6月13日
    081
  • Java编辑器的下载和应用——IDEA

    IDEA下载 (1)搜索 IntelliJ IDEA,选择电脑适合的版本下载(跟着指示一步步安装就好了) (2)安装完成后打开,创建一个空项目(在之后的学习中可把所有的代码放这里,…

    Java 2023年6月6日
    052
  • [Java][Spring]spring profile与maven profile多环境管理

    spring profile 与 maven profile 多环境管理 spring profile Spring profile是 Spring提供的多环境管理方案。 如下图:…

    Java 2023年6月5日
    078
  • MongoDB高级应用之数据转存与恢复(5)

    1、MongoDB索引 1.1、创建索引 db.books.ensureIndex{{number:1}} 创建索引同时指定索引的名字 db.books.ensureIndex({…

    Java 2023年6月7日
    096
  • JavaCV的摄像头实战之三:保存为mp4文件

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《JavaCV的摄…

    Java 2023年6月8日
    093
  • Windows-电脑清理

    1、清理回收站 2、右键磁盘清理 3、运行 %temp% ,全删 4、win设置清理 win搜索—>存储—>配置存储感知或立即运行打开存储感知、…

    Java 2023年6月9日
    083
  • 从餐厅服务员到一线互联网电商程序员 (中)

    本系列文章分三部分: 上: 餐厅、洗浴会所打工经历中: 大学求学创业经历下: 互联网从业经历 本文为第二部分,关注 “真香号”,及时阅读其它篇章。 接上文:…

    Java 2023年6月7日
    081
  • Java面试题(十)–Spring Cloud

    1 基础知识篇 1、什么是微服务架构? 微服务架构是一种架构模式或者说是架构风格,它提倡将单一应用程序划分成一组小的服务。每个服务运行在其独立的自己的进程中服务之间相互配合、相互协…

    Java 2023年6月9日
    090
  • Java连载149-集合类小节

    一、Collection和Collections之间的区别 Collection是一个接口类,是Set和List接口的父接口 Collections是一个工具类,是不应该初始化为一…

    Java 2023年6月13日
    082
  • JDK成长记20: ReenranctLock(3)释放锁的AQS底层原理

    前两节你应该掌握了ReentrantLock加锁成功和加锁失败入队的核心逻辑,是如何通过AQS中的3个组件做到的。今天来我们看下: ReentrantLock中,当线程释放锁时的逻…

    Java 2023年6月5日
    082
  • 热部署只知道devtools吗?JRebel不香吗?

    前言 JRebel收费怎么破? 什么是本地热部署? 什么是远程热部署? JRebel和devtools的区别 如何安装JRebel? 如何本地热部署? 如何远程热部署? 多模块开发…

    Java 2023年6月14日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球