如何在从智能手机接收蓝牙数据的同时使用键盘移动Pygame的多边形?

时间:2018-05-09 15:58:36

标签: python bluetooth pygame

我想从智能手机接收蓝牙数据时使用键盘移动pygame的多边形。收到蓝牙信号时,多边形出现在屏幕上,但不能用键盘移动。我只是向上移动。我怎么能搬一个......

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 :(得分:1)

您的问题似乎是mapDispatch阻止了Python。

当你使用pygame时,你通常会自己控制主循环,也就是说,你每隔几毫秒调用client_socket.recv(1024)。最简单的解决方案可能是首先将套接字设置为non-blocking mode并进行轮询。

E.g。在主循环的每次迭代期间调用pygame.display.update(),如果不为空,则处理msg = client_socket.recv(1024)

根据套接字实现(我不知道msg的具体内容),您可能必须处理部分消息和消息边界。也就是说,您可能需要收集更多数据并将它们添加到一起,直到您有完整的消息,然后使用类似.split(' \ n')的内容将已完成的消息与下一个消息分开信息。只需打印你得到的东西并从那里弄清楚。

还有其他选项而不是轮询(线程,异步事件主循环),但它们有各自的缺点(同步和竞争条件,回调和框架复杂性)。