pygame中的旋转

2024-04-06

我一直在寻找如何使我的图像围绕单个点旋转的解决方案,但据我发现,没有任何方法真正起作用。

我知道的

  • 我可以使用旋转pygame.transform.rotate(surface, angle)

  • 我需要不断重置中心,以便图像不会自行旋转。

  • 需要更新图像以消除失真

At first the image looks like this Pygame screen

Then when I rotate it a couple times it looks like this Pygame screen 2

这是我的代码

import pygame


class pyGameSetup:

def __init__(self, title, width, height):

    # initialize pygame library
    pygame.init()

    # set up specific display properties
    self.game_display = pygame.display.set_mode((width, height))
    pygame.display.set_caption(title)

    # update display
    pygame.display.update()

    # create new global variables for the class
    # game state
    self.running = True

    # colors, only main
    # TODO: implement more color RGB values, if updated, update corresponding method
    self.white = (255, 255, 255)
    self.black = (0, 0, 0)
    self.grey = (128, 128, 128)
    self.pink = (255, 102, 178)
    self.blue = (0, 0, 255)
    self.red = (255, 0, 0)
    self.green = (0, 255, 0)
    self.purple = (127, 0, 255)
    self.yellow = (255, 255, 0)
    self.teal = (0, 204, 204)
    self.orange = (255, 128, 0)

    # player coordinates and properties
    self.player_x = int(width / 2)
    self.player_y = int(height / 2)
    self.player_width = 100
    self.player_height = 50
    self.player_speed_x = 0
    self.player_speed_y = 0
    self.move_speed = 5

    # FPS controllers (note start speed should always be 60 / 5 so, 1 / 300
    self.clock = pygame.time.Clock()
    self.fps = 60

    # screen values
    self.width = width
    self.height = height

    # rotation for car
    self.angle = 200

    # car image
    self.car1 = pygame.image.load("Images\\Car1.png")
    self.update_size()
    self.car_rect = self.car1.get_rect()
    self.car_rect.center = (self.player_x, self.player_y)


def exit(self):
    pygame.quit()
    self.running = False
    quit()

def game_loop(self):
    while self.running:
        for event in pygame.event.get():
            self.event_handler(event)

        # update player position
        # self.player_x += self.player_speed_x
        self.angle = self.player_speed_x
        self.player_y += self.player_speed_y

        # check to make sure it's in bounds
        self.check_valid_move()

        # reprint canvas
        self.game_display.fill(self.white)

        # update angle
        self.update_angle()

        # print player
        self.game_display.blit(self.car1, (self.player_x, self.player_y, self.player_width,
                                           self.player_height))

        # update display
        pygame.display.update()

        # FPS
        self.clock.tick(self.fps)

def event_handler(self, e):
    if e.type == pygame.QUIT:
        self.exit()
    if e.type == pygame.KEYDOWN:
            if e.key == pygame.K_LEFT:
                self.player_speed_x = -self.move_speed
            if e.key == pygame.K_RIGHT:
                self.player_speed_x = self.move_speed
            if e.key == pygame.K_UP:
                self.player_speed_y = -self.move_speed
            if e.key == pygame.K_DOWN:
                self.player_speed_y = self.move_speed
    if e.type == pygame.KEYUP:
            if e.key == pygame.K_LEFT:
                self.player_speed_x = 0
            if e.key == pygame.K_RIGHT:
                self.player_speed_x = 0
            if e.key == pygame.K_UP:
                self.player_speed_y = 0
            if e.key == pygame.K_DOWN:
                self.player_speed_y = 0

def check_valid_move(self):
    if self.player_x <= 0:
        self.player_x = 0
    if self.player_x >= self.width - self.player_width:
        self.player_x = self.width - self.player_width
    if self.player_y <= 0:
        self.player_y = 0
    if self.player_y >= self.height - self.player_height:
        self.player_y = self.height - self.player_height

def update_size(self):
    self.car1 = pygame.transform.scale(self.car1, (self.player_width, self.player_height))
    self.car1 = pygame.transform.rotate(self.car1, -90)

def update_angle(self):
    old_center = self.car_rect.center
    self.car1 = pygame.transform.rotate(self.car1, self.angle)
    self.car_rect.center = old_center

x = pyGameSetup('Game', 800, 600)
x.game_loop()

错误出现在 update_angle 中,老实说我完全迷失了,甚至不知道它在做什么。提前致谢。


您的问题是您正在旋转旋转的图像。因此,图像看起来是倾斜的,这是预料之中的。相反,有两个变量,一个用于原始变量,一个用于最近的轮换。

所以而不是:

car1 = original_image_rect
car1 = pygame.transform.rotate(car1, 10)
car1 = pygame.transform.rotate(car1, 10)
...

你会这样做:

car1 = original_image_rect
car2 = pygame.transform.rotate(car1, 10)
car2 = pygame.transform.rotate(car1, 20)
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pygame中的旋转 的相关文章

