前面留下的两个问题,因为游戏界面设置的比较小的原因,火箭在移动时就会显得比较快,一下就移出了界面,下面需要改进的就是火箭的速度与屏幕边缘的设置,火箭到了屏幕边缘就不再移动。
火箭的设置需要在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
通过以上的更改,火箭可以上下左右移动且不会移出屏幕,按下空格键能发射子弹。
效果图如下:
后面陆续更新游戏界面的各种效果,增加游戏功能,比如,,,
问我何所有,山中惟白云。只堪自怡悦,不堪持赠君:部分道理于我有益,未必普适。部分观点能力所限,难免偏颇主观。部分行文斩钉截铁,不代表坚信其唯一正确性,只是不愿面面俱到和模棱两可而已。有错误和意见欢迎指正哈!
独乐乐,不如众乐乐:写是乐,评是乐,看是乐,乐最重要。