鱼C论坛

 找回密码
 立即注册
查看: 1996|回复: 8

[技术交流] 人物在大地图上走动_来看看如何使角色始终站在窗口中间移动(7楼哦)

[复制链接]
发表于 2023-7-20 23:33:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 fffccc8080 于 2023-7-21 18:26 编辑

这是新的蓝奏云下载地址

zong123.lanzouw.com/i6nV5133kjxa  2023年7月21号,我想办法让人物不动,就地图在动,那效果确实爽,人物我还是尽量放可视窗口的中间吧
效果爽归爽,但是走到一些地方,明明有路,上不去了。又有新的BUG了。已经改回先前的人物和地图都动。






下面代码是人物不动,地图动,但有新的BUG,麻烦!先前的文件及代码我还是放回来吧,可以比较比较!



要人物和地图都动,将下面代码中,键盘事件处的 jsmovefun() 调用的函数,打开注释就行



  1. # 角色和地图的碰撞
  2. import pygame,sys
  3. WIDTH=800
  4. HEIGHT=600
  5. pygame.init()
  6. root=pygame.display.set_mode((WIDTH,HEIGHT),0,32)
  7. clock=pygame.time.Clock()
  8. class Jl(pygame.sprite.Sprite):
  9.         def __init__(self):
  10.                 pygame.sprite.Sprite.__init__(self)
  11.                 self.image=None
  12.                 self.speed=None
  13.                 self.rect=None
  14.                 self.mask=None # 获得图片的遮罩层
  15.                 self.lists=list() # 用于储存xy坐标
  16.         def load(self,img,xy,speed):
  17.                 self.image=pygame.image.load(img).convert_alpha()
  18.                 self.rect=self.image.get_rect() # rect x , y , wh等
  19.                 self.rect.x,self.rect.y=xy
  20.                 self.lists.append(self.rect.x)
  21.                 self.lists.append(self.rect.y)
  22.                 self.speed=speed
  23.                 self.mask=pygame.mask.from_surface(self.image) # 获得图片的遮罩层

  24. # 实例化
  25. js=Jl()
  26. js.load("./ren.png",(377,275),10)
  27. bigmap=Jl()
  28. bigmap.load("./bmap.png",(-1447,-236),10)
  29. beaumap=Jl()
  30. beaumap.load("./beau_map.jpg",(-1447,-236),10)
  31. zrmap=Jl()
  32. zrmap.load("./zren.png",(-1447,-236),10)


  33. # pz=False

  34. def jsmovefun(num): # 这函数写归写,下面不调用它就行,只让地图动,感觉效果更好
  35.         if num==4:
  36.                 if js.rect.x<=0:
  37.                         js.rect.x=0
  38.                 else:
  39.                         js.rect.x-=js.speed
  40.         elif num==8:
  41.                 if js.rect.y<=0:
  42.                         js.rect.y=0
  43.                 else:
  44.                         js.rect.y-=js.speed
  45.         elif num==6:
  46.                 if js.rect.x>=WIDTH-js.rect.w:
  47.                         js.rect.x=WIDTH-js.rect.w
  48.                 else:
  49.                         js.rect.x+=js.speed
  50.         elif num==2:
  51.                 if js.rect.y>=HEIGHT-js.rect.h:
  52.                         js.rect.y=HEIGHT-js.rect.h
  53.                 else:
  54.                         js.rect.y+=js.speed

  55. def map_movefun(map,num): # 地图是反方向移动
  56.         if num==4: # 人物往左,地图向右
  57.                 if map.rect.x>=0:
  58.                         map.rect.x=0
  59.                 else:
  60.                         map.rect.x+=map.speed
  61.         elif num==8: # 人物往上,地图向下
  62.                 if map.rect.y>=0:
  63.                         map.rect.y=0
  64.                 else:
  65.                         map.rect.y+=map.speed
  66.         elif num==6: # 人物往右,地图向左
  67.                 if map.rect.x<=-(map.rect.w-WIDTH): # 角色正方向移动的时候地图负方向移动,当角色走到地图右边界时,地图的x是地图的宽减去视窗宽并取负值
  68.                         map.rect.x=-(map.rect.w-WIDTH)
  69.                 else:
  70.                         map.rect.x-=map.speed
  71.         elif num==2: # 人物往下,地图向上
  72.                 if map.rect.y<=-(map.rect.h-HEIGHT): # 角色正方向移动的时候地图负方向移动,当角色走到地图下边界时,地图的y是地图的高减去视窗高并取负值
  73.                         map.rect.y=-(map.rect.h-HEIGHT)
  74.                 else:
  75.                         map.rect.y-=map.speed

  76. def vsfun(aa,bb):
  77.         vs=pygame.sprite.collide_mask(aa,bb) # 角色与地图碰撞
  78.         if vs!=None:
  79.                 return True
  80.         else:
  81.                 return False

  82. while True:
  83.         for event in pygame.event.get():
  84.                 if event.type==pygame.QUIT:
  85.                         pygame.quit()
  86.                         sys.exit()

  87.                 elif event.type==pygame.KEYDOWN:
  88.                         if event.key==pygame.K_LEFT:
  89.                                 # jsmovefun(4)
  90.                                 map_movefun(bigmap,4)
  91.                                 map_movefun(beaumap,4)
  92.                                 map_movefun(zrmap,4)
  93.                                 pd=vsfun(js,bigmap)
  94.                                 if pd==True: # 发生碰撞
  95.                                         bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
  96.                                         beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
  97.                                         js.rect.x,js.rect.y=js.lists[0],js.lists[1]
  98.                                         zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
  99.                                         # print("往左发生了碰撞")
  100.                                 else:
  101.                                         bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
  102.                                         beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
  103.                                         js.lists[0],js.lists[1]=js.rect.x,js.rect.y
  104.                                         zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
  105.                         elif event.key==pygame.K_UP:
  106.                                 # jsmovefun(8)
  107.                                 map_movefun(bigmap,8)
  108.                                 map_movefun(beaumap,8)
  109.                                 map_movefun(zrmap,8)
  110.                                 pd=vsfun(js,bigmap)
  111.                                 if pd==True: # 发生碰撞
  112.                                         bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
  113.                                         beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
  114.                                         js.rect.x,js.rect.y=js.lists[0],js.lists[1]
  115.                                         zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
  116.                                         # print("往上发生了碰撞")
  117.                                 else:
  118.                                         bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
  119.                                         beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
  120.                                         js.lists[0],js.lists[1]=js.rect.x,js.rect.y
  121.                                         zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
  122.                         elif event.key==pygame.K_RIGHT:
  123.                                 # jsmovefun(6)
  124.                                 map_movefun(bigmap,6)
  125.                                 map_movefun(beaumap,6)
  126.                                 map_movefun(zrmap,6)
  127.                                 pd=vsfun(js,bigmap)
  128.                                 if pd==True: # 发生碰撞
  129.                                         bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
  130.                                         beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
  131.                                         js.rect.x,js.rect.y=js.lists[0],js.lists[1]
  132.                                         zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
  133.                                         # print("往右发生了碰撞")
  134.                                 else:
  135.                                         bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
  136.                                         beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
  137.                                         js.lists[0],js.lists[1]=js.rect.x,js.rect.y
  138.                                         zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
  139.                         elif event.key==pygame.K_DOWN:
  140.                                 # jsmovefun(2)
  141.                                 map_movefun(bigmap,2)
  142.                                 map_movefun(beaumap,2)
  143.                                 map_movefun(zrmap,2)
  144.                                 pd=vsfun(js,bigmap)
  145.                                 if pd==True: # 发生碰撞
  146.                                         bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
  147.                                         beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
  148.                                         js.rect.x,js.rect.y=js.lists[0],js.lists[1]
  149.                                         zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
  150.                                         # print("往下发生了碰撞")
  151.                                 else:
  152.                                         bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
  153.                                         beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
  154.                                         js.lists[0],js.lists[1]=js.rect.x,js.rect.y
  155.                                         zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y

  156.         root.fill((255,255,255))
  157.        
  158.         # root.blit(beaumap.image,(beaumap.rect.x,beaumap.rect.y))
  159.        
  160.         root.blit(bigmap.image,(bigmap.rect.x,bigmap.rect.y)) # 这才是碰撞到的地图,写这里为了隐藏

  161.         root.blit(beaumap.image,(beaumap.rect.x,beaumap.rect.y)) # 这是漂亮大地图

  162.         root.blit(js.image,(js.rect.x,js.rect.y))

  163.         root.blit(zrmap.image,(zrmap.rect.x,zrmap.rect.y)) # 遮挡景
  164.         pygame.display.update()
  165.         clock.tick(60)








