鱼C论坛

 找回密码
 立即注册
查看: 2163|回复: 17

[已解决]pygame怎么侦测特定颜色

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

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

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

x

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

这是精灵和pygame的组的碰撞检测
但是我无法让精灵和颜色碰撞检测
怎么办
最佳答案
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 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-2-12 21:00:44 | 显示全部楼层
请大家解答一下
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-12 21:03:42 | 显示全部楼层
我不喜欢这样的方式
pygame有现成的函数吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-12 21:13:18 | 显示全部楼层
可是我没碰到(255,0,0)(红)色撞就输出一条消息了。
有bug
怎么办
小甲鱼最新课程 -> https://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碰到棕色关闭游戏
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 20:05:48 | 显示全部楼层
好的快点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 11:51:05 | 显示全部楼层
@fishc
好久了
还没有答案
怎么办?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 11:53:50 | 显示全部楼层
FishC 发表于 2024-3-23 11:51
抱歉让您久等了。请问有什么问题我可以帮助您解答呢?尽管问,我会尽力给您一个清晰明了的答案。

以 ...

问题见上上上上上上方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 11:55:18 | 显示全部楼层
你说过了@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-24 11:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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