问题标签 [pygame-surface]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1018 浏览

python - Pygame如何让一个Sprite A有一个Rect属性

我有两个精灵,一个是我的角色,另一个是我的敌人。我如何让它们都具有 rect 属性,以便我可以在 pygame 中使用 rect 碰撞。任何事情都会对我有所帮助。谢谢。

这是我的代码:

0 投票
2 回答
86 浏览

python - Pygame,Python 3中Rects之间的Colorkey冲突

我目前正在开发 Pygame、Python 3 上的游戏,游戏的重要部分之一是 Rects 在子弹目标情况下的碰撞。

使用该colliderect功能很容易实现,但必须不计算与颜色键相同颜色的像素。

例如,如果其中一个精灵(角色)是一个大的等边三角形,其底部是水平的,并且子弹从左上角colliderect射出,即使顶部的像素也会立即检测到碰撞- 左边是玩家的精灵是透明的。

我需要创建一个函数,仅当子弹到达与颜色键颜色不同的像素时才会检测到碰撞。如果子弹只有一个像素,这很容易:

我尝试为子弹中的每个像素迭代上述语句,但是,当然,这会导致大量滞后。有没有不同的、更有效的方法?

提前致谢!!

0 投票
1 回答
731 浏览

python - Pygame,Python 3 中的对角精灵运动

我目前正在使用 Pygame、Python 3 制作游戏,其中一个错误是它们的镜头移动方式。该游戏是一款 2D 自上而下的射击游戏,玩家射击机制的代码如下:

player_rect是播放器的 Rect,bullet_speed 是预定义的int

在循环的后面,有这部分代码:

这个机制大部分都很好,除了一个主要错误:射击越慢,它就越不准确,pygame.Rect[0]并且pygame.Rect[1]只能是整数值。比如如果player_rect.center(0, 0),鼠标的位置是(100, 115),bullet_speed是10,那么x_speed会自动四舍五入to7y_speedto 8,导致子弹最终通过该点(98, 112)。但是,如果 bullet_speed 为5,则子弹将通过点(99, 132)

有没有办法在pygame中解决这个问题?

提前感谢您的帮助!

0 投票
1 回答
739 浏览

pygame - 使用精灵在pygame中旋转图像

我正在 pygame 中制作游戏,我想旋转图像。pygame.transform.rotate不断增加图像尺寸,所以我想也许精灵可以帮助我旋转图像。但问题更复杂,我想点击表面上的某个地方,我想让图像转向那个方向,所以对象可以进行无限次的旋转。有人可以给我解释一下如何做到这一点吗?

0 投票
1 回答
994 浏览

python-2.7 - Pygame 是否会在显示屏外使用矩形对精灵进行 blit

我目前正在开发 2D 俯视图的太空探索游戏。我有很多行星,由于地图跨度比显示大得多,我最终在显示区域之外有很多行星精灵。目前,我假设 Pygame 如果精灵不在显示器中,实际上不会对精灵进行 blit(据我所知,它的 blitting 和绘制到表面会大大减慢速度)是真的吗?或者我需要添加一个条件来检查精灵是否在 blit 调用之前位于显示器内?我问的原因是我的游戏的运作方式是每次发现一个行星时都会创建 2 个新行星……这意味着游戏可能会变得非常大,并且可能非常缓慢。

谢谢

0 投票
1 回答
972 浏览

python - 我如何在pygame中画一条线并改变颜色?

我正在尝试在 pygame 中为学校项目制作绘图程序。在这个模块中,我打算让用户按下鼠标并在表面上画一条线。如果一个人按下一个矩形,这个人选择的颜色就是绘制线的颜色。出于某种原因,变量可以更改,但即使我按下鼠标,也不会画线。这是代码:

0 投票
2 回答
39 浏览

python - 无法更新 pygame 表面

我正在制作一个 pygame 游戏。我有 3 个表面:(gameDisplay角色和背景直接渲染到的地方),guiSurfinvSurf 有一个在核心 pyhon 中制作的时钟,它使用 pygame 字体显示游戏时间。我将时钟传送到guiSurf然后在我的游戏循环中我传送guiSurf到。我的问题是时钟在原来的地方留下了痕迹。IE 当它从“07:00”变为“07:01”时,“01”位于不应该存在的“00”之上。我会发布代码,但有 400 行。有谁知道我可能做错了什么。链接到时钟的图片invSurfgameDisplay