复制代码










先前的py文件只要将键盘事件处的 jsmovefun() 调用的函数,打开注释就行


这一楼文件不动它了,若能彻底解决人物始终站中间走的话,新文件发到下面的楼层里吧









人物在大地图上的走动,大家看看要如何才能使角色始终站在游戏窗口中间走,

六楼,我的回复中,是很勉强的站中间,到边界虽然不会报错,但走起来,有点不合情理。













评分

参与人数 2荣誉 +10 贡献 +6 收起 理由
python爱好者. + 5 + 3 鱼C有你更精彩^_^
歌者文明清理员 + 5 + 3

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-20 23:43:48 | 显示全部楼层
(不用度盘了,度盘垃圾)


同感
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-21 00:56:06 | 显示全部楼层

蓝奏云下载也不快呀,百度网盘会员下载还是挺快的,我一直都在用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-21 10:47:47 | 显示全部楼层
isdkz 发表于 2023-7-21 00:56
蓝奏云下载也不快呀,百度网盘会员下载还是挺快的,我一直都在用

迅雷 + 蓝奏 / 123pan = perfect
城通网盘其实也很垃圾,都是用的自带的下载(非vip限速),要是有文件的下载路径就快得多的(城通的好处是唯一不用手机号认证的网盘)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-21 13:05:54 | 显示全部楼层
本帖最后由 fffccc8080 于 2023-7-21 13:07 编辑

