我有一个环形雷达。雷达的“手臂”以恒定的速度旋转。我需要雷达上的光点在它们通过的时候播放声音。
我如何着手解决这个问题,以确保我的每一次革命都是成功的?
(使用pygame)
我已经尝试使用if语句来捕获"arm“的(x,y)坐标和这些光点是否相等。然而,我并没有得到持续的成功。我还尝试了斜率测量和余弦测量,并检查它们在手臂和光点之间是否相等;我不能实时获得一致的成功,当有命中时,通常会在圆圈上cos相同的位置播放两个。因为手臂精确到的小数位数比光点的位置多得多,所以似乎很难用if语句很好地捕捉到它。我不知道还能怎么做。任何想法都将不胜感激!

代码片段:
import pygame
from pygame.locals import *
import math
SIZE = 800, 800
screen = pygame.display.set_mode(SIZE, pygame.HWSURFACE | pygame.DOUBLEBUF)
done = False
bpm = 180 # based on a metronome to easily modulate speed
bbpm = 4
spm = bbpm*60/bpm
turnsPerMs = 1/(1000*spm)
startTime = pygame.time.get_ticks()
color = Color("red")
CENTER = (400,400)
RADIUS = 200
lineLen = 100
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 200)
BACKGROUND = (218, 226, 235)
pygame.init()
class Blip:
def __init__(self):
self.mouse = (0, 0)
self.vector = (self.mouse[0] - CENTER[0], self.mouse[1] - CENTER[1])
self.distance = math.sqrt(self.vector[0] ** 2 + self.vector[1] ** 2)
self.scalar = RADIUS / self.distance
self.lineend = (int(round(CENTER[0] + self.vector[0] * self.scalar)), int(round(CENTER[1] + self.vector[1] * self.scalar)))
self.radius = 20
self.position = (self.lineend[0] - self.radius, self.lineend[0] + self.radius, self.lineend[1] - self.radius,
self.lineend[1] + self.radius)
self.o = 255
self.s = 200
self.t = 150
"""def load_sound(self, filename):
print(filename)
self.sound = pygame.mixer.music.load(filename)"""
def play_sound(self):
print("Blip!")
def draw_blip(self):
pygame.draw.circle(screen, (100, 150, 200), self.lineend, self.radius)
class TickArm:
def __init__(self):
self.timeDelta = 0
self.revDelta = 0
self.deltaRadian = 0
self.x = SIZE[0]/2
self.y = SIZE[1]/2
def draw_tickarm(self):
self.timeDelta = pygame.time.get_ticks() - startTime
self.revDelta = self.timeDelta*turnsPerMs;
self.deltaRadian = self.revDelta*2*math.pi;
self.x = CENTER[0] + math.cos(self.deltaRadian) * RADIUS
self.y = CENTER[1] + math.sin(self.deltaRadian) * RADIUS
# then render the line ->(x,y)
pygame.draw.line(screen, color, CENTER, (self.x,self.y), 1)
tickarm = TickArm()
blip = Blip()
while not done:
for e in pygame.event.get():
if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE):
done = True
break
screen.fill((BACKGROUND))
pygame.draw.circle(screen, color, CENTER, RADIUS, 2)
pygame.draw.circle(screen, color, CENTER, RADIUS-25, 2)
blip.draw_blip()
tickarm.draw_tickarm()
pygame.display.flip()发布于 2017-05-21 11:42:28
没有足够的代表发表评论。抱歉的!但是你可以试试这个:
screen.get_at(x,y)方法:将所有斑点的中心存储在一个元组center_lists中
for i in center_lists:
if screen.get_at(i) == green:
#play the sound您要做的是检查每个帧上所有斑点的中心颜色。如果它们是绿色的,您可以播放声音。您甚至可以进一步创建另一个元组,为不同类型的blips创建不同的声音,并使用迭代器count i播放相应的元组。
https://stackoverflow.com/questions/44090007
复制相似问题