Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вопрос по алгоритму проверки (для игры) (https://javascript.ru/forum/misc/32871-vopros-po-algoritmu-proverki-dlya-igry.html)

cyber 02.11.2012 02:07

вопрос по алгоритму проверки (для игры)
 
продолжаю писать свою игру, и хотел бы услышать мнение других о том на сколько тот алгоритм проверки что я придумал "адекватный" со стороны производительности.
(не знаю как такая игра называется, но помню принцип, когда то играл в такую)
Об игре:
есть поле для игры на нем:
с верху блоки(который нужно разбить),
с низу "доска" которая отбивает мячь,
и конечно мячик - самое интересное начинается когда нужно определить когда мяч взаимодействовал с блоком и с каким.
структура уровня состоит из многомерной матрицы :

Алгоритм:
для каждой строки матрицы создать асоциативный массив в качестве идентификатора будет нижняя граница строки, пример:
strings[250] = 3 // 3й массив по счету

и в той строке проверять с каким элементом столкнулся мячик .
П.с Хотелось бы услышать мнение и предложения.

cyber 02.11.2012 02:40

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 213631)
Арканоид же!


Блоки бывают разной прочности: некоторые разбиваются сразу, а по другим нужно нанести 2, 3 а то и 4 удара.
Это обязательно нужно реализовать, иначе какой же это арканоид?!

ну сначала я сделаю простые блоки сдам курсовую, а потом допилю сделаю save и загрузку уровней с сервера.
Структуры игру конструировал с учетом этих возможностей.

cyber 02.11.2012 03:08

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 213634)
IIRC, в канонической игре ширина и высота всех блоков одинакова, поэтому такой подход будет избыточным. Более того, идентификация сущностей с помощью их свойств не способствует стабильности алгоритмов, и это вообще дурная манера - будет минус при оценке курсовой. :)

в том дело что я хочу сделать что бы были фигуры разного размера, допустим какой то большой блок в центре(который нельзя уничтожить).

kaf 02.11.2012 09:49

мячик может ударить по блоку не только снизу, поэтому нужно отслеживать все стороны

я бы хранил блоки примерно так
var blocks=[
    {top:100,right:600,bottom:120,left:550},
    ...
]

в зависимости от начального и конечного положения мячика сделал бы поиск по блокам (максимум по двум "границам") на предмет попадания соответствующей "границы" в диапазон перемещения мячика

параметров по блокам может быть больше, можно будет отслеживать "падающие" блоки...

cyber 02.11.2012 10:35

Цитата:

Сообщение от kaf (Сообщение 213652)
мячик может ударить по блоку не только снизу, поэтому нужно отслеживать все стороны

я бы хранил блоки примерно так
var blocks=[
    {top:100,right:600,bottom:120,left:550},
    ...
]

в зависимости от начального и конечного положения мячика сделал бы поиск по блокам (максимум по двум "границам") на предмет попадания соответствующей "границы" в диапазон перемещения мячика

параметров по блокам может быть больше, можно будет отслеживать "падающие" блоки...

я по другому буду создавать обьект блока вот накидал примерный вариант
var standart = {
        width : 50,
        height : 20,
        bg : "img.jpg",
        type : 1
      
      
      }; 
      
   function Blocks() {
      
      this.x = 20;
       this.y =50;
      
      
      
      }
      Blocks.prototype = standart;
      
      
    var bl = new Blocks();

      bl.width = 40;

kaf 02.11.2012 11:43

Цитата:

Сообщение от cyber (Сообщение 213659)
я по другому буду создавать обьект блока вот накидал примерный вариант
var standart = {
        width : 50,
        height : 20,
        bg : "img.jpg",
        type : 1
      
      
      }; 
      
   function Blocks() {
      
      this.x = 20;
       this.y =50;
      
      
      
      }
      Blocks.prototype = standart;
      
      
    var bl = new Blocks();

      bl.width = 40;

потом ведь все-равно придется группировать эти блоки для удобства перебора при проверках

если данные для "карты" блоков будут подгружаться отдельным файлом, то проще сразу подгружать готовым объектом (JSON)

