python写游戏2

继续python写游戏1

首先创建一艘飞船:

 pygame.display.set_caption("Alien Invasion")
    #创建一艘飞船
    ship=Ship(screen)

在wile循环中显示飞船

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

接下来是重构 增加代码可读性
将check_events() 放在一个名为game_functions 的模块中

import sys

import pygame

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

然后把事件放入alien_invasion.py模块中

  while True:
        gf.check_events()
        #每次循环时都会重绘屏幕
        screen.fill(ai_settings.bg_color)

把屏幕显示放入game_functions 的模块中命名为函数update_screen,并在alien_invasion.py模块中添加

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

run_game()

现在飞船的显示完成 接下来是操纵飞船了
添加进这段代码就能控制飞船,不过只能一下一下按,不过这还只是一个开始,下面的改进可以持续移动

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.rect.centerx+=1

上述方法只能实现按一次移动一次,我们可以这样想,改一下操作的东西,当按下一个键的时候把移动标志位改为True松开的时候又恢复为False 标志位为True的时候程序会实现一直移动(也就是说客户的操作从按键移动飞船变成了按键让飞船开始移动,具体的移动过程交给程序来做)
在ship.py文件里的修改

        #将每艘新飞船放到屏幕底部中央
        self.rect.centerx=self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom
        #移动标志
        self.moving_rigth=False


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

接下来设置check_events

    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 __init__(self,ai_settings,screen):
        #初始化飞船并设置其初始位置
        self.screen=screen
        self.ai_setting=ai_settings
        # 在飞船的属性center中存储小数值
        self.center = float(self.rect.centerx)
    def update(self):
        #根据移动标志调整飞船位置
        if self.moving_right:
            self.center+=self.ai_settings.ship_speed_factor
        if self.moving_left:
            self.center-=self.rect.center-self.ai_settings.ship_speed_factor
        #根据self.center更新rect对象
        self.rect.centerx=self.center

在主项目中添加

       gf.update_screen(ai_settings,screen,ship)

值得想一下想显示一艘飞船需要什么:1.飞船的属性,2.整个游戏背景的属性

控制飞船飞行范围
ship.py

def update(self):
        #更新飞船的center值
        #根据移动标志调整飞船位置
        if self.moving_right and self.rect.right<self.screen_rect.right:
            self.center+=self.ai_settings.ship_speed_factor
        if self.moving_left and self.rect.left>self.screen_rect.left:
            self.center-=self.ai_settings.ship_speed_factor
        #根据self.center更新rect对象
        self.rect.centerx=self.center

很简单,设计了一个self.center的变化范围

经过这一系列操作game_function.py文件就变得混乱了,需要重构一下

def check_keydown_events(event,ship):
    #处理按下去
    if event.key==pygame.K_RIGHT:
        #向右移动飞船
        ship.moving_right=True
    elif event.key==pygame.K_LEFT:
        #向左移动
        ship.moving_left=True

def check_keyup_events(event,ship):
    #处理按键弹上去
    if event.key==pygame.K_RIGHT:
        ship.moving_right=False
    elif event.key==pygame.K_LEFT:
        ship.moving_left=False


def check_events(ship):
    #响应按键和鼠标事件
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:
            check_keydown_events(event,ship)
        elif event.type==pygame.KEYUP:
            check_keyup_events(event,ship)

到现在为止创建了
alien_invasion.py ,创建了游戏窗口和飞船包含游戏的主循环,消息的捕获
settings.py 包含游戏的设置,窗口大小,窗口背景色和飞船的移动速度
* gam_functions.py* 包含函数响应事件和更新屏幕
ship.py 包含ship的方法和属性

到现在为止飞船就能显示并移动了(可以优化一下,让飞船可以上下移动)下面将开始发射子弹了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值