2010-11-20 32 views
6

Tôi đang viết một trò chơi chữ và tôi cần một hệ thống chiến đấu đơn giản, như trong MUD, bạn phát lệnh và thỉnh thoảng "đánh dấu" xảy ra, khi tất cả các lệnh đó thực thi, người chơi và quái vật gây sát thương, tất cả các loại những thứ khác nhau xảy ra. Làm cách nào để triển khai khái niệm đó? Tôi đã nghĩ đến việc tạo một biến chứa thời gian đánh dấu cuối cùng, và một hàm chỉ đặt các sự kiện trên stack và khi đó là (time + x) thực hiện tất cả chúng một cách tương tự. Có bất kỳ biến thể dễ dàng hơn hoặc sạch hơn để làm điều đó?Làm thế nào để thực hiện động cơ đánh dấu đơn giản trong c + +?

Cú pháp có thể là gì?

double lastTickTime; 
double currentTime; 

void eventsPile(int event, int target) 
{ 
// how do i implement stack of events? And send them to execute() when time is up? 
} 

void execute(int event, int target) 
{ 
    if ((currentTime - lastTickTime) == 2) 
    { 
     eventsHandler(event, target); 
    }  
    else 
    { // How do I put events on stack? 
    } 
} 
+2

Những gì bạn có âm thanh tốt với tôi. –

+0

Tôi đã sử dụng cách tiếp cận đó trong quá khứ và nó hoạt động tốt, cho những gì nó có giá trị. –

+0

được cập nhật, cần trợ giúp thực hiện hoặc chỉ dẫn về nội dung cần đọc. – Dvole

Trả lời

1

Vấn đề với ngăn xếp hành động đơn giản là thứ tự các hành động có thể sẽ dựa trên thời gian - bất kỳ loại nào nhanh nhất sẽ tấn công lần truy cập đầu tiên. Bạn có lẽ nên giới thiệu các ưu tiên trong ngăn xếp, để ví dụ tất cả các sự kiện toàn cục kích hoạt trước, sau đó các sự kiện hành động của sinh vật, nhưng những sự kiện hành động đó được sắp xếp theo một số thuộc tính như sự nhanh nhẹn hoặc cấp độ. Nếu một sinh vật có sự nhanh nhẹn cao hơn thì nó sẽ là đòn tấn công đầu tiên.

+1

Điều đó nghe có vẻ cực kỳ phức tạp với tôi, tôi mới bắt đầu và đó là dự án lập trình đầu tiên của tôi – Dvole

-1

Sử dụng bộ đếm thời gian thực thi mỗi x ms (trong khi x là lần đánh dấu), thực hiện bất kỳ hành động nào được đặt trên ngăn xếp trong phương thức đó.

+0

... và đảm bảo rằng việc thực hiện các tác vụ không mất nhiều thời gian hơn so với thời lượng đánh dấu của bạn. –

0

Từ những gì tôi đã thấy, hầu hết các công cụ như vậy là sự kiện chứ không phải dựa trên thời gian. với một tick mới được kích hoạt một khoảng thời gian sau khi kết thúc tick cuối cùng. (do đó, chủ yếu tránh vấn đề của tick mất nhiều thời gian hơn khoảng thời gian)

Điều này cũng đơn giản hóa việc triển khai; bạn chỉ cần có vòng lặp trò chơi kích hoạt sự kiện tick, sau đó sleep s/yield giây trong khoảng thời gian yêu cầu. Đó là tầm thường.

Nó có thể được đơn giản hóa bằng cách lập mô hình thế giới dưới dạng cây, trong đó mỗi phần tử quản lý các sự kiện truyền bá (chẳng hạn như ticks) cho con cái của chúng. miễn là bạn tránh/quản lý 'vòng', điều này hoạt động tốt (tôi đã thực hiện nó).

này có hiệu quả làm giảm hệ thống tick một cái gì đó như thế này (psudocode):

while (isRunning) { 
    world->tick(); 
    sleep(interval); 
} 

Trong hầu hết các trường hợp, theres rất ít cần phải nhận được fancier hơn nhiều so với điều chỉnh độ dài của thời gian trước đó.

Bất kỳ hành động thực thể riêng lẻ nào sẽ là một phần trong hàng đợi hành động của riêng chúng và được xử lý trong các sự kiện "đánh dấu" của riêng chúng.

Thông thường lệnh của người dùng sẽ được chia thành các lệnh "ingame" và "meta", mọi thứ sẽ chỉ sửa đổi hàng đợi hành động của nhân vật, được xử lý trong lần đánh dấu tiếp theo, như bình thường đối với bất kỳ thực thể nào khác.

Chiến đấu đơn giản dựa theo tự nhiên từ nền tảng này. thời gian thực có thể được mô hình hóa với một phân chia tốt hơn của tick s, với tùy chọn 'tổng hợp thời gian'.

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