蓝奏感觉还好,度盘下载最不行


上面更新了一下了,本想让人物站中间不动,只让地图动,看上去效果达到了,但是有新的BUG碰撞明明前面有路却有空气墙了。



还是重新上传先前的了,一楼代码就不用变了,只要打开四行代码的注释即可。也就是先前的代码。




虽然先前看上去不爽,没有人物站在中间的爽,但是至少碰撞上面遇到的问题相对少些


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-21 16:16:02 | 显示全部楼层
本帖最后由 fffccc8080 于 2023-7-21 16:20 编辑


以下代码勉强可以完成人物角色一直走在中间,

只不过会有一个BUG,走到边界后,回来时,嗖的一下就被拉回到视窗中间了。






  1. # 角色和地图的碰撞
  2. import pygame,sys
  3. WIDTH=800
  4. HEIGHT=600
  5. pygame.init()
  6. root=pygame.display.set_mode((WIDTH,HEIGHT),0,32)
  7. clock=pygame.time.Clock()

  8. # 全局变量
  9. SPEED=10

  10. class Jl(pygame.sprite.Sprite):
  11.         def __init__(self):
  12.                 pygame.sprite.Sprite.__init__(self)
  13.                 self.image=None
  14.                 self.speed=None
  15.                 self.rect=None
  16.                 self.mask=None # 获得图片的遮罩层
  17.                 self.lists=list() # 用于储存xy坐标
  18.         def load(self,img,xy):
  19.                 self.image=pygame.image.load(img).convert_alpha()
  20.                 self.rect=self.image.get_rect() # rect x , y , wh等
  21.                 self.rect.x,self.rect.y=xy
  22.                 self.lists.append(self.rect.x)
  23.                 self.lists.append(self.rect.y)
  24.                 self.speed=SPEED
  25.                 self.mask=pygame.mask.from_surface(self.image) # 获得图片的遮罩层

  26. # 实例化
  27. js=Jl()
  28. js.load("./ren.png",(WIDTH/2,HEIGHT/2))
  29. bigmap=Jl()
  30. bigmap.load("./bmap.png",(-1447,-236))
  31. beaumap=Jl()
  32. beaumap.load("./beau_map.jpg",(-1447,-236))
  33. zrmap=Jl()
  34. zrmap.load("./zren.png",(-1447,-236))


  35. # pz=False

  36. def jsmovefun(num): # 这函数写归写,下面不调用它就行,只让地图动,感觉效果更好
  37.         if num==4:
  38.                 if js.rect.x<=0:
  39.                         js.rect.x=0
  40.                 else:
  41.                         js.rect.x-=js.speed
  42.         elif num==8:
  43.                 if js.rect.y<=0:
  44.                         js.rect.y=0
  45.                 else:
  46.                         js.rect.y-=js.speed
  47.         elif num==6:
  48.                 if js.rect.x>=WIDTH-js.rect.w:
  49.                         js.rect.x=WIDTH-js.rect.w
  50.                 else:
  51.                         js.rect.x+=js.speed
  52.         elif num==2:
  53.                 if js.rect.y>=HEIGHT-js.rect.h:
  54.                         js.rect.y=HEIGHT-js.rect.h
  55.                 else:
  56.                         js.rect.y+=js.speed

  57. def map_movefun(map,num): # 地图是反方向移动
  58.         if num==4: # 人物往左,地图向右
  59.                 if map.rect.x>=0:
  60.                         map.rect.x=0
  61.                         jsmovefun(4)
  62.                 else:
  63.                         if js.rect.x>=WIDTH/2:
  64.                                 js.rect.x=WIDTH/2
  65.                                 map.rect.x+=map.speed
  66.                         else:
  67.                                 js.rect.x+=js.speed
  68.                                 map.rect.x+=0
  69.         elif num==8: # 人物往上,地图向下
  70.                 if map.rect.y>=0:
  71.                         map.rect.y=0
  72.                         jsmovefun(8)
  73.                 else:
  74.                         if js.rect.y>=HEIGHT/2:
  75.                                 js.rect.y=HEIGHT/2
  76.                                 map.rect.y+=map.speed
  77.                         else:
  78.                                 map.rect.y+=0
  79.                                 js.rect.y+=js.speed
  80.         elif num==6: # 人物往右,地图向左
  81.                 if map.rect.x<=-(map.rect.w-WIDTH): # 角色正方向移动的时候地图负方向移动,当角色走到地图右边界时,地图的x是地图的宽减去视窗宽并取负值
  82.                         map.rect.x=-(map.rect.w-WIDTH)
  83.                         jsmovefun(6)
  84.                 else:
  85.                         if js.rect.x<=WIDTH/2:
  86.                                 js.rect.x=WIDTH/2
  87.                                 map.rect.x-=map.speed
  88.                         else:
  89.                                 map.rect.x-=0
  90.                                 js.rect.x-=js.speed
  91.         elif num==2: # 人物往下,地图向上
  92.                 if map.rect.y<=-(map.rect.h-HEIGHT): # 角色正方向移动的时候地图负方向移动,当角色走到地图下边界时,地图的y是地图的高减去视窗高并取负值
  93.                         map.rect.y=-(map.rect.h-HEIGHT)
  94.                         jsmovefun(2)
  95.                 else:
  96.                         if js.rect.y<=HEIGHT/2:
  97.                                 js.rect.y=HEIGHT/2
  98.                                 map.rect.y-=map.speed
  99.                         else:
  100.                                 map.rect.y-=0
  101.                                 js.rect.y-=js.speed
  102. #                                

  103. # def map_movefun(map,num): # 地图是反方向移动
  104. #         if num==4: # 人物往左,地图向右
  105. #                 if map.rect.x>=0:
  106. #                         map.rect.x=0
  107. #                         jsmovefun(4)
  108. #                 else:
  109. #                         map.rect.x+=0
  110. #                         js.rect.x+=js.speed
  111. #                         if js.rect.x>=WIDTH/2:
  112. #                                 js.rect.x+=0
  113. #                                 map.rect.x+=map.speed
  114. #                         else:
  115. #                                 map.rect.x+=0
  116. #                                 js.rect.x+=js.speed
  117. #         elif num==8: # 人物往上,地图向下
  118. #                 if map.rect.y>=0:
  119. #                         map.rect.y=0
  120. #                         jsmovefun(8)
  121. #                 else:
  122. #                         map.rect.y+=0
  123. #                         js.rect.y+=js.speed
  124. #                         if js.rect.y>=HEIGHT/2:
  125. #                                 js.rect.y+=0
  126. #                                 map.rect.y+=map.speed
  127. #                         else:
  128. #                                 map.rect.y+=0
  129. #                                 js.rect.y+=js.speed
  130. #         elif num==6: # 人物往右,地图向左
  131. #                 if map.rect.x<=-(map.rect.w-WIDTH): # 角色正方向移动的时候地图负方向移动,当角色走到地图右边界时,地图的x是地图的宽减去视窗宽并取负值
  132. #                         map.rect.x=-(map.rect.w-WIDTH)
  133. #                         jsmovefun(6)
  134. #                 else:
  135. #                         map.rect.x-=0
  136. #                         js.rect.x-=js.speed
  137. #                         if js.rect.x<=WIDTH/2:
  138. #                                 js.rect.x-=0
  139. #                                 map.rect.x-=map.speed
  140. #                         else:
  141. #                                 map.rect.x+=0
  142. #                                 js.rect.x-=js.speed
  143. #         elif num==2: # 人物往下,地图向上
  144. #                 if map.rect.y<=-(map.rect.h-HEIGHT): # 角色正方向移动的时候地图负方向移动,当角色走到地图下边界时,地图的y是地图的高减去视窗高并取负值
  145. #                         map.rect.y=-(map.rect.h-HEIGHT)
  146. #                         jsmovefun(2)
  147. #                 else:
  148. #                         map.rect.y-=0
  149. #                         js.rect.y-=js.speed
  150. #                         if js.rect.y<=HEIGHT/2:
  151. #                                 js.rect.y-=0
  152. #                                 map.rect.y-=map.speed
  153. #                         else:
  154. #                                 map.rect.x+=0
  155. #                                 js.rect.y-=js.speed





  156. def vsfun(aa,bb):
  157.         vs=pygame.sprite.collide_mask(aa,bb) # 角色与地图碰撞
  158.         if vs!=None:
  159.                 return True
  160.         else:
  161.                 return False

  162. while True:
  163.         for event in pygame.event.get():
  164.                 if event.type==pygame.QUIT:
  165.                         pygame.quit()
  166.                         sys.exit()

  167.                 elif event.type==pygame.KEYDOWN:
  168.                         if event.key==pygame.K_LEFT:
  169.                                 # jsmovefun(4)
  170.                                 map_movefun(bigmap,4)
  171.                                 map_movefun(beaumap,4)
  172.                                 map_movefun(zrmap,4)
  173.                                 pd=vsfun(js,bigmap)
  174.                                 if pd==True: # 发生碰撞
  175.                                         bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
  176.                                         beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
  177.                                         js.rect.x,js.rect.y=js.lists[0],js.lists[1]
  178.                                         zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
  179.                                         # print("往左发生了碰撞")
  180.                                 else:
  181.                                         bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
  182.                                         beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
  183.                                         js.lists[0],js.lists[1]=js.rect.x,js.rect.y
  184.                                         zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
  185.                         elif event.key==pygame.K_UP:
  186.                                 # jsmovefun(8)
  187.                                 map_movefun(bigmap,8)
  188.                                 map_movefun(beaumap,8)
  189.                                 map_movefun(zrmap,8)
  190.                                 pd=vsfun(js,bigmap)
  191.                                 if pd==True: # 发生碰撞
  192.                                         bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
  193.                                         beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
  194.                                         js.rect.x,js.rect.y=js.lists[0],js.lists[1]
  195.                                         zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
  196.                                         # print("往上发生了碰撞")
  197.                                 else:
  198.                                         bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
  199.                                         beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
  200.                                         js.lists[0],js.lists[1]=js.rect.x,js.rect.y
  201.                                         zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
  202.                         elif event.key==pygame.K_RIGHT:
  203.                                 # jsmovefun(6)
  204.                                 map_movefun(bigmap,6)
  205.                                 map_movefun(beaumap,6)
  206.                                 map_movefun(zrmap,6)
  207.                                 pd=vsfun(js,bigmap)
  208.                                 if pd==True: # 发生碰撞
  209.                                         bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
  210.                                         beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
  211.                                         js.rect.x,js.rect.y=js.lists[0],js.lists[1]
  212.                                         zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
  213.                                         # print("往右发生了碰撞")
  214.                                 else:
  215.                                         bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
  216.                                         beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
  217.                                         js.lists[0],js.lists[1]=js.rect.x,js.rect.y
  218.                                         zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y
  219.                         elif event.key==pygame.K_DOWN:
  220.                                 # jsmovefun(2)
  221.                                 map_movefun(bigmap,2)
  222.                                 map_movefun(beaumap,2)
  223.                                 map_movefun(zrmap,2)
  224.                                 pd=vsfun(js,bigmap)
  225.                                 if pd==True: # 发生碰撞
  226.                                         bigmap.rect.x,bigmap.rect.y=bigmap.lists[0],bigmap.lists[1]
  227.                                         beaumap.rect.x,beaumap.rect.y=beaumap.lists[0],beaumap.lists[1]
  228.                                         js.rect.x,js.rect.y=js.lists[0],js.lists[1]
  229.                                         zrmap.rect.x,zrmap.rect.y=zrmap.lists[0],zrmap.lists[1]
  230.                                         # print("往下发生了碰撞")
  231.                                 else:
  232.                                         bigmap.lists[0],bigmap.lists[1]=bigmap.rect.x,bigmap.rect.y
  233.                                         beaumap.lists[0],beaumap.lists[1]=beaumap.rect.x,beaumap.rect.y
  234.                                         js.lists[0],js.lists[1]=js.rect.x,js.rect.y
  235.                                         zrmap.lists[0],zrmap.lists[1]=zrmap.rect.x,zrmap.rect.y

  236.         root.fill((255,255,255))
  237.        
  238.         # root.blit(beaumap.image,(beaumap.rect.x,beaumap.rect.y))
  239.         root.blit(bigmap.image,(bigmap.rect.x,bigmap.rect.y)) # 这才是碰撞到的地图,写这里为了隐藏
  240.        
  241.         root.blit(beaumap.image,(beaumap.rect.x,beaumap.rect.y)) # 这是漂亮大地图


  242.         root.blit(js.image,(js.rect.x,js.rect.y))

  243.         root.blit(zrmap.image,(zrmap.rect.x,zrmap.rect.y)) # 遮挡景
  244.         pygame.display.update()
  245.         clock.tick(60)








