繁体   English   中英

如何在 pygame 中制作墙精灵?

[英]How to make a wall sprite in pygame?

我正在构建一个游戏,我有一个玩家 class,但是当它接触块精灵的左/右侧时,它会传送到块的顶部。 我不知道如何解决这个问题。 我所见过的任何问题都没有帮助我解决这个问题。

我可以通过做检测碰撞

for entity in blocks:
If self.rect.collidepoint(entity.midleft):
Collide = true

播放器 class:

class Player(pygame.sprite.Sprite):
  def __init__(self):
    super(Player, self).__init__()
    self.surf = pygame.Surface((40,40))
    self.surf.fill((255,0,0))
    self.rect = self.surf.get_rect()
    self.pos = vec(0,144)
    self.vel = vec(0,0)
    self.acc = vec(0,0)
    
  def move(self, pressed_keys):
    self.acc = vec(0,0.5)
    if pressed_keys[K_LEFT]:
      self.acc.x = -ACC
      
    if pressed_keys[K_RIGHT]:
      self.acc.x = ACC

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

    #if self.pos.x > W:
    #  self.pos.x = W
    #if self.pos.x < 0:
    #  self.pos.x = 0

    self.rect.midbottom = self.pos
  
    
  def checkCollision(self):
    for entity in blocks:
      if self.rect.collidepoint(entity.rect.midleft) or self.rect.collidepoint(entity.rect.midright):
        return True
    return False
  def update(self):
    hits = pygame.sprite.spritecollide(self, blocks, False)

    
    if self.vel.y > 0:
      if hits:
        self.pos.y = hits[0].rect.top + 1
        self.vel.y = 0
    
  def jump(self):
    hits = pygame.sprite.spritecollide(self, blocks, False)
    if hits:
      self.vel.y = -15

我只需要一些东西来指引我正确的方向!

您必须分别对 x 和 y 轴进行碰撞测试。

首先运行 x 轴的碰撞测试。 如果玩家移动到一个块中,将玩家与块对齐:

for entity in blocks:
    if self.rect.colliderect(entity):

        # move left and hit the block on the right
        if self.vel.x < 0 and self.rect.center > entity.right:
            self.rect.left = entity.right

        # move right and hit the block on the left
        if self.vel.x > 0 and self.rect.center < entity.left:
            self.rect.right = entity.left

之后,您可以运行 y 轴的碰撞测试:

for entity in blocks:
    if self.rect.colliderect(entity):
        
        # player is falling
        if self.vel.y > 0:
            self.rect.bottom = entity.top

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM