【问题标题】:Pygame colliderect is not working properlyPygame colliderect 无法正常工作
【发布时间】:2021-01-10 17:04:04
【问题描述】:

我正在编写这个代码来构建一个简单的正方形,它可以左右移动,并且可以使用 pygame 中的 colliderect 函数在舞台上跳跃,但问题是当玩家(正方形)在舞台上跳跃时,它的 y 坐标变为舞台的 y 坐标永久且永不倒下。另一个大问题是,当玩家在舞台下方时,它应该无法跳过顶部,但确实可以。我的代码有四页,第一部分是主循环,第二部分是玩家类,第三部分是舞台类,第四部分是游戏的基本功能

主要--Pg 01

import pygame
from player import Player
import game_functions as gf
import sys
from stage import Stage
from pygame.sprite import Group

def run_game():
    # Intialise the game and start the screen
    pygame.init()   
    screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("AmarCreep")
    
    player = Player(screen)
    stage = Stage(screen)
    
    clock = pygame.time.Clock()

    
    # Main loop
    while True:
        clock.tick(60)
        
        # Navy screen
        screen.fill((173,216,249))
        
        
        for event in pygame.event.get():
            # Check if user wants to quit
            if event.type == pygame.QUIT:
                sys.exit()
            gf.responses(screen, player, event)
            
        # Update player's x-y coordinate
        player.p_movements(stage)
        
        stage.draw_stage()
        
        # Make the player appear
        player.draw_player()
        
        
        # Make the newly made screen visible
        pygame.display.flip()
    
run_game()

播放器--Pg 02

import pygame
from pygame.sprite import Sprite


class Player(Sprite):
    # Initialise the main player
    
    def __init__(self, screen):
        super(Player, self).__init__()
        
        self.screen = screen
        self.screen_rect = screen.get_rect()
        
        # Specifying the position of the player at start 
        self.rect = pygame.Rect(0, 0, 30, 30)
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = 590
        
        self.moving_left = False
        self.moving_right = False
        self.moving_up = False
        self.vel_y = 18
        
    def p_movements(self, stage):
        
        dx = 0
        dy = 0
        
        # Predict the player movements beforehand
        if self.moving_left and self.rect.x > 10:
            dx -= 7
        if self.moving_right and self.rect.x < 760:
            dx += 7 
        if self.moving_up:
            dy -= self.vel_y
            self.vel_y -= 2
            if self.vel_y < -18:
                self.moving_up = False
                self.vel_y = 18
                
            
            
        # Check collisions in x direction
        if stage.s_rect.colliderect(self.rect.x + dx, self.rect.y, 30, 30):
            dx = 0
        
        
        # Check collisions in y direction
        if stage.s_rect.colliderect(self.rect.x, self.rect.y + dy, 30, 30):
            if self.vel_y < 0:
                dy =  stage.s_rect.bottom - self.rect.top
                self.vel_y = 0
            elif self.vel_y > 0:
                dy = stage.s_rect.top - self.rect.bottom                        
        
        
                
        # Update the positionse
        self.rect.x += dx
        self.rect.y += dy
        
        if self.rect.bottom > 590:
            self.rect.bottom = 590
            dy = 0
            
        
        pygame.time.Clock().tick(60)
                
            
    def draw_player(self):
        ''' Draw the player on the screen'''
        pygame.draw.rect(self.screen, (245,245,245), self.rect)
    
        

阶段--Pg 03

import pygame
from pygame.sprite import Sprite
from random import randint

class Stage(Sprite):
    """Initialize the platform for player to jump on"""
    
    def __init__(self, screen):
        super(Stage, self).__init__()
        
        self.screen = screen
        self.screen_rect = screen.get_rect()
        
        self.s_rect = pygame.Rect(0, 540, 80, 10)
        self.s_rect.x = randint(10, 590)
                
    def draw_stage(self):
        ''' Draw the platform for the player'''
        pygame.draw.rect(self.screen, (0,0,0), self.s_rect)
                

游戏功能--Pg 04

import pygame


def responses(screen, player, event):
    ''' Check for responses'''
    
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_UP:
            player.moving_up = True
            
        if event.key == pygame.K_LEFT:
            player.moving_left = True
                
        if event.key == pygame.K_RIGHT:
            player.moving_right = True
                
    elif event.type == pygame.KEYUP:
                
        if event.key == pygame.K_LEFT:
            player.moving_left = False
                
        if event.key == pygame.K_RIGHT:
            player.moving_right = False
        
    

    
    
    

【问题讨论】:

    标签: python class pygame


    【解决方案1】:

    根据我对您的代码的了解,您使用 colliderect 与 30x30 的碰撞框:colliderect(self.rect.x + dx, self.rect.y, 30, 30)

    您的关卡或关卡为 80x10:pygame.Rect(0, 540, 80, 10)

    这意味着碰撞检测只会发生在你舞台的某个部分。这是一个视觉效果,可以帮助您更好地理解:

    我相信这可能是您的问题的根源。与红色盒子碰撞后,您让它们传送到一半左右,此时它们仍在与盒子碰撞。这使得它们不断地传送回原来的位置,因为它们总是被放回红色盒子中,因为它们正在与它发生碰撞。这可能会导致您的其他一些错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2013-04-04
      • 2015-11-12
      • 1970-01-01
      相关资源
      最近更新 更多