随机推荐

  • 在Firebase中使用push()时如何获取唯一ID并将其存储在我的数据库中[重复]

    这个问题在这里已经有答案了 我正在 firebase 中推送数据 但我也想在我的数据库中存储唯一的 id 有人可以告诉我 如何使用唯一的 id 推送数据吗 我正在尝试这样 writeUserData var key ref push key
  • 如何在 Grails 中全局处理 HTTP 错误(状态代码 4xx/5xx)?

    Grails 中是否有一种方法可以在将所有可能的 HTTP 错误发送到客户端浏览器之前捕获它们 以便能够处理发送到客户端的内容 我是说所有 4xx 和 5xx HTTP 状态代码 不仅仅是403 404和500等其他建议的 我想做的是首先捕
  • 使用 javascript 获取初始表单值

    我有一个像这样的 php 生成的表单
  • 为什么 .json() 是异步的? [复制]

    这个问题在这里已经有答案了 我一直在关注教程并发现以下代码片段 const myAsyncFunction async gt const usersResponse await fetch https jsonplaceholder typ
  • ValidateCredentials 对于未知用户返回 true?

    我在这里看到一些奇怪的行为PrincipalContext ValidateCredentials 该设置是父 子设置中的两个 Active Directory 域 因此我们有主域company com和子域development comp
  • Google Slide API - 如何多次复制一张幻灯片并每次创建一个唯一的对象 ID

    一般来说 我希望人们将一些数据放入谷歌工作表中并提供一个按钮 该按钮获取数据并自动填充预制的谷歌幻灯片 我选择了复制主幻灯片 然后用数据替换单个文本模块的方法 有更好的方法来实现我的目标吗 这是主幻灯片 这是我用于复制的代码 但它只能复制母
  • 当键列具有不同名称时实体拆分?

    我正在使用 Entity Framework 4 3 1 Code First 并且需要在两个表之间拆分实体 这些表有一个共享的主键 并且是一对一的 但每个表上的列的名称并不相同 我无法控制数据布局 也不能请求任何更改 例如 SQL 表可以
  • 带锚点的 ASP.Net MVC RedirectToAction

    我有以下问题 例如我有这样的路线 routes Add new Route forums thread threadOid last new MvcRouteHandler Defaults new RouteValueDictionary
  • EnableRaisingEvents(启用和禁用它)

    我正在维护一些代码 其中有两个 FileSystemWatcher 事件 这使得调试变得困难 并且有错误 所以我的想法是通过使执行顺序化来简化代码 差不多是这样的 Main method 1 normal code here 2 enabl
  • 如何配置 Beyond Compare 以忽略注释中的 SCM 替换文本?

    我确实有一些被 SCM 替换的文本序列 在我的例子中是 Perforce 我确实想配置 BeyondCompare 将这些序列视为不重要的差异 以便在比较文件时能够忽略它们 就我而言 它是关于 Python 源文件的 序列看起来像 Id d
  • 如何在 Struts 2 中创建自定义 URL?喜欢 www.twitter.com/goodyzain

    我正在开发一个项目 我想为每个用户提供唯一的 URL 例如 www SocialNetwork com jhon www SocialNetwork com jasmine 到目前为止我能够实现这一点 www SocialNetwork c
  • Flow Shop 到布尔可满足性 [多项式时间缩减]

    我联系您是为了了解 如何将流水车间调度问题 转化为布尔可满足性 我已经对 N N 数独 N 皇后和班级调度问题进行了此类简化 但我对如何将流水车间转换为 SAT 有一些问题 SAT 问题如下所示 目标是 使用不同的布尔变量 找到每个变量的影
  • Kotlin - 为什么编译器合约只允许引用函数参数

    在编写验证函数时 这些验证函数通常会检查可空性 尽管在调用这些函数之后 可以安全地使用对象成员 就像它们不可为 null 一样 但 Kotlin 编译器契约不允许指定此行为 例如 data class EmployeeDto val nam
  • 为 Windows 创建 Ruby 应用程序

    我想开发一个Windows应用程序 老实说 我现在不太关心跨平台 但仍然很好 我想使用 Ruby 因为它的语法相当简单 而且 简单易学 我的应用程序就像一个 游戏关卡创建者 您可以在其中设计自己的关卡 然后通过读取创建者应用程序创建的项目文
  • 意外响应代码 404 齐射

    我收到以下代码发送的某些请求的错误 但我不知道为什么 private void DeActivateReq String toolID String token String Childid String url http 54 77 12
  • 如何将 AutoValue 与 Retrofit 2 结合使用?

    我已经在一个项目中使用了 AutoValue 和 android apt 插件 并且我知道 Ryan Harter 的 AutoValue gson 扩展 但是如何连接 Retrofit 2 以在抽象类上使用扩展和工厂方法 String g
  • 具有多个预览的 AVCaptureSession

    我有一个 AVCaptureSession 与 AVCaptureVideoPreviewLayer 一起运行 我可以看到视频 所以我知道它正在发挥作用 但是 我想要一个集合视图 并在每个单元格中添加一个预览层 以便每个单元格显示视频的预览
  • Celery 使连接由对等方重置

    我设置了rabbitmqserver并使用以下步骤添加了用户 uruddarraju usr lib rabbitmq lib rabbitmq server 3 2 3 sudo rabbitmqctl list users Listin
  • Chromedriver `driver.manage.logs.get(:browser)` 在 chromedriver 75.0.3770.8 上失败

    访问时driver manage logs get browser 在 chromedriver 75 0 3770 8 上我收到此错误 undefined method log for
  • pygame中的旋转

    我一直在寻找如何使我的图像围绕单个点旋转的解决方案 但据我发现 没有任何方法真正起作用 我知道的 我可以使用旋转pygame transform rotate surface angle 我需要不断重置中心 以便图像不会自行旋转 需要更新图