淘先锋技术网

首页 1 2 3 4 5 6 7

前面留下的两个问题,因为游戏界面设置的比较小的原因,火箭在移动时就会显得比较快,一下就移出了界面,下面需要改进的就是火箭的速度与屏幕边缘的设置,火箭到了屏幕边缘就不再移动。
火箭的设置需要在settings类里添加,这里添加一个火箭速度的属性:

定义一个可以存储浮点型数据得新属性,用于存储位置信息并根据速度变换位置信息,最终再将位置信息传递给更新控制飞船的位置属性。(传递回去的时候因为数据类型的不同,会自动去除小数部分,但问题不大,这里不用细究)

#在飞船属性center中存储小数值,传递位置信息
 self.centerx = float(self.image_rect.centerx)
 self.centery = float(self.image_rect.centery)

不让火箭移到屏幕外面,只需要通过监视飞船外接矩形边缘的坐标,让它不能触及屏幕边缘坐标,通过if判断语句来检测,不仅要检测到键盘事件,还要判断火箭位置与屏幕边缘是否有接触,二者同时满足才进行移动指令,通过self.centerx,self.centery来进行位置的变换,最后再将值传递回去,更新位置的值。

     def update(self):
        '''根据移动标志响应飞船的位置'''
        if self.moving_right and self.image_rect.right < self.screen_rect.right:
            self.centerx += self.mg_settings.ship_speed
        if self.moving_left and self.image_rect.left > 0:
            self.centerx -= self.mg_settings.ship_speed
        if self.moving_up and self.image_rect.top >0:
            self.centery -= self.mg_settings.ship_speed
        if self.moving_down and self.image_rect.bottom < self.screen_rect.bottom:
            self.centery += self.mg_settings.ship_speed

        #根据self.center更新rect对象
        self.image_rect.centerx = self.centerx
        self.image_rect.centery = self.centery

(屏幕左上角的坐标值(0,0))

进行子弹的设置

我们可以通过设置子弹类,使我们按下特定的键值时,火箭可以发射子弹。
子弹可以直接利用pygame.Rect()或者是pygame包中其他方法进行生成,但是需要创建特定的图像时,可以通过自己导入图片作为子弹进行射击,这样看上去更舒服。大概方法与导入火箭大概相同,但是位置是放在了火箭的顶部中心:

   self.image_bullet_rect.centerx = ship.image_rect.centerx
   self.image_bullet_rect.top = ship.image_rect.top

创建一个bullet类单独存储子弹的设置。话不多说,看代码!
bullet.py

import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
    '''创建一个对飞船进行管理的类'''
    def __init__(self, mg_settings, screen, ship):
        '''在飞船所处位置创建一个子弹对象'''
        super(Bullet, self).__init__()
        self.screen = screen

        # 加载导弹图像并获取外接矩形
        self.image_bullet = pygame.image.load("C:\python项目文件\练习002\image\导弹.bmp")
        self.image_bullet_rect = self.image_bullet.get_rect()

        self.image_bullet_rect.centerx = ship.image_rect.centerx
        self.image_bullet_rect.top = ship.image_rect.top
        #存储用小数表示子弹的位置
        self.y = float(self.image_bullet_rect.y)

        self.bullet_speed = mg_settings.bullet_speed

    def update(self):
        '''向上移动子弹'''
        #更新表示子弹移动位置的小数值
        self.y -= self.bullet_speed
        #更新表示子弹rect的位置
        self.image_bullet_rect.y = self.y

    def draw_bullet(self):
        '''在屏幕上绘制子弹'''
        self.screen.blit(self.image_bullet, self.image_bullet_rect)

其他模块也基本上没有什么变动,变动了的相关代码如下:
main_game.py

    #创建一艘飞船
    ship = Ship(mg_settings, screen)
    #创建一个用于存储子弹的编组
    bullets = Group()

    #开始游戏主循环
    while True:

        gf.check_enents(mg_settings, screen, ship, bullets)#检测键盘事件
        ship.update()#检测到键盘事件后更新屏幕
        bullets.update()
        gf.update_screen(mg_settings, screen, ship, bullets)
run_game()
	

game_func.py

def check_enents(mg_settings, screen, ship, bullets):
    '''响应按键和鼠标事件'''
    ......
            elif event.key == pygame.K_SPACE:
                #创建一颗子弹,并将其加入到编组bullets中
                new_bullet = Bullet(mg_settings, screen, ship)
                bullets.add(new_bullet)   

......
def update_screen(mg_settings, screen, ship, bullets):
    '''更新屏幕上的图像,并切换到新屏幕'''
    # 每次循环时都重绘屏幕
    screen.fill(mg_settings.screen_color)
    #在外星人和飞船后面重绘所有子弹
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    ship.blitme()
    # 让最近绘制的屏幕可见
    pygame.display.flip() 		

settings.py

#单独创建一个类存储游戏所需的界面设置
class Settings():
    def __init__(self):
        self.screen_w = 400
        self.screen_h = 300
        self.screen_color = 255,255,255

        self.ship_speed = 0.3
        #子弹速度设置
        self.bullet_speed = 0.1

通过以上的更改,火箭可以上下左右移动且不会移出屏幕,按下空格键能发射子弹。
效果图如下:
在这里插入图片描述
后面陆续更新游戏界面的各种效果,增加游戏功能,比如,,,
问我何所有,山中惟白云。只堪自怡悦,不堪持赠君:部分道理于我有益,未必普适。部分观点能力所限,难免偏颇主观。部分行文斩钉截铁,不代表坚信其唯一正确性,只是不愿面面俱到和模棱两可而已。有错误和意见欢迎指正哈!
独乐乐,不如众乐乐:写是乐,评是乐,看是乐,乐最重要。