2016-08-11 11 views
1

私はraspi 3と単純な8x8 LEDマトリックスを手に入れました。それを使って遊んだ後、私はpygameのイベントで単純なスネークゲーム(その行列上に表示)をすることに決めました。私はpygameの以前の経験はありません。 LEDマトリックス以外にスクリーン/ディスプレイは接続されていません。SSH経由のPygameはキーストロークを登録しません(ラズベリーPi 3)

だから、最初の問題は、「pygame.error:ビデオシステムが初期化されていません」でした私は、それはENV変数設定することにより、固定しまったと思いますけれども、: 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を使用しているようですか? X11転送を設定する方法については、[this](http://superuser.com/q/119792/152529)と[this](http://unix.stackexchange.com/q/12755)をご覧ください。方法。 – 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) 

あなたのキーの押下が登録されていることがわかります - 彼らはただの文字列です。

ただし、これはブロッキングモードで実行されます。それは次のようになりますので、あなたはおそらく、あなたの8×8のディスプレイに引き出していますあなたのゲームループ内でこれを入れてしまうでしょう、あなたのシナリオでは

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)) 

:あなたのコードは、他のことを行う必要があると仮定すると、あなたは上nodelayを変えることができます:

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%がかかります。あなたが必要とするものであれば、スレッド/マルチプロセッシングを使ってこのアプローチを拡張することができます。

関連する問題