понедельник, 17 июня 2013 г.

Космическая игра - часть 1 Генератор звёздного неба



Добрый день. HTML 5 потрясающие возможности для реализации художественных замыслов на стыке математики, программирования и дизайна. Нельзя обойти эту технологию стороной при разработке игр, нельзя...

Итак, подумал я как-то, что здорово было бы создать программу, которая бы генерировала звёздное небо.

Звёздное небо можно нарисовать с помощью отдельных точек размером в 1 пиксел. Далее, можно было бы  задать для каждой точки свой цвет. Мерцание можно эмитировать изменением размера точки на 2-3 пиксела в случайном порядке, для отдельных точек.




1.Создадим новый проект  http://2l4u.ru/gamecreator.pia




2. Откроется сцена - окно игры, которую мы создаём

3. Теперь нам нужно создать два события: событие "STAGE START" и событие "Create".
В "STAGE START" можно помещать HTML - код.
В событие  "Create", "Step" только Jquery / Java Script
Таким образом, в "STAGE START" мы можем разместить код HTML5.


4. Для этого, можно использовать объект контроллер - ctrl
Конечно, мы можем создать свой объект, но контроллер ctrl присутствует по умолчанию
Нажимаем на шестерёнку и вызываем окно свойств




Итак, добавляем событие STAGE START

Выбираем "STAGE START" из списка


Результатом, действием на это событие добавим "blank script"



теперь откроем blank script - чистый скрипт на редактирование...



Откроется окно Редактор событий


Теперь вставим код:



<script>
// Эта функция генерирует случайной число в заданных приделах
function getRandomInt(min, max)
{
 return Math.floor(Math.random() * (max - min + 1)) + min;
}

// размер экрана звёздного неба
var screen_width=765;
var screen_height=430;

// кол-во звёзд
var all_stars=getRandomInt(50, 1000);
// начальные координаты "звёздного неба"
var start_x=0;
var start_y=0

// массивы для хранения данных о звёздах
// эти массивы нам нужны, чтобы одновременно передвигать звёзды
// создавать иллюзию движения

stars_array_ids = new Array();
stars_array_ids_x = new Array();
stars_array_ids_y = new Array();
stars_array_ids_color = new Array();
stars_array_ids_type = new Array();



// функция для преобразования числовых данных в формат цвета
function rgb2hex(r,g,b)
{
  return Number(r).toString(16).toUpperCase().replace(/^(.)$/,'0$1') +
         Number(g).toString(16).toUpperCase().replace(/^(.)$/,'0$1') +
         Number(b).toString(16).toUpperCase().replace(/^(.)$/,'0$1');
}

// загрузка страницы

$(document).ready(function(){

// задаем параметры элементу CANVAS с id = "canv_1"

$("#canv_1").css("width",screen_width);
$("#canv_1").css("height",screen_height);

// получаем 2d контекст на котором и будем рисовать
var canvas = document.getElementById("canv_1");
if (canvas.getContext)
{
var ctx = canvas.getContext("2d");
}


// наполняем массивы - генерируем характеристики звёзд

for(i_temp=0;i_temp<all_stars; i_temp++){
 //sum += a[i];
 stars_array_ids[i_temp] = '"stars_'+i_temp+'"';
 stars_array_ids_y[i_temp] = getRandomInt(-1*screen_height,screen_height);
 stars_array_ids_x[i_temp] = getRandomInt(0,screen_width);
 stars_array_ids_color[i_temp] =('#'+rgb2hex(getRandomInt(1,255),getRandomInt(1,255),getRandomInt(1,255)));
 stars_array_ids_type[i_temp] = getRandomInt(0,50);

}



// создаём функцию рисования звёздного неба
// эта функция будет вызываться через равные промежутки времени

function draw_move_stars(){
// заполняем экран чёрным фоном
ctx.fillStyle="black";
ctx.fillRect(0,0,screen_width,screen_height);

// получаем характеристики для рисования на холсте
  for(i_temp=0;i_temp<stars_array_ids.length;i_temp++){

  var x=stars_array_ids_x[i_temp];
  var y=stars_array_ids_y[i_temp];
  var color=stars_array_ids_color[i_temp];
  var type= stars_array_ids_type[i_temp];

  y=y+1;
  if (y>screen_height){
   y=-screen_height;
  }
  stars_array_ids_y[i_temp]=y;
 
   ctx.shadowColor = "blue";
   ctx.shadowBlur = 5;
   ctx.fillStyle =color;

  if (type==0){
  ctx.fillStyle =('#'+rgb2hex(getRandomInt(100,255),getRandomInt(100,255),getRandomInt(100,255)));
  }

  var razm_x=getRandomInt(1,2);
  var razm_y=getRandomInt(1,2);

  if (type==0){
  ctx.fillRect(x,y,razm_x,razm_y);

  } else {
  ctx.fillRect(x,y,1,1);
  }

// после того, как мы нарисовали звёзды - сбрасываем параметры холста
 ctx.restore();


 }


 }

var i_time=0;

// теперь создаём функцию, которая будет вызывать себя
//  функцию draw_move_stars через равные промежутки времени - 50 миллисекунд

function  move_stars() {
// увеличиваем значение счётчика
  i_time++;
// через 1000 миллисекунд вызывает - second_passed - себя
  setTimeout(move_stars, 50);
  draw_move_stars();
}

 move_stars();





});

</script>
</head>
<body>
<CANVAS id="canv_1" width="765" height="430"></CANVAS>

</body>

</html>

2. Нажимаем сохранить, закрываем редактор событий. Жмём Пуск

результат можно посмотреть здесь http://2l4u.ru/program_740.php