鱼C论坛

 找回密码
 立即注册
查看: 1262|回复: 5

[已解决]关于pygame中,键盘事件的调用一个问题

[复制链接]
发表于 2021-3-24 11:44:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
操作键盘使图片翻转,为什么直接在对应的判断里调用翻转的方法会每一次点击就翻转一次,而调用橘黄色部分的方法多次点击只有第一次生效啊
两个方法都是一样来的
l_head = turtle
r_head = pygame.transform.flip(turtle, True, False)

while True:
    #   获取用户当前动作的事件列表
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == KEYDOWN:
            # print(str(event.key))
            if event.key == K_LEFT:
                speed = [-1, 0]
                turtle = l_head
            if event.key == K_RIGHT:
                speed = [1, 0]
                turtle = r_head
                # turtle = pygame.transform.flip(turtle, True, False)
            if event.key == K_UP:
                speed = [0, -1]
            if event.key == K_DOWN:
                speed = [0, 1]
最佳答案
2021-3-24 14:53:50
本帖最后由 小伤口 于 2021-3-24 14:56 编辑
黑与白的灰 发表于 2021-3-24 14:35
这是全部代码
import pygame
import sys


r_head = pygame.transform.flip(turtle, True, False)
这个表明r_head已经是翻转的图片
他并没有进入while循环里
也就表明r_head只是单纯的一张原来图片再翻过来的图片
而在while循环加入
turtle = pygame.transform.flip(turtle, True, False)
意思就表明每点击右键就反转一次
所以两者是有差别的
当然你也可以把
r_head = pygame.transform.flip(turtle, True, False)
加入while循环里面
也就是这样
import pygame
import sys
import os
from pygame.locals import *

#   初始化Pygame
pygame.init()

#   设置帧率
clock = pygame.time.Clock()

size = width, height = 500, 600
#   每次移动的位置
speed = [2, 1]
bg = (255, 255, 255)
data = os.path.dirname(os.path.realpath(__file__))
data_image = os.path.join(data, "image\优领108.png")
#   创建指定大小的窗口
screen = pygame.display.set_mode(size)
#   设置窗口标题
pygame.display.set_caption("(ノ◑ ◑)ノ(。•́︿•̀。)")

#   加载图片
turtle = pygame.image.load(data_image)
#   获取图片矩形位置
position = turtle.get_rect()

l_head = turtle


while True:
    r_head = pygame.transform.flip(turtle, True, False)
    #   获取用户当前动作的事件列表
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == KEYDOWN:
            # print(str(event.key))
            if event.key == K_LEFT:
                speed = [-1, 0]
                turtle = l_head
            if event.key == K_RIGHT:
                speed = [1, 0]
                turtle = r_head
                #turtle = pygame.transform.flip(turtle, True, False)
            if event.key == K_UP:
                speed = [0, -1]
            if event.key == K_DOWN:
                speed = [0, 1]

    #   移动图像
    position = position.move(speed)

    if position.left < 0 or position.right > width:
        #   翻转图像
        #   需要翻转的图像, 水平翻转的Boolean值, 垂直翻转的Boolean值
        turtle = pygame.transform.flip(turtle, True, False)
        #   反向移动
        speed[0] = -speed[0]

    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]

    #   填充背景
    screen.fill(bg)
    #   更新图像
    screen.blit(turtle, position)
    #   更新界面
    pygame.display.flip()
    #   延迟10毫秒
    # pygame.time.delay(0)
    clock.tick(40)
也会出现同样的问题

欢迎继续提问
有帮助的话请设置最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-24 12:56:39 | 显示全部楼层
代码没有发全吧,前后代码也是很重要的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-24 14:35:27 | 显示全部楼层
这是全部代码
import pygame
import sys
import os
from pygame.locals import *

#   初始化Pygame
pygame.init()

#   设置帧率
clock = pygame.time.Clock()

size = width, height = 500, 600
#   每次移动的位置
speed = [2, 1]
bg = (255, 255, 255)
data = os.path.dirname(os.path.realpath(__file__))
data_image = os.path.join(data, "image\优领108.png")
#   创建指定大小的窗口
screen = pygame.display.set_mode(size)
#   设置窗口标题
pygame.display.set_caption("(&#65417;&#9681; &#9681;)&#65417;(&#65377;&#8226;&#769;︿&#8226;&#768;&#65377;)")

