如何为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
相关产品推荐
相关产品推荐

