2013-04-16 75 views
20

Tôi đang làm một trò chơi trong pygame 1.9.2. Đó là một trò chơi đơn giản, trong đó một con tàu di chuyển giữa năm cột kẻ xấu tấn công bằng cách di chuyển từ từ xuống dưới. Tôi đang cố gắng làm cho nó di chuyển sang trái và sang phải bằng các phím mũi tên trái và phải. Đây là mã của tôi:Làm thế nào để có được đầu vào bàn phím trong pygame?

keys=pygame.key.get_pressed() 
if keys[K_LEFT]: 
    location-=1 
    if location==-1: 
     location=0 
if keys[K_RIGHT]: 
    location+=1 
    if location==5: 
     location=4 

Nó hoạt động quá tốt. Con tàu di chuyển quá nhanh. Nó gần như không thể có nó di chuyển chỉ có một vị trí, trái hoặc phải. Làm thế nào tôi có thể làm cho nó để con tàu chỉ di chuyển một lần mỗi lần nhấn phím?

Trả lời

32

Bạn có thể lấy các sự kiện từ pygame và sau đó xem ra cho sự kiện KEYDOWN, thay vì nhìn vào các phím được trả về bởi get_pressed() (mà cung cấp cho bạn các phím hiện đang ép xuống, trong khi sự kiện KEYDOWN cho bạn thấy các phím được nhấn xuống trên khung đó).

Điều đang xảy ra với mã của bạn ngay bây giờ là nếu trò chơi của bạn hiển thị ở tốc độ 30 khung hình/giây và bạn giữ phím mũi tên trái trong nửa giây, bạn đang cập nhật vị trí 15 lần.

events = pygame.event.get() 
for event in events: 
    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_LEFT: 
      location -= 1 
     if event.key == pygame.K_RIGHT: 
      location += 1 

Để hỗ trợ phong trào liên tục trong khi một phím được tổ chức xuống, bạn sẽ phải thiết lập một số loại giới hạn, hoặc dựa trên một tỷ lệ khung hình tối đa buộc của vòng trò chơi hoặc bởi một bộ đếm mà chỉ cho phép bạn di chuyển mọi dấu tích của vòng lặp.

move_ticker = 0 
keys=pygame.key.get_pressed() 
if keys[K_LEFT]: 
    if move_ticker == 0: 
     move_ticker = 10 
     location -= 1 
     if location == -1: 
      location = 0 
if keys[K_RIGHT]: 
    if move_ticker == 0: 
     move_ticker = 10  
     location+=1 
     if location == 5: 
      location = 4 

Sau đó, ở đâu đó trong vòng lặp game bạn sẽ làm một cái gì đó như thế này:

if move_ticker > 0: 
    move_ticker -= 1 

này sẽ chỉ cho phép bạn di chuyển một lần mỗi 10 khung hình (vì vậy nếu bạn di chuyển, các ticker được thiết lập đến 10, và sau 10 khung hình, nó sẽ cho phép bạn di chuyển lại)

+0

Tôi đã cố gắng sử dụng điều này nhưng vấn đề là nó chỉ di chuyển nếu tôi nhấn nút vào đúng thời điểm pygame đang tìm kiếm sự kiện đó. Nó sẽ không di chuyển khi tôi muốn nó. –

+2

Vâng, bạn phải kiểm tra các sự kiện của bạn trên mỗi lần cập nhật vòng lặp trò chơi của bạn. Bạn đã làm điều này? Sự kiện sẽ ở trong hàng đợi sự kiện của Pygame cho đến khi bạn đọc chúng hoặc bơm chúng. – Haz

+2

Dan, câu trả lời này là chính xác những gì bạn yêu cầu, nhưng hãy nhớ rằng sử dụng các sự kiện bạn sẽ không thể liên tục di chuyển con tàu của bạn mà bạn có thể muốn nếu bạn có thể kiểm soát tốc độ. Bạn có thể giữ mã ban đầu và khi bạn phát hiện một phím được nhấn, bạn có thể dễ dàng bỏ qua các nút được nhấn cho các vòng lặp N. – pmoleri

-3

Bạn nên sử dụng clock.tick(10) như đã nêu trong docs.

0

Hãy thử điều này:

keys=pygame.key.get_pressed() 
if keys[K_LEFT]: 
    if count == 10: 
     location-=1 
     count=0 
    else: 
     count +=1 
    if location==-1: 
     location=0 
if keys[K_RIGHT]: 
    if count == 10: 
     location+=1 
     count=0 
    else: 
     count +=1 
    if location==5: 
     location=4 

Điều này sẽ có nghĩa là bạn chỉ di chuyển bằng 1/10 thời gian. Nếu nó vẫn di chuyển nhanh, bạn có thể thử tăng giá trị bạn đặt "đếm" quá.

3
import pygame 
pygame.init() 
pygame.display.set_mode() 
while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit(); #sys.exit() if sys is imported 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_0: 
       print("Hey, you pressed the key, '0'!") 
      if event.key == pygame.K_1: 
       print("Doing whatever") 



Trong lưu ý rằng K_0 và K_1 không phải là chìa khóa duy nhất, để xem tất cả trong số họ, xem tài liệu pygame, nếu không, nhấn tab sau khi nhập

pygame.

(lưu ý. Sau pygame) vào chương trình không hoạt động. Lưu ý rằng K phải là vốn. Cũng lưu ý rằng nếu bạn không cung cấp cho pygame một kích thước hiển thị (pass no args), thì nó sẽ tự động sử dụng kích thước của màn hình/màn hình máy tính. Chúc mừng mã hóa!

-3

tất cả các câu trả lời ở trên quá phức tạp, tôi chỉ thay đổi các biến bằng 0.1 thay vì 1 điều này làm cho con tàu chậm 10 lần nếu điều đó vẫn là quá nhanh thay đổi các biến bằng 0,01 điều này làm cho con tàu chậm hơn 100 lần thử này

keys=pygame.key.get_pressed() 
if keys[K_LEFT]: 
    location -= 0.1 #or 0.01 
    if location==-1: 
    location=0 
if keys[K_RIGHT]: 
    location += 0.1 #or 0.01 
    if location==5: 
     location=4 
+0

hey, điều này sẽ làm việc ngoại trừ thực tế là tất cả các chuyển động phải là giá trị số nguyên. đi vào làm tròn là unicecary là tốt. Sử dụng sự kiện pygame.KEYDOWN là giải pháp tôi đang tìm kiếm, một chuyển động cho mỗi lần nhấn nút. Nó hoạt động tốt khi chỉ có 5 vị trí có thể. –

0

Just FYI, nếu bạn đang cố gắng để đảm bảo con tàu không đi ra khỏi màn hình với

location-=1 
if location==-1: 
    location=0 

bạn có lẽ tốt hơn có thể sử dụng

location -= 1 
location = max(0, location) 

Bằng cách này, nếu nó bỏ qua -1 chương trình của bạn không phá vỡ

Các vấn đề liên quan