人物在大地图上走动_来看看如何使角色始终站在窗口中间移动(7楼哦)
本帖最后由 fffccc8080 于 2023-7-21 18:26 编辑这是新的蓝奏云下载地址
zong123.lanzouw.com/i6nV5133kjxa2023年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,bigmap.lists
beaumap.rect.x,beaumap.rect.y=beaumap.lists,beaumap.lists
js.rect.x,js.rect.y=js.lists,js.lists
zrmap.rect.x,zrmap.rect.y=zrmap.lists,zrmap.lists
# print("往左发生了碰撞")
else:
bigmap.lists,bigmap.lists=bigmap.rect.x,bigmap.rect.y
beaumap.lists,beaumap.lists=beaumap.rect.x,beaumap.rect.y
js.lists,js.lists=js.rect.x,js.rect.y
zrmap.lists,zrmap.lists=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,bigmap.lists
beaumap.rect.x,beaumap.rect.y=beaumap.lists,beaumap.lists
js.rect.x,js.rect.y=js.lists,js.lists
zrmap.rect.x,zrmap.rect.y=zrmap.lists,zrmap.lists
# print("往上发生了碰撞")
else:
bigmap.lists,bigmap.lists=bigmap.rect.x,bigmap.rect.y
beaumap.lists,beaumap.lists=beaumap.rect.x,beaumap.rect.y
js.lists,js.lists=js.rect.x,js.rect.y
zrmap.lists,zrmap.lists=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,bigmap.lists
beaumap.rect.x,beaumap.rect.y=beaumap.lists,beaumap.lists
js.rect.x,js.rect.y=js.lists,js.lists
zrmap.rect.x,zrmap.rect.y=zrmap.lists,zrmap.lists
# print("往右发生了碰撞")
else:
bigmap.lists,bigmap.lists=bigmap.rect.x,bigmap.rect.y
beaumap.lists,beaumap.lists=beaumap.rect.x,beaumap.rect.y
js.lists,js.lists=js.rect.x,js.rect.y
zrmap.lists,zrmap.lists=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,bigmap.lists
beaumap.rect.x,beaumap.rect.y=beaumap.lists,beaumap.lists
js.rect.x,js.rect.y=js.lists,js.lists
zrmap.rect.x,zrmap.rect.y=zrmap.lists,zrmap.lists
# print("往下发生了碰撞")
else:
bigmap.lists,bigmap.lists=bigmap.rect.x,bigmap.rect.y
beaumap.lists,beaumap.lists=beaumap.rect.x,beaumap.rect.y
js.lists,js.lists=js.rect.x,js.rect.y
zrmap.lists,zrmap.lists=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() 调用的函数,打开注释就行
这一楼文件不动它了,若能彻底解决人物始终站中间走的话,新文件发到下面的楼层里吧
人物在大地图上的走动,大家看看要如何才能使角色始终站在游戏窗口中间走,
六楼,我的回复中,是很勉强的站中间,到边界虽然不会报错,但走起来,有点不合情理。
(不用度盘了,度盘垃圾)
同感 歌者文明清理员 发表于 2023-7-20 23:43
同感
蓝奏云下载也不快呀,百度网盘会员下载还是挺快的,我一直都在用 isdkz 发表于 2023-7-21 00:56
蓝奏云下载也不快呀,百度网盘会员下载还是挺快的,我一直都在用
迅雷 + 蓝奏 / 123pan = perfect
城通网盘其实也很垃圾,都是用的自带的下载(非vip限速),要是有文件的下载路径就快得多的(城通的好处是唯一不用手机号认证的网盘) 本帖最后由 fffccc8080 于 2023-7-21 13:07 编辑
蓝奏感觉还好,度盘下载最不行
上面更新了一下了,本想让人物站中间不动,只让地图动,看上去效果达到了,但是有新的BUG碰撞明明前面有路却有空气墙了。
还是重新上传先前的了,一楼代码就不用变了,只要打开四行代码的注释即可。也就是先前的代码。
虽然先前看上去不爽,没有人物站在中间的爽,但是至少碰撞上面遇到的问题相对少些
本帖最后由 fffccc8080 于 2023-7-21 16:20 编辑
以下代码勉强可以完成人物角色一直走在中间,
只不过会有一个BUG,走到边界后,回来时,嗖的一下就被拉回到视窗中间了。
# 角色和地图的碰撞
import pygame,sys
WIDTH=800
HEIGHT=600
pygame.init()
root=pygame.display.set_mode((WIDTH,HEIGHT),0,32)
clock=pygame.time.Clock()
# 全局变量
SPEED=10
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):
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",(WIDTH/2,HEIGHT/2))
bigmap=Jl()
bigmap.load("./bmap.png",(-1447,-236))
beaumap=Jl()
beaumap.load("./beau_map.jpg",(-1447,-236))
zrmap=Jl()
zrmap.load("./zren.png",(-1447,-236))
# 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
jsmovefun(4)
else:
if js.rect.x>=WIDTH/2:
js.rect.x=WIDTH/2
map.rect.x+=map.speed
else:
js.rect.x+=js.speed
map.rect.x+=0
elif num==8: # 人物往上,地图向下
if map.rect.y>=0:
map.rect.y=0
jsmovefun(8)
else:
if js.rect.y>=HEIGHT/2:
js.rect.y=HEIGHT/2
map.rect.y+=map.speed
else:
map.rect.y+=0
js.rect.y+=js.speed
elif num==6: # 人物往右,地图向左
if map.rect.x<=-(map.rect.w-WIDTH): # 角色正方向移动的时候地图负方向移动,当角色走到地图右边界时,地图的x是地图的宽减去视窗宽并取负值
map.rect.x=-(map.rect.w-WIDTH)
jsmovefun(6)
else:
if js.rect.x<=WIDTH/2:
js.rect.x=WIDTH/2
map.rect.x-=map.speed
else:
map.rect.x-=0
js.rect.x-=js.speed
elif num==2: # 人物往下,地图向上
if map.rect.y<=-(map.rect.h-HEIGHT): # 角色正方向移动的时候地图负方向移动,当角色走到地图下边界时,地图的y是地图的高减去视窗高并取负值
map.rect.y=-(map.rect.h-HEIGHT)
jsmovefun(2)
else:
if js.rect.y<=HEIGHT/2:
js.rect.y=HEIGHT/2
map.rect.y-=map.speed
else:
map.rect.y-=0
js.rect.y-=js.speed
#
# def map_movefun(map,num): # 地图是反方向移动
# if num==4: # 人物往左,地图向右
# if map.rect.x>=0:
# map.rect.x=0
# jsmovefun(4)
# else:
# map.rect.x+=0
# js.rect.x+=js.speed
# if js.rect.x>=WIDTH/2:
# js.rect.x+=0
# map.rect.x+=map.speed
# else:
# map.rect.x+=0
# js.rect.x+=js.speed
# elif num==8: # 人物往上,地图向下
# if map.rect.y>=0:
# map.rect.y=0
# jsmovefun(8)
# else:
# map.rect.y+=0
# js.rect.y+=js.speed
# if js.rect.y>=HEIGHT/2:
# js.rect.y+=0
# map.rect.y+=map.speed
# else:
# map.rect.y+=0
# js.rect.y+=js.speed
# elif num==6: # 人物往右,地图向左
# if map.rect.x<=-(map.rect.w-WIDTH): # 角色正方向移动的时候地图负方向移动,当角色走到地图右边界时,地图的x是地图的宽减去视窗宽并取负值
# map.rect.x=-(map.rect.w-WIDTH)
# jsmovefun(6)
# else:
# map.rect.x-=0
# js.rect.x-=js.speed
# if js.rect.x<=WIDTH/2:
# js.rect.x-=0
# map.rect.x-=map.speed
# else:
# map.rect.x+=0
# js.rect.x-=js.speed
# elif num==2: # 人物往下,地图向上
# if map.rect.y<=-(map.rect.h-HEIGHT): # 角色正方向移动的时候地图负方向移动,当角色走到地图下边界时,地图的y是地图的高减去视窗高并取负值
# map.rect.y=-(map.rect.h-HEIGHT)
# jsmovefun(2)
# else:
# map.rect.y-=0
# js.rect.y-=js.speed
# if js.rect.y<=HEIGHT/2:
# js.rect.y-=0
# map.rect.y-=map.speed
# else:
# map.rect.x+=0
# js.rect.y-=js.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,bigmap.lists
beaumap.rect.x,beaumap.rect.y=beaumap.lists,beaumap.lists
js.rect.x,js.rect.y=js.lists,js.lists
zrmap.rect.x,zrmap.rect.y=zrmap.lists,zrmap.lists
# print("往左发生了碰撞")
else:
bigmap.lists,bigmap.lists=bigmap.rect.x,bigmap.rect.y
beaumap.lists,beaumap.lists=beaumap.rect.x,beaumap.rect.y
js.lists,js.lists=js.rect.x,js.rect.y
zrmap.lists,zrmap.lists=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,bigmap.lists
beaumap.rect.x,beaumap.rect.y=beaumap.lists,beaumap.lists
js.rect.x,js.rect.y=js.lists,js.lists
zrmap.rect.x,zrmap.rect.y=zrmap.lists,zrmap.lists
# print("往上发生了碰撞")
else:
bigmap.lists,bigmap.lists=bigmap.rect.x,bigmap.rect.y
beaumap.lists,beaumap.lists=beaumap.rect.x,beaumap.rect.y
js.lists,js.lists=js.rect.x,js.rect.y
zrmap.lists,zrmap.lists=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,bigmap.lists
beaumap.rect.x,beaumap.rect.y=beaumap.lists,beaumap.lists
js.rect.x,js.rect.y=js.lists,js.lists
zrmap.rect.x,zrmap.rect.y=zrmap.lists,zrmap.lists
# print("往右发生了碰撞")
else:
bigmap.lists,bigmap.lists=bigmap.rect.x,bigmap.rect.y
beaumap.lists,beaumap.lists=beaumap.rect.x,beaumap.rect.y
js.lists,js.lists=js.rect.x,js.rect.y
zrmap.lists,zrmap.lists=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,bigmap.lists
beaumap.rect.x,beaumap.rect.y=beaumap.lists,beaumap.lists
js.rect.x,js.rect.y=js.lists,js.lists
zrmap.rect.x,zrmap.rect.y=zrmap.lists,zrmap.lists
# print("往下发生了碰撞")
else:
bigmap.lists,bigmap.lists=bigmap.rect.x,bigmap.rect.y
beaumap.lists,beaumap.lists=beaumap.rect.x,beaumap.rect.y
js.lists,js.lists=js.rect.x,js.rect.y
zrmap.lists,zrmap.lists=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)
本帖最后由 fffccc8080 于 2023-7-21 18:24 编辑
zong123.lanzouw.com/iBSCn134ichg 好了,这是完美解决的,接上六楼,六楼代码正确。
蓝奏云,一楼的也不删了,这是新上传的一个完美解决的
我是怎么解决的呢,在大地图周围又套上了一层防止角色走到边界后,按反方向被瞬间拉回视窗中心。
给楼主看看我以前写的,不知道符不符合你的要求:
import sys
import pygame
from pygame.locals import *
#初始化
pygame.init()
#创建屏幕
screen = pygame.display.set_mode((400, 400))
#创建时钟对象
clock = pygame.time.Clock()
# 加载地图图片和人物
bgpic = pygame.image.load("摄像机测试背景.png")
man = pygame.image.load("小火柴人.jpg")
# 获取人物图片的外界长方形,设定人物初始位置为背景中心
man_rect = man.get_rect()
man_rect.centerx = 200
man_rect.centery = 200
# 标记人物运动方向的布尔值
move_left = False
move_right = False
move_up = False
move_down = False
# 摄像机取景框左上角坐标(游戏世界地图坐标)
camerax = 0
cameray = 0
# 人和屏幕中心点的最大距离
camera_slack = 100
while True:
#设置帧数
clock.tick(30)
# 投放地图(屏幕内坐标)
screen.blit(bgpic,(-400-camerax, -400-cameray))
# 投放人物(屏幕内坐标)
screen.blit(man,(man_rect.x-camerax, man_rect.y-cameray))
#处理人物移动速度(人物不能走出边界)
if move_left and man_rect.x>-400:
man_rect.x -= 4
if move_right and man_rect.x<800-80:
man_rect.x += 4
if move_up and man_rect.y>-400:
man_rect.y -= 4
if move_down and man_rect.y<800-92:
man_rect.y += 4
# 处理摄像机的移动
#人太靠左了摄像机也需要向左移动
if camerax+200-man_rect.centerx > camera_slack and camerax > -400:
#摄像机要移动的距离就是人物越过活动范围的距离
# camerax = camerax - (camerax+200-man_rect.centerx-camera_slack)
camerax = man_rect.centerx+camera_slack-200
#人太靠右了 摄像机也需要向右移动
elif man_rect.centerx-(camerax+200) > camera_slack and camerax < 400:
#camerax = camerax + (man_rect.cenyerx-(camerax+200)-camera_slack)
camerax = man_rect.centerx-200-camera_slack
#人太靠上了 摄像机也需要往上移动
if cameray+200-man_rect.centery > camera_slack and cameray >-400:
#cameray = cameray - (cameray+200-man_rect.centery)+camera_slack
cameray = man_rect.centery-200+camera_slack
elif man_rect.centery - (cameray+200) > camera_slack and cameray <400:
cameray = man_rect.centery-200-camera_slack
#更新画面
pygame.display.update()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
#当按下方向键 人物移动
elif event.type == KEYDOWN:
if event.key == K_LEFT:
move_left = True
elif event.key == K_RIGHT:
move_right = True
if event.key == K_UP:
move_up = True
elif event.key == K_DOWN:
move_down = True
#松开方向键 人物结束移动
if event.type == KEYUP:
if event.key == K_LEFT:
move_left = False
elif event.key == K_RIGHT:
move_right = False
if event.key == K_UP:
move_up = False
elif event.key == K_DOWN:
move_down = False
图片
:
两个{:10_254:}
如果大家都对这个有需求的话以后我做个教程?{:10_277:}
页:
[1]