2016-08-11 56 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%,所以如果你沒有一些其他的方式來限制你的應用程序是做什麼能引起你一些問題。如果你發現這是你需要的東西,你可以使用線程/多處理來擴展這種方法。