import pygame
import sys,time,random
from pygame.locals import *
pygame.init()
# 设置按下鼠标的时候一直触发
pygame.key.set_repeat(10, 10)
# 加载背景图片
bg = pygame.image.load('./img/bg.png')
# 加载左方向行走和站立图片
heroLStand = pygame.image.load('img/heroLstand.png')
heroL1 = pygame.image.load('img/heroL1.png')
heroL2 = pygame.image.load('img/heroL2.png')
heroL3 = pygame.image.load('img/heroL3.png')
# 加载右方向行走和站立图片
heroRStand = pygame.image.load('img/heroRstand.png')
heroR1 = pygame.image.load('img/heroR1.png')
heroR2 = pygame.image.load('img/heroR2.png')
heroR3 = pygame.image.load('img/heroR3.png')
# 加载障碍物
zaw1 = pygame.image.load('img/zaw1.png')
zaw2 = pygame.image.load('img/zaw2.png')
zaw3 = pygame.image.load('img/zaw3.png')
# 加载武器图片
wq = pygame.image.load('img/b.png')
effer = pygame.image.load('img/effer.png')
clock = pygame.time.Clock()
# 创建一个画布
canvas = pygame.display.set_mode((1200,600))
# 初始数据# 设置跳跃高度
jumpHeight = 40
# 设置移动速度
moveSpeed = 10
#------------------创建武器类----------------
class Wq():#武器的属性有:皮肤,坐标以及宽高,以及方向def __init__(self,skin,x,y,width,height,direction):self.skin = skinself.x = xself.y = yself.width = widthself.height = heightself.direction = direction# 武器的移动def shoot(self):#如果方向是往右则x值增加if self.direction == "right":for i in range(10):self.x = self.x+2else:# 否则就是往左移动for i in range(10):self.x = self.x-2#------------------创建英雄类----------------
# 英雄类:属性, 皮肤skin,坐标,x,y 宽高width,height
n = 0# 实现动态切换不同的图片
class Hero():def __init__(self,skin,x,y,width,height,direction="right"):self.skin = skinself.x = xself.y = yself.width = widthself.height = heightself.direction = direction# 往左移动的方法def goLeft(self):self.x = self.x-moveSpeed# 往右移动的方法def goRight(self):self.x = self.x+moveSpeed# 往左移动的时候,图片的切换(英雄人物的切换)def leftChange(self):global nif n%3 == 0:# 如果对3取余结果等于0,使用第一张图片self.skin = heroL1elif n%3 == 1:self.skin = heroL2else:self.skin = heroL3n = n+1# 往右移动的时候,图片的切换(英雄人物的切换)def rightChange(self):global nif n%3 == 0:# 如果对3取余结果等于0,使用第一张图片self.skin = heroR1elif n%3 == 1:self.skin = heroR2else:self.skin = heroR3n = n+1 #-----------------创建英雄对象-------------
# heroRStand,10,400,135,200
hero = Hero(heroRStand,10,400,135,200)#----------------创建障碍物类---------------------
# 障碍物的属性:x,y,skin,width,height
# 障碍物的方法: 往左移动的方法
class Zaw():# 障碍物类def __init__(self,x,y,skin,width,height):self.x = xself.y = yself.skin = skinself.width = widthself.height = heightdef walk(self):# 设置往左移动的方法self.x = self.x - 3
# 创建列表存储同时存储多个障碍物对象
zawList = []
createTime = 0# 用来存储创建障碍物对象的时间
# 创建一个方法:批量的生成障碍物对象
def createZaw():# 因为每次创建障碍物对象的时候,都需要看间隔时间,时间符合要求则创建# 更新时间global createTime# 检测时间间隔if time.time()-createTime > 3:# 更新一下创建障碍物的时间createTime = time.time()type = random.randint(1,3)if type == 1:# 如果type的值是1就要创建第一种障碍物zawenemy = Zaw(1200,500,zaw1,46,46)elif type == 2:# 如果type的值是2就要创建第2种障碍物zawenemy = Zaw(1200,500,zaw2,142,103)else:# 创建第3种障碍物zawenemy = Zaw(1200,450,zaw3,180,180)# 将障碍物追加列表zawList.append(zawenemy)#--------------批量创建障碍物对象---------------------
#-----------------创建传送到画布方法-----------
# 让背景往右移动
bginit1 = -1200
bginit2 = 0
def draw():global bginit1,bginit2canvas.blit(bg,(bginit1,0))canvas.blit(bg,(bginit2,0))bginit1 = bginit1+1# 因为整体往右移动故2张背景图片x的值全部都在增加bginit2 = bginit2+1if bginit1>1200:bginit1 = -1200if bginit2>1200:bginit2 = -1200canvas.blit(hero.skin,(hero.x,hero.y))# 将障碍物列表中的所有障碍物传送到画布上for e in zawList:if e.x < -200:# 说明往左移动的到最左边出画布zawList.remove(e)# 从障碍物列表中移出该障碍物else:canvas.blit(e.skin,(e.x,e.y))e.walk()# 将武器绘制到画布上for w in wqList: if w.x<-200 or w.x>1200:wqList.remove(w)else:canvas.blit(w.skin,(w.x,w.y))w.shoot() def hit():# 武器和障碍物碰撞for w in wqList: for e in zawList: if w.x+w.width >= e.x and w.x<=e.x+e.width\and w.y+150>=e.y:for i in range(4):canvas.blit(effer,(e.x,e.y))wqList.remove(w)zawList.remove(e)# 事件监听方法
isJump = False# 默认False没有跳跃
wqList = []# 武器库
# 设置发射时间间隔
shootTime = 0
def eventDeal():global isJumpif hero.direction == "right":hero.skin = heroRStand# 默认向右站立elif hero.direction == "left":hero.skin = heroLStand # 遍历所有的事件for e in pygame.event.get():# 点击关闭按钮的时候,关闭窗口处理if e.type == QUIT:pygame.quit()# pygame退出相当于窗口关闭sys.exit()# 系统退出 #---------------上下左右键监听处理-------------------if e.type == KEYDOWN:# 当检测按下按键的时候# 判断按的左键if e.key == K_LEFT:print('您刚才按下了左键')hero.goLeft()# 往左移动hero.leftChange()# 调用往左移动切换图片的效果hero.direction = "left"elif e.key == K_RIGHT:print('您刚才按下了右键')hero.direction = "right"hero.goRight()hero.rightChange() elif e.key == K_SPACE:# 检测到空格print('您刚才按下课空格键')isJump = True# 当点击空格的时候跳跃状态切换成Trueelif e.key == K_UP:global shootTimeif time.time()-shootTime > 1:shootTime = time.time()# 通过武器类创建武器库w = Wq(wq,hero.x,hero.y+hero.height/8,20,\56,hero.direction)# 将武器追加到武器库wqList.append(w)while True:clock.tick(15)if isJump:hero.y = hero.y-jumpHeightjumpHeight = jumpHeight-2if hero.y == 400:isJump = FalsejumpHeight = 40createZaw()# 程序帮我们创建障碍物 draw()hit()eventDeal()pygame.display.update()
整个代码下载位置:https://download.csdn.net/download/Gjanuary/88384893