2016-08-11 71 views
1

所以我得到了raspi 3和简单的8x8 LED矩阵。在玩完它之后,我决定用pygame的事件做一个简单的蛇游戏(在那个矩阵上显示),我之前没有使用pygame的经验。除了LED矩阵之外,没有连接屏幕/显示器。通过SSH Pygame不注册按键(树莓派3)

所以刚开始的问题是“pygame.error:视频系统未初始化”,但我认为我得到它固定通过设置环境变量: os.putenv('DISPLAY', ':0.0') 现在,我得到它的工作我运行它...没有任何事情发生,就像没有注册按键一样。 Just this "junk", I don't know how to call it LED矩阵上的点不移动。如果我改变蛇的x或y位置,它会按照预期移动。

我的代码:

#!/usr/bin/python2 
import pygame 
import max7219.led as led 
from max7219.font import proportional, SINCLAIR_FONT, TINY_FONT, CP437_FONT 
import numpy as nqp 
import os 

SIZE = (8, 8) 

class Board: 
    def __init__(self, size, snake): 
     "Board object for snake game" 
     self.matrix = np.zeros(size, dtype=np.int8) 
     self.device = led.matrix() 
     self.snake = snake 
    def draw(self): 
     #add snake 
     self.matrix = np.zeros(SIZE, dtype=np.int8) 
     self.matrix[self.snake.x][self.snake.y] = 1 
     for x in range(8): 
      for y in range(8): 
       self.device.pixel(x, y, self.matrix[x][y], redraw=False) 
     self.device.flush() 
    def light(self, x, y): 
     "light specified pixel" 
     self.matrix[x][y] = 1 
    def dim(self, x, y): 
     "off specified pixel" 
     self.matrix[x][y] = 0 

class Snake: 
    def __init__(self): 
     "Object representing an ingame snake" 
     self.length = 1 
     self.x = 3 
     self.y = 3 

if __name__=="__main__": 
    os.putenv('DISPLAY', ':0.0') 
    pygame.init() 
    snake = Snake() 
    board = Board(SIZE, snake) 
    done = False 
    while not done: 
     for event in pygame.event.get(): 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_UP: 
        snake.y -= 1 
       elif event.key == pygame.K_DOWN: 
        snake.y += 1 
       elif event.key == pygame.K_LEFT: 
        snake.x -= 1 
       elif event.key == pygame.K_RIGHT: 
        snake.x += 1 
     board.draw() 

我使用pygame的,因为我不知道别的(好吧,我不能使用pygame的两种,但我只是不知道任何替代品)。如果可以做得更简单,我会很乐意去做。先谢谢你!

+0

看起来你使用的是PuTTY?看看[this](http://superuser.com/q/119792/152529)和[this](http://unix.stackexchange.com/q/12755),了解如何让X11转发设置办法。 – Kupiakos

回答

0

你应该可以使用curses。这里有一个简单的例子:

import curses 


def main(screen): 
    key = '' 
    while key != 'q': 
     key = screen.getkey() 
     screen.addstr(0, 0, 'key: {:<10}'.format(key)) 


if __name__ == '__main__': 
    curses.wrapper(main) 

你会看到你的按键是注册 - 他们只是字符串。

但是,这在阻塞模式下运行。假设您的代码需要做其他事情,您可以打开nodelay

def main(screen): 
    screen.nodelay(True) 
    key = '' 
    while key != 'q': 
     try: 
      key = screen.getkey() 
     except curses.error: 
      pass # no keypress was ready 
     else: 
      screen.addstr(0, 0, 'key: {:<10}'.format(key)) 

在你的情况,你可能会把这个游戏环路的图纸出来到您的8x8显示器里面,所以它会是这个样子:

game = SnakeGame() 
while game.not_done: 
    try: 
     key = screen.getkey() 
    except curses.error: 
     key = None 

    if key == 'KEY_UP': 
     game.turn_up() 
    elif key == 'KEY_DOWN': 
     game.turn_down() 
    elif key == 'KEY_LEFT': 
     game.turn_left() 
    elif key == 'KEY_RIGHT': 
     game.turn_right() 

    game.tick() 

有一点需要注意 - 这种做法把你的CPU的100%,所以如果你没有一些其他的方式来限制你的应用程序是做什么能引起你一些问题。如果你发现这是你需要的东西,你可以使用线程/多处理来扩展这种方法。