Вход

Просмотр полной версии : вопрос по алгоритму проверки (для игры)


cyber
02.11.2012, 02:07
продолжаю писать свою игру, и хотел бы услышать мнение других о том на сколько тот алгоритм проверки что я придумал "адекватный" со стороны производительности.
(не знаю как такая игра называется, но помню принцип, когда то играл в такую)
Об игре:
есть поле для игры на нем:
с верху блоки(который нужно разбить),
с низу "доска" которая отбивает мячь,
и конечно мячик - самое интересное начинается когда нужно определить когда мяч взаимодействовал с блоком и с каким.
структура уровня состоит из многомерной матрицы :
https://lh3.googleusercontent.com/-LBQGLqMYpf8/UJLuaujGo-I/AAAAAAAAAF8/H4QbhXF9iDI/s1004/test.jpg
Алгоритм:
для каждой строки матрицы создать асоциативный массив в качестве идентификатора будет нижняя граница строки, пример:
strings[250] = 3 // 3й массив по счету

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

cyber
02.11.2012, 02:40
Арканоид же!


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

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

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

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

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

я бы хранил блоки примерно так

var blocks=[
{top:100,right:600,bottom:120,left:550},
...
]

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

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

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

я бы хранил блоки примерно так

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
я по другому буду создавать обьект блока вот накидал примерный вариант



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],
];

cyber
11.11.2012, 01:15
вот так выглядит
https://lh5.googleusercontent.com/-FCry-Gt4vds/UJ7Dd5-_rrI/AAAAAAAAAHM/sX1x_vlq8-8/s791/view.jpg