0 投票
2 回答
2099 浏览

python - 在pygame中获取用户点击的位置

我在 tkinter 的 aa 框架中嵌入了一个 pygame 窗口。在另一个框架中,我有一个按钮,单击时会调用以下函数:

我打算让程序在单击按钮后打印用户在 pygame 表面上单击的位置的位置。但是,在第一次单击按钮和随后单击 pygame 表面时,没有输出。在相应的第二次点击pygame表面之前第二次点击按钮,python打印出如下输出:

('开始', (166, 115))

在点击pygame表面后,我怎样才能让它给我一个结果?当我有两个单独的 tkinter 和 pygame 窗口时,我遇到了同样的问题,因此将 pygame 嵌入 tkinter 不太可能是问题的原因。

编辑:经过进一步测试,如果按下按钮然后多次单击 pygame 表面,则在第二次单击按钮时,所有这些单击的坐标都将作为批处理打印出来。

0 投票
0 回答
128 浏览

python - pygame 使用 Surface.fill 崩溃,矩形超出其界限和任何非零 PYGAME_BLEND 标志

当我尝试同时使用和参数fill与 Surface一起使用时,pygame 会滞后几秒钟,然后在没有通知的情况下崩溃,如果我命名了逃离 Surface 区域的矩形尺寸。rectspecial_flags

下面是使用 IDLE 的测试结果:

无论我如何与软件交互或不交互,都会发生这种重新启动。无论我是否打电话,都会发生这种pygame.init()情况import pygame

如果使用完全在曲面边界内的 rect 参数(在本例中(0,0,50,50)为 ),则它可以正常工作。或者,省略或发送0​​参数special_flags不会触发此问题;Surface 包含的像素会正常更改,任何从边缘“溢出”的像素都将被忽略。

我想知道是什么导致pygame以这种神秘且无法解释的方式崩溃?

我正在使用 pygame 1.9.1 和 python 2.7.10。


解决方案

对于同样遭受此问题困扰的任何未来读者,可以通过至少三种方式之一来回避该问题。我将在这里与您分享:

  • 使用裁剪rect参数。

    fill用替换 rect 参数test_surf.get_rect().clip(test_rect)clip将限制test_rect在目标 Surface 的边界;如果没有公共像素,它将返回一个带有形状参数的安全矩形<0, 0, 0, 0>

  • 改为使用第二个表面blit

    创建一个新的 Surface,用你想要的 rgb 值(不包括 alpha)填充它,而不使用 BLEND 模式,用于set_alpha将所需的不透明度应用到 Surface,最后使用适当的值blit将新表面应用到test_surf或任何你的目标dest(在我的情况下,(33,33))和混合模式(对我来说,pygame.BLEND_RBGA_MULT)。

  • 与虫子对抗虫子。

    第三种更令人费解的解决方案是test_surf.fill(test_rgba, (0,0,0,0), pygame.BLEND_RGBA_MULT)在运行越界矩形之前调用。无论这做什么似乎都可以修复 pygame,这样您就可以安全地使用后续的 BLENDed 填充越界而不会遇到麻烦。此外,此后在任何 Surface上尝试越界、混合填充似乎是安全的,并且无论零像素混合填充做什么似乎都可以纠正 pygame 中功能失调的元素,以便该会话不会再次发生崩溃。

    请注意,这第三种解决方案尚未经过彻底测试!!

祝你好运!

0 投票
0 回答
288 浏览

python - pygame LayeredDirty 每次都重新绘制整个屏幕

我最近开始玩 pygame,我想创建一个平铺字段,以突出显示鼠标悬停的瓷砖。为此,我使用了 DirtySprite 和 LayeredDirty,以便只绘制更新的图块。但是,当我运行代码时,FPS 下降到 11,当我检查时,总是绘制整个屏幕。这是我的代码:

当我检查脏瓷砖时,只有 2 块看起来很脏(应该是这样)。但是,当我打印allspritesRect 时,我总是得到(0,0,1920,1080). 为什么总是重新绘制整个屏幕而不仅仅是更新的图块?

更新

当我打印时:

我得到不同的结果;a.rect打印返回两个要更新的矩形,但是allsprites返回(0,0,1920,1080)