You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pygame平台游戏添加重力?多种实现尝试失效求助

可直接运行的无类重力实现方案

修改思路

  • 不引入自定义类结构,完全沿用你现有代码的全局变量逻辑,降低学习成本
  • 移除原跳跃代码中会导致卡帧的time.sleep逻辑,替换为帧同步的速度累加实现
  • 补充地面碰撞检测,解决原代码跳完悬空不落地的问题
  • 保留你原有的左右移动、墙体绘制、文字渲染、图片加载的全部逻辑,仅替换有bug的跳跃模块
  • 新增60帧锁帧逻辑,避免不同硬件上运行速度不一致的问题

完整可运行代码

import pygame
from pygame.locals import *
from pygame import mixer
from typing import Tuple
import pickle
from os import path
import time
import sys
import os
pygame.init()

# 原有常量配置 完全保留
white = 255,255,255
black = 0,0,0
green = 0, 255, 0
blue = 0,0,255
font = pygame.font.SysFont('Comic Sans MS', 50, 70)
screen_width = 650
screen_height = 800
screen = pygame.display.set_mode([screen_width,screen_height])
pygame.display.set_caption("Darsh's Game")

# 原有玩家初始设置 完全保留
speed = 1
x = 25
y = 669
left = False
right = True

# 重力模块新增参数
gravity = 0.5
vel_y = 0
on_ground = False
clock = pygame.time.Clock()

# 原有绘制函数 完全保留
def draw_text(text, font, text_col, x, y):
    img = font.render(text, True, text_col)
    screen.blit(img, (x, y))

def draw_rect():
    rect1 = pygame.Rect(0, 0, 25, 800)
    pygame.draw.rect(screen, black, rect1)
    rect2 = pygame.Rect(625, 0, 25, 800)
    pygame.draw.rect(screen, black, rect2)
    rect3 = pygame.Rect(0, 775, 650, 25)
    pygame.draw.rect(screen, green, rect3)

def direction(left, right):
    if left == True:
        screen.blit(mainleft_img, (x, y))
    elif right == True:
        screen.blit(mainright_img, (x, y))

# 原有图片加载逻辑 完全保留
mainright_img = pygame.image.load('newgameimg/mainright.png')
mainleft_img = pygame.image.load('newgameimg/mainleft.png')
# 自动计算地面落地位置,适配图片高度,避免穿模
ground_level = 775 - mainright_img.get_height()

run = True
while run:
    # 统一清屏,移除原代码中重复的清屏和绘制调用
    screen.fill(white)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    # 原有左右移动逻辑 完全保留
    if keys[pygame.K_a] and x > speed - 16:
        x -= speed
        left = True
        right = False
    if keys[pygame.K_d] and x < screen_width - speed - 89:
        x += speed
        left = False
        right = True
    if keys[pygame.K_ESCAPE]:
        run = False

    # 重力+跳跃核心逻辑 替换原有悬空跳跃代码
    vel_y += gravity
    y += vel_y
    # 地面碰撞检测
    if y >= ground_level:
        y = ground_level
        vel_y = 0
        on_ground = True
    else:
        on_ground = False
    # 仅在站立在地面时允许触发跳跃
    if keys[pygame.K_SPACE] and on_ground:
        vel_y = -11

    # 统一渲染所有元素
    direction(left, right)
    draw_text("George is dumb", font, green, 100, 400)
    draw_rect()
    pygame.display.update()
    # 锁60帧,保证全设备运行速度一致
    clock.tick(60)

pygame.quit()

可调参数说明

  • 重力强度:修改gravity的数值,数值越大,角色下落速度越快,重力感越强
  • 跳跃高度:修改起跳时给的初始速度vel_y = -11,绝对值越大,角色跳得越高
  • 移动速度:修改speed的数值,即可调整角色左右移动的快慢

内容的提问来源于stack exchange,提问作者dashgandhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 21:06:05