Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

user.lives++; // добавляет одну жизнь
user.score += 1000; // добавляет 1000 очков
bonus.fireball = true; // огненный мяч
bonus.magnet = true; // магнит на доску
bonus.thru = true; // мяч проходит через все
bonus.shooting = true; // пушки на доске
function createlevel(a){cl=!1;shadow.aframe=20;clearTimeout(lightning.timout);audioFile.Voltage.pause();shadow.drawing=!0;for(y=remains=0;20>y;y++)for(x=0;20>x;x++)clearTimeout(bricks[x][y].timeout),bricks[x][y].type=file.charCodeAt(20*y+x+400*(a-1)),bricks[x][y].aframe=0,0!=bricks[x][y].type&&2!=bricks[x][y].type&&remains++,8==bricks[x][y].type&&(bricks[x][y].aframe=23)};
user.level++; // текущий уровень
createlevel(user.level); // кидает на следующий мгновенно
Перед запуском игры все изображения (символы) отрисовываются в том же канвасе, что и игра, я сохраняю их как картинки,
то есть: char[...].img.src = canvas.toDataURL(«image/png»);
Так как putImageData() гараздо медленнее чем drawImage() и это не единственный минус.
putImageData, не накладывает изображение сверху, а заменяет его полностью.
ctx.drawImage( canvas, fromX, fromY )
В начале задумывалось перерисовывать только те элементы котором изменяются, но из за большого количества багов, которые возникали в связи с этим, я остановился на варианте полной перерисовки кадра

if(bricks[x][y].type!=0&&
this.x>bricks[x][y].x-5&&
this.x<bricks[x][y].x+35&&
this.y>bricks[x][y].y-5&&
this.y<bricks[x][y].y+20){
действия с кирпичом
}
Щас сам пишу арканоид, но блин застрял на collision detection, может кто посоветует как лучше обрабатывать столкновения с блоками и отражение мячика от них как у вас?
В начале задумывалось перерисовывать только те элементы котором изменяются, но из за большого количества багов, которые возникали в связи с этим, я остановился на варианте полной перерисовки кадра
Вот это зря. Стоило таки побороть баги ;)
Shock, а не видел хорошего материал почитать на эту тему? Просто вот интересно, заводить у каждого объекта поле «сдвинулся» и если оно истинно перерисовывать объект, меняя после перерисовки поле на false? Как-то не изящно выходит ))
animate({
object: element,
props: { fromX: 100 },
onTick: element.redraw
});
var helper, vector, target;
// Глобализуем свойства LibCanvas
LibCanvas.extract();
// Создаём приложение размером 600*400
helper = new App.Light(new Size(600, 400));
// теперь внутри target у нас всегда актуальные координаты мыши относительно приложения
target = helper.mouse.point;
/* Создаём векторную фигуру - круг, радиусом 20 пикселей
* с центром в точке 100/100
* тёмно-красная середина и красная граница
*
* Этот круг у нас будет основным объектом
*/
vector = helper
.createVector( new Circle(100, 100, 20), { zIndex: 2 })
.setStyle({ stroke: '#900', fill: '#300' });
// При клике по холсту дописываем координату в очередь на движение
helper.mouse.events.add('click', function () {
// создаём маленькую зелёную точку, которая будет обозначать цель нашего движения
var targetVector = helper
.createVector( new Circle(target.clone(), 2) )
.setStyle({ fill: '#0f0' });
// добавляем анимацию перемещения оригинального объекта в стек
vector.animate({
props: {
// плавно изменяем координаты центра
'shape.center.x': target.x,
'shape.center.y': target.y
},
fn: 'elastic-out',
// за одну секунду
time: 1000,
// при каждом смещении перерисовываем вектор
onTick: vector.redraw,
// при завершении движения удаляем точку-цель движения
onComplete: function () {
targetVector.destroy();
}
});
});

Вся анимация в игре оптимизирована с помощью requestAnimationFrame, но разные устройства выдают разные показатели FPS.
*.mds — MIDI файлы музыки, сконвертировать их в *.mp3 мне помог savex.
По поводу физки. В игре оригинальная обработка столкновений или самостоятельно придуманная?
Реверс-инжиниринг арканоида DX-ball, или Новая жизнь старой игры