Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在基于平铺的游戏中平滑移动玩家?_Python_Pygame_Game Development - Fatal编程技术网

Python 如何在基于平铺的游戏中平滑移动玩家?

Python 如何在基于平铺的游戏中平滑移动玩家?,python,pygame,game-development,Python,Pygame,Game Development,在我创建的一个基于平铺的rpg中,我试图实现一个能够在平铺之间平滑移动玩家的功能。我已经在播放器更新和getkeys功能中应用了这一点。当玩家在四个方向中的任何一个方向移动时,程序应该计算玩家应该落在的下一个瓷砖上,直到他们落在该瓷砖上,玩家应该在两个瓷砖之间平稳移动 但是,我创建的函数没有正确定位播放器。该函数未命中下一个磁贴的位置,导致播放器移出网格,从而导致碰撞错误 将pygame导入为pg 导入系统 向量=pg.math.Vector2 白色=(255,255,255) 黑色=(0,0,

在我创建的一个基于平铺的rpg中,我试图实现一个能够在平铺之间平滑移动玩家的功能。我已经在播放器更新和
getkeys
功能中应用了这一点。当玩家在四个方向中的任何一个方向移动时,程序应该计算玩家应该落在的下一个瓷砖上,直到他们落在该瓷砖上,玩家应该在两个瓷砖之间平稳移动

但是,我创建的函数没有正确定位播放器。该函数未命中下一个磁贴的位置,导致播放器移出网格,从而导致碰撞错误

将pygame导入为pg
导入系统
向量=pg.math.Vector2
白色=(255,255,255)
黑色=(0,0,0)
红色=(255,0,0)
黄色=(255,255,0)
蓝色=(0,0255)
宽度=512×32×24瓦
高度=384
FPS=60
TILESIZE=32
播放器速度=3*TILESIZE
MAP=[“1111111111”,
"1..............1",
“第1页”,
"1..1111........1",
"1..1..1........1",
"1..1111........1",
"1..............1",
"1........11111.1",
"1........1...1.1",
"1........11111.1",
"1..............1",
"1111111111111111"]
def碰撞命中率(一,二):
返回1.hit_rect.colliderect(2.rect)
def玩家_碰撞(精灵,组):
hits_walls=pg.sprite.spritecollide(sprite,group,False,collide_hit_rect)
如果击中墙壁:
sprite.pos-=sprite.vel*瓷砖大小
职业玩家(第三页精灵):
定义初始化(self,game,x,y):
self.groups=game.all\u精灵
pg.sprite.sprite.\uuuu init\uuuu(self,self.groups)
self.game=游戏
self.walk\u缓冲区=200
self.vel=vec(0,0)
self.pos=vec(x,y)*TILESIZE
self.dirvec=vec(0,0)
self.last_pos=self.pos
self.next_pos=vec(0,0)
self.current\u frame=0
self.last_update=pg.time.get_ticks()
自走=真
self.between_tiles=False
self.walking_精灵=[pg.Surface((TILESIZE,TILESIZE))]
self.walking_精灵[0]。填充(黄色)
self.image=self.walking\u精灵[0]
self.rect=self.image.get_rect()
self.hit_rect=self.rect
self.hit_rect.bottom=self.rect.bottom
def更新(自我):
self.get_key()
self.rect=self.image.get_rect()
self.rect.topleft=self.pos
如果self.pos==self.next_pos:
self.between_tiles=False
如果self.between_tiles:
self.pos+=self.vel*self.game.dt
self.hit_rect.topleft=self.pos
玩家(self,self.game.walls)可能会改变位置
self.hit_rect.topleft=self.pos#重置矩形
self.rect.midbottom=self.hit_rect.midbottom
def get_密钥(自):
self.dirvec=vec(0,0)
now=pg.time.get_ticks()
keys=pg.key.get_pressed()
如果现在-self.last\u update>self.walk\u缓冲区:
self.vel=vec(0,0)
self.last_update=现在
如果键[pg.K_左]或键[pg.K_a]:
self.dirvec.x=-1
self.vel.x=-玩家速度
elif键[pg.K_RIGHT]或键[pg.K_d]:
self.dirvec.x=1
self.vel.x=玩家速度
elif键[pg.K_UP]或键[pg.K_w]:
self.dirvec.y=-1
self.vel.y=-玩家速度
elif键[pg.K_DOWN]或键[pg.K_s]:
self.dirvec.y=1
self.vel.y=玩家速度
如果self.dirvec!=向量(0,0):
self.between_tiles=真
自走=真
##self.offset=self.vel*self.game.dt
self.last_pos=self.pos
self.next_pos=self.pos+self.dirvec*TILESIZE
其他:
self.between_tiles=False
self.walking=False
班级障碍(第三页精灵):
定义初始化(self,game,x,y):
self.groups=game.walls
pg.sprite.sprite.\uuuu init\uuuu(self,self.groups)
self.x=x*TILESIZE
self.y=y*TILESIZE
self.w=TILESIZE
self.h=TILESIZE
self.game=游戏
self.image=pg.Surface((self.w,self.h))
self.image.fill(黑色)
self.rect=self.image.get_rect()
self.hit_rect=self.rect
self.rect.x=self.x
self.rect.y=self.y
班级游戏:
定义初始化(自):
第init页()
self.screen=pg.display.set_模式((宽度、高度))
pg.display.set_标题(“Hello堆栈溢出”)
self.clock=pg.time.clock()
pg.key.set_重复(500100)
def新(自我):
self.all_sprite=pg.sprite.Group()
self.walls=pg.sprite.Group()
对于行,枚举(映射)中的平铺:
对于列,枚举中的平铺(平铺):
如果平铺==“1”:
障碍物(自身、列、行)
elif tile==“P”:
打印(“香蕉!”)
self.player=玩家(self、col、row)
def退出(自我):
第页退出
sys.exit()
def运行(自):
#游戏循环-设置self.playing=False结束游戏
自弹=真
自娱自乐时:
self.dt=self.clock.tick(FPS)/1000
self.events()
self.update()
self.draw()
def事件(自):
#在这里捕捉所有事件
对于pg.event.get()中的事件:
如果event.type==pg.QUIT:
self.quit()
def更新(自我):
self.player.update()
def牵引(自):
self.screen.fill(白色)
对于self.walls中的墙:
self.screen.blit(wall.image,wall.rect)
对于self.all_精灵中的精灵:
自动屏幕。