Tôi đang tạo một bản sao Asteroidz trong pygame và có hai cho sự kiện trong pygame.event.get()
vòng lặp, một vòng để kiểm tra yêu cầu thoát và liệu trò chơi có nên bắt đầu bằng cách nhấn phím cách hay không, sau đó trong trò chơi để cố gắng hạn chế người chơi giữ phím cách và liên tục bắn. Mã có liên quan cho tôi kiểm tra_đầu vào
hàm được chạy một lần sau mỗi vòng lặp như sau;
Tôi đã tạo một bản sao Asteroidz trong pyGame và có hai bản dành cho Sự kiện trong vòng lặp pygame.vent.get(), một bản để kiểm tra yêu cầu thoát và liệu trò chơi có nên bắt đầu hay không bằng cách nhấn phím cách trước khi thử tiếp tục trong trò chơi. Và hạn chế người chơi khỏi nhấn giữ phím cách và bắn liên tục. Mã liên quan cho hàm check_input của tôi như sau, hàm này chạy một lần trong mỗi vòng lặp;
def check_input(bản thân):
đối với sự kiện trong pygame.event.get(): #KHÔNG KIỂM TRA ĐỦ NHANH, TOÀN BỘ QUÁ TRÌNH QUÁ CHẬM
nếu (event.type == pygame.KEYUP) và (event.key == pygame.K_SPACE):
in ('boop')
self.shootThrottle = 0
nếu self.shootThrottle == 0:
self.shootThrottle += 1
bullets.add(Bullet(self.shape[0][0],self.shape[0][1], self.angle))
khóa = pygame.key.get_pressed()
nếu key[pygame.K_LEFT]:
góc tự nhiên -= 7
tự xoay(-7)
khóa elif[pygame.K_RIGHT]:
góc tự nhiên += 7
tự xoay(7)
nếu self.angle > 360:
góc tự nhiên -= 360
elif self.angle < 0:
góc tự nhiên += 360
nếu key[pygame.K_UP]:
tự tăng tốc()
elif phím[pygame.K_DOWN]:
tự giảm tốc()
Tôi đang sử dụng bắnThrottle
như một phương tiện để cố gắng ngăn chặn các viên đạn được bắn ra cho đến khi phím cách được nhả ra. Hệ thống này hoạt động, nhưng do cho sự kiện trong pygame.event.get()
quá chậm nên nó không hoạt động bình thường.
Tôi đang sử dụng ShootThrottle như một cách để cố gắng ngăn viên đạn bắn ra cho đến khi thanh dấu cách được thả ra. Hệ thống này hoạt động nhưng không hoạt động bình thường vì sự kiện for trong pygame.vent.get() quá chậm.
Bất kỳ sự giúp đỡ nào cũng đều được trân trọng!
Bất kỳ trợ giúp đều được đánh giá rất cao!
Thêm câu trả lời
Khuyến nghị câu trả lời tuyệt vời
[...] và có hai cho sự kiện trong pygame.sự kiện.get()
vòng lặp [..]"
Đó chính là vấn đề. pygame.sự kiện.get()
lấy tất cả các tin nhắn và xóa chúng khỏi hàng đợi. Xem tài liệu:
Đó là vấn đề. Get() nhận tất cả tin nhắn và xóa chúng khỏi hàng đợi. Xem tài liệu:
Thao tác này sẽ lấy tất cả tin nhắn và xóa chúng khỏi hàng đợi. [...]
Nếu như pygame.sự kiện.get()
được gọi trong nhiều vòng lặp sự kiện, chỉ có một vòng lặp nhận được các sự kiện, nhưng không phải tất cả các vòng lặp đều nhận được tất cả các sự kiện. Do đó, một số sự kiện có vẻ như bị bỏ lỡ.
Nếu pygame.vent.get() được gọi trong nhiều vòng lặp sự kiện thì chỉ một vòng lặp nhận được các sự kiện, nhưng không phải tất cả các vòng lặp đều nhận được tất cả các sự kiện. Vì vậy, một số sự kiện dường như bị bỏ lỡ.
Nhận các sự kiện một lần cho mỗi khung hình và sử dụng chúng trong nhiều vòng lặp hoặc truyền danh sách hoặc sự kiện cho các hàm và phương thức để xử lý chúng:
Nhận các sự kiện một lần trên mỗi khung và sử dụng chúng trong nhiều vòng lặp hoặc chuyển danh sách hoặc sự kiện tới các hàm và phương thức nơi chúng được xử lý:
def handle_events(sự kiện):
cho sự kiện trong sự kiện:
# [...]
trong khi chạy:
event_list = pygame.event.get()
# [...]
# Vòng lặp sự kiện thứ 1
cho sự kiện trong event_list:
# [...]
# [...]
# Vòng lặp sự kiện thứ 2
cho sự kiện trong event_list:
# [...]
# [...]
# hàm xử lý sự kiện
xử lý_sự_kiện(danh_sách_sự_kiện)
Thêm câu trả lời
Tôi là một lập trình viên xuất sắc, rất giỏi!