学习地址 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()
