- Мне больше нравиться управление top-down шутерами 'стрелки = вектор направления', все по-началу пытался улететь вверх зажав UP.
- С мышкой не так и много возни.
- Умудрился потерять корабль-базу, а она сама похожа на часть фона.
- Никакого ориентира нету, непонятно на сколько улетел вперед или назад, я бы советовал смещать звезды-фон относительно объектов переднего плана - имитации глубины.
- В меню нужно вчитываться, я не понял сразу (первые 10 сек) как полетать - кнопку ОТБЫТЬ нужно как-то выделить.
Коменты по коду.
Зачем иметь угол поворота у всего? Сложне вычисления. Ты на такт игры дофига Math.sin и Math.cos вызываешь. Лучше иметь вектор направления, чем угол направления. Именно для "пулек". И код будет короче.
bullets[i].x+=bullets[i].speed*Math.cos(bullets[i].angle*Math.PI/180);
bullets[i].y+=bullets[i].speed*Math.sin(bullets[i].angle*Math.PI/180);
bullets[i].x_c+=bullets[i].speed*Math.cos(bullets[i].angle);
bullets[i].y_c+=bullets[i].speed*Math.sin(bullets[i].angle);
станет
bullets[i].x+=bullets[i].speed*bullets[i].dir.x;
bullets[i].y+=bullets[i].speed*bullets[i].dir.y;
bullets[i].x_c+=bullets[i].speed*bullets[i].dir.x;
bullets[i].y_c+=bullets[i].speed**bullets[i].dir.x; --//это я не понял на какой фиг
Собственно и это станет легче.
if ((player.x-mov_x>384 && camera_c==0) || (player.x-mov_x>518 && camera_c==1)) mov_x+=Math.abs(player.speed*Math.cos(player.angle*Math.PI/180));
if ((player.y-mov_y>284 && camera_c==0) || (player.y-mov_y>368 && camera_c==1)) mov_y+=Math.abs(player.speed*Math.sin(player.angle*Math.PI/180));
if ((player.x-mov_x<384 && camera_c==0) || (player.x-mov_x<250 && camera_c==1)) mov_x-=Math.abs(player.speed*Math.cos(player.angle*Math.PI/180));
if ((player.y-mov_y<284 && camera_c==0) || (player.y-mov_y<200 && camera_c==1)) mov_y-=Math.abs(player.speed*Math.sin(player.angle*Math.PI/180));
Комент по этому куску: УБЕРИ численные границы координат из условий, непонятно как они взялись вообще, , а то авто-резайз окна поломает все и долго искать глюки будешь.
Код состоит только из
If, switch и чисел-костант (90% всей математики, без рисования) - плохо..
Пример:
if ((player.x-mov_x>384 && camera_c==0) || (player.x-mov_x>518 && camera_c==1)) mov_x+=Math.abs(player.speed*Math.cos(player.angle*Math.PI/180));
if ((player.y-mov_y>284 && camera_c==0) || (player.y-mov_y>368 && camera_c==1)) mov_y+=Math.abs(player.speed*Math.sin(player.angle*Math.PI/180));
if ((player.x-mov_x<384 && camera_c==0) || (player.x-mov_x<250 && camera_c==1)) mov_x-=Math.abs(player.speed*Math.cos(player.angle*Math.PI/180));
if ((player.y-mov_y<284 && camera_c==0) || (player.y-mov_y<200 && camera_c==1)) mov_y-=Math.abs(player.speed*Math.sin(player.angle*Math.PI/180));
if (mov_x<0) mov_x=0;
if (mov_y<0) mov_y=0;
if (mov_y>7626) mov_y=7626;
if (mov_x>7426) mov_x=7426;
if (player.x<0) player.x=0;
if (player.y<0) player.y=0;
if (player.x>8192) player.x=8192;
if (player.y>8192) player.y=8192;
if (player.xp>=player.lvl*(player.lvl*30)) player.lvl++;
if (player.arm_hp<=0) player.arm_hp=0;
ИЗ-ЗА этого тебе трудно внести небольшие изменения в код, например обрабоку нажатий мышкой.
а draw() вообще индус-код с const-string (прямой текст в методах).
ctxMap.fillText("Прочность: "+ships[ships_shop_p].hp,16,106);
ctxMap.fillText("Макс. скорость: "+ships[ships_shop_p].speed*100+" м/с",16,130);
ctxMap.fillText("Скорость поворота: "+ships[ships_shop_p].speed_turn*60+" град/с",16,154);
ctxMap.fillText("Доступно с уровня: "+ships[ships_shop_p].lvl,16,178);
ctxMap.fillText("Цена: "+ships[ships_shop_p].cost,16,202);
Советовал бы сделать класс-меню, а не городить огород, а то что бы пункт добавить, то нужно в 10 местах править.
Ну а так неплохо для начала.