Làm cách nào để tạo ra thứ gì đó tôi flash / nháy thường xuyên hơn khi nó gần biến mất?


10

Trong trò chơi của tôi khi bạn tiêu diệt kẻ thù, chúng có thể làm rơi thứ gì đó như gói sức khỏe hoặc vàng. Tôi muốn điều này có giới hạn thời gian để cuối cùng nó biến mất nếu bạn không nhặt nó lên. Tôi muốn vật phẩm này nhấp nháy thường xuyên hơn khi càng gần "cái chết". Làm thế nào để bạn thực hiện thuật toán "nhấp nháy thường xuyên hơn"?

Câu trả lời:


2

Mối quan tâm của tôi với một trong hai cách tiếp cận hiện được đưa ra là cả hai sẽ dẫn đến nháy mắt 'tốc độ biến đổi', điều này không chỉ gây mất tập trung cho người chơi mà còn khiến người ta khó có thể đánh giá chính xác thời gian một vật thể còn lại trước khi nó biến mất . Thay vào đó, ở đâu đó trong các thông số của bạn (cho dù họ có tính toàn cầu cho các renderer hoặc trên một cơ sở cho mỗi đối tượng) Tôi sẽ có bốn hằng số: slowBlinkTime, slowBlinkRate, fastBlinkTimefastBlinkRate. Khi kết xuất, nếu tuổi thọ còn lại của đối tượng của bạn nhỏ hơn fastBlinkTime, thì hãy nhấp nháy nó fastBlinkRate; nếu không thì ít hơn slowBlinkTime, sau đó nháy mắt với nó slowBlinkRate. Nếu bạn muốn tiến thêm một bước thì bạn có thể có một loạt các blinkTimes vàblinkRates và kiểm tra từng cái một, nhưng trong thực tế có khả năng là quá mức cần thiết và chỉ cần có các trạng thái 'cảnh báo' và 'quan trọng' là đủ. Mã sẽ trông giống như thế này:

float blinkCycle;
if ( entity.timeLeft < fastBlinkTime ) {
  blinkCycle = entity.timeLeft/fastBlinkRate;
} else if ( entity.timeLeft < slowBlinkTime ) {
  blinkCycle = entity.timeLeft/slowBlinkRate;
}
blinkCycle = blinkCycle - floor(blinkCycle); // find blinkCycle 'mod 1'
if ( (entity.timeLeft < slowBlinkTime) && (blinkCycle < 0.5f) ) {
  renderBlinked(entity); // this should be the 'blinked' state, whether flashed or missing
} else {
  renderNormal(entity); // the normal render for the entity
}

Lưu ý rằng mã này giả sử chu kỳ chớp mắt nửa bật, nửa tắt (đó là những gì 0.5ftrong bài kiểm tra thể hiện), nhưng có thể dễ dàng được điều chỉnh cho một cái gì đó như hai phần ba, một phần ba chỉ bằng cách điều chỉnh hằng số thích hợp. Điều này cũng không làm gì để 'đồng bộ hóa' nhấp nháy giữa trạng thái nhanh và chậm, nhưng điều đó tương đối đơn giản để đánh bóng.

Điều này rất đơn giản để cắm vào và nó sẽ có lợi thế đáng kể cho IMHO khi người chơi có thể thấy chuyển đổi từ 'chậm' sang 'nhanh' và biết chính xác họ còn bao lâu. Tôi sẽ bắt đầu với các giá trị tham số như 5s cho slowBlinkTimevà 0,5 slowBlinkRategiây và 2 giây / 0,25 cho fastBlinkTimefastBlinkRate, nhưng điều đó hoàn toàn phụ thuộc vào trò chơi cụ thể của bạn.


Tôi không hiểu Nếu chớp mắt ngày càng nhanh hơn, đó có phải là thước đo tốt hơn để biết chính xác đối tượng còn lại bao lâu không chỉ 2 chế độ?
Daniel Kaplan