или использование prototype обязательное условие задания?

cyber 02.11.2012 14:45

kaf,
данные уровня буду подругажатся одним обьектом и в нем будет и матрица и ссылки на тексктуры. вот так он выглядит пока, для первого уровня
var firstLvl = {
               Number: 1,
               Texture: {
                   BackgroundImage: "Levels/Level 1/background.jpg",
                   Blocks: {// ðàçìåð óíè÷òîæàåììûõ îáüåêòîâ
                       width: 50,
                       height: 20
                   },
                   offset: {
                       left: 0,
                       top: 10

                   }
               },

               Board: {
                   Color:"Black",
                   //Image:"",// íàéòè êàðòèíêó 
                   size: {
                       width: 250,
                       height:15

                   },

                   Positions:{
                       
                       x: "center",// or 'left' or 'right'
                       y:160 // îòñòóï ñ íèçó
                   
                   }

               },

               Ball: {

                   radius: 20,
                   position: "center",//position:[left || right || center] .( position on object Board)
                   color: "green",


               }
           }

           firstLvl.TextureMatrix = createMatrix({
               width: firstLvl.Texture.Blocks.width + firstLvl.Texture.offset.left,
               height: firstLvl.Texture.Blocks.height + firstLvl.Texture.offset.top,
               fill: {
                   width: "full",
                   height: 300,// â ïèêñåëÿõ(çà÷åííèå "full" íå ïðèíèìàåòñÿ)
                   fnc: structureOne
               }
           });

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

Severtain 03.11.2012 09:52

cyber,
Ваша структура и так понятно! (она почти у всех одинакова). Но вам до этого правильно сказали.
"ведь все-равно придется группировать эти блоки для удобства перебора при проверках"
Так что желательные не делать такие ссылки )
Просто если несколько ячеек будут иметь одну ссылку на блок, то по вашей логике это будет единый объект, с едиными переменными!

cyber 04.11.2012 02:33

Цитата:

придется группировать эти блоки для удобства перебора при проверках
Подумал и решил так сделать:
в матрице буду храниться только типы блоков , а обьекты типов буду храниться в отдельно массиве
[0,1,2,0,2,1]//0 - пусто, 1 - тип заданный по умолчанию, 2 - тип из массива "типов"

var types = [];
types[2] = {
width:60,
img:"img.jpg"
}// если какое то свойство не указанно оно будет браться из типа 1 .

как то так.

cyber 11.11.2012 01:11

вот такая структура объекта уровня в игре, на сколько она удобно?
var firstLvl = {
    Number: 1,
    Texture: {
        BackgroundImage: "Levels/Level_1/background.jpg",
        Blocks: {// размер уничтожаеммых обьектов
            width: 50,
            height: 20,
            life: 1,
            color: "black",
            offset: {
                left: 10,
               
            }
        },
        lineSpacing: 10// меж строчные отступы
      
    },

    Board: {
        Color: "Black",
        //Image:"",// найти картинку 
        size: {
            width: 250,
            height: 15

        },

        Positions: {

            x: "center",// or 'left' or 'right'
            y: 20 // отступ с низу

        },

        Offset: {

            x: 40,
            y: 0
        }

    },

    Ball: {

        radius: 20,
        position: "center",//position:[left || right || center] .( position on object Board)
        color: "green",
        speed: 5


    }
}

var types = firstLvl.Texture.Blocks.types = [];

types[4] = {
    width: 290,
    height: 30,
    color: "yellow",
    life: 4,
    offset: {
        left: 200,
        top: 100,
        bottom:20
    }
};

types[3] = {
    offset: { left: 200 },
    color:"green",
    inherit: 2 // отсутсвующие свойства  наследуються от указанного типа
};

types[2] = {
    width: 50,
    height: 20,
    color: "red",
    life: 2,
   
};



firstLvl.TextureMatrix = [
    [4],
    [3, 2, 2, 2, 2],
    [3, 2, 2, 2, 2],
    [3, 2, 2, 2, 2],
    [3, 1, 1, 1, 1],
    [3, 1, 1, 1, 1],
];


Часовой пояс GMT +3, время: 09:31.