外星人入侵

今天是一个周末,宿舍的人全部都出去玩了,而我因为太懒一个人留在了宿舍,连床都不起,吃饭靠的是点外卖。

不过,为了好玩,我跟着书本学习打了一个2D小游戏,并加入了一点自己的东西。

一、游戏页面

        刚开始我把所有的游戏屏幕设置都放在了下面代码里,这使得代码看起来非常长,和杂乱, 所以为了使游戏方便扩展和整个代码逻辑更容易理解,我将整个游戏分为了几个文件。下面就是主程序文件

import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf


def run_game():
    #初始化游戏并创建一个屏幕对象
    pygame.init()#初始化背景设置,让Pygame能够正长工作
    # screen=pygame.display.set_mode((1200,800))#实参(1200,800)是一个元组,制定了游戏窗口的尺寸
    ai_settings=Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("外星人入侵")

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


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

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

        #监视键盘和鼠标事件
        # for event in pygame.event.get():
        #     if event.type==pygame.QUIT:#如果用户点叉号,则退出
        #         sys.exit()
        gf.check_events(ship)

        ship.update()

        #每次循环时重绘屏幕
        #screen.fill(bg_color)
        # screen.fill(ai_settings.bg_color)
        # ship.blitme()
        #
        # #让最近绘制的屏幕可见
        # pygame.display.flip()
        gf.update_screen(ai_settings,screen,ship)

run_game()

二、屏幕设置类settings.py

class Settings(object):
    '''存储这个游戏的所有设置类'''

    def __init__(self):
        '''初始化游戏设置'''
        #屏幕设置
        self.screen_width=450
        self.screen_height=640
        # self.bg_color=(230,250,250)
        #self.ship_speed_factor=1.5

本身我跟随书本里做的时候,它提供的是背景颜色,但是我觉得背景颜色太难看了,所以就自己进行了修改,修改在下一部分里

三、创建ship类

在这个类里,我们将飞船显示在屏幕上,并进行屏幕的更新,在这基础上,我在这个类里给游戏加上了背景图片,记住一定要先绘制背景图片,在绘制飞船,不然会显示不出飞船

import pygame

class Ship(object):
    def __init__(self,screen):
        '''初始化飞船,并设定其初始位置'''
        self.screen=screen



        #加载飞船图像,并获取其外接矩形
        self.image=pygame.image.load('images/img/plane_2.png')
        self.screen_image=pygame.image.load('images/bg_2.jpg')
        self.rect=self.image.get_rect()#获取飞船外接矩形
        self.screen_rect=screen.get_rect()#获取表示屏幕的矩形
        self.screen_image_rect=self.screen_image.get_rect()


        #将每艘新飞船放在屏幕底部中央
        self.screen_image_rect.centerx=self.screen_rect.centerx
        self.screen_image_rect.bottom = self.screen_rect.bottom
        self.rect.centerx=self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom


        #移动标示
        self.moving_right=False
        self.moving_left=False

        self.moving_up = False
        self.moving_down = False



    def update(self):
        ''' 根据移动标示移动飞船'''
        if self.moving_right:
            self.rect.centerx+=1
        if self.moving_left:
            self.rect.centerx-=1
        if self.moving_up :
            self.rect.bottom-=1
        if self.moving_down :
            self.rect.bottom+=1




    def blitme(self):
       '''在指定位置绘制飞船'''
       self.screen.blit(self.screen_image, self.screen_image_rect)
       self.screen.blit(self.image, self.rect)  # blitme(),根据self.rect将图片绘制到屏幕上。

四、游戏操作

既然是电脑游戏,则肯定是要通过键盘来控制飞船的移动,我们需要响应按键。每当用户按键时,都将在Pygame中注册一个事件。

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.key==pygame.K_UP:
                    ship.moving_up = True
                elif event.key==pygame.K_DOWN:
                    ship.moving_down = 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
                elif event.key == pygame.K_UP:
                    ship.moving_up = False
                elif event.key == pygame.K_DOWN:
                    ship.moving_down = False


def update_screen(ai_settings,screen,ship):
    # screen.fill(ai_settings.bg_color)

    ship.blitme()

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

 

 

这就是我这一天所学习的,至于限制飞船不出屏幕,填装弹药以及外星人的创建,要等到下次了。

posted @ 2018-03-11 15:44  fromzore  阅读(169)  评论(0编辑  收藏  举报