#   加载图片
turtle = pygame.image.load(data_image)
#   获取图片矩形位置
position = turtle.get_rect()

l_head = turtle
r_head = pygame.transform.flip(turtle, True, False)

while True:
    #   获取用户当前动作的事件列表
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == KEYDOWN:
            # print(str(event.key))
            if event.key == K_LEFT:
                speed = [-1, 0]
                turtle = l_head
            if event.key == K_RIGHT:
                speed = [1, 0]
                turtle = r_head
                # turtle = pygame.transform.flip(turtle, True, False)
            if event.key == K_UP:
                speed = [0, -1]
            if event.key == K_DOWN:
                speed = [0, 1]

    #   移动图像
    position = position.move(speed)

    if position.left < 0 or position.right > width:
        #   翻转图像
        #   需要翻转的图像, 水平翻转的Boolean值, 垂直翻转的Boolean值
        turtle = pygame.transform.flip(turtle, True, False)
        #   反向移动
        speed[0] = -speed[0]

    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]

    #   填充背景
    screen.fill(bg)
    #   更新图像
    screen.blit(turtle, position)
    #   更新界面
    pygame.display.flip()
    #   延迟10毫秒
    # pygame.time.delay(0)
    clock.tick(40)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-24 14:53:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 小伤口 于 2021-3-24 14:56 编辑
黑与白的灰 发表于 2021-3-24 14:35
这是全部代码
import pygame
import sys


r_head = pygame.transform.flip(turtle, True, False)
这个表明r_head已经是翻转的图片
他并没有进入while循环里
也就表明r_head只是单纯的一张原来图片再翻过来的图片
而在while循环加入
turtle = pygame.transform.flip(turtle, True, False)
意思就表明每点击右键就反转一次
所以两者是有差别的
当然你也可以把
r_head = pygame.transform.flip(turtle, True, False)
加入while循环里面
也就是这样
import pygame
import sys
import os
from pygame.locals import *

#   初始化Pygame
pygame.init()

#   设置帧率
clock = pygame.time.Clock()

size = width, height = 500, 600
#   每次移动的位置
speed = [2, 1]
bg = (255, 255, 255)
data = os.path.dirname(os.path.realpath(__file__))
data_image = os.path.join(data, "image\优领108.png")
#   创建指定大小的窗口
screen = pygame.display.set_mode(size)
#   设置窗口标题
pygame.display.set_caption("(ノ◑ ◑)ノ(。•́︿•̀。)")

#   加载图片
turtle = pygame.image.load(data_image)
#   获取图片矩形位置
position = turtle.get_rect()

l_head = turtle


while True:
    r_head = pygame.transform.flip(turtle, True, False)
    #   获取用户当前动作的事件列表
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == KEYDOWN:
            # print(str(event.key))
            if event.key == K_LEFT:
                speed = [-1, 0]
                turtle = l_head
            if event.key == K_RIGHT:
                speed = [1, 0]
                turtle = r_head
                #turtle = pygame.transform.flip(turtle, True, False)
            if event.key == K_UP:
                speed = [0, -1]
            if event.key == K_DOWN:
                speed = [0, 1]

    #   移动图像
    position = position.move(speed)

    if position.left < 0 or position.right > width:
        #   翻转图像
        #   需要翻转的图像, 水平翻转的Boolean值, 垂直翻转的Boolean值
        turtle = pygame.transform.flip(turtle, True, False)
        #   反向移动
        speed[0] = -speed[0]

    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]

    #   填充背景
    screen.fill(bg)
    #   更新图像
    screen.blit(turtle, position)
    #   更新界面
    pygame.display.flip()
    #   延迟10毫秒
    # pygame.time.delay(0)
    clock.tick(40)
也会出现同样的问题

欢迎继续提问
有帮助的话请设置最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-24 14:56:50 | 显示全部楼层
小伤口 发表于 2021-3-24 14:53
这个表明r_head已经是翻转的图片
他并没有进入while循环里
也就表明r_head只是单纯的一张原来图片再 ...

这么一说我就知道了,谢谢帮忙解决问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-24 14:57:35 | 显示全部楼层
黑与白的灰 发表于 2021-3-24 14:56
这么一说我就知道了,谢谢帮忙解决问题

共同学习
有帮助的话请设置最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 06:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表