Đầu tiên tôi sẽ giải thích nguyên tắc, sau đó là phần vẽ:
Trong ví dụ của tôi, tôi giả sử rằng bạn có giá trị tiến độ từ 0 đến 100 (%), mặc dù mọi thứ khác sẽ làm.
Trên một đường thẳng, vị trí hiện tại của thanh tiến trình sẽ chỉ đơn giản là giá trị tiến độ đó.
Trên một đường tròn bạn có được vị trí đó với lượng giác. Bất kỳ điểm nào trên một vòng tròn được đưa ra là:
point.x = r * cos(angle);
point.y = r * sin(angle);
Trong đó r là bán kính của đường tròn. Như bạn thấy, góc là biến duy nhất trong các phương trình đó. Điều đó có nghĩa là bằng cách nào đó bạn phải tích hợp tiến trình của mình vào góc độ.
Giải pháp rất đơn giản: Một "chạy" xung quanh vòng tròn bằng 2 * Pi (hoặc 360 độ). Bạn phải chia khoảng cách đó thành 100 phần nhỏ hơn, để khi giá trị tiến độ là 100, giá trị bên trong cos () và sin () là 2 * pi (hoặc 360 độ).
Bạn đạt được điều đó bằng cách chia 2 * pi (hoặc 360 độ) cho 100 và nhân nó với tiến trình:
float step = 2*pi/100;
point.x = r * cos(progress * step);
point.y = r * sin(progress * step);
Bây giờ đến phần vẽ.
Tôi không biết gì về Actioncript3 (hoặc Flash, vì vấn đề đó), vì vậy tôi không thể cho bạn biết các quy trình chính xác, nhưng nói chung sẽ có hai cách để làm điều này:
Đầu tiên, và (theo ý kiến của tôi dễ dàng hơn cho cả hai): Vẽ vòng tròn một phần theo cách thủ công chỉ đơn giản là kết nối các đường màu với độ dày nhất định (nếu bạn không cần họa tiết trên đó và đủ màu đơn giản) hoặc vẽ khoanh tròn như một kết nối của quads kết cấu (nếu bạn cần kết cấu).
Thứ hai: Bạn vẽ một bức tranh đại diện cho vòng tròn được tải đầy đủ của bạn và tải nó dưới dạng kết cấu, đặt nó vào một hình tứ giác và hiển thị nó. Sau đó, bạn lại tự vẽ một vòng tròn một phần trên hình tứ giác đó và chỉ hiển thị phần của hình tứ giác có kết cấu trong đó hình tròn được hiển thị ở phía trước nó. Ví dụ, trong OpenGL, bạn có thể dễ dàng thực hiện việc này bằng cách sử dụng bộ đệm stpson.
Nếu bạn muốn biết cách tính các điểm khác nhau trên vòng tròn của mình để sử dụng chúng để lắp ráp các đa giác / đường cần thiết, bạn có thể xem lại các phương trình trên:
point.x = r * cos(angle);
point.y = r * sin(angle);
Ví dụ, bạn có thể chạy những cái trong vòng lặp for chạy từ 0 đến tiến trình hiện tại của bạn, nếu đó là một vòng tròn bao gồm một loạt các dấu chấm được kết nối (theo cú pháp c ++):
float granularity = 2*PI/required_granularity; //determines how smooth your circle will look
float step = 2*PI/100.0f;
list<Vector2> points; //list of all the calculated points
for(float angle=0; angle < progress*step; angle += granularity)
{
Vector2 point(radius*cos(angle), radius*sin(angle));
points.push_back(point); //adds the point to the list
}
Bây giờ tất cả các điểm này sẽ được tập trung vào nguồn gốc của hệ tọa độ của bạn, vì vậy bạn cần di chuyển chúng đến bất kỳ vị trí nào mà bạn muốn vòng tròn của mình ở đó. Nhưng tôi nghĩ bạn có thể tự mình tìm ra điều đó: P