1
@tieTYT Vấn đề là, đặc biệt là khi tốc độ chớp mắt thay đổi, người dùng khó có thể (a) xác định chính xác tốc độ của một vật thể nhấp nháy và (b) tương quan với thời gian tồn tại của nó. Hãy tưởng tượng có một thanh trượt từ 0 đến 100 so với 'công tắc' với các vị trí ở 0, 50 và 100; mọi người có thể đoán giá trị của thanh trượt trong vòng 5-10%, nhưng họ sẽ biết chính xác giá trị của công tắc được bật - và việc đánh giá tỷ lệ so với vị trí khó hơn nhiều.
Steven Stadnicki

Mặc dù những gì phiếu bầu gợi ý, tôi nghĩ đây là câu trả lời tốt nhất. Ngoài ra, cách dễ dàng hơn để thực hiện (ít nhất là về mặt khái niệm). Câu trả lời của tôi nhận được nhiều phiếu hơn, nhưng tôi vẫn không hài lòng với nó. Cách tiếp cận của bạn sẽ cho một cái nhìn thỏa mãn.
Daniel Kaplan

14

Nếu t giảm từ T xuống 0, bạn có thể sử dụng thứ gì đó như sin ((T - t) ²) thì nếu số đó> 0 bạn vẽ đối tượng, nếu đó là <0 bạn không


Tôi đã thử điều này bản thân mình và tôi đã phải sửa chữa nó. Đối với tôi T là 100. Phương trình này làm cho mọi thứ nhấp nháy siêu nhanh toàn bộ thời gian. Vì vậy, để làm chậm nó, tôi đã thay đổi phương trình thành sin (((T - t) / 10) ²). Điều này là sau khi mày mò xung quanh với các số như / 6 và / 7.

Tôi cũng đã thử điều này: sin ((T - t) ² * 1/100)

Và sau đó tôi không thích làm thế nào sự sụt giảm dường như vô hình nhiều như nó có thể nhìn thấy. Tôi muốn nó hiếm khi vô hình. Tôi đã hoàn thành điều đó bằng cách thực hiện điều này: sin ((T - t) ² * 1/100) + .5 Điều đó + .5 làm dịch chuyển "đường thẳng" hình sin lên để nó không trở thành <0 như thường lệ.

Không ai trong số này làm việc chính xác theo cách tôi muốn. Vấn đề là chớp mắt sẽ bắt đầu quá sớm. Tôi muốn thả có thể nhìn thấy trong 3 giây và sau đó bắt đầu nhấp nháy. Để thực hiện điều đó, tôi đã làm một cái gì đó như thế này:

isVisible(drop)
  if drop.t > x
    return true
  else
    sin((T - x - drop.t * 1/100) + .5 >= 0

Đó xsẽ là 3 giây.

Cũng đáng chú ý là đây là công cụ tôi đã sử dụng toàn bộ thời gian để hình dung ra cách nhấp nháy sẽ trông như thế nào. Tôi nghĩ rằng điều này sẽ mất 5 lần lâu hơn mà không có công cụ trực quan.


Tuyệt vời, tôi thích giải pháp này, Một cách nhanh chóng khác sẽ được thực hiệnsin(t * pow((t/T), 1.5))
Gustavo Maciel

4

Có thể với sự giúp đỡ của một biến khác?

current_length = 4
length_decrease = 0.5
current_time = current_length

function update(delta_time)
    if current_time > 0 then
        draw()
    end
    current_time -= delta_time
    if current_time < -current_length then
        current_length -= length_decrease -- feel free to get creative here
        if current_length < 0 then
            disable_object()
        end
        current_time += current_length * 2
    end
end

Nó dài hơn một chút so với giải pháp bạn tự đề xuất, nhưng bạn tiết kiệm chi phí sinpowhoạt động của mình và bạn có nhiều quyền kiểm soát hơn đối với việc chớp mắt diễn ra nhanh hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.