外星人入侵(二)

飞船的移动

思路:当按下特定的方向键后,飞船向指定的方向移动,可以允许不断移动,为实现不断移动,需要设置一个移动标志,默认为False,当按下时,则为True,实现其方向键的移动,除此之外,还要限制飞船的活动范围,防止飞出边界,为此需要更改代码

ship.py完整代码如下

import pygame

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

        #加载飞船图像
        self.image=pygame.image.load('E:\外星人入侵\images\ship.bmp')
        #获取飞船图像的长宽尺寸
        self.rect=self.image.get_rect()

        #获取游戏屏幕的尺寸
        self.screen_rect=screen.get_rect()


        #将每艘新飞船放在屏幕底部的中央

        #飞船的x坐标=屏幕的x中间位置坐标
        self.rect.centerx=self.screen_rect.centerx
        #飞船的y坐标=屏幕的底部Y值
        self.rect.bottom=self.screen_rect.bottom

        #在飞船的属性center中存储最小数值
        # self.center=float(0)


        #飞船移动标志
        self.moving_right=False
        self.moving_left =False
        self.moving_down = False
        self.moving_up = False

    def update(self):
        """根据移动标志调整飞船的位置"""
        #更新飞船的center值而不是rect
        if self.moving_right and self.rect.right<self.screen_rect.right:
            self.rect.centerx+=1
            #self.center+=self.ai.speed
        if self.moving_left and self.rect.left>0:
           self.rect.centerx-=1
        if self.moving_up and self.rect.top>self.screen_rect.top:
           self.rect.centery -= 1
           # self.center+=self.ai.speed
        if self.moving_down and self.rect.bottom<self.screen_rect.bottom:
           self.rect.centery += 1
            #self.center -= self.ai.speed
        #根据self.center更新rect对象
        #self.rect.centerx+=self.center

    def blitme(self):
        """指定位置绘制飞船"""

        #blit(图像,图像绘制的位置坐标)
        self.screen.blit(self.image,self.rect)


添加update()函数,根据上下左右移动标志,进行飞船的上下左右移动

game_functions.py完整代码如下

import sys
import pygame

def check_keydown_evnet(event,ship):
    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

def check_keyup_event(event,ship):
    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 check_evens(ship):
    """响应按键和鼠标事件"""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        #检测是否有按键按下
        elif event.type==pygame.KEYDOWN:
            check_keydown_evnet(event, ship)

        elif event.type==pygame.KEYUP:
            check_keyup_event(event, ship)


def update_screen(ai_settings,screen,ship):
    """每次更新屏幕上的图像,并切换到新屏幕"""
    # 背景填充颜色
    screen.fill(ai_settings.bg_color)
    # 将飞船绘制到屏幕上
    ship.blitme()

    # 让最近绘制的屏幕可见,否则是看不见的
    pygame.display.flip()

进行相应的按键事件处理,添加判断按键是否按下与松开的相关处理事件,从而实现飞船的上下左右移动

alien_invasion.py完整代码如下

import sys

import pygame
#导入设置类
from settings import Settings
from ship import Ship
import game_functions as gf

def run_game():
    #初始化游戏并创建一个屏幕对象
    pygame.init()
    #实例化settings对象
    ai=Settings()
    #创建游戏窗口大小
    screen=pygame.display.set_mode((ai.screen_width,ai.screen_height))
    #创建游戏标题
    pygame.display.set_caption("外星人大战")

    #实例化飞船对象ship,传入屏幕实参
    ship=Ship(ai,screen)

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

        #监视键盘和鼠标的事件

        gf.check_evens(ship)
        ship.update()
        gf.update_screen(ai,screen,ship)
if __name__ == '__main__':
    run_game()

最后实现的效果图如下
这里写图片描述

总结

实现飞船的上下左右移动,以及边界限制

猜你喜欢

转载自blog.csdn.net/jia666666/article/details/81263979
今日推荐