鱼C论坛

 找回密码
 立即注册
查看: 1069|回复: 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() 调用的函数,打开注释就行


# 角色和地图的碰撞
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() 调用的函数,打开注释就行


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









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

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













评分

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

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


同感
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

蓝奏云下载也不快呀,百度网盘会员下载还是挺快的,我一直都在用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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


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



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




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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-21 16:16:02 | 显示全部楼层
本帖最后由 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[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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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


我是怎么解决的呢,在大地图周围又套上了一层防止角色走到边界后,按反方向被瞬间拉回视窗中心。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

给楼主看看我以前写的,不知道符不符合你的要求:
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

            
图片
:

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


两个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果大家都对这个有需求的话以后我做个教程?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 09:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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