Python Pygame玩家在矩形顶部进行远程传送

Python Pygame玩家在矩形顶部进行远程传送,python,pygame,Python,Pygame,我目前正试图习惯pygame,因此正在构建一个platformer游戏。我已经搜索了这个问题,但找不到任何相关的。问题是,当我的玩家在左侧或右侧碰撞时,他们会在我的平台矩形顶部传送。我已经尝试了多种修复方法,比如改变玩家的y位置,这会产生其他问题,并且只有当玩家击中任意一侧而不是顶部时才会触发碰撞效果,但似乎没有任何东西可以放弃玩家的远程传送。这会导致碰撞未触发或玩家与平台左上角或右上角的不可见墙发生碰撞。以下是相关文件(pg=pygame)的代码: 从pygame.locals导入* 从设置导

我目前正试图习惯pygame,因此正在构建一个platformer游戏。我已经搜索了这个问题,但找不到任何相关的。问题是,当我的玩家在左侧或右侧碰撞时,他们会在我的平台矩形顶部传送。我已经尝试了多种修复方法,比如改变玩家的y位置,这会产生其他问题,并且只有当玩家击中任意一侧而不是顶部时才会触发碰撞效果,但似乎没有任何东西可以放弃玩家的远程传送。这会导致碰撞未触发或玩家与平台左上角或右上角的不可见墙发生碰撞。以下是相关文件(pg=pygame)的代码:

从pygame.locals导入*
从设置导入*
向量=pg.math.Vector2
平台=pg.sprite.Group()
grounds=pg.sprite.Group()
除玩家外的所有玩家=pg.sprite.Group()
职业玩家(第三页精灵):
定义初始化(自):
精灵精灵。精灵。精灵初始(自我)
self.image=pg.Surface((20,20))
self.image.fill(蓝色)
self.rect=self.image.get_rect()
self.pos=vec((10780))
self.vel=vec(0,0)
self.acc=vec(0,0)
def更新(自我):
平台。添加(平台1)
地面。添加(地面)
除玩家外的所有玩家。添加(平台1,地面)
self.acc=vec(0,0.5)
hits=pg.sprite.spritecollide(p,除玩家外的所有玩家,False)
如果p.vel.y>0:
如果点击:
self.pos.y=hits[0].rect.top+1
自我水平y=0
#这就是问题所在
wall_hits=pg.sprite.spritecollide(p,platforms,False)
如果p.vel.x>0:
如果碰壁:
self.pos.x=wall\u hits[0]。rect.left-10
self.vel.x=0
如果p.vel.x<0:
如果碰壁:
self.pos.x=wall\u hits[0]。rect.right+10
self.vel.x=0
keys=pg.key.get_pressed()
如果键[pg.K_a]:
自身附件x-=附件
如果键[pg.K_d]:
自加速x+=加速
如果键[pg.K_空格]:
self.jump()
自加速x+=自加速x*fric
self.vel+=self.acc
self.pos+=self.vel+0.5*self.acc
如果self.pos.x>宽度:
self.pos.x=0
如果自身位置x<0:
self.pos.x=宽度
self.rect.midbottom=self.pos
def跳转(自):
hits=pg.sprite.spritecollide(self,除玩家外的所有玩家,False)
如果点击:
自我水平y-=15
班级场地(第页雪碧、雪碧):
定义初始化(自):
精灵精灵。精灵。精灵初始(自我)
self.image=pg.Surface((宽度,20))
self.image.fill(绿色)
self.rect=self.image.get_rect(中心=(宽度/2,高度-10))
课堂讲台(第三页:雪碧、雪碧):
定义初始化(自):
精灵精灵。精灵。精灵初始(自我)
self.image=pg.Surface((100300))
self.image.fill(灰色)
self.rect=self.image.get_rect(中心=(宽度/2,高度-10))
plat1=平台()
p=玩家()
地面=地面()

如果有人能帮助我并指出我的错误,我将不胜感激。

将其分为两个独立的问题。首先处理与平台侧面的碰撞。 玩家向右移动时会与平台左侧碰撞,但玩家左侧不会与平台碰撞。 向右移动时与平台右侧碰撞,但右侧不与平台碰撞。 如果球员侧面相撞,纠正他的位置,使他不会进一步相撞。 之后,进行新的碰撞测试,并处理与平台顶部的碰撞:

#处理侧面碰撞
self.rect.midbottom=self.pos
hits=pg.sprite.spritecollide(p,除玩家外的所有玩家,False)
如果点击:
如果p.vel.x>0且self.rect.left点击[0]。rect.right:
self.rect.left=点击[0]。rect.right
self.pos=self.rect.midbottom
自我水平y=0
#韩德尔垂直碰撞
hits=pg.sprite.spritecollide(p,除玩家外的所有玩家,False)
如果命中率和p.vel.y>0:
self.rect.bottom=点击[0]。rect.top+1
self.rect.midbottom=self.pos
自我水平y=0

谢谢,这帮了我很大的忙lot@Johnface请阅读并考虑你发现最有用的东西。
from pygame.locals import *
from settings import *

vec = pg.math.Vector2
platforms = pg.sprite.Group()
grounds = pg.sprite.Group()
all_except_player = pg.sprite.Group()


class Player(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((20, 20))
        self.image.fill(blue)
        self.rect = self.image.get_rect()
        self.pos = vec((10, 780))
        self.vel = vec(0, 0)
        self.acc = vec(0, 0)

    def update(self):
        platforms.add(plat1)
        grounds.add(ground)
        all_except_player.add(plat1, ground)
        self.acc = vec(0, 0.5)
        hits = pg.sprite.spritecollide(p, all_except_player, False)
        if p.vel.y > 0:
            if hits:
                self.pos.y = hits[0].rect.top + 1
                self.vel.y = 0
# this is where I assume the problem lies
        wall_hits = pg.sprite.spritecollide(p, platforms, False)
        if p.vel.x > 0:
            if wall_hits:
                self.pos.x = wall_hits[0].rect.left - 10
                self.vel.x = 0
        if p.vel.x < 0:
            if wall_hits:
                self.pos.x = wall_hits[0].rect.right + 10
                self.vel.x = 0  
        keys = pg.key.get_pressed()
        if keys[pg.K_a]:
            self.acc.x -= acc
        if keys[pg.K_d]:
            self.acc.x += acc
        if keys[pg.K_SPACE]:
            self.jump()

        self.acc.x += self.vel.x * fric
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc

        if self.pos.x > width:
            self.pos.x = 0
        if self.pos.x < 0:
            self.pos.x = width

        self.rect.midbottom = self.pos

    def jump(self):
        hits = pg.sprite.spritecollide(self, all_except_player, False)
        if hits:
            self.vel.y -= 15


class Ground(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((width, 20))
        self.image.fill(green)
        self.rect = self.image.get_rect(center=(width/2, height - 10))


class Platform(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((100, 300))
        self.image.fill(gray)
        self.rect = self.image.get_rect(center=(width/2, height - 10))


plat1 = Platform()
p = Player()
ground = Ground()