冲浪的口香糖 发表于 5 天前

为啥小乌龟动不了

#导入库
import pygame
import sys
from pygame.locals import *

#初始化pygame
pygame.init()

#设置变量
size = width, height = 600, 400
bg = (255, 255, 255)
turtle = pygame.image.load(r"C:\Users\24734\Desktop\code\img\turtle.png")
position = turtle.get_rect()#获取图片

screen = pygame.display.set_mode(size)
pygame.display.set_caption('fihc demo')

#游戏循环
while True:
    #获取事件
    for event in pygame.event.get():
      #如果pygame事件为quit,那么久退出
      if event.type == pygame.QUIT:
            sys.exit()

      if event.type == pygame.KEYDOWN:
            if event.key == K_w:
                position = position.move((0, -5))

    #刷新
    screen.fill(bg)#刷新背景
    screen.blit(turtle, position)#刷新图像
    pygame.display.flip()#刷新
小乌龟动不了,按下W键后乌龟还是没动{:10_283:}

FishC 发表于 5 天前

你的小乌龟动不了是因为只处理了按键按下事件(KEYDOWN),没有处理按键持续按住的情况。修改方案如下:

问题原因:
1. KEYDOWN 只在按键被按下时触发一次
2. 没有实现持续按键检测逻辑

解决方案:
使用 pygame.key.get_pressed() 实时检测按键状态


import pygame
import sys
from pygame.locals import *

pygame.init()

size = width, height = 600, 400
bg = (255, 255, 255)
turtle = pygame.image.load(r"C:\Users\24734\Desktop\code\img\turtle.png")
position = turtle.get_rect()

screen = pygame.display.set_mode(size)
pygame.display.set_caption('fihc demo')

# 游戏循环
while True:
    # 获取事件
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            sys.exit()
   
    # 新增:实时检测按键状态
    keys = pygame.key.get_pressed()
    if keys:# 持续检测W键
      position = position.move(0, -5)
   
    # 刷新
    screen.fill(bg)
    screen.blit(turtle, position)
    pygame.display.flip()


关键修改说明:
1. 添加了 keys = pygame.key.get_pressed() 获取当前所有按键状态
2. 使用 if keys: 持续检测W键是否被按住
3. 这样按住W键时,每帧都会向上移动5像素

其他建议:
1. 可以添加方向键控制(上下左右):

    if keys:
      position = position.move(0, -5)
    if keys:
      position = position.move(0, 5)
    if keys:
      position = position.move(-5, 0)
    if keys:
      position = position.move(5, 0)


2. 建议添加帧率控制:

clock = pygame.time.Clock()# 初始化时钟
while True:
    clock.tick(60)# 控制60帧/秒
    # ...其他代码...


修改后按住W键小乌龟就会持续向上移动啦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

FishC 发表于 5 天前

你的代码问题在于只处理了按键按下(KEYDOWN)事件,且每次按键只移动5像素(可能不明显)。同时缺少其他方向的控制和持续移动逻辑。以下是修正方案:

主要问题:
1. 只处理了W键向上移动,未处理其他方向
2. 移动步长太小(5像素)不易察觉
3. 未实现按键持续移动(需状态跟踪)

改进代码:

import pygame
import sys
from pygame.locals import *

pygame.init()
size = width, height = 600, 400
bg = (255, 255, 255)

# 使用默认乌龟代替外部图片(避免路径问题)
turtle = pygame.Surface((50, 50), pygame.SRCALPHA)
pygame.draw.circle(turtle, (0, 200, 0), (25, 25), 20)# 绿色圆形作为乌龟

position = turtle.get_rect(center=(300, 200))# 初始位置居中
speed = 8# 增大移动速度

screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')

# 移动状态跟踪
move = {"up": False, "down": False, "left": False, "right": False}

while True:
    for event in pygame.event.get():
      if event.type == QUIT:
            pygame.quit()
            sys.exit()
      
      # 按键按下
      if event.type == KEYDOWN:
            if event.key == K_w: move["up"] = True
            if event.key == K_s: move["down"] = True
            if event.key == K_a: move["left"] = True
            if event.key == K_d: move["right"] = True
      
      # 按键释放
      if event.type == KEYUP:
            if event.key == K_w: move["up"] = False
            if event.key == K_s: move["down"] = False
            if event.key == K_a: move["left"] = False
            if event.key == K_d: move["right"] = False
   
    # 根据状态持续移动
    if move["up"]: position.y -= speed
    if move["down"]: position.y += speed
    if move["left"]: position.x -= speed
    if move["right"]: position.x += speed
   
    # 边界检查
    position.x = max(0, min(position.x, width - position.width))
    position.y = max(0, min(position.y, height - position.height))
   
    screen.fill(bg)
    screen.blit(turtle, position)
    pygame.display.flip()
    pygame.time.delay(30)# 控制帧率


关键改进:
1. 使用内置绘图代替外部图片(避免路径错误)
2. 增加方向键WASD控制
3. 添加移动状态跟踪实现持续移动
4. 移动速度提高到8像素/帧
5. 添加边界限制防止移出屏幕
6. 增加帧率延迟使移动更平滑

按WASD键试试,现在乌龟应该可以自由移动了!如果仍有问题,请检查PyGame是否安装正确(可通过pip install pygame安装)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 为啥小乌龟动不了