на досуге посетило меня вдохновение о разработке нового 2d движка для игр. Однако с одной уникальной особенностью. Хочется сделать его реально удобным для разработчиков разного уровня.
Как этого добиться?
Сначала мы придумаем и напишем 2-3 типовых игры на «идеальном» движке, т.е. сначала будет создано само приложение, а уже потом под его код будет писаться движок.
Первой игрой будет платформер, получивший тестовое название Terririst Win.
Описание:
бегать по локации, закладывая и взрывая бомбы убивать мобов.
Второй игрой скорее будет match3
С удовольствием жду ваших примеров идаельного кода.
Начнем разбор первой версии «идеального» кода для платформера)
start.js:
window.onload = init function init(){ // в начале указываем все ресурсы Engine.setResurs({ 'block' : 'resurs/sprite/block.jpg', 'bomb' : 'resurs/sprite/bombs.png', 'cop' : 'resurs/sprite/cops.png', 'mob' : 'resurs/sprite/mobs.png', 'player' : 'resurs/sprite/player.png', 'mask' : 'resurs/sprite/mask.png', '_palm' : 'resurs/sprite/_palm.png', '_lavk' : 'resurs/sprite/_lavk.png', 'fire' : 'resurs/sprite/fires.png' }) /* теперь ставим основные настройки width - ширина (рх) canvas height - высота (рх) canvas separator - id html элемента canvas size - размер выходной клетки (на его основе будет строится в частности и zoom) */ Engine.init({ width : 800, height : 512, separator : 'game_canvas', size : 32, }) /* отсюда начинается "произвольный" код игры Карта локации (1-0 : степень проходимости 0 - полная, 1 - частичная) */ var map = new Array( new Array(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), new Array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), new Array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), new Array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), new Array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), new Array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), new Array(1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1), new Array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), new Array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), new Array(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) ) /* Создание сцены: Engine.Task.AddScene('map') - добавляем сцену с именем map Добавление объекта на сцену // GameObject - встроеный шаблон игрового объекта, еще будет круг // создание GameObject типа box, в позиции Vec2б шириной и высотой 1 var block = new GameObject('box', new Vec2(x, y), 1, 1) // выключаем гравитацию block.gravitati = false; // добавляем объект на сцену, с псевдослучайным именем scene.ObjectAdd(false, block) */ var scene = new SceneControl('scene1', map[0].length, map.length) for(var y = 0; y < map.length; y++){ for(var x = 0; x < map[0].length; x++){ var sprite = new SpriteControl('block', new Vec2(x, y), Setting.set('size'), Setting.set('size') var block = new GameObject('box', new Vec2(x, y), 1, 1) block.sprite = sprite; block.gravitati = false; scene.ObjectAdd(false, block) } } /* создаем наш собственный объект Player с векторами Vec2 и добавляем на сцену */ var player = new PlayerObject(new Vec2(5, 5)) scene.ObjectAdd('player', player) Engine.Task.AddScene('scene1', scene) /*запускаем в проигрыватель сцену map*/ Engine.Task.PlayScene('map') // запускаем игру Engine.Play(); }
Ну и код player.js
function PlayerObject(vec2){ // parrent - прототип объекта this.parrent = new GameObject('box', vec2, 1, 1 ) // переназначение events с parrent this.eventKeyUp = function(){ // стрелка вверх this.parrent.vec2 = this.parrent.vec2.summ(new Vec2(-2, 0)) } this.eventKeyLeft = function(){ // в лево this.parrent.vec2 = this.parrent.vec2.summ(new Vec2(0, -1)) } this.eventKeyRight = function(){ // в право this.parrent.vec2 = this.parrent.vec2.summ(new Vec2(0, 1)) } this.eventKeyE = function(){ // клавиша E // получаем сцену по коду var scene = Engine.Task.returnScene('map') // Bomb - тоже заранее подготовленный нами объект с описанием поведения бомбы var bomb = new Bomb(new Vec2(this.parrent.vec2.x, this.parrent.vec2.y)) scene.ObjectAdd(false, bomb) } this.eventKeySpace = function(){ // пробел // bomb Detonation } this.collision = function(){ // событие столкновения // заприщяем проваливаться сквозь "пол" if(this.collisionFlagBottom){ // если коллизия происходит снизу this.parrent.vec2.y = 0 // изменять текущий вектор } } }
тек же хотелось бы увидеть примеры для ваших «идеальных» игр, как бы вам было удобно писать
собственно, это первая версия псевдоидеального кода)
с нетерпением жду ваших комментариев, заметок и предложений.
На по следок:
код проекта на github github.com/DrNemo/just2d
пока не будет разработан нормальный шаблон кода, к программированию реального кода приступать не буду, т.ч. можете не обращать пока внимание на наброски из папки just2d.v.0.0.1)
идея а так же прототип пришли в голову вчера ночью, не бейте сильно)
ссылка на оригинал статьи http://habrahabr.ru/post/163581/
Добавить комментарий