皮加姆的撞墙跳跃

2024-05-18 23:44:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用pygame2.7.9制作一个关卡编辑平台游戏。代码有一些问题。首先,当我站在墙上时,我不能跳。第二,我的角色在墙上时动作不流畅。播放墙列表是标高中所有墙的列表。在

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()

Tags: andrectselfrightifdefpygamelist
1条回答
网友
1楼 · 发布于 2024-05-18 23:44:41

我能解决的第一个问题却忘了怎么解决。第二个问题我解决了自校正.y+=自我。迅速而不是在碰撞前检查u。以下是更新后的代码(适用于跳跃和墙壁碰撞):

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()

相关问题 更多 >

    热门问题