私は円形のレーダーを持っています。レーダーの「腕」は一定の速度で回転します。彼らが通過するたびに音を出すためには、レーダー上の瞬間が必要です。レーダー上でのブリップ音の再生
どのように私はすべての革命私はヒットが保証されるようにこの問題を解決するために行くのですか? (pygameの使用)
Iは、(x、y)が「アーム」の座標とブリップが等価であるかどうかをキャッチするためにif文を用いて試みました。しかし、私は一貫した成功を収めていません。私はまた、勾配測定とコサイン測定を行い、それらが腕と瞬きの間で同等かどうかをチェックしようと試みました。私はリアルタイムで一貫した成功を収めておらず、ヒットしたときには、サークル上でコサインが同じ位置で通常2回プレイされます。腕は、ブリップの位置よりも多くの小数点以下の桁に正確であるため、難しいですが、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()
アームがどのように実装されているかを知らなくても、答えを出すのは難しいです。しかし、あなたのレーダーをセクションや妥当な大きさに分割して、アームのx、yの位置がどのセクションにあるのかを確認するのがよいと思います。セクションにドットが含まれている場合は、サウンドを再生します。だから、ドットとアームの位置が等しいかどうかをチェックするのではなく(彼らが浮動小数点数であると仮定しているため動作しません)、マージン内に位置が近いかどうかをチェックします。 –
ありがとうございます!私はちょうど良い歩きを取って、同様の考えを持っていた。私はそれぞれの点のための境界ボックスを作ることができます、そして、腕が境界ボックスの中にあるならば、私はブリップが音を出せるようにすることができます。それは動作するかもしれません!私は、腕がとても速く動くので、箱から箱への移行が難しいと思っているだけです。それが動作しない場合、私は間違いなく、あなたが言うように、そして、それがどのように動作するかを見るのに、「最寄りの隣人」アプローチに行くでしょう。また、アーム/ドットのコードを投稿して、実装のより良いアイデアを得ることができます。 –
各吹き出しの* angle *(X/Y座標で 'math.atan2'を使って)を計算して、腕の角度が瞬きの「交差」するフレームでサウンドを再生するほうが理にかなっています。 – Wyzard