宇宙飞船打外星人(python-2D游戏开发)

1.开发准备

1.环境
选择一个python环境,本设备选用的为一个tensorflow_gpu2.4.0的py36环境。

2.开发流程

2.1创建第一个外星人

1、首先我新建一个Aliens类,创建第一个外星人,我选择了一个tensorflow2的py36的一个编译环境;当然我需要创建一个脚本存放这个类:alien.py;在该脚本中,我导入pygame包的时候报错了,证明我这个包在该环境中没有下载,于是我去博客中找到该包下载的办法【1】:

  • 首先下载安装pygame所需要的wheel包,我们可以去该网址找到我们需要的安装包:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame,找到对应的python环境,下载之后我根据【1】安装遇到一些问题:
    在这里插入图片描述
    于是,我尝试新的安装方法:首先,我打开该环境anaconda prompt(管理员),并激活该环境,我的虚拟环境名称为tensorflow2,所有我输入:activate tensorflow2;之后,直接pip安装会出错:pip install pygame-1.9.6-cp36-cp36m-win_amd64.whl,原来我需要先将该.whl文件拷贝到该虚拟环境指定文件夹中安装,我可以直接找到该虚拟环境的目录,拷贝之后,我再一次输入上面的安装指令,最后成功安装:在这里插入图片描述

然后再去visual studio2017,在对应脚本中输入:import pygame,报错消失,说明安装成功。之后,我再去定义这个Aliens类:

