यदि आप एक विस्फोट से उस जज स्क्रीनिंग शेक का उल्लेख कर रहे हैं, तो मैंने इसे अपने प्रोटोटाइप गेम में लागू करने की कोशिश की है (यह 2 डी है लेकिन मुझे 3 डी में अच्छी तरह से अनुवाद करना चाहिए, मुझे उम्मीद है)। यूट्यूब वीडियो पर एक नज़र डालें और देखें कि क्या आप देख रहे हैं - स्क्रीन शेक लगभग 1:35 बंद है
वैसे भी, मैंने जिस तरह से इसे हासिल किया वह था, सेंस के लिए एक व्यूपोर्ट बनाना और केंद्र बिंदु ( centre
) को स्टोर करना ।
जब एक विस्फोट बंद होता है, तो मैं radius
~ 30px का एक यादृच्छिक बनाता हूं । मैं फिर centre
एक यादृच्छिक दिशा में इस कई पिक्सेल से व्यूपोर्ट को ऑफसेट करता हूं ।
प्रत्येक बाद के अपडेट के लिए (स्क्रीन पर ड्रॉ के बीच), मैं radius
10-20% कम कर देता हूं और centre
फिर से इस कई पिक्सल के व्यूपोर्ट को ऑफसेट करता हूं । हालांकि, इस ऑफसेट के लिए एक यादृच्छिक कोण चुनने के बजाय, मैं इसके बजाय पिछले व्यूपोर्ट कोण को लेता हूं centre
और इसमें 180 +/- 60 डिग्री जोड़ दिया।
इसलिए मूल रूप से, प्रत्येक अपडेट (या 10-20 सेमी या तो), मैं centre
स्क्रीन से पिक्सेल की कम संख्या से व्यूपोर्ट को ऑफसेट करता हूं ।
यहाँ कुछ छद्मकोश हैं:
viewportCentre = (400,300) //Lets say screen size is 800 x 600
radius = 30.0
randomAngle = rand()%360
offset = ( sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) // set centre of viewport
draw()
while(true) //update about every 10-20ms
{
radius *=0.9 //diminish radius each frame
randomAngle +=(180 +\- rand()%60) //pick new angle
offset = (sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) //set centre of viewport
draw() //redraw
}
जब त्रिज्या 2.0 से कम हो जाता है, तो मैं आमतौर पर स्क्रीन शेक को रोक देता हूं, जिस बिंदु पर मैं व्यूपोर्ट को वापस रीसेट करता हूं centre
।