# 角色和地图的碰撞
import pygame,sys
WIDTH=800
HEIGHT=600
pygame.init()
root=pygame.display.set_mode((WIDTH,HEIGHT),0,32)
clock=pygame.time.Clock()
class Jl(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image=None
self.speed=None
self.rect=None
self.mask=None # 获得图片的遮罩层
self.lists=list() # 用于储存xy坐标
def load(self,img,xy,speed):
self.image=pygame.image.load(img).convert_alpha()
self.rect=self.image.get_rect() # rect x , y , wh等
self.rect.x,self.rect.y=xy
self.lists.append(self.rect.x)
self.lists.append(self.rect.y)
self.speed=speed
self.mask=pygame.mask.from_surface(self.image) # 获得图片的遮罩层
# 实例化
js=Jl()
js.load("./ren.png",(377,275),10)
bigmap=Jl()
bigmap.load("./bmap.png",(-1447,-236),10)
beaumap=Jl()
beaumap.load("./beau_map.jpg",(-1447,-236),10)
zrmap=Jl()
zrmap.load("./zren.png",(-1447,-236),10)
# pz=False
def jsmovefun(num): # 这函数写归写,下面不调用它就行,只让地图动,感觉效果更好
if num==4:
if js.rect.x<=0:
js.rect.x=0
else:
js.rect.x-=js.speed
elif num==8:
if js.rect.y<=0:
js.rect.y=0
else:
js.rect.y-=js.speed
elif num==6:
if js.rect.x>=WIDTH-js.rect.w:
js.rect.x=WIDTH-js.rect.w
else:
js.rect.x+=js.speed
elif num==2:
if js.rect.y>=HEIGHT-js.rect.h:
js.rect.y=HEIGHT-js.rect.h
else:
js.rect.y+=js.speed
def map_movefun(map,num): # 地图是反方向移动
if num==4: # 人物往左,地图向右
if map.rect.x>=0:
map.rect.x=0
else:
map.rect.x+=map.speed
elif num==8: # 人物往上,地图向下
if map.rect.y>=0:
map.rect.y=0
else:
map.rect.y+=map.speed
elif num==6: # 人物往右,地图向左
if map.rect.x<=-(map.rect.w-WIDTH): # 角色正方向移动的时候地图负方向移动,当角色走到地图右边界时,地图的x是地图的宽减去视窗宽并取负值
map.rect.x=-(map.rect.w-WIDTH)
else:
map.rect.x-=map.speed
elif num==2: # 人物往下,地图向上
if map.rect.y<=-(map.rect.h-HEIGHT): # 角色正方向移动的时候地图负方向移动,当角色走到地图下边界时,地图的y是地图的高减去视窗高并取负值
map.rect.y=-(map.rect.h-HEIGHT)
else:
map.rect.y-=map.speed
def vsfun(aa,bb):
vs=pygame.sprite.collide_mask(aa,bb) # 角色与地图碰撞
if vs!=None:
return True
else:
return False
while True:
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_LEFT:
# jsmovefun(4)
map_movefun(bigmap,4)
map_movefun(beaumap,4)
map_movefun(zrmap,4)
pd=vsfun(js,bigmap)
if pd==True: # 发生碰撞
bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
js.rect.x,js.rect.y=js.lists[0],js.lists[1]
zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
# print("往左发生了碰撞")
else:
bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
js.lists[0],js.lists[1]=js.rect.x,js.rect.y
zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
elif event.key==pygame.K_UP:
# jsmovefun(8)
map_movefun(bigmap,8)
map_movefun(beaumap,8)
map_movefun(zrmap,8)
pd=vsfun(js,bigmap)
if pd==True: # 发生碰撞
bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
js.rect.x,js.rect.y=js.lists[0],js.lists[1]
zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
# print("往上发生了碰撞")
else:
bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
js.lists[0],js.lists[1]=js.rect.x,js.rect.y
zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
elif event.key==pygame.K_RIGHT:
# jsmovefun(6)
map_movefun(bigmap,6)
map_movefun(beaumap,6)
map_movefun(zrmap,6)
pd=vsfun(js,bigmap)
if pd==True: # 发生碰撞
bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
js.rect.x,js.rect.y=js.lists[0],js.lists[1]
zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
# print("往右发生了碰撞")
else:
bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
js.lists[0],js.lists[1]=js.rect.x,js.rect.y
zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
elif event.key==pygame.K_DOWN:
# jsmovefun(2)
map_movefun(bigmap,2)
map_movefun(beaumap,2)
map_movefun(zrmap,2)
pd=vsfun(js,bigmap)
if pd==True: # 发生碰撞
bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
js.rect.x,js.rect.y=js.lists[0],js.lists[1]
zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
# print("往下发生了碰撞")
else:
bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
js.lists[0],js.lists[1]=js.rect.x,js.rect.y
zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
root.fill((255,255,255))
# root.blit(beaumap.image,(beaumap.rect.x,beaumap.rect.y))
root.blit(bigmap.image,(bigmap.rect.x,bigmap.rect.y)) # 这才是碰撞到的地图,写这里为了隐藏
root.blit(beaumap.image,(beaumap.rect.x,beaumap.rect.y)) # 这是漂亮大地图
root.blit(js.image,(js.rect.x,js.rect.y))
root.blit(zrmap.image,(zrmap.rect.x,zrmap.rect.y)) # 遮挡景
pygame.display.update()
clock.tick(60)