หากคุณอ้างถึงหน้าจอสั่นสะเทือนจากการระเบิดฉันได้ลองใช้มันในเกมต้นแบบของฉัน (มันเป็น 2d แต่ควรแปลเป็น 3d ค่อนข้างดีฉันคาดหวัง) ลองดูที่วิดีโอ youtubeและดูว่าเป็นสิ่งที่คุณกำลังมองหาหรือไม่หน้าจอสั่นเตะออกประมาณ 1:35
อย่างไรก็ตามวิธีที่ฉันประสบความสำเร็จก็คือการสร้างวิวพอร์ตสำหรับ sceen และเก็บจุดศูนย์กลาง ( centre
)
เมื่อการระเบิดเริ่มต้นขึ้นฉันสร้างแบบสุ่มradius
~ 30px จากนั้นฉันจะชดเชยวิวพอร์ตจากcentre
พิกเซลจำนวนมากนี้ในทิศทางแบบสุ่ม
สำหรับการอัปเดตแต่ละครั้งในภายหลัง (ระหว่างการดึงหน้าจอ) ฉันลดลงradius
10-20% และชดเชยวิวพอร์ตด้วยพิกเซลจำนวนมากนี้จากcentre
อีกครั้ง อย่างไรก็ตามแทนที่จะเลือกมุมสุ่มสำหรับออฟเซ็ตนี้ฉันแทนมุมมองก่อนหน้าของมุมมองจากcentre
และเพิ่ม 180 +/- 60 องศา
ดังนั้นโดยทั่วไปการอัปเดตแต่ละครั้ง (หรือ 10-20ms หรือมากกว่านั้น) ฉันชดเชยออฟเซ็ตวิวด้วยจำนวนพิกเซลที่ลดลงจาก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
จุดที่ผมตั้งค่าวิวพอร์ตกลับไป