Hỏi về bắt sự kiện phím mũi tên với lệnh pygame.event.get()

khi mình code dòng lệnh này:

for event in pygame.event.get():
  if event.type == QUIT:
    done = False
  if event.type == KEYDOWN:
    if event.key == K_LEFT and change_x == 0:
      change_x = -25
      change_y = 0
      pass
    elif event.key == K_RIGHT and change_x == 0:
      change_x = 25
      change_y = 0
      pass
    elif event.key == K_UP and change_y == 0:
      change_y = -25
      change_x = 0
      pass
    elif event.key == K_DOWN and change_y == 0:
      change_y = 25
      change_x = 0
      pass

Dòng lệnh chạy rất tốt nhưng có một vấn đề là nếu mình bấm 2 phím UP và RIGHT quá nhanh thì trong vòng lập này nó sẽ thực hiện cả câu lệnh điều kiện của cả 2 phím trong 1 vòng lập này. Mình đã thử dùng pass để bỏ qua vòng lập event này khi có một câu lệnh điều kiện được thực hiện nhưng kết quả vấn vậy. Có cách nào để bỏ qua cả đoạn vòng lập event này khi có đã có một câu lệnh điều kiện keydown thỏa mãn không. Mong các bạn giúp đỡ ạ


mình gán ảnh vào vì mình không căn lề được mấy dòng code mình cope ở trên phần code mình hỏi mình đã bôi đen trong ảnh.

Thì bạn chỉ xử lí 1 keyboard event mỗi frame thôi.

Với lại pass là lệnh ko làm gì cả (no-op), nên chỉ dùng cho khối rỗng.


5 Likes

Rắn (s)ăn mồi phải không?

R(S)ĂM

Hướng ưu tiên sẽ là hướng chỉ định hoặc hướng được nhấn đầu/cuối.
Giả sử mình nhấn 1 lần cả 4 hướng cùng 1 lúc thì rắn sẽ đi theo cách nào?
Bạn phải tự quy định.

Mình chơi theo cách đơn giản là hướng cuối cùng được nhấn sẽ là hướng mình cho rắn đi:

lastmove = K_LEFT
for event...:
    lastmove = event.key
if lastmove = K_LEFT:
...

Nói đơn giản là if - elif sẽ nằm ngoài vòng lặp.

4 Likes

bạn có thể chỉ rõ cho mình được không mình cũng mới học nên không rõ mấy phần đấy lắm đến frame mà mình nghe cũng thấy lạ lạ nữa :smiley:

https://www.emanueleferonato.com/2018/09/15/understanding-frame-based-vs-time-based-games/
Tức là mỗi frame là một bước nhảy hay mỗi frame có thể là n bước nhảy (do lag) :smiley:

4 Likes

mình vẫn chưa hiểu rõ về mấy phần event này lắm bạn có thể chỉ rõ cho mình dòng
for event…:
được không ạ.
mình đã thử nhiều trường hợp for rồi mà không được.

Mình cũng cố tìm cách và cũng tìm ra cách này rồi :grinning:


nhưng liệu bạn có thể chỉ cho mình dòng lệnh for event…: được không.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?