Как переместить полигон Pygame с помощью клавиатуры при получении данных Bluetooth со смартфона? - PullRequest
0 голосов
/ 09 мая 2018

Я хочу переместить полигон Pygame с помощью клавиатуры при получении данных Bluetooth от смартфона. При получении сигнала Bluetooth на экране появляется многоугольник, но он не может двигаться с помощью клавиатуры. Я поставил только двигаясь вверх. Как я могу двигаться один ......

import pygame, sys
from pygame.locals import *
pygame.init()
import RPi.GPIO as GPIO
import numpy as np
import bluetooth
DISPLAYSURF = pygame.display.set_mode((500,400), 0, 32)
pygame.display.set_caption('Drawing')
BLACK = (0,0,0)
WHITE = (255,255,255)
GREEN = (0,255,0)
DISPLAYSURF.fill(WHITE)
pygame.display.update()
server_socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
port = 1
server_socket.bind(("", port))
server_socket.listen(1)
client_socket, address = server_socket.accept()
print ("Accepted connection from ", address)
def get_data():
    data = client_socket.recv(1024)
return data

p = np.array([[146,0],[291,106],[236,277],[56,277],[0,106]])

координаты многоугольника

    while True:
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:

            pygame.quit()
            sys.exit()



    data = get_data()
    if data == '0':

        DISPLAYSURF.fill(WHITE)
        pygame.draw.polygon(DISPLAYSURF, GREEN, ((p[0][0],p[0][1]),(p[1][0],p[1][1]),(p[2][0],p[2][1]),(p[3][0],p[3][1]),(p[4][0],p[4][1])))

        if event.type == KEYDOWN:
            if event.key == K_UP:
                p[0][1]-=2
                p[1][1]-=2
                p[2][1]-=2
                p[3][1]-=2
                p[4][1]-=2   
        if event.type == KEYUP:
            p=p

1 Ответ

0 голосов
/ 09 мая 2018

Ваша проблема в том, что client_socket.recv(1024) блокирует Python.

Когда вы используете pygame, вы обычно сами управляете основным циклом, то есть вы вызываете pygame.display.update() каждую пару миллисекунд. Возможно, самое простое решение - сначала установить сокет в неблокирующий режим и выполнить опрос.

например. Вы вызываете msg = client_socket.recv(1024) во время каждой итерации основного цикла и обрабатываете msg, если не пусто.

В зависимости от реализации сокета (я не знаю особенностей BluetoothSocket), вам, возможно, придется иметь дело с частичными сообщениями и границами сообщений. То есть вам может потребоваться собрать больше данных и сложить их вместе, пока у вас не появится полное сообщение, и использовать что-то вроде .split ('\ n'), чтобы отделить законченное сообщение (я) от частичного следующего сообщения. Просто распечатай то, что ты получишь, и разберись в этом.

Существуют и другие параметры, кроме опроса (потоки, основной цикл асинхронных событий), но они имеют свои недостатки (условия синхронизации и гонки, обратные вызовы и сложность инфраструктуры).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...