Nếu bạn đang đề cập đến màn hình rung lắc từ vụ nổ, tôi đã cố gắng thực hiện điều này trong trò chơi nguyên mẫu của mình (đó là 2d nhưng nên dịch sang 3d khá tốt, tôi mong đợi). Hãy xem video youtube và xem đó có phải là thứ bạn đang tìm kiếm không - màn hình rung bắt đầu khoảng 1:35
Dù sao, cách tôi đạt được là tạo ra một khung nhìn cho sceen và lưu trữ điểm trung tâm ( centre
).
Khi một vụ nổ bắt đầu, tôi tạo ngẫu nhiên radius
~ 30px. Sau đó, tôi bù lại khung nhìn từ centre
nhiều pixel theo hướng ngẫu nhiên.
Đối với mỗi lần cập nhật tiếp theo (giữa các lần rút ra màn hình), tôi giảm radius
10-20% và bù lại chế độ xem bằng nhiều pixel này từ centre
một lần nữa. Tuy nhiên, thay vì chọn một góc ngẫu nhiên cho phần bù này, thay vào đó tôi lấy góc nhìn trước đó từ centre
và thêm 180 +/- 60 độ cho nó.
Vì vậy, về cơ bản, mỗi bản cập nhật (hoặc 10-20ms hoặc hơn), tôi bù đắp cho chế độ xem bằng một số pixel giảm dần từ centre
màn hình.
Đây là một số mã giả:
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
}
Tôi thường dừng rung màn hình khi bán kính thấp hơn 2.0, tại thời điểm đó tôi đặt lại chế độ xem trở lại centre
.