res.sendFile('/путь/до/файла/имяфайла');
res.redirect('remote.server/test.img');
<spoiler title=""><code lang="javascript">
тут вставить код
</code></spoiler>
$.Bullet = function(opt) {
for (var k in opt) {
this[k] = opt[k];
}
this.enemiesHit = [];
this.inView = 0;
$.particleEmitters.push(new $.ParticleEmitter({
x: this.x,
y: this.y,
count: 1,
spawnRange: 1,
friction: 0.75,
minSpeed: 2,
maxSpeed: 10,
minDirection: 0,
maxDirection: $.twopi,
hue: 0,
saturation: 0
}));
};
/*==============================================================================
Update
==============================================================================*/
$.Bullet.prototype.update = function(i) {
/*==============================================================================
Apply Forces
==============================================================================*/
this.x += Math.cos(this.direction) * (this.speed * $.dt);
this.y += Math.sin(this.direction) * (this.speed * $.dt);
this.ex = this.x - Math.cos(this.direction) * this.size;
this.ey = this.y - Math.sin(this.direction) * this.size;
/*==============================================================================
Check Collisions
==============================================================================*/
var ei = $.enemies.length;
while (ei--) {
var enemy = $.enemies[ei];
if ($.util.distance(this.x, this.y, enemy.x, enemy.y) <= enemy.radius) {
if (this.enemiesHit.indexOf(enemy.index) == -1) {
$.particleEmitters.push(new $.ParticleEmitter({
x: this.x,
y: this.y,
count: Math.floor($.util.rand(1, 4)),
spawnRange: 0,
friction: 0.85,
minSpeed: 5,
maxSpeed: 12,
minDirection: (this.direction - $.pi) - $.pi / 5,
maxDirection: (this.direction - $.pi) + $.pi / 5,
hue: enemy.hue
}));
this.enemiesHit.push(enemy.index);
enemy.receiveDamage(ei, this.damage);
if (this.enemiesHit.length > 3) {
$.bullets.splice(i, 1);
}
}
if (!this.piercing) {
$.bullets.splice(i, 1);
}
}
}
/*==============================================================================
Lock Bounds
==============================================================================*/
if (!$.util.pointInRect(this.ex, this.ey, 0, 0, $.ww, $.wh)) {
$.bullets.splice(i, 1);
}
/*==============================================================================
Update View
==============================================================================*/
if ($.util.pointInRect(this.ex, this.ey, -$.screen.x, -$.screen.y, $.cw, $.ch)) {
this.inView = 1;
} else {
this.inView = 0;
}
};
/*==============================================================================
Render
==============================================================================*/
$.Bullet.prototype.render = function(i) {
if (this.inView) {
$.ctxmg.beginPath();
$.ctxmg.moveTo(this.x, this.y);
$.ctxmg.lineTo(this.ex, this.ey);
$.ctxmg.lineWidth = this.lineWidth;
$.ctxmg.strokeStyle = this.strokeStyle;
$.ctxmg.stroke();
}
};
Почему-то при добавлении кода:
const Vector = window.libs.Vector;
Вся игра перестаёт работать.
<script src="js/vector.js" type="text/javascript" charset="utf-8"></script>
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
class Array {
public:
Array(int length){
length = length;
// выделяет память
if(length>0){
arr = (int*)std::malloc(length*sizeof(int));
}
}
// деструктор
~Array(){
// освобождает выделеную память
std::free(arr);
}
// метод добавления нового значения в конец массива
void push(int value){
length++;
arr = (int*) realloc (arr, length * sizeof(int));
arr[length - 1] = value;
}
// в идеале в этот клас также надо добавить методы:
// int pop(void) - вынимает из массива последнее значение
// void unshift(int value) - добавляет новое значение в начало массива
// int shift(void) - вынимает из массива первое значение
// int length(void) - возвращает длинну массива
// а также итерационные функции, которые в цикле проходят все элементы массива вызывая для каждого callback функцию
// Array* forEach(void (*callback)(int, int)) - функциональный аналог for
// Array* map(int (*callback)(int, int)) - заменяет значение каждого элемента на значение возвращаемое для него callback функцией
// Array* filter(false (*callback)(int, int)) - удаляет значения для которых callback функция вернула false
// Array* sort(false (*callback)(int, int)) - сортирует массив
// и еще много много много всего включая переопределение операторов))
private:
// ссылка на выделенную память
int* arr;
// длинна массива
int length = 0;
};
void main(void){
// счетчик введенных значений
int count = 0;
// переменная для колличества значений==0
int zero = 0;
// переменная для суммы индексов со значениями==0
int zeroindex = 0;
// создаем объект класса Array
Array arr;
// ввод пользователем произвольного значений (бесконечный цикл)
while (){
// временные переменные для ввода
std::string str;
std::string num;
std::cout << "введите значение №" << count << ":";
std::getline( std::cin, str );
// если введено пустое значение прекращаем ввод
if ( str.empty() ) {
break;
}
// иначе увеличиваем счетчик введенных значений
count++;
// преобразуем в число
std::istringstream stream( str );
stream >> num;
// добавляем введеное число в объект класса Array
arr.push(num);
// если введен 0 то увеличиваем счетчик zero
if( num == 0){
zero++;
zeroindex+=count;
}
}
// выводим результаты расчетов
std::cout << "колличество значений равных нулю:" << zero;
std::cout << "сумма их индексов:" << zeroindex;
// освобождаем выделеную память перед выходом
std::free(arr);
}
Что касается серверной стороны, то других вариантов не вижу. Если у Вас больше не осталось вопросов по серверной стороне, я откланяюсь.
PS: не забудте отметить решением если у Вас нет объективных причин не делать этого)