2016-08-11 1 views
1

그래서 raspi 3 및 간단한 8x8 LED 매트릭스가 있습니다. 일부 게임을하고 난 후에 나는 파이 게임의 이벤트로 간단한 뱀 게임 (그 매트릭스에 표시)을하기로 결심했다. 나는 파이 게임의 이전 경험이 없다. LED 매트릭스 이외에 연결된 스크린/디스플레이가 없습니다. 나는 내가 그것이 ENV 변수로 설정하여 고정 얻었다 고 생각하지만, "비디오 시스템 초기화되지 pygame.error는" SSH를 통한 파이 게임이 키 입력을 등록하지 않습니다 (라즈베리 파이 3)

그래서 처음에 문제가 있었다 나는 그것을 실행 작업 그것을 가지고 이제 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() 

내가 무엇을 모르기 때문에 내가 파이 게임을 사용하고 (그럼 난 파이 게임을 사용할 수 있습니다하지만 난 그냥 어떤 대안을 알고하지 않습니다). 그것이 더 간단하게 할 수 있다면 나는 그것을 행복하게 할 것입니다. 미리 감사드립니다!

+0

퍼티를 사용하고있는 것 같습니다. X11 포워딩을 설정하는 방법에 대해 [this] (http://superuser.com/q/119792/152529)와 [this] (http://unix.stackexchange.com/q/12755)를보십시오. 방법. – Kupiakos

답변

0

저주를 사용할 수 있어야합니다. 다음은 간단한 예제이다

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) 

당신은 당신의 키 입력이 등록되어있는 것을 볼 수 있습니다 - 그들은 단지 문자열입니다.

그러나 차단 모드에서 실행됩니다. 당신은 아마 당신의 8x8 디스플레이로 인출있어 게임 루프 내에서이 되었는데요 시나리오에서

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 %를 취할 것입니다. 당신이 필요로하는 것이 있다면, 스레딩/멀티 프로세싱을 사용하여이 접근법을 확장 할 수 있습니다.