## 创建Aliens类
class Aliens(Sprite):
     """表示单个外星人的类"""
    
     def __init__(self,ai_settings,screen):
     
         """初始化外星人并设置其起始位置"""
         super(Aliens,self).__init__()
         self.screen=screen
         self.ai_settings=ai_settings

         #加载外星人图像,并设置成rect属性
         self.image=pygame.image.load("img/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 blitme(self):
          """在指定位置绘制外星人"""
          self.screen.blit(self,image,self.rect)

之后,我结合电脑自带的画图软件画了个简易的外星人,并经过ps软件调整图像大小,另存为png格式,并在项目根目录下新建文件夹命名为img,将该外星人图像放在img文件夹下:
在这里插入图片描述
在这里插入图片描述
2、之后再创建Aliens实例,需要新建一个脚本:alien_invasion.py;在该脚本中,我们创建这个实例:

from ship import Ship
from alien import Aliens
import game_functions as gf

def run_game():
    --snip--
    #创建一个外星人
    alien=Aliens(ai_settings,screen)

    #开始游戏主循环
    while True:
        gf.check_keydown_events
        ship.update()
        gf.update_screen(ai_settings,screen,ship,alien,bullets)

run_game()

其中,from ship import Ship ,报错,同理,在tensorflow2虚拟环境下我们直接pip安装一下这个包:pip install ship;安装成功,问题解决;

--snip--
# 先省略部分代码的作用

tips:快捷键ctrl+shift+A可以快速在该项目中创建.py脚本:
在这里插入图片描述

3、初始化一些游戏的功能,而让外星人出现在屏幕上只是一个功能,我们需要初始化多个这种函数,其中让外星人出现在屏幕上我们会用到update_screen(),并调用blitme(),创建一个game_functions.py,下面大家就好领悟了:

import sys
from time import sleep
import pygame

#from alien import Aliens
#from bullet import Bullet

"""
def check_keydown_events(event,ai_settings,screen,ship,bullets):
    

    elif event.key == pygame.k_q:
        sys.exit()
"""
def update_screen(alien,ai_settings,screen,ship,bullets):
    --snip--
    #在飞船和外星人后面重绘所有子弹
    for bullet in bullets:
        bullet.draw_bullet()
    ship.blitme()
    alien.blitme()

    #让最近绘制的屏幕可见
    pygame.display.flip()

之后,我运行代码发现并不会出现屏幕和外星人:
在这里插入图片描述

后来才发现要创建pygame窗口以及响应用户输入界面,于是我进行如下开展。

2.2进行一些响应和设置操作

1、创建pygame窗口以及用于输入的响应用户,并设置一下背景颜色,创建了一个设置类:settings.py;并实例化这个类,然后在alien_invasion.py添加访问设置,最后修改如下:
settings.py:

class Settings():
    """存储《外星人入侵》的所设置的类"""


    def __init__(self):
        """初始化游戏的设置"""
        #屏幕设置
        self.screen_width=1200
        self.screen_hight=800
        self.bg_color=(230,230,230)

alien_invasion.py:

from pygame.sprite import Sprite
from ship import Ship
from alien import Aliens
from settings import Settings


def run_game():
    #--------------------------#
    #初始化游戏并创建一个屏幕对象
    #-------------------------#
    pygame.init()
    #screen=pygame .display.set_mode(1200,800)
    screen=pygame .display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    #--------------------------#
    #设置背景颜色
    #-------------------------#
    bg_color=(230,230,230)

    #开始游戏的主循环
    while True:

        #监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                sys.exit()
        
        #每次循环时都重新绘制屏幕
        screen.fill(bg_color)

        #让最近绘制的屏幕可见
        pygame.display.flip()
    
    #创建一个外星人
    alien=Aliens(ai_settings,screen)

    #开始游戏主循环
    #while True:
        #gf.check_keydown_events
        #ship.update()
        #gf.update_screen(ai_settings,screen,ship,alien,bullets)

run_game()

2、添加飞船图片,同理,我又在画图工具画了一个飞船简图,并调整大小,放置在img/文件夹下,命名为ship.png:
在这里插入图片描述

2.3在屏幕上绘制飞船

1、首先创建Ship类,新建ship.py脚本:

import pygame
class Ship():

    def __init__(self,screen):
        """初始化飞船并设置其初始位置"""
        self.screen=screen

        #加载飞船图像并获取其外接矩形
        self.image=ppygame.image.load("img/ship.png")
        self.rect=self.image.get_rect()
        self.screen_rect=screen.get_rect()

        #将每艘飞船放置在屏幕底部中央
        self.rect.centerx=self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom
    
    def blitme(self):
        """在指定位置绘制飞船"""
        self.screen.blit(self.image,self.rect)

2、在屏幕上绘制飞船,我们更新一下alien_invasion.py,使其创建一艘飞船,并调用其方法blitme(),由于报错,我们现将创建外星人的代码注释掉,并加入新的代码:

import pygame
#import game_functions as gf
import sys


from pygame.sprite import Sprite
from ship import Ship
from alien import Aliens
from settings import Settings


def run_game():
    #--------------------------#
    #初始化游戏并创建一个屏幕对象
    #-------------------------#
    pygame.init()
    ai_settings=Settings()
    #screen=pygame .display.set_mode(1200,800)
    screen=pygame .display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    #--------------------------#
    #设置背景颜色
    #-------------------------#
    bg_color=(230,230,230)

    #--------------------------#
    #新建一艘飞船
    #-------------------------#
    ship=Ship(screen)

    #--------------------------#
    #创建一个外星人
    #-------------------------#
    #alien=Aliens(ai_settings,screen)

    #开始游戏的主循环
    while True:

        #监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                sys.exit()
        
        #每次循环时都重新绘制屏幕
        screen.fill(bg_color)
        #调用我们自己定义的函数blitme(),使其在指定位置绘制飞船
        ship.blitme()

        #让最近绘制的屏幕可见
        pygame.display.flip()
        
    #开始游戏主循环
    #while True:
        #gf.check_keydown_events
        #ship.update()
        #gf.update_screen(ai_settings,screen,ship,alien,bullets)

run_game()

3、运行alien_invasion.py之后报错:在这里插入图片描述
返回settings.py脚本发现height输错了,反正大家报错就根据错误提示去找线索并修改就好:
在这里插入图片描述
比如下面又是习惯性输入出错:在这里插入图片描述
将ppygame修改为pygame,再运行,成功:
在这里插入图片描述
做到这一步已经成功一半,坚持就是胜利!

2.4设置移动、调整速度和活动范围等功能

1、我们在game_functions.py中check_event(ship)设置飞船的响应按键:点击右键向右移动,松开停止移动,飞船不移动时,moving_right置为False,玩家按下箭头,moving_right=True,松开moving_right=False,根据pygame.KEYDOWN可以检测玩家按下事件;pygame.KEYUP可以检测玩家松开按键事件。飞船每右键按一次,飞船将向右移动一个像素,将ship.rect.centerx值加一。
2、同理,左键标志也为moving_right=False,飞船每左键按一次,飞船将向左移动一个像素,将ship.rect.centerx值减一。
3、然后设置调整飞船速度,代码最后一起罗列。

2.5射击设置部分

前面我们已经创建好游戏屏幕,并能更新画面,我们还创建了一个飞船,并让其限制活动范围,而按键可以控制其移动方向,那么现在马上创建飞船的子弹设置吧。
1、添加子弹设置(包括子弹数量、颜色。速度、大小),再创建Bullet类
2、遇到的问题:参数顺序要一致,不然代码混乱,运行会报错
通过调整多次代码,最后运行成功,效果如下:
在这里插入图片描述
而且,移动方向我按左键它向右移,再去看看按键设置的代码,并调整飞船移动的速度;之后,对于子弹再做一些改进,删除消失的子弹、并限制子弹数量。
之后,返回2.1创建一个及多个外星人,运行alien_invasion.py:效果如下:
在这里插入图片描述

效果展示

代码

参考:
https://blog.csdn.net/mao_hui_fei/article/details/100124405

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的渔WZH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值