Tôi đang làm việc trên một trò chơi 2ngày đơn giản, nơi nhiều kẻ thù liên tục sinh ra và đuổi theo người chơi hoặc người chơi trong python + pygame. Một vấn đề tôi gặp phải, và một trong nhiều người đã lập trình loại trò chơi này đã chạy vào là kẻ thù hội tụ rất nhanh. Tôi đã thực hiện một giải pháp tạm thời cho vấn đề này với một chức năng đẩy bất kỳ hai kẻ thù một cách ngẫu nhiên nếu chúng quá gần nhau. Điều này làm việc tốt nhưng là về một thuật toán O (n^2) được chạy mỗi khung và ở kẻ thù cao chương trình bắt đầu chậm lại.chỉ đạo một khối lượng kẻ thù cùng một lúc
Khi chương trình của tôi chạy với chức năng này, kẻ thù dường như tạo thành đối tượng tròn tôi đặt biệt danh là một "cục bô". Các cụm có vẻ thường ecliptic nhưng thực sự có thể phức tạp hơn (không đối xứng) bởi vì khi người chơi di chuyển kẻ thù đang được kéo theo các hướng khác nhau. Tôi thích cách mà cụm này hoạt động, tuy nhiên tôi tự hỏi liệu có cách nào hiệu quả hơn để tính toán nó hay không. Hiện tại, mỗi kẻ thù trong các khối (thường là> 100) là lần đầu tiên di chuyển theo hướng của người chơi, và sau đó đẩy ra xa nhau. Nếu có thay vào đó là một cách để tính toán con số mà các khối tạo ra, và làm thế nào nó di chuyển nó sẽ tiết kiệm rất nhiều tính toán.
Tôi không chắc chắn cách tiếp cận vấn đề. Nó có thể được tính toán nơi biên giới của con số di chuyển, và sau đó mở rộng nó để đảm bảo khu vực vẫn giữ nguyên.
Ngoài hai chức năng của tôi hiện đang được sử dụng để di chuyển kẻ thù:
def moveEnemy(enemy, player, speed):
a = player.left-enemy.left
b = player.top-enemy.top
r = speed/math.hypot(a,b)
return enemy.move(r*a, r*b)
def clump(enemys):
for p in range(len(enemys)):
for q in range(len(enemys)-p-1):
a = enemys[p]
b = enemys[p+q+1]
if abs(a.left-b.left)+abs(a.top-b.top)<CLUMP:
xChange = (random.random()-.5)*CLUMP
yChange = ((CLUMP/2)**2-xChange**2)**.5
enemys[p] = enemys[p].move(int(xChange+.5), int(yChange + .5))
enemys[p+q+1] = enemys[p+q+1].move(-int(xChange+.5),-int(yChange+.5))
return enemys
Chỉnh sửa: một số ảnh chụp màn hình về cách thức lùm trông: http://imageshack.us/photo/my-images/651/elip.png/ http://imageshack.us/photo/my-images/ 832/newfni.png/
http://imageshack.us/photo/my-images/836/gamewk.png/
Các lùm vẻ là chủ yếu là một đối tượng tròn chỉ kéo dài (như một nhật thực nhưng có thể kéo dài trong nhiều hướng), tuy nhiên nó curre ntly có cạnh thẳng do kẻ thù hình chữ nhật.
Làm thế nào về mã cho phạm vi? Đó có phải là việc kiểm tra khoảng cách không? Điều đó có thể rất tốn kém cho một số lượng lớn các đơn vị. –
Ngoài ra, đừng làm điều này mỗi khung hình mà đúng hơn là mỗi khung hình X. Tôi đã giải quyết vấn đề tương tự này theo cách tương tự, tuy nhiên tôi đã cho phép chồng chéo lên nhau. Nó làm cho đám đông nhìn trông nguy hiểm hơn! –
Tùy thuộc vào chất lượng câu trả lời bạn nhận được ở đây, bạn cũng có thể muốn thử yêu cầu điều này trên http://gamedev.stackexchange.com/. –