|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 fffccc8080 于 2023-7-21 18:26 编辑
这是新的蓝奏云下载地址
zong123.lanzouw.com/i6nV5133kjxa 2023年7月21号,我想办法让人物不动,就地图在动,那效果确实爽,人物我还是尽量放可视窗口的中间吧
效果爽归爽,但是走到一些地方,明明有路,上不去了。又有新的BUG了。已经改回先前的人物和地图都动。
下面代码是人物不动,地图动,但有新的BUG,麻烦!先前的文件及代码我还是放回来吧,可以比较比较!
要人物和地图都动,将下面代码中,键盘事件处的 jsmovefun() 调用的函数,打开注释就行
- # 角色和地图的碰撞
- 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)
复制代码
先前的py文件只要将键盘事件处的 jsmovefun() 调用的函数,打开注释就行
这一楼文件不动它了,若能彻底解决人物始终站中间走的话,新文件发到下面的楼层里吧
人物在大地图上的走动,大家看看要如何才能使角色始终站在游戏窗口中间走,
六楼,我的回复中,是很勉强的站中间,到边界虽然不会报错,但走起来,有点不合情理。
|
评分
-
查看全部评分
|