今天是一个周末,宿舍的人全部都出去玩了,而我因为太懒一个人留在了宿舍,连床都不起,吃饭靠的是点外卖。
不过,为了好玩,我跟着书本学习打了一个2D小游戏,并加入了一点自己的东西。
一、游戏页面
刚开始我把所有的游戏屏幕设置都放在了下面代码里,这使得代码看起来非常长,和杂乱, 所以为了使游戏方便扩展和整个代码逻辑更容易理解,我将整个游戏分为了几个文件。下面就是主程序文件
import sysimport pygamefrom settings import Settingsfrom ship import Shipimport game_functions as gfdef 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 pygameclass 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 sysimport pygamedef 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 = Falsedef update_screen(ai_settings,screen,ship): # screen.fill(ai_settings.bg_color) ship.blitme() # 让最近绘制的屏幕可见 pygame.display.flip()
这就是我这一天所学习的,至于限制飞船不出屏幕,填装弹药以及外星人的创建,要等到下次了。