pygame的入门,基本都是讲飞机大战,跟随着他人的教程自己摸索了一遍。素材都是自己下载的
#!/usr/bin/env python
"""
This is the full and final example from the Pygame Tutorial,
"How Do I Make It Move". It creates 10 objects and animates
them on the screen.
Note it's a bit scant on error checking, but it's easy to read. :]
Fortunately, this is python, and we needn't wrestle with a pile of
error codes.
"""
#import everything
import os, pygame
from pygame.locals import *
from random import randint
main_dir = os.path.split(os.path.abspath(__file__))[0]
SCREEN_WIDTH=800
SCRREN_HIGHT=600
offset = {pygame.K_LEFT:0, pygame.K_RIGHT:0, pygame.K_UP:0, pygame.K_DOWN:0}
#quick function to load an image
def load_image(name):
path = os.path.join(main_dir, 'data', name)
return pygame.image.load(path).convert_alpha()
class Player(pygame.sprite.Sprite):
def __init__(self,surface,position):
pygame.sprite.Sprite.__init__(self)
self.image=surface
self.rect=self.image.get_rect()
self.rect.topleft=position
self.speed=6
self.bullets=pygame.sprite.Group() #添加子弹精灵组
def move(self,offset):
x=self.rect.left+offset[pygame.K_RIGHT] - offset[pygame.K_LEFT]
y=self.rect.top+offset[pygame.K_DOWN] - offset[pygame.K_UP]
if x<0:
self.rect.left=0
elif x>SCREEN_WIDTH-self.rect.width:
self.rect.left=SCREEN_WIDTH-self.rect.width
else:
self.rect.left=x
if y<0:
self.rect.top=0
elif y>SCRREN_HIGHT-self.rect.height:
self.rect.top=SCRREN_HIGHT-self.rect.height
else:
self.rect.top=y
def single_shoot(self,surface):
buttle_signle=Bullet(surface,self.rect.midtop) #在midtop位置添加子弹
self.bullets.add(buttle_signle) #在精灵组中添加一颗子弹
class Bullet(pygame.sprite.Sprite):
"""docstring for Bullet"""
def __init__(self, surface,position):
super(Bullet, self).__init__() #调用父类的初始化,和line31功能一样
self.image = surface
self.rect=self.image.get_rect()
self.rect.topleft=position
self.speed=10
def update(self):
self.rect.top-=self.speed
if self.rect.top<-self.rect.height:
self.kill() #删除精灵
class Enemy(pygame.sprite.Sprite):
"""docstring for Enemy"""
def __init__(self, surface,position):
super(Enemy, self).__init__()
self.image=surface
self.rect=self.image.get_rect()
self.rect.topleft=position
self.speed=3
def update(self):
self.rect.top+=self.speed
if self.rect.top>SCRREN_HIGHT:
self.kill()
#here's the full code
def main():
print("欢迎,按A射击")
ticks=0
clock = pygame.time.Clock()
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH,SCRREN_HIGHT))
pygame.display.set_caption("飞机大战")
player = load_image('plane.png')
player=pygame.transform.scale(player,(int(SCREEN_WIDTH/10),int(SCRREN_HIGHT/10)))
background= load_image('background.png')
background=pygame.transform.scale(background,(SCREEN_WIDTH,SCRREN_HIGHT))
bullet_surface=load_image('buttle.jpg').subsurface(164,120,10,18)
enemy=load_image('enemy.png').subsurface(128,145,80,60)
enemy=pygame.transform.scale(enemy,(60,40))
enemy_group=pygame.sprite.Group() #添加敌人精灵组
game_over=load_image('over.jpg')
game_over=pygame.transform.scale(game_over,(SCREEN_WIDTH,SCRREN_HIGHT))
player1=Player(player,(400,600))
while True:
clock.tick(60) #60HZ的刷新
ticks+=1
screen.blit(background,(0,0))
screen.blit(player1.image,player1.rect)
player1.move(offset)
player1.bullets.update()
player1.bullets.draw(screen)
enemy_group.update()
enemy_group.draw(screen)
if ticks%50==0:
enemy_new=Enemy(enemy,(randint(0,SCREEN_WIDTH-enemy.get_width()),-enemy.get_height()))
enemy_group.add(enemy_new)
pygame.sprite.groupcollide(player1.bullets,enemy_group,True,True) #检测子弹与敌人有没有相撞,如果相撞就把子弹和敌人消除
if len(pygame.sprite.spritecollide(player1,enemy_group,True,False))>0:
print ("loss")
break
pygame.display.update() #图片更新应对是放在最后一步,先绘制背景,在绘制飞机,在绘制子弹,最后刷新
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
elif event.type==pygame.KEYUP:
if event.key in offset:
offset[event.key]=0
elif event.type==pygame.KEYDOWN:
if event.key in offset:
offset[event.key]=10
elif event.key==K_a:
player1.single_shoot(bullet_surface)
while True:
screen.blit(game_over,(0,0))
pygame.display.update() #图片更新应对是放在最后一步,先绘制背景,在绘制飞机,在绘制子弹,最后刷新
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if __name__ == '__main__': main()