python - Pygame colliderect 无法正常工作
问题描述
我正在编写这段代码来构建一个简单的正方形,它可以左右移动,并且可以使用 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
解决方案
推荐阅读
- c# - RedirectionToAction 与模型
- sql-server - 如何获取复杂 SQL 查询中使用的表列表
- google-sheets - 根据 4 个可能的单元格值计算 2 张纸上的点
- python - 将 Ctypes 数组的一部分转换为结构
- airflow - 为一天内运行多次的外部任务的特定运行创建 Airflow ExternalTaskSensor
- python - 任务 1 的活动 1 提示用户输入名字、姓氏和姓名缩写
- python-3.x - 难以决定继承什么以及如何继承
- reactjs - 如何在自定义类组件的样式中使用主题
- javascript - 如何使用解析服务器调用函数
- reactjs - TypeError:无法读取未定义的属性“状态” - 函数