墙壁碰撞跳跃在Pygame

时间:2015-05-26 18:59:43

标签: python pygame collision platform

我正在使用pygame 2.7.9制作关卡编辑平台游戏。代码存在一些问题。首先,当我在墙上时,我无法跳跃。其次,我的角色在墙壁上的动作并不平滑。 playWallList是关卡中所有墙的列表。

import pygame, random, sys
from pygame.locals import *
running = True #Flags game as on

class PlayPlayer(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = images["spr_player"]
        self.rect = self.image.get_rect()
        self.rect.topleft = placedPlayer.rect.topleft
        self.speedX, self.speedY = 0, 0
    def update(self):
        global playWallList
        self.rect.y += self.speedY
        self.rect.x += self.speedX
        self.calc_grav()
        wall_hit_list = pygame.sprite.spritecollide(self, playWallList, False)
        for wall in wall_hit_list:
            if(self.speedX > 0): #player moves right and collides into wall
                self.rect.left = wall.rect.right
            elif(self.speedX < 0): #player moves left and collides into wall
                self.rect.right = wall.rect.left
        # Check and see if we hit anything
        wall_hit_list = pygame.sprite.spritecollide(self, playWallList, False)
        for wall in wall_hit_list:
            # Reset our position based on the top/bottom of the object.
            if self.speedY > 0:
                self.rect.bottom = wall.rect.top
            elif self.speedY < 0:
                self.rect.top = wall.rect.bottom
            # Stop our vertical movement
            self.speedY = 0
    def go_left(self):
        self.speedX = -3
    def go_right(self):
        self.speedX = 3
    def stop(self):
        self.speedX = 0
    def calc_grav(self):
        if self.speedY == 0:
            self.speedY = 1
        else:
            self.speedY += .25
    def jump(self):
        global playWallList
        self.speedY += 2
        platform_hit_list = pygame.sprite.spritecollide(self, playWallList, False)
        self.speedY -= 2
        # Checks to make sure if it is ok to jump
        if len(platform_hit_list) > 0 or self.rect.bottom >= screenHeight:
            self.speedY = -10

while running:
    for event in pygame.event.get():
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT and player[0].speedX < 0:
                player[0].stop()
            if event.key == pygame.K_RIGHT and player[0].speedX > 0:
                player[0].stop()
    keys_pressed = pygame.key.get_pressed()
    if keys_pressed[K_LEFT]:
        player[0].go_left()
    if keys_pressed[K_RIGHT]:
        player[0].go_right()
    if keys_pressed[K_UP]:
        player[0].jump()

1 个答案:

答案 0 :(得分:1)

我能够解决的第一个问题,但我忘记了。我通过self.rect.y + = self.speedY解决了第二个问题,而不是在wall_hit_list之前(当检查X的冲突时)。以下是可用的更新代码(用于跳跃和墙壁碰撞):

class PlayPlayer(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = images["spr_player"]
        self.rect = self.image.get_rect()
        self.rect.topleft = placedPlayer.rect.topleft
        playsprites.add(self)
        self.speedX, self.speedY = 0, 0
        self.jumpReset = 0
    def update(self):
        global playWallList, wall_hit_list
        self.calc_grav()
        self.rect.x += self.speedX
        wall_hit_list = pygame.sprite.spritecollide(self, playWallList, False)
        for wall in wall_hit_list:
            if(self.speedX > 0): #player moves right and collides into wall
                self.rect.right = wall.rect.left
            elif(self.speedX < 0): #player moves left and collides into wall
                self.rect.left = wall.rect.right
        self.rect.y += self.speedY
        # Check and see if we hit anything
        wall_hit_list = pygame.sprite.spritecollide(self, playWallList, False)
        for wall in wall_hit_list:
        # Reset our position based on the top/bottom of the object.
            if self.speedY > 0:
                self.rect.bottom = wall.rect.top #On top of the wall
                self.jumpReset = 0
            elif self.speedY < 0:
                self.rect.top = wall.rect.bottom #Below the wall
            # Stop our vertical movement
            self.speedY = 0
def go_left(self):
    self.speedX = -3
def go_right(self):
    self.speedX = 3
def stop(self):
    self.speedX = 0
def calc_grav(self):
    if self.speedY == 0:
        self.speedY = 1
    else:
        self.speedY += .25
    # On ground?
    if self.rect.y >= screenHeight-32 and self.speedY >= 0:
        self.jumpReset = 0
        self.speedY = 0
        self.rect.y = screenHeight-32
def jump(self):
    global wall_hit_list
    self.speedY += 2
    self.speedY -= 2
    # Checks to make sure if it is ok to jump
    if len(wall_hit_list) > 0 or self.rect.bottom >= screenHeight-32:
        self.speedY = -8
        self.jumpReset = 1
while running:
    for event in pygame.event.get():
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT and player[0].speedX < 0:
                player[0].stop()
            if event.key == pygame.K_RIGHT and player[0].speedX > 0:
                player[0].stop()
    keys_pressed = pygame.key.get_pressed()
    if keys_pressed[K_LEFT]:
        if player[0].rect.left > 0:
            player[0].go_left()
        else:
            player[0].stop()
    if keys_pressed[K_RIGHT]:
        if player[0].rect.right < screenWidth:
            player[0].go_right()
        else:
            player[0].stop()
    if keys_pressed[K_UP]:
        if player[0].jumpReset == 0:
            player[0].jump()
相关问题