天天看點

python學習記錄基礎(九)---飛機大戰案例篇

學習位址 http://www.sikiedu.com/course/695/task/57839/show

1   20200818的python開發遊戲3.8還沒支援pygame,所有我重新解除安裝了,并且重新安裝了3.7的,pygame的安裝要在pip裡面安裝的,預設的3.7版本是自動安裝好pip的,所有在pip裡面安裝pygame自行上網查詢安裝方法

關于pythonRect的解釋

https://blog.csdn.net/qq_36554582/article/details/82979709

https://blog.csdn.net/qq_32966727/article/details/82320347

import sys    #引入系統有關的子產品
import pygame   #引入pygame子產品
class Settings():   #單獨建立一個類去初始化螢幕的資料
    def __init__(self):
        self.screen_witdth=480
        self.screen_height=852
        self.bg_color=(255,192,203)
        self.hero_speed=1.5
        self.bullet_speed=4
        self.bullet_width=4
        self.bullet_Height=8
        self.bullet_color=(0,0,128)
        self.enemy_speed=1

class Enemy(pygame.sprite.Sprite):
    def __init__(self,screen,settings):
        super(Enemy,self).__init__()
        self.screen=screen
        self.settings=settings
        self.image=pygame.image.load('image/enemy1.png')
        self.rect=self.image.get_rect()

        self.rect.x=10
        self.rect.y=10
        self.speed=settings.enemy_speed
        self.y=float(self.rect.y)

    def blitme(self):
         self.screen.blit(self.image,self.rect)
    def updata(self):
        self.y+=self.speed
        self.rect.y=self.y
         
        
class Bullet(pygame.sprite.Sprite):     #繼承于精靈類
    def __init__(self,screen,settings,hero):
        super(Bullet,self).__init__()
        self.screen=screen
        self.settings=settings
        self.image=pygame.image.load('image/bullet1.png')
        self.rect=self.image.get_rect()
##        self.rect=pygame.Rect(0,0,settings.bullet_width,settings.bullet_Height)
        self.rect.centerx=hero.rect.centerx
        self.rect.y=hero.rect.y
        self.y=float(hero.rect.y)
        self.speed=settings.bullet_speed
##        self.color=settings.bullet_color
    def update(self):
        self.y-= self.speed
        self.rect.y=self.y
    def drawme(self):
##        pygame.draw.rect(self.screen,self.color,self.rect)
        self.screen.blit(self.image,self.rect)
        

class Bg():        #子產品這個背景
    def __init__(self,screen):
        self.screen=screen
        self.image=pygame.image.load('image/background.png')   #同樣的方式加載圖檔
        self.rect=self.image.get_rect()
    def blitme(self):
        self.screen.blit(self.image,self.rect)     #建立繪制
class Hero:     #主角子產品
    def __init__(self,screen,settings):
        self.screen=screen
        self.image=pygame.image.load('image/hero1.png')   #同樣的方式加載圖檔
        self.rect=self.image.get_rect()
        self.screen_rect=screen.get_rect()
        self.settings=settings
##        self.rect.x=self.screen_rect.width/2-self.rect.width/2
        self.rect.centerx=self.screen_rect.centerx    #把圖檔的中心點x等于螢幕的中心點
        self.rect.bottom=self.screen_rect.bottom    #把圖檔的底部等于螢幕的底部
        self.moving_right=False   #建立左右移動标志位
        self.moving_left=False
        self.centerx=float(self.screen_rect.centerx)
        
    def blitme(self):
        self.screen.blit(self.image,self.rect)     #建立繪制
    def update(self):
        if self.moving_right and self.rect.right<self.screen_rect.right:      #持續檢測移動
            self.centerx+=self.settings.hero_speed
        if self.moving_left and self.rect.left>0:
            self.centerx-=self.settings.hero_speed
        self.rect.centerx=self.centerx
        

def check_events(screen,settings,hero,bullets):    #事件檢測子產品化    
    for e in pygame.event.get():     #周遊所有事件
             if e.type==pygame.QUIT:    #擷取退出事件,就是點選視窗的X鍵就會觸發這個事件
                  pygame.quit()    #退出遊戲
                  sys.exit()         #退出系統
             elif e.type==pygame.KEYDOWN:    #左右按鍵按下擡起檢測
                 if e.key==pygame.K_RIGHT:
                     hero.moving_right=True
                 elif e.key==pygame.K_LEFT:
                     hero.moving_left=True
                 elif e.key==pygame.K_SPACE:
                     new_bullet=Bullet(screen,settings,hero)
                     bullets.add(new_bullet)
             elif e.type==pygame.KEYUP:
                 if e.key==pygame.K_RIGHT:
                     hero.moving_right=False
                 elif e.key==pygame.K_LEFT:
                     hero.moving_left=False
                    

def updata_screen(bg,hero,bullets,enemys,screen):    #子產品化重新整理螢幕
    bg.blitme()       #  調用繪制
        #繪制主角
    for bullet in bullets.sprites():
        bullet.drawme()
    hero.blitme()
##    enemy.blitme()
    enemys.draw(screen)
    pygame.display.flip()    #重新整理螢幕
    

def updata_bullets(bullets):
    bullets.update()
    for b in bullets.sprites():
            if b.rect.bottom<0:
                bullets.remove(b)
                            
def create_enemy(enemys,screen,settings):
    enemy=Enemy(screen,settings)
    enemys.add(enemy)
    number_enemys=screen.get_rect().width/(20+enemy.rect.width)
    for index in range(int(number_enemys)):
        if index==0:
            continue      #這句話的意思是終止目前循環,繼續下次循環
        x=10+index*(20+enemy.rect.width)
        new_enemy=Enemy(screen,settings)
        new_enemy.rect.x=x
        enemys.add(new_enemy)
        
    
    
def run_game():
    pygame.init()     #py初始化,會把子產品初始化,并且建立一個螢幕對象
    settings=Settings()     #執行個體化螢幕資料
    
    screen= pygame.display.set_mode((settings.screen_witdth,settings.screen_height))   #設定螢幕分辨率
##    bg_color=settings.bg_color   #通過rgb值确定顔色
##    bg=pygame.image.load('image/background.png')    #通過相對路徑去擷取圖檔
##    bg_rect= bg.get_rect()
    bg=Bg(screen)    #執行個體化背景子產品
    hero=Hero(screen,settings)  #執行個體化主角
    #enemy=Enemy(screen,settings)
    bullets=pygame.sprite.Group()    
    #bg_rect這裡面是一個存儲着四個資料的元組
    #(x,y,width,height)   x,y是代表坐标,預設是0,0,左上角是原點,後面是螢幕的寬高,但是如果傳入的是圖檔,後面兩個參數是不起作用的
    enemys=pygame.sprite.Group()
    create_enemy(enemys,screen,settings)
    while True :     #死循環,持續檢測
        check_events(screen,settings,hero,bullets)       #調用子產品化事件
        hero.update()    #持續檢測
##        screen.fill(bg_color)     #顔色填充     先繪制背景,在繪制主角
        #screen.blit(bg,bg_rect)    #把加載的圖檔給與螢幕,因為傳入背景圖檔,是以隻取bg_rect中的x,y坐标,後面的寬高不取
        updata_bullets(bullets)
        updata_screen(bg,hero,bullets,enemys,screen)    #調用子產品化螢幕重新整理
        enemys.updata()
        
run_game()
           
python學習記錄基礎(九)---飛機大戰案例篇

繼續閱讀