Notes
Old implementation
Problem & Proposed solution
- Satu objek yang mengurus semua room yang cukup bermasalah untuk pengembangan dengan room yang sangat banyak
- Setelah melakukan static analysis ada beberapa code yang duplikat dan tidak konsisten
- Expensive list allocation for only a single use every single step… twice…
- Dari penjelasan diatas sensor merah hanya berlaku untuk pergerakan horizontal dan tidak ada hadler untuk vertical (Y langsung ditembak ke Y)
old code
Code
if(!instance_exists(obj_slowmo_parent)){
//Update destination
if(instance_exists(v_following) and v_following != self){
if(global.var_player2_character != 0 and instance_exists(obj_player) and !instance_exists(obj_cutscene_camera) and follow_not_hero = false){
if(global.one_offthe_player_is_dead = false){
_list = ds_list_create()
for (var _i = 0; _i < instance_number(obj_player); ++_i){
_list[|_i] = instance_find(obj_player,_i);
}
for (var _i = 0;_i < ds_list_size(_list); _i++){
if(_list[|_i].v_state = HUMANSTATE.COMEBACK){
global.one_offthe_player_is_dead = true
}
}
xTo = (_list[|0].x + _list[|1].x)/2
yTo = (_list[|0].y + _list[|1].y)/2
invis_wall_kanan.x = x+view_w_half + 35
invis_wall_kiri.x = x-view_w_half - 35
}
if(global.one_offthe_player_is_dead = true){
if(instance_exists(invis_wall_kanan)) instance_destroy(invis_wall_kanan)
if(instance_exists(invis_wall_kiri)) instance_destroy(invis_wall_kiri)
var _list = ds_list_create()
for (var _i = 0; _i < instance_number(obj_player); ++_i){
_list[|_i] = instance_find(obj_player,_i);
}
for (var _i = 0;_i < ds_list_size(_list); _i++){
if(_list[|_i].v_state != HUMANSTATE.DEAD and _list[|_i].v_state != HUMANSTATE.COMEBACK){
v_following = _list[|_i]
}
}
if (v_following.x > x+var_tetapan)
{
xTo = v_following.x - var_tetapan
}
if (v_following.x < x-var_tetapan)
{
xTo = v_following.x + var_tetapan
}
yTo = v_following.y;
}
}else{
if (v_following.x > x+var_tetapan)
{
xTo = v_following.x - var_tetapan
}
if (v_following.x < x-var_tetapan)
{
xTo = v_following.x + var_tetapan
}
yTo = v_following.y;
}
}
//update object position
x += (xTo - x ) / pembagi_x;
y += (yTo - y) / pembagi_y;
x = clamp(x,v_batas_kiri_cam+buff,v_batas_kanan_cam-buff);
y = clamp(y,v_batas_atas_cam,v_batas_bawah_cam);
} else {
if(obj_slowmo_parent.vs_animasi < 2){
if(instance_exists(target)){
if (target.x > x)
{
xTo = target.x
}
if (target.x < x)
{
xTo = target.x
}
yTo = target.y + target.v_z
}
//update object position
x += (xTo - x ) / pembagi_x;
y += (yTo - y) / pembagi_y*5;
x = clamp(x,v_batas_kiri_cam+buff-view_w_half,v_batas_kanan_cam-buff+view_w_half);
y = clamp(y,view_h_half+buff,room_height-view_h_half-buff);
}
if(obj_slowmo_parent.vs_animasi = 2){
xTo = x_zoom_out
yTo = y_zoom_out
//update object position
x += (xTo - x ) / pembagi_x/5;
y += (yTo - y) / pembagi_y*5;
x = clamp(x,v_batas_kiri_cam+buff,v_batas_kanan_cam-buff);
y = clamp(y,view_h_half+buff,room_height-view_h_half-buff);
}
}
//screen shake
x += random_range(-shake_remain,shake_remain);
y += random_range(-shake_remain,shake_remain);
shake_remain = max(0,shake_remain-((1/shake_length)*shake_magnitude));
//Update view
camera_set_view_pos(view_camera[0],x-view_w_half,y-view_h_half)
//camera_set_view_size(view_camera[0],o_display_init.ideal_width,o_display_init.ideal_height)
camera_set_view_size(view_camera[0],width_size,height_size)
//surface_resize(application_surface,width_size,height_size)
//display_set_gui_size(display_get_gui_width(),display_get_gui_height())
//display_set_gui_size(1280,720)
Review
Ini tidak bisa digunakan untuk 3 player
xTo = (_list[|0].x + _list[|1].x)/2
yTo = (_list[|0].y + _list[|1].y)/2
weird conditioning
if(global.one_offthe_player_is_dead = false){
...
}
if(global.one_offthe_player_is_dead = true){
...
}
better use event based to inform there is new state
for (var _i = 0;_i < ds_list_size(_list); _i++){
if(_list[|_i].v_state = HUMANSTATE.COMEBACK){
global.one_offthe_player_is_dead = true
}
}
Huh 3 DIFFERENT way of CLAMPING?
...
//update object position
x += (xTo - x ) / pembagi_x;
y += (yTo - y) / pembagi_y;
x = clamp(x,v_batas_kiri_cam+buff,v_batas_kanan_cam-buff);
y = clamp(y,v_batas_atas_cam,v_batas_bawah_cam);
} else {
if(obj_slowmo_parent.vs_animasi < 2){
...
//update object position
x += (xTo - x ) / pembagi_x;
y += (yTo - y) / pembagi_y*5;
x = clamp(x,v_batas_kiri_cam+buff-view_w_half,v_batas_kanan_cam-buff+view_w_half);
y = clamp(y,view_h_half+buff,room_height-view_h_half-buff);
}
if(obj_slowmo_parent.vs_animasi = 2){
...
//update object position
x += (xTo - x ) / pembagi_x/5;
y += (yTo - y) / pembagi_y*5;
x = clamp(x,v_batas_kiri_cam+buff,v_batas_kanan_cam-buff);
y = clamp(y,view_h_half+buff,room_height-view_h_half-buff);
}
}