ฉันจะทำสิ่งที่ฉันแฟลช / กะพริบบ่อยขึ้นเมื่อมันเข้าใกล้หายไปได้อย่างไร


10

ในเกมของฉันเมื่อคุณฆ่าศัตรูพวกเขาอาจทิ้งอะไรบางอย่างเช่นชุดสุขภาพหรือทอง ฉันต้องการให้สิ่งนี้มีเวลา จำกัด เพื่อที่ว่ามันจะหายไปในที่สุดหากคุณไม่มารับ ฉันต้องการให้ไอเท็มกระพริบบ่อยครั้งยิ่งการเข้าใกล้ "ความตาย" ใกล้เคียงยิ่งขึ้น คุณทำอัลกอริธึม "กะพริบบ่อยขึ้น" ได้อย่างไร

คำตอบ:


2

ความกังวลของฉันกับวิธีการอย่างใดอย่างหนึ่งที่เสนอในปัจจุบันคือพวกเขาทั้งสองจะนำไปสู่ ​​'ความเร็วตัวแปร' กะพริบซึ่งไม่เพียง แต่จะทำให้เสียสมาธิสำหรับผู้เล่น แต่ยังทำให้ยากที่จะประเมินว่าวัตถุมีเวลานานเท่าใดก่อนที่มันจะหายไป . แต่บางแห่งในพารามิเตอร์ของคุณ (ไม่ว่าจะเป็นระดับโลกสำหรับการแสดงผลหรือบนพื้นฐานต่อวัตถุ) ฉันจะมีสี่ค่าคงที่: slowBlinkTime, slowBlinkRate, และfastBlinkTime fastBlinkRateเมื่อการแสดงผลถ้าชีวิตที่เหลืออยู่ของวัตถุของคุณน้อยกว่าfastBlinkTimeแล้วกระพริบตาได้ที่fastBlinkRate; มิฉะนั้นถ้ามันน้อยกว่าแล้วกระพริบตาได้ที่slowBlinkTime slowBlinkRateถ้าคุณอยากจะไปขั้นตอนต่อไปแล้วคุณอาจจะมีอาร์เรย์ของที่แตกต่างกันblinkTimeและblinkRateและตรวจสอบพวกเขาทีละคน แต่ในทางปฏิบัติมันน่าจะเกินกำลังและแค่มี 'คำเตือน' และ 'ที่สำคัญ' ก็น่าจะเพียงพอแล้ว รหัสจะมีลักษณะดังนี้:

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
}

โปรดทราบว่ารหัสนี้อนุมานวงจรการกะพริบครึ่งครึ่งและครึ่ง (นั่นคือสิ่งที่แสดงให้เห็น0.5fในการทดสอบ) แต่สามารถปรับเปลี่ยนได้อย่างง่ายดายสำหรับบางอย่างเช่นสองในสามเปิดหนึ่งในสามออกเพียงแค่ปรับค่าคงที่ที่เหมาะสม สิ่งนี้ยังไม่ทำอะไรเลยเพื่อ 'ซิงโครไนซ์' กระพริบระหว่างรัฐที่เร็วและช้า แต่นั่นค่อนข้างตรงไปตรงมาที่จะขัด

สิ่งนี้ควรตรงไปตรงมาเพื่อเสียบและจะมีประโยชน์มาก IMHO ที่ผู้เล่นจะสามารถเห็นสวิตช์จาก 'ช้า' เป็น 'เร็ว' กะพริบและรู้ว่าพวกเขาได้ทิ้งนานแค่ไหน ฉันจะเริ่มต้นด้วยค่าพารามิเตอร์เช่น 5s สำหรับslowBlinkTimeและ 0.5s สำหรับslowBlinkRateและ 2s / 0.25s สำหรับfastBlinkTimeและfastBlinkRateแต่นั่นขึ้นอยู่กับเกมของคุณโดยเฉพาะ


ฉันไม่เข้าใจ หากการกระพริบเร็วขึ้นและเร็วขึ้นนั่นจะไม่ใช่มาตรวัดที่ดีกว่าหรือว่าจะเหลือวัตถุเพียงแค่ 2 โหมดเท่านั้นใช่หรือไม่
Daniel Kaplan

