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

如何在Pygame平台游戏中实现重力功能?附带像素画制作疑问

实现Pygame平台游戏的重力功能 + 像素画制作建议

一、添加重力功能的具体实现

重力的核心是持续向下的加速度,我们需要给角色添加竖直方向的速度变量,让它随时间累积重力加速度,同时处理地面碰撞避免角色掉出屏幕。以下是修改后的完整代码,关键改动已标注:

import pygame

pygame.init()

win = pygame.display.set_mode((800, 500))
pygame.display.set_caption("Platformer")

x = 200
y = 200
width = 20
height = 20
vel = 5

# 新增重力相关变量
gravity = 0.8       # 重力加速度,数值越大下落越快
y_vel = 0           # 竖直方向的速度
jump_force = -15    # 跳跃初始向上速度(pygame中y轴向上为数值减小,所以用负数)
ground_y = 500 - height  # 地面y坐标(屏幕底部减去角色高度)

run = True
FPS = 30
fpsClock = pygame.time.Clock()

while run:
    # 移除pygame.time.delay(30),用fpsClock统一控制帧率
    fpsClock.tick(FPS)

    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 > 0:
        x -= vel
    if keys[pygame.K_d] and x < 800 - width:
        x += vel

    # 跳跃逻辑:仅当角色在地面时允许跳跃
    if keys[pygame.K_w] and y >= ground_y:
        y_vel = jump_force

    # 应用重力:更新竖直速度
    y_vel += gravity
    # 更新角色竖直位置
    y += y_vel

    # 地面碰撞检测:防止角色穿过地面
    if y >= ground_y:
        y = ground_y
        y_vel = 0  # 落地后重置竖直速度,避免持续加速

    win.fill((0, 0, 0))
    pygame.draw.rect(win, (255, 0, 0), (x, y, width, height))
    pygame.display.update()

pygame.quit()

关键改动说明:

  • 新增gravity、y_vel、jump_force变量,用加速度模拟真实重力效果
  • 跳跃逻辑改为给y_vel赋值,而非直接修改y,让跳跃有自然的上升-下落过程
  • 每次循环先叠加重力更新竖直速度,再更新角色位置
  • 添加地面碰撞检测,确保角色落地后不会继续下落
  • 统一用fpsClock.tick(FPS)控制帧率,避免原代码中delay与tick的帧率冲突

后续如果要添加空中平台,只需把地面碰撞逻辑扩展为检测角色与所有平台的矩形碰撞即可。

二、像素画制作的实用建议(非核心)

  • 从低分辨率画布入手:比如16×16、32×32像素,完成后再放大显示,更容易控制像素细节
  • 使用专门的像素画工具:比如Aseprite、Piskel,这类工具自带网格对齐、像素锁定功能,避免模糊边缘
  • 限制调色板:选择3-5种主色调+1-2种阴影/高光色,避免颜色过多导致画面杂乱
  • 注重形状简洁:用最少的像素块勾勒轮廓,光影用1-2像素的块表现,不要过度追求复杂细节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:01:11