我想从智能手机接收蓝牙数据时使用键盘移动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
答案 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')的内容将已完成的消息与下一个消息分开信息。只需打印你得到的东西并从那里弄清楚。
还有其他选项而不是轮询(线程,异步事件主循环),但它们有各自的缺点(同步和竞争条件,回调和框架复杂性)。