В настоящее время я пытаюсь оцифровывать настольную игру, которую я изобрел (репо: https://github.com/zutn/King_of_the_Hill). Чтобы это работало, мне нужно проверить, была ли нажата одна из плиток (дуги) на этом board. До сих пор я не мог понять способ, не отказываясь от функции pygame.arc для рисования. Если я использую позицию x, y по нажатой позиции, я не могу понять выход, чтобы определить точный контур дуги для сравнения. Я думал об использовании проверки цвета, но это только скажет мне, была ли нажата какая-либо из плиток. Итак, есть ли удобный способ проверить, была ли нажата дуга в pygame или мне нужно использовать спрайты или что-то совершенно другое? Кроме того, в последующие шаги будут включены единицы, которые расположены на плитки. Это сделало бы решение с расчетом расчета угла ниже гораздо более сложным.Обнаружение, если дуга была нажата в pygame
0
A
ответ
1
Это простой класс дуги, который будет определять, содержится ли точка в дуге, но она будет работать только с круговыми дугами.
import pygame
from pygame.locals import *
import sys
from math import atan2, pi
class CircularArc:
def __init__(self, color, center, radius, start_angle, stop_angle, width=1):
self.color = color
self.x = center[0] # center x position
self.y = center[1] # center y position
self.rect = [self.x - radius, self.y - radius, radius*2, radius*2]
self.radius = radius
self.start_angle = start_angle
self.stop_angle = stop_angle
self.width = width
def draw(self, canvas):
pygame.draw.arc(canvas, self.color, self.rect, self.start_angle, self.stop_angle, self.width)
def contains(self, x, y):
dx = x - self.x # x distance
dy = y - self.y # y distance
greater_than_outside_radius = dx*dx + dy*dy >= self.radius*self.radius
less_than_inside_radius = dx*dx + dy*dy <= (self.radius- self.width)*(self.radius- self.width)
# Quickly check if the distance is within the right range
if greater_than_outside_radius or less_than_inside_radius:
return False
rads = atan2(-dy, dx) # Grab the angle
# convert the angle to match up with pygame format. Negative angles don't work with pygame.draw.arc
if rads < 0:
rads = 2 * pi + rads
# Check if the angle is within the arc start and stop angles
return self.start_angle <= rads <= self.stop_angle
Вот пример использования класса. Для этого требуется использовать центральную точку и радиус вместо прямоугольника для создания дуги.
pygame.init()
black = (0, 0, 0)
width = 800
height = 800
screen = pygame.display.set_mode((width, height))
distance = 100
tile_num = 4
ring_width = 20
arc = CircularArc((255, 255, 255), [width/2, height/2], 100, tile_num*(2*pi/7), (tile_num*(2*pi/7))+2*pi/7, int(ring_width*0.5))
while True:
fill_color = black
for event in pygame.event.get():
# quit if the quit button was pressed
if event.type == pygame.QUIT:
pygame.quit(); sys.exit()
x, y = pygame.mouse.get_pos()
# Change color when the mouse touches
if arc.contains(x, y):
fill_color = (200, 0, 0)
screen.fill(fill_color)
arc.draw(screen)
# screen.blit(debug, (0, 0))
pygame.display.update()
+0
Это именно то, что я искал. Большое спасибо. –
Смежные вопросы
- 1. VB6 - WebBrowser Обнаружение, если ссылка была нажата
- 2. Обнаружение местоположения, в котором была нажата кнопка
- 3. Выполнение PHP: обнаружение, когда была нажата ссылка.
- 4. Обнаружение, если была нажата кнопка из другого класса
- 5. Почему не Pygame выход, если мышь нажата
- 6. Кнопка Pygame нажата
- 7. Unity Prevent Jump, если кнопка была нажата
- 8. разорвать петлю, если была нажата Esc
- 9. Как знать, если метка была нажата
- 10. Обнаружение, когда ссылка была нажата с помощью PHP
- 11. Обнаружение строки, которая была нажата с помощью JQuery
- 12. Обнаружение столкновений в pygame
- 13. Обнаружение столкновений в pygame
- 14. Обнаружение, если была упомянута группа слов
- 15. обнаружение кнопки дома нажата
- 16. Начальное обнаружение столкновений в Pygame
- 17. pygame обнаруживает, какая клавиша нажата
- 18. обнаружение столкновения треугольника Pygame
- 19. Обнаружение столкновений с PyGame
- 20. Обнаружение столкновений Pygame
- 21. проверка, если мышь была нажата в определенной области
- 22. отправка ввода в java, как если бы была нажата кнопка
- 23. Определите, была ли нажата гиперссылка
- 24. Проверьте, какая часть была нажата?
- 25. Расширенная ячейка не была нажата
- 26. Какая часть CheckedTextView была нажата?
- 27. Pygame: это правильное событие для просмотра, если нажата кнопка мыши.
- 28. Запросить, была ли нажата кнопка
- 29. Проверьте, какой была нажата ASP.NET
- 30. проверьте, была ли нажата кнопка.
Что делать, если это так: взять центральную точку в качестве ориго в двумерной системе координат. Вычисляли угол между щелчком мыши и источником, чтобы определить, какой набор плиток был нажат. Затем вычислите расстояние между щелчком мыши и началом координат, чтобы определить, какая плитка была нажата. –
Это может работать. Большое спасибо. Я попробую его и отчитаю. Однако все еще приветствуются дополнительные идеи. –
Извините, что я забыл добавить, что на плитах тоже будут единицы, что делает невозможным (по крайней мере, как я себе представляю) –