复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-21 18:23:21 | 显示全部楼层
本帖最后由 fffccc8080 于 2023-7-21 18:24 编辑

zong123.lanzouw.com/iBSCn134ichg     好了,这是完美解决的,接上六楼,六楼代码正确。

蓝奏云,一楼的也不删了,这是新上传的一个完美解决的


我是怎么解决的呢,在大地图周围又套上了一层防止角色走到边界后,按反方向被瞬间拉回视窗中心。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-21 18:31:56 | 显示全部楼层

给楼主看看我以前写的,不知道符不符合你的要求:
  1. import sys
  2. import pygame
  3. from pygame.locals import *

  4. #初始化
  5. pygame.init()
  6. #创建屏幕
  7. screen = pygame.display.set_mode((400, 400))
  8. #创建时钟对象
  9. clock = pygame.time.Clock()
  10. # 加载地图图片和人物
  11. bgpic = pygame.image.load("摄像机测试背景.png")
  12. man = pygame.image.load("小火柴人.jpg")

  13. # 获取人物图片的外界长方形,设定人物初始位置为背景中心
  14. man_rect = man.get_rect()
  15. man_rect.centerx = 200
  16. man_rect.centery = 200

  17. # 标记人物运动方向的布尔值
  18. move_left = False
  19. move_right = False
  20. move_up = False
  21. move_down = False


  22. # 摄像机取景框左上角坐标(游戏世界地图坐标)
  23. camerax = 0
  24. cameray = 0
  25. # 人和屏幕中心点的最大距离
  26. camera_slack = 100



  27. while True:
  28.     #设置帧数
  29.     clock.tick(30)
  30.     # 投放地图(屏幕内坐标)
  31.     screen.blit(bgpic,(-400-camerax, -400-cameray))
  32.     # 投放人物(屏幕内坐标)
  33.     screen.blit(man,(man_rect.x-camerax, man_rect.y-cameray))
  34.     #处理人物移动速度(人物不能走出边界)
  35.     if move_left and man_rect.x>-400:
  36.         man_rect.x -= 4
  37.     if move_right and man_rect.x<800-80:
  38.         man_rect.x += 4
  39.     if move_up and man_rect.y>-400:
  40.         man_rect.y -= 4
  41.     if move_down and man_rect.y<800-92:
  42.         man_rect.y += 4

  43.     # 处理摄像机的移动
  44.     #人太靠左了摄像机也需要向左移动
  45.     if camerax+200-man_rect.centerx > camera_slack and camerax > -400:
  46.         #摄像机要移动的距离就是人物越过活动范围的距离
  47.         # camerax = camerax - (camerax+200-man_rect.centerx-camera_slack)
  48.         camerax = man_rect.centerx+camera_slack-200
  49.     #人太靠右了 摄像机也需要向右移动
  50.     elif man_rect.centerx-(camerax+200) > camera_slack and camerax < 400:
  51.         #camerax = camerax + (man_rect.cenyerx-(camerax+200)-camera_slack)
  52.         camerax = man_rect.centerx-200-camera_slack   

  53.     #人太靠上了 摄像机也需要往上移动
  54.     if cameray+200-man_rect.centery > camera_slack and cameray >-400:
  55.         #cameray = cameray - (cameray+200-man_rect.centery)+camera_slack
  56.         cameray = man_rect.centery-200+camera_slack
  57.     elif man_rect.centery - (cameray+200) > camera_slack and cameray <400:
  58.         cameray = man_rect.centery-200-camera_slack

  59.     #更新画面
  60.     pygame.display.update()

  61.     for event in pygame.event.get():
  62.         if event.type == QUIT:
  63.             pygame.quit()
  64.             sys.exit()
  65.         #当按下方向键 人物移动
  66.         elif event.type == KEYDOWN:
  67.             if event.key == K_LEFT:
  68.                 move_left = True
  69.             elif event.key == K_RIGHT:
  70.                 move_right = True
  71.             if event.key == K_UP:
  72.                 move_up = True
  73.             elif event.key == K_DOWN:
  74.                 move_down = True
  75.         #松开方向键 人物结束移动
  76.         if event.type == KEYUP:
  77.             if event.key == K_LEFT:
  78.                 move_left = False
  79.             elif event.key == K_RIGHT:
  80.                 move_right = False
  81.             if event.key == K_UP:
  82.                 move_up = False
  83.             elif event.key == K_DOWN:
  84.                 move_down = False

  85.             












复制代码
图片
:

摄像机测试背景.png
小火柴人.jpg


两个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-21 18:32:37 | 显示全部楼层

如果大家都对这个有需求的话以后我做个教程?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-27 13:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表