外星人大战---------------------游戏开发

因为基本知识已经学习的差不多了,做三个实例更加上手学习,第一个实例是游戏开发,外星人,第二个是数据处理,第三个是web开发,这一个月尽量完成第一个实例。


首先对于游戏开发,会经常使用pygame模块,安装教程我已经在前面提到过了。

1.第一步先创建一个空的游戏窗口,用于后面的外星人,飞船等

import sys     #退出时需要这个模块
import pygame  #导入游戏模块
def run_game():
    pygame.init()  #初始化,创建屏幕对象
    screen=pygame.display.set_mode((800,800))  #创建一个800*800的屏幕
    pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasion

    "开始游戏的主代码循环"
    while True:
        for event in pygame.event.get():     #监听键盘和鼠标,规定退出的情况
            if event.type==pygame.QUIT:
                sys.exit()    
         pygame.display.flip()     #让屏幕可见
run_game()

首先导入sys、pygame 模块 ,定义运行函数,初始化,定义游戏屏幕的大小以及名称,然后再开始编写游戏代码,刚开始最简单的情况,监听键盘和鼠标的动作,退出情况的编程,这就搭建好了一个简单的游戏框架,现在就是需要把刚刚做的屏幕可见,能运行出来让用户看到。最后运行程序。

输出如下:

对于屏幕,我们也可以修改屏幕背景颜色:

import sys     #退出时需要这个模块
import pygame  #导入游戏模块
def run_game():
    pygame.init()  #初始化,创建屏幕对象
    screen=pygame.display.set_mode((800,800))  #创建一个800*800的屏幕
    pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasion

    bg_color=(230,230,230)  #设置背景颜色,红绿蓝,0——255的取值范围
    
    "开始游戏的主代码循环"
    while True:
        for event in pygame.event.get():     #监听键盘和鼠标,规定退出的情况
            if event.type==pygame.QUIT:
                sys.exit() 
         screen.fill(bg_color)  
         pygame.display.flip()    #让屏幕可见,刷新屏幕
run_game()

首先在初始化里设置背景颜色,采用红绿蓝RGB,每个值得取值范围在0-255,其次在刷新屏幕的时候接受背景颜色的实参,填充屏幕。

输出如下:这里我修改了代码,是

如何简化 代码,我们可以把设置。功能分模块;这样也好维护,利于程序员修改程序:

把游戏里设置放在setting类里,我们创建一个Setting:

#存储外星人游戏开发的设置
class Setting():
    def __init__(self):
        self.screen_width=800      #设置屏幕高度宽度,背景颜色
        self.screen_height=800
        self.bg_color=(230,230,230)

在主程序里修改代码:

import sys     #退出时需要这个模块
import pygame  #导入游戏模块
from setting import Setting    #导入设置类

def run_game():
    pygame.init()  #初始化,创建屏幕对象
    ai_settings=Setting()    #创建一个800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasion

    
    "开始游戏的主代码循环"
    while True:
        for event in pygame.event.get():     #监听键盘和鼠标,规定退出的情况
            if event.type==pygame.QUIT:
                sys.exit()  
         screen.fill(ai_settings.bg_color)
         pygame.display.flip()    #让屏幕可见,刷新屏幕
run_game()

输出如下:

2.在第一步绘制好的屏幕里添加图像

在游戏里最好再用位图(.bmp),这是Python默认的加载方法,一般图片资源文件建立一个文件夹,放在项目文件夹下。我们来创建一个Ship的类,用于表示飞船的图片。

#创建飞船类
import pygame

class Ship(): 
   def __init__(self,screen):
       self.screen=screen

     #图片存在images文件夹下,名字是ship.bmp    
    self.image=pygame.image.load('images/ship.bmp')  
    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)   
   

对于这个类,首先我们通过pygame.image.load()加载图像,然后定义屏幕的rect和图片的rect,在定义图片的rect位于屏幕的rect哪里。

接着编写主程序

import sys     #退出时需要这个模块
import pygame  #导入游戏模块
from setting import Setting    #导入设置类
from ship import Ship   #导入飞船类

def run_game():
    pygame.init()  #初始化,创建屏幕对象
    ai_settings=Setting()    #创建一个800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasion

    ship=Ship(screen)   #创建飞船
    
    "开始游戏的主代码循环"
    while True:
        for event in pygame.event.get():     #监听键盘和鼠标,规定退出的情况
            if event.type==pygame.QUIT:
                sys.exit()  
         screen.fill(ai_settings.bg_color)
         ship.blitme()   
         pygame.display.flip()    #让屏幕可见,刷新屏幕
run_game()

输出如下:

3.完全重构整个函数:

发现主程序里有很多功能函数,我们可以创建一个功能的模块game_functions

#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等

import sys
import pygame

def check_events():     #响应键盘和鼠标事件
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
           sys.exit() 

def update_screen(ai_settings,screen,ship):   # 更新屏幕
    screen.fill(ai_settings.bg_color)
    ship.blitme()

    pygame.display.flip()
    

创建了两个功能函数,一个响应键盘和鼠标事件,一个更新屏幕。

编写主程序:

import pygame

from settings import Setting
from ship import Ship
from game_functions import gf

def run_game():
     pygame.init()  #初始化,创建屏幕对象
    ai_settings=Setting()    #创建一个800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasion

    ship=Ship(screen)   #创建飞船

    while True:
        gf.check_events()
        gf.update_screen(ai_settings,screen,ship)

