2017-05-20 6 views
2

私は円形のレーダーを持っています。レーダーの「腕」は一定の速度で回転します。彼らが通過するたびに音を出すためには、レーダー上の瞬間が必要です。レーダー上でのブリップ音の再生

どのように私はすべての革命私はヒットが保証されるようにこの問題を解決するために行くのですか? (pygameの使用)

Iは、(x、y)が「アーム」の座標とブリップが等価であるかどうかをキャッチするためにif文を用いて試みました。しかし、私は一貫した成功を収めていません。私はまた、勾配測定とコサイン測定を行い、それらが腕と瞬きの間で同等かどうかをチェックしようと試みました。私はリアルタイムで一貫した成功を収めておらず、ヒットしたときには、サークル上でコサインが同じ位置で通常2回プレイされます。腕は、ブリップの位置よりも多くの小数点以下の桁に正確であるため、難しいですが、ifステートメントでうまくキャッチすることができます。私はこれについて他にどのように行くのか分かりません。任意のアイデアをいただければ幸いです!

janky radar

コードスニペット:

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() 
+1

アームがどのように実装されているかを知らなくても、答えを出すのは難しいです。しかし、あなたのレーダーをセクションや妥当な大きさに分割して、アームのx、yの位置がどのセクションにあるのかを確認するのがよいと思います。セクションにドットが含まれている場合は、サウンドを再生します。だから、ドットとアームの位置が等しいかどうかをチェックするのではなく(彼らが浮動小数点数であると仮定しているため動作しません)、マージン内に位置が近いかどうかをチェックします。 –

+0

ありがとうございます!私はちょうど良い歩きを取って、同様の考えを持っていた。私はそれぞれの点のための境界ボックスを作ることができます、そして、腕が境界ボックスの中にあるならば、私はブリップが音を出せるようにすることができます。それは動作するかもしれません!私は、腕がとても速く動くので、箱から箱への移行が難しいと思っているだけです。それが動作しない場合、私は間違いなく、あなたが言うように、そして、それがどのように動作するかを見るのに、「最寄りの隣人」アプローチに行くでしょう。また、アーム/ドットのコードを投稿して、実装のより良いアイデアを得ることができます。 –

+2

各吹き出しの* angle *(X/Y座標で 'math.atan2'を使って)を計算して、腕の角度が瞬きの「交差」するフレームでサウンドを再生するほうが理にかなっています。 – Wyzard

答えて

1

足りない担当者はコメントします。ごめんなさい! しかし、あなたはこれを試すことができます。

screen.get_at(x,y) 

は行く方法: ストアをタプルcenter_lists内のすべてのブリップの中心が

for i in center_lists: 
    if screen.get_at(i) == green: 
     #play the sound 

何をやることは、それぞれ上のすべてのブリップの中心の色を確認していますフレーム。緑の場合は、音を鳴らすことができます。さまざまなタイプのブリップに対して異なるサウンドを持つ別のタプルを作成し、イテレータカウントiを使用してそれぞれを再生することもできます。