- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何将我在代码中加载的 PNG 文件(对于 pygame
) 转换为圆的边界?
我有以下图片(png
):
我使用 jpeg
文件作为白色背景。
我的意思是,如何防止圆圈出现在 PNG 图像中?圆圈使用箭头键向左、向右、向上、向下移动。
我的代码:
import pygame
def main1():
width, height = 600, 600
posx, posy = 300, 300
screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
velocity = (0, 0)
done = False
pygame.display.update()
bg = pygame.image.load("maze1.png")
bg1 = pygame.image.load("maze2.jpeg")
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
keys = pygame.key.get_pressed()
screen.blit(bg1, (0, 0))
screen.blit(bg, (0, 0))
if keys[pygame.K_RIGHT]:
posx += 3
if keys[pygame.K_UP]:
posy -= 3
if keys[pygame.K_LEFT]:
posx -= 3
if keys[pygame.K_DOWN]:
posy += 3
cir = pygame.draw.circle(screen, (255, 200, 240), (posx,posy), 10)
pygame.display.flip()
clock.tick(30)
if __name__ == '__main__':
pygame.init()
main1()
pygame.quit()
最佳答案
所以 - 事实证明,您想要的比您在那里尝试的要复杂一些。
Pygame 在一个函数中具有像素碰撞检测功能,即“pygame.sprite.collide_mask”。尝试使用 Python 代码自己进行像素验证,使用 image.get_at
检查像素以检查透明像素会太慢 - 纯 Python 循环遍历像素可能比检查代码慢数千倍在 native 代码中。这意味着您必须使用 pygame.sprite.collide_mask
。
该函数的问题在于它仅适用于图像 mask - 并且它们必须附加到 Sprite 对象,该对象还必须具有有效的“矩形”属性。 ( https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_mask )
不好的部分是您必须正确地创建所有这些东西。好的部分是您可以从代码中使用 Sprite 对象获得一些额外的好处 - 例如封装一些逻辑,以及“posx”和“posy”坐标本身。我保留了单独的变量,这样您就可以想出您想要的最佳方式。
另一个坏消息是,尽管理论上没问题,并且工作“相当好”,但掩码碰撞检测存在极端情况。在运行这些示例时,您会注意到当您遇到一个角落时,您可能会卡住。我试图通过碰撞检测功能中的另一个“向前看”步骤来缓解这种情况 - 对我来说感觉好一点,但移动的圆圈有时会卡住。
无论如何,所有的代码都是:
"""
Author: Muhammad Nouman
https://stackoverflow.com/questions/45673808/how-to-convert-png-image-to-boundries-for-circle-pygame
"""
import pygame
class GameObject(pygame.sprite.Sprite):
def __init__(self, image):
super().__init__()
self.image = image
self.rect = self.image.get_rect()
self.mask = pygame.mask.from_surface(image)
def can_move(self, delta_pos, wall_map, count=1):
old_pos = self.rect.center
self.rect.centerx = self.rect.centerx + delta_pos[0]
self.rect.centery = self.rect.centery + delta_pos[0]
result = bool(pygame.sprite.collide_mask(self, wall_map))
if count:
result &= not self.can_move(delta_pos, wall_map, count - 1)
self.rect.center = old_pos
return not result
def main1():
width, height = 600, 600
posx, posy = 300, 300
screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
velocity = (0, 0)
done = False
pygame.display.update()
bg = pygame.image.load("maze1.png")
bg = pygame.transform.rotozoom(bg, 0, width / bg.get_width())
bg1 = pygame.image.load("maze2.jpeg")
character_image = pygame.Surface((20,20), pygame.SRCALPHA)
pygame.draw.circle(character_image, (255, 200, 240, 255), (10, 10), 10)
character = GameObject(character_image)
character.rect.center = (posx, posy)
tiled_maze = GameObject(bg)
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
keys = pygame.key.get_pressed()
screen.fill((255, 255,255))
screen.blit(bg, (0, 0))
if keys[pygame.K_RIGHT]:
if character.can_move((3, 0), tiled_maze):
posx += 3
if keys[pygame.K_UP]:
if character.can_move((0, -3), tiled_maze):
posy -= 3
if keys[pygame.K_LEFT]:
if character.can_move((-3, 0), tiled_maze):
posx -= 3
if keys[pygame.K_DOWN]:
if character.can_move((0, 3), tiled_maze):
posy += 3
character.rect.center = ((posx, posy))
screen.blit(character.image, character.rect)
pygame.display.flip()
clock.tick(30)
if __name__ == '__main__':
pygame.init()
main1()
pygame.quit()
所以,只是给出一个总体思路:“ mask ”是图像的简化版本,pygame 可以创建标记哪些像素确实包含某些东西,哪些像素是完全透明的。它们是从图像创建的。 collide_mask
方法需要一个 Sprite 对象,它有一个 rect
和一个 mask
属性 - rect
包含 Sprite 在游戏场上的位置,mask
是根据图像创建的掩码。
迷宫可以做成一个覆盖所有区域的 Sprite (另外,它必须按比例缩小以适应你的屏幕尺寸——我通过调用 ...rotozoom
实现了它. 因为它已经包含透明度,所以它已经全部设置好(另外,请注意,如果您要有纯色背景,则不需要第二张图像 - 您可以使用表面的 fill
方法).
现在,“圆”角色必须有一个图像 - 所以我用一些代码在内存中创建了一个表面,并在上面画了一个圆,然后使用这个表面作为“圆” Sprite 的图像。
因为我们的 Sprite 必须有一个自己的类,所以我在那里添加了碰撞检测逻辑作为一种方法——它基本上需要一个“ future 偏移量”当 Sprite 要移动时,第二个 Sprite ——在这种情况下,总是迷宫。它“模拟”新位置,并检查“ self ”(即圆形 Sprite )是否会与该位置的“其他 Sprite ”面具发生碰撞。如果是这样,游戏逻辑中的 if
语句会阻止更新位置。 (稍微调整一下这些 if 语句可能会给您带来更好的体验,防止出现当前迷宫中存在的“粘性”角落)。
总而言之,我希望你能明白这里做了什么,并希望你能改进这段代码以获得更好的使用体验。
关于python - 如何将 PNG 图像转换为边界(对于圆)[pygame]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45673808/
我正在尝试学习 Knockout 并尝试创建一个照片 uploader 。我已成功将一些图像存储在数组中。现在我想回帖。在我的 knockout 码(Javascript)中,我这样做: 我在 Jav
我正在使用 php 编写脚本。我的典型问题是如何在 mysql 中添加一个有很多替代文本和图像的问题。想象一下有机化学中具有苯结构的描述。 最有效的方法是什么?据我所知,如果我有一个图像,我可以在数据
我在两个图像之间有一个按钮,我想将按钮居中到图像高度。有人可以帮帮我吗? Entrar
下面的代码示例可以在这里查看 - http://dev.touch-akl.com/celebtrations/ 我一直在尝试做的是在 Canvas 上绘制 2 个图像(发光,然后耀斑。这些图像的链接
请检查此https://jsfiddle.net/rhbwpn19/4/ 图像预览对于第一篇帖子工作正常,但对于其他帖子则不然。 我应该在这里改变什么? function readURL(input)
我对 Canvas 有疑问。我可以用单个图像绘制 Canvas ,但我不能用单独的图像绘制每个 Canvas 。- 如果数据只有一个图像,它工作正常,但数据有多个图像,它不工作你能帮帮我吗? va
我的问题很简单。如何获取 UIImage 的扩展类型?我只能将图像作为 UIImage 而不是它的名称。图像可以是静态的,也可以从手机图库甚至文件路径中获取。如果有人可以为此提供一点帮助,将不胜感激。
我有一个包含 67 个独立路径的 SVG 图像。 是否有任何库/教程可以为每个路径创建单独的光栅图像(例如 PNG),并可能根据路径 ID 命名它们? 最佳答案 谢谢大家。我最终使用了两个答案的组合。
我想将鼠标悬停在一张图片(音乐专辑)上,然后播放一张唱片,所以我希望它向右移动并旋转一点,当它悬停时我希望它恢复正常动画片。它已经可以向右移动,但我无法让它随之旋转。我喜欢让它尽可能简单,因为我不是编
Retina iOS 设备不显示@2X 图像,它显示 1X 图像。 我正在使用 Xcode 4.2.1 Build 4D502,该应用程序的目标是 iOS 5。 我创建了一个测试应用(主/细节)并添加
我正在尝试从头开始以 Angular 实现图像 slider ,并尝试复制 w3school基于图像 slider 。 下面我尝试用 Angular 实现,谁能指导我如何使用 Angular 实现?
我正在尝试获取图像的图像数据,其中 w= 图像宽度,h = 图像高度 for (int i = x; i imageData[pos]>0) //Taking data (here is the pr
我的网页最初通过在 javascript 中动态创建图像填充了大约 1000 个缩略图。由于权限问题,我迁移到 suPHP。现在不用标准 标签本身 我正在通过这个 php 脚本进行检索 $file
我正在尝试将 python opencv 图像转换为 QPixmap。 我按照指示显示Page Link我的代码附在下面 img = cv2.imread('test.png')[:,:,::1]/2
我试图在这个 Repository 中找出语义分割数据集的 NYU-v2 . 我很难理解图像标签是如何存储的。 例如,给定以下图像: 对应的标签图片为: 现在,如果我在 OpenCV 中打开标签图像,
import java.util.Random; class svg{ public static void main(String[] args){ String f="\"
我有一张 8x8 的图片。 (位图 - 可以更改) 我想做的是能够绘制一个形状,给定一个 Path 和 Paint 对象到我的 SurfaceView 上。 目前我所能做的就是用纯色填充形状。我怎样才
要在页面上显示图像,你需要使用源属性(src)。src 指 source 。源属性的值是图像的 URL 地址。 定义图像的语法是: 在浏览器无法载入图像时,替换文本属性告诉读者她们失去的信息。此
**MMEditing是基于PyTorch的图像&视频编辑开源工具箱,支持图像和视频超分辨率(super-resolution)、图像修复(inpainting)、图像抠图(matting)、
我正在尝试通过资源文件将图像插入到我的程序中,如下所示: green.png other files 当我尝试使用 QImage 或 QPixm
我是一名优秀的程序员,十分优秀!