鱼C论坛

 找回密码
 立即注册
查看: 108|回复: 10

pygame怎么侦测特定颜色

[复制链接]
发表于 2024-2-12 20:49:16 | 显示全部楼层 |阅读模式

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

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

x

  1. if pygame.sprite.spritecollide(ball,group,False, pygame.sprite.collide_mask):
  2.     pass
复制代码

这是精灵和pygame的组的碰撞检测
但是我无法让精灵和颜色碰撞检测
怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-12 20:49:31 | 显示全部楼层
要检测精灵和特定颜色之间的碰撞,你可以使用pygame.Surface对象的`get_at()`方法来获取指定像素位置的颜色值。然后,你可以将这个颜色值与目标颜色进行比较,从而判断是否发生了碰撞。

下面是一个简单的示例代码,演示了如何检测精灵和特定颜色之间的碰撞:

  1. import pygame

  2. pygame.init()

  3. WIDTH = 400
  4. HEIGHT = 300

  5. screen = pygame.display.set_mode((WIDTH, HEIGHT))
  6. clock = pygame.time.Clock()

  7. class Ball(pygame.sprite.Sprite):
  8.     def __init__(self):
  9.         super().__init__()
  10.         self.image = pygame.image.load('ball.png')
  11.         self.rect = self.image.get_rect()
  12.         self.rect.center = (WIDTH // 2, HEIGHT // 2)

  13.     def update(self):
  14.         keys = pygame.key.get_pressed()
  15.         if keys[pygame.K_UP]:
  16.             self.rect.y -= 5
  17.         if keys[pygame.K_DOWN]:
  18.             self.rect.y += 5
  19.         if keys[pygame.K_LEFT]:
  20.             self.rect.x -= 5
  21.         if keys[pygame.K_RIGHT]:
  22.             self.rect.x += 5

  23.     def is_colliding_with_color(self, color):
  24.         pixel_color = screen.get_at((self.rect.x, self.rect.y))
  25.         return pixel_color == color

  26. ball = Ball()
  27. running = True

  28. while running:
  29.     for event in pygame.event.get():
  30.         if event.type == pygame.QUIT:
  31.             running = False
  32.    
  33.     ball.update()
  34.    
  35.     if ball.is_colliding_with_color((255, 0, 0)):  # 检测与红色碰撞
  36.         print("与红色碰撞了!")
  37.    
  38.     screen.fill((255, 255, 255))
  39.     screen.blit(ball.image, ball.rect)
  40.     pygame.display.flip()
  41.     clock.tick(60)

  42. pygame.quit()
复制代码


在这个示例中,我们创建了一个Ball精灵,通过键盘控制它的移动。然后,在主循环中使用`is_colliding_with_color()`方法来检测与红色是否发生碰撞。如果发生碰撞,就会在控制台输出一条消息。

你可以根据自己的需要修改颜色值和需要检测的位置,以适应你的具体场景。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-12 21:00:44 | 显示全部楼层
请大家解答一下
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-12 21:00:52 | 显示全部楼层
zxbin1 发表于 2024-02-12 21:00
请大家解答一下
谢谢


当然,请问你有关于pygame侦测特定颜色的问题吗?我会尽力帮助你解答。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-12 21:03:42 | 显示全部楼层
我不喜欢这样的方式
pygame有现成的函数吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-12 21:04:02 | 显示全部楼层
zxbin1 发表于 2024-02-12 21:03
我不喜欢这样的方式
pygame有现成的函数吗


非常抱歉,我误解了你的问题。在pygame中,有一个函数可以用于检测特定颜色的碰撞,即`pygame.mask.Mask.overlap()`函数。

这个函数接受两个参数:要检测碰撞的Surface对象和颜色。它将返回一个布尔值,表示是否发生了碰撞。

下面是一个示例代码,演示了如何使用`overlap()`函数来检测精灵和特定颜色之间的碰撞:

  1. import pygame

  2. pygame.init()

  3. WIDTH = 400
  4. HEIGHT = 300

  5. screen = pygame.display.set_mode((WIDTH, HEIGHT))
  6. clock = pygame.time.Clock()

  7. class Ball(pygame.sprite.Sprite):
  8.     def __init__(self):
  9.         super().__init__()
  10.         self.image = pygame.image.load('ball.png')
  11.         self.rect = self.image.get_rect()
  12.         self.rect.center = (WIDTH // 2, HEIGHT // 2)

  13.     def update(self):
  14.         keys = pygame.key.get_pressed()
  15.         if keys:
  16.             self.rect.y -= 5
  17.         if keys:
  18.             self.rect.y += 5
  19.         if keys:
  20.             self.rect.x -= 5
  21.         if keys:
  22.             self.rect.x += 5

  23.     def is_colliding_with_color(self, color):
  24.         mask = pygame.mask.from_surface(self.image)
  25.         collision_mask = pygame.mask.Mask((self.rect.width, self.rect.height))
  26.         collision_mask.fill()
  27.         return mask.overlap_area(collision_mask, (0, 0)) > 0

  28. ball = Ball()

  29. running = True
  30. while running:
  31.     for event in pygame.event.get():
  32.         if event.type == pygame.QUIT:
  33.             running = False

  34.     ball.update()

  35.     if ball.is_colliding_with_color((255, 0, 0)):  # 检测与红色碰撞
  36.         print("与红色碰撞了!")

  37.     screen.fill((255, 255, 255))
  38.     screen.blit(ball.image, ball.rect)
  39.     pygame.display.flip()
  40.     clock.tick(60)

  41. pygame.quit()
复制代码


在这个示例中,我们创建了一个Ball精灵,通过键盘控制它的移动。然后,在主循环中使用`is_colliding_with_color()`方法来检测与红色是否发生碰撞。如果发生碰撞,就会在控制台输出一条消息。

希望这次解答能满足您的需求。如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-12 21:13:18 | 显示全部楼层
可是我没碰到(255,0,0)(红)色撞就输出一条消息了。
有bug
怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-12 21:13:34 | 显示全部楼层
zxbin1 发表于 2024-02-12 21:13
可是我没碰到(255,0,0)(红)色撞就输出一条消息 ...


如果你在使用`pygame.mask.Mask.overlap()`函数时,出现了没有检测到碰撞的情况,可能有几个原因导致这个问题:

1. 碰撞区域不正确:在创建碰撞掩码(collision_mask)时,传入的参数可能不正确。请确保传入的尺寸与精灵图像的尺寸相匹配,并且偏移量(offset)为(0, 0)。

2. 检测颜色不准确:可能是因为传入`is_colliding_with_color()`方法的颜色参数有误。请确保颜色值与精灵图像中实际的颜色值相匹配。

3. 碰撞掩码创建失败:在使用`pygame.mask.from_surface()`函数创建掩码时,可能会失败。这可能是因为图像的透明度或其他因素导致了掩码创建的问题。你可以尝试使用其他图像,或者确保图像中没有透明度。

如果你无法解决问题,你可以提供更多的代码和图像文件,我们一起来查找问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-13 20:16:56 | 显示全部楼层
  1. import pygame
  2. import sys
  3. from pygame.locals import *

  4. class Ball(pygame.sprite.Sprite):
  5.     def __init__(self,image,position,speed):
  6.         pygame.sprite.Sprite.__init__(self) #初始化
  7.         self.image = pygame.image.load(image)#获得图片
  8.         self.image.set_colorkey((255,255,255))
  9.         self.rect = self.image.get_rect() #获得图片矩形
  10.         self.rect.left,self.rect.top = position #确定位置
  11.         self.speed = speed #获得方向
  12.         self.mask = pygame.mask.from_surface(self.image)
  13.     def mo(self):
  14.         self.rect = self.rect.move(self.speed)

  15. class Ban(pygame.sprite.Sprite):
  16.     def __init__(self,image,position):
  17.         pygame.sprite.Sprite.__init__(self) #初始化
  18.         self.image = pygame.image.load(image)#获得图片
  19.         self.rect = self.image.get_rect() #获得图片矩形
  20.         self.rect.left,self.rect.top = position #确定位置
  21.         self.speed = [0,0] #获得方向
  22.     def tz(self):
  23.         self.rect = self.rect[0]-75,self.rect[1]-15

  24. #定义
  25. ball_image = "资源\\球.bmp"
  26. ban_image = "资源\\板.bmp"
  27. size = w,h = 600,400
  28. im = pygame.image.load("资源\\背景.bmp")

  29. #初始化 pygame
  30. pygame.init()

  31. #创建指定大小的窗口
  32. screen = pygame.display.set_mode(size)
  33. #设置窗口标题
  34. pygame.display.set_caption("第一个游戏")

  35. ball = Ball(ball_image,(350,250),[2,2])
  36. ban = Ban(ban_image,(0,225))

  37. group = pygame.sprite.Group()
  38. group.add(ban)

  39. while True:
  40.     for event in pygame.event.get():
  41.         if event.type == QUIT:
  42.             sys.exit()
  43.     if pygame.sprite.spritecollide(ball,group,False,pygame.sprite.collide_mask):
  44.         ball.speed[0] = -ball.speed[0]
  45.         ball.speed[1] = -abs(-ball.speed[1])
  46.     if ball.rect.left < 0 or ball.rect.right > w:
  47.         ball.speed[0] = -ball.speed[0]

  48.     if ball.rect.top < 0 or ball.rect.bottom > h:
  49.         ball.speed[1] = -ball.speed[1]

  50.     ban.rect = pygame.mouse.get_pos()
  51.     ban.tz()
  52.     ball.mo()
  53.     screen.blit(im,(0,0))
  54.     screen.blit(ban.image,ban.rect)
  55.     screen.blit(ball.image,ball.rect)
  56.     #更新界面
  57.     pygame.display.flip()
  58.     #延时 10ms
  59.     pygame.time.delay(10)
复制代码

这是代码
新建压缩(zipped)文件夹.zip (3.89 KB, 下载次数: 4)
这是资源
路过的拿走

我想让ball碰到棕色关闭游戏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-13 20:17:14 | 显示全部楼层
zxbin1 发表于 2024-02-13 20:16
import pygame
import sys
from pygame.locals impo ...


根据你提供的代码和资源,我看到你创建了一个名为`Ball`的精灵类,并且使用了`pygame.mask.Mask`来进行碰撞检测。如果你希望球(ball)能够与棕色(颜色值为182, 196, 0)发生碰撞时关闭游戏,你可以在主循环中添加相应的逻辑。

首先,你可以在`Ball`类中添加一个新的方法`is_colliding_with_color(self, color)`,该方法用于检测球是否与指定的颜色发生碰撞:

  1. class Ball(pygame.sprite.Sprite):
  2.     def __init__(self, image, position, speed):
  3.         pygame.sprite.Sprite.__init__(self)
  4.         self.image = pygame.image.load(image)
  5.         self.image.set_colorkey((255, 255, 255))
  6.         self.rect = self.image.get_rect()
  7.         self.rect.left, self.rect.top = position
  8.         self.speed = speed
  9.         self.mask = pygame.mask.from_surface(self.image)

  10.     def move(self):
  11.         self.rect = self.rect.move(self.speed)

  12.     def is_colliding_with_color(self, color):
  13.         pixel_coords = self.rect.move(-self.rect.left, -self.rect.top)
  14.         return self.mask.overlap_area(screen_mask, pixel_coords) > 0
复制代码


然后,在主循环中,你可以在碰撞检测的部分添加代码来判断球与棕色的碰撞,并在发生碰撞时关闭游戏窗口:

  1. while True:
  2.     for event in pygame.event.get():
  3.         if event.type == QUIT:
  4.             sys.exit()

  5.     if pygame.sprite.spritecollide(ball, group, False, pygame.sprite.collide_mask):
  6.         if ball.is_colliding_with_color((182, 196, 0)):
  7.             pygame.quit()
  8.             sys.exit()

  9.     # 其他的代码...
复制代码


这样,当球与棕色发生碰撞时,游戏窗口将会关闭。
希望这个解决方案对你有帮助,如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-15 12:19:39 | 显示全部楼层
你还在吗?
如果你还在的话回来踢我一脚,我再尝试帮你解决问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-2-23 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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