學習位址 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()