run_game()

 输出如下:

4.驾驶飞船

前面我们已将简单搭建好游戏屏幕以及飞船,现阶段就是移动飞船,实现动态过程。

先简单的右移动,每当用户点击键盘的时候都会在pygame里注册一个事件,事件是通过pygame.event.get()获取的,在功能模块监听键盘事件:

#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等

import sys
import pygame

def check_events(ship):     #响应键盘和鼠标事件
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
           sys.exit() 
        elif event.yype==pygame.KEYDOWN:   #监测是否为右键
            if event.key==pygame.K_RIGHT:
                ship.rect.centerx+=1
def update_screen(ai_settings,screen,ship):   # 更新屏幕
    screen.fill(ai_settings.bg_color)
    ship.blitme()

    pygame.display.flip()

主程序如下:

import pygame

from setting import Setting
from ship import Ship
from game_functions import gf

def run_game():
     pygame.init()  #初始化,创建屏幕对象
    ai_settings=Setting()    #创建一个800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasion

    ship=Ship(screen)   #创建飞船

    while True:
        gf.check_events(ship)
        gf.update_screen(ai_settings,screen,ship)

run_game()

输出如下:这是我按下右键后的位置 

但是这只能一点一点移动,不能长按右键移动,可以这样想,既然按下键盘就注册一个事件,那么我长按右键盘,当我放开键盘是就是一个状态,在我不放开的键盘的这段时间里可以一直循环。所以建立一个标志moving_right,在飞船不动的时候,设为False,在按下右键盘的时候设为True,在松开的时候设为FALSE,因为这是飞船的特性,我们把代码写入Ship类

#创建飞船类
import pygame

class Ship(): 
    def __init__(self,screen):
        self.screen=screen

     #图片存在images文件夹下,名字是ship.bmp    
        self.image=pygame.image.load('images/ship.bmp')  
        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

        self.moving_right=False            #设置移动标志

    def update(self):
        if self.moving_right:        #根据移动标志,来调整位置
            self.rect.centerx+=1
        

    def blitme(self):
         self.screen.blit(self.image,self.rect)   
   

接下来再把按下键盘的一系列代码写入功能类:

#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等

import sys
import pygame

def check_events(ship):     #响应键盘和鼠标事件
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit() 
		elif event.type==pygame.KEYDOWN:     #监测是否为右键
			if event.key==pygame.K_RIGHT:
				ship.moving_right=True    #改变标志位

		elif event.type==pygame.KEYUP:       #监测是否放开键盘
			if event.key==pygame.K_RIGHT:
				ship.moving_right=False
        
         
def update_screen(ai_settings,screen,ship):   # 更新屏幕
    screen.fill(ai_settings.bg_color)
    ship.blitme()

    pygame.display.flip()

接下来是主程序:

import pygame

from setting import Setting
from ship import Ship
import game_functions as gf

def run_game():
    pygame.init()  #初始化,创建屏幕对象
    ai_settings=Setting()    #创建一个800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasion

    ship=Ship(screen)   #创建飞船

    while True:
        gf.check_events(ship)
        ship.update()
        gf.update_screen(ai_settings,screen,ship)

run_game()

 输出如下:当我按下右键盘,持续移动。

之前都是右移动,那么左移动也是一样的,现在完成左右移动的方法

A.修改Ship类:

#创建飞船类
import pygame

class Ship(): 
	def __init__(self,screen):
		self.screen=screen

     #图片存在images文件夹下,名字是ship.bmp    
		self.image=pygame.image.load('images/ship.bmp')  
		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

		self.moving_right=False            #设置移动标志
		self.moving_left=False

	def update(self):
		if self.moving_right:        #根据移动标志,来调整位置
			self.rect.centerx+=1
		if self.moving_left:
			self.rect.centerx-=1
        

	def blitme(self):
		self.screen.blit(self.image,self.rect)  

 再修改功能类:

#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等

import sys
import pygame

def check_events(ship):     #响应键盘和鼠标事件
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit() 
		elif event.type==pygame.KEYDOWN:     #监测是否为右键
			if event.key==pygame.K_RIGHT:
				ship.moving_right=True    #改变标志位
			elif event.key==pygame.K_LEFT:
				ship.moving_left=True

		elif event.type==pygame.KEYUP:       #监测是否放开键盘
			if event.key==pygame.K_RIGHT:
				ship.moving_right=False
			elif event.key==pygame.K_LEFT:
				ship.moving_left=False
      
         
def update_screen(ai_settings,screen,ship):   # 更新屏幕
    screen.fill(ai_settings.bg_color)
    ship.blitme()

    pygame.display.flip()

主程序不变:

import pygame

from setting import Setting
from ship import Ship
import game_functions as gf

def run_game():
    pygame.init()  #初始化,创建屏幕对象
    ai_settings=Setting()    #创建一个800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #对于这个窗口的命名为Alien Invasion

    ship=Ship(screen)   #创建飞船

    while True:
        gf.check_events(ship)
        ship.update()
        gf.update_screen(ai_settings,screen,ship)

run_game()

因为这是动态效果,就不截图了,自己验证过是OK的。

这是一次简单的移动效果。接下来的放入下节。

猜你喜欢

转载自blog.csdn.net/shinhwa96/article/details/84136104