2016-08-31 5 views
1

Я делаю маленькую платформерную игру, используя pygame, и решил, что создание редактора уровней для каждого уровня будет проще, чем набирать координаты и размер каждого блока.pygame - Snap Mouse to Grid

Я использую набор линий по горизонтали и вертикали, чтобы сделать сетку проще.

Вот код для моей сетки:

def makeGrid(surface, width, height, spacing): 
    for x in range(0, width, spacing): 
     pygame.draw.line(surface, BLACK, (x,0), (x, height)) 
    for y in range(0, height, spacing): 
     pygame.draw.line(surface, BLACK, (0,y), (width, y)) 

Я хочу мыши пользователя, чтобы перейти на 10 пикселей с интервалом, чтобы двигаться только в точках пересечения. Вот что я пытался заставить мышь привязать к сетке.

def snapToGrid(mousePos): 
    if 0 < mousePos[0] < DISPLAYWIDTH and 0 < mousePos[1] < 700: 
     pygame.mouse.set_pos(roundCoords(mousePos[0],mousePos[1])) 

(BTV, roundCoords() возвращает координаты с округлением до ближайших десяти единицы.)

(Также BTV, SnapToGrid() вызывается внутри основного игрового цикла (пока не сделано))

... но this бывает, мышь не хочет двигаться нигде.


Любые предложения по устранению этого? Если мне нужно, я тоже могу изменить код сетки. Спасибо, кучка.

P.S. Это использует последнюю версию PyGame на 64-битном Python. 2.7

ответ

1

Прежде всего, я думаю, что вы не за горами.

Я думаю, проблема в том, что код проходит довольно быстро через каждый игровой цикл, поэтому ваша мышь не успевает сдвинуться далеко до того, как будет установлена ​​позиция, возвращаемая вашей функцией.

То, что я хотел бы изучить, а не pygame.mouse.set_pos(), просто возвращает привязанные координаты к переменной и использует это, чтобы разбить маркер на экран, выделяя пересечение интересов (здесь я использую круг, но вы могли бы просто blit изображение мыши;)). И скрыть фактическую мышь с помощью pygame.mouse.set_visible(False):

def snapToGrid(mousePos): 
    if 0 < mousePos[0] < DISPLAYWIDTH and 0 < mousePos[1] < 700: 
     return roundCoords(mousePos[0],mousePos[1]) 

snap_coord = snapToGrid(mousePos)# save snapped coordinates to variable 

pygame.draw.circle(Surface, color, snap_coord, radius, 0)# define the remaining arguments, Surface, color, radius as you need 

pygame.mouse.set_visible(False)# hide the actual mouse pointer 

Я надеюсь, что работает для вас!

+0

Мне это очень нравится, спасибо. Проблема только в том, что предыдущий круг не исчезает. –

+0

Я не знаю, насколько это возможно для вас, но обычно я обычно размахиваю своим фоном на каждом кадре и снова наполняю его. Так что в вашем случае я бы 1) blit на белом фоне, 2) blit сетку, 3) blit круг, на каждом отдельном фрейме. – Sorade

+0

То, что я сделал, было blit еще одним кругом над столом с тем же цветом, что и фон, поэтому точка выглядит как пространство в сетке вместо точки. –

 Смежные вопросы

  • Нет связанных вопросов^_^