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()

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一丁目赠我

谢谢你的打赏,感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值