1
@tietyT ปัญหาคือโดยเฉพาะอย่างยิ่งเมื่ออัตราการกะพริบเป็นตัวแปรมันยากสำหรับผู้ใช้ในการ (ก) กำหนดว่าวัตถุจะกระพริบเร็วแค่ไหนและ (b) มีความสัมพันธ์กับว่ามันจะมีชีวิตอยู่อีกนานเท่าใด ลองนึกภาพว่ามีตัวเลื่อนจาก 0 ถึง 100 กับ 'สวิตช์' ที่มีตำแหน่งที่ 0, 50 และ 100 ผู้คนอาจเดาได้ว่าค่าของแถบเลื่อนอยู่ที่ประมาณ 5-10% แต่พวกเขาจะรู้ได้อย่างชัดเจนว่าสวิตช์เปิดอยู่ - และมันยากกว่าที่จะวัดอัตรากว่าตำแหน่ง
Steven Stadnicki

แม้จะมีสิ่งที่ให้คะแนนแนะนำฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด นอกจากนี้ยังเป็นวิธีที่ง่ายต่อการใช้งาน (อย่างน้อยแนวคิด) คำตอบของฉันได้รับการโหวตมากขึ้น แต่ฉันก็ยังไม่พอใจกับการมองเห็น วิธีการของคุณจะให้รูปลักษณ์ที่น่าพอใจ
Daniel Kaplan

14

ถ้า t ลดลงจาก T เป็น 0 คุณสามารถใช้บางอย่างเช่นบาป ((T - t) ²) ถ้าจำนวนนั้น> 0 คุณวาดวัตถุถ้ามันเป็น <0 คุณไม่ได้


ฉันลองสิ่งนี้ด้วยตัวเองและฉันต้องใช้มันด้วย สำหรับฉัน T คือ 100 สมการนี้ทำให้ทุกอย่างกระพริบเร็วตลอดเวลา ดังนั้นเพื่อให้ช้าลงฉันเปลี่ยนสมการเป็นบาป (((T - t) / 10) ²) นี่เป็นหลังจากทำการแก้ไขด้วยตัวเลขเช่น / 6 และ / 7

ฉันก็ลองทำเช่นนี้: sin ((T - t) ² * 1/100)

แล้วฉันก็ไม่ชอบที่การล่องเรือดูเหมือนจะล่องหนเกือบเท่าที่มองเห็น ฉันอยากให้มองไม่เห็น ฉันทำได้โดยทำสิ่งนี้: sin ((T - t) ² * 1/100) + .5 นั่น + .5 เลื่อนไซน์ "เส้น" ขึ้นเพื่อไม่ให้กลายเป็น <0 บ่อยเท่าที่ควร

สิ่งนี้ไม่เป็นไปตามที่ฉันต้องการ ปัญหาคือว่าการกะพริบจะเริ่มเร็วเกินไป ฉันต้องการให้การตกปรากฏเป็นเวลา 3 วินาทีจากนั้นเริ่มกระพริบ เพื่อให้บรรลุผลนั้นฉันได้ทำสิ่งนี้:

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

นั่นxจะเป็น 3 วินาที

สิ่งที่ควรสังเกตก็คือเครื่องมือนี้เป็นเครื่องมือที่ฉันใช้ตลอดเวลาในการมองภาพว่าการกะพริบของหน้าตาเป็นอย่างไร ฉันคิดว่าสิ่งนี้จะใช้เวลานานขึ้น 5 เท่าโดยไม่มีเครื่องมือแสดงผล


สุดยอดฉันชอบวิธีนี้วิธีอื่น ๆ ที่ทำได้sin(t * pow((t/T), 1.5))
Gustavo Maciel

4

บางทีด้วยความช่วยเหลือของตัวแปรอื่น?

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

มันยาวกว่าโซลูชันที่คุณเสนอให้ตัวเอง แต่คุณประหยัดค่าใช้จ่ายsinและpowการดำเนินการได้มากขึ้นและคุณสามารถควบคุมได้มากขึ้นว่าการกะพริบของจะเร็วขึ้นอย่างไร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.