Хорошо, поэтому я просто попытался сократить количество строк кода, изменив ручную запись всего в массив .. Моя проблема в том, что он теперь телепортируется, а гравитация не работает ... во-первых, у меня есть сетка ячеистых объектовкоторые в основном являются сеткой 32x32 "640X480".Все эти объекты передаются в массив, например, так -
var gridcellarray = [750];
gridcellarray[0] = cell0;
gridcellarray[1] = cell1;
gridcellarray[2] = cell2;
and so on for 750 32x32 cells...
Теперь, что касается сценария столкновения, у меня есть это ...
function collisioncheck(obj) {
obj = obj;
for(var i = 0; i < gridcellarray.length; i++){
//really long if statement// sorry...
if ((gridcellarray[i].solid == true) && ((obj.PosY >= gridcellarray[i].y - obj.maskImg.height) && !(obj.PosY >= gridcellarray[i].y ) && !((obj.PosX > gridcellarray[i].x + solidOriginX + solidImg.width/2-5) || (obj.PosX < gridcellarray[i].x - solidOriginX - solidImg.width/2)))){
if(obj.onground == 0){
obj.PosY = gridcellarray[i].y - obj.maskImg.height;
obj.VelY = 0;
obj.onground = 1;
obj.jump = 0;
}
}
else if (obj.PosY >= canvas.height - obj.maskImg.height){
if(obj.onground == 0){
obj.VelY = 0;
obj.onground = 1;
obj.jump = 0;
obj.PosY = canvas.height - obj.maskImg.height;
}
}
else {
obj.VelY += 1;
obj.onground = 0;
}
}
}
теперь этот код работал просто отличнораньше Если я вручную скопировал его 750 раз для каждой ячейки, и проблема в том, что теперь, когда у меня есть одна итерация циклического перебора их в виде массива, он запутывается и телепортирует меня на дно, и если я пытаюсь прыгнуть, даже когда не нижеили в блоке он телепортирует меня обратно ко дну.
// edit
Я думаю, что все переменные должны объяснять свое назначение по имени, но если у вас есть какие-либо вопросы, пожалуйста, задавайте.
// edit
Все переменные применяют объект, для которого вы проверяете коллизию, например, collisioncheck (player). Это ссылка на работающую демонстрацию кода ... В ней есть код Зака Блума, и он прекрасно работает применительно к неопубликованной горизонтали.сценарии столкновений, но по вертикали, они не будут сбрасываться и подтверждать ваше положение в блоке, т.е. ongroud = true; Демонстрационная ссылка
// edit
Хорошо, теперь, когда Зак указал на сброс значений y и x, это помогло много, но он все еще не может прыгать, так как переменная onground не делаетхотите сбросить при обнаружении столкновения ... о, и телепортирование происходит из-за моего сценария вверх -
//Upwards Collision//
if ((cell.solid == true) && ((obj.PosY >= cell.y - 32) && !(obj.PosY > cell.y+32) && !((obj.PosX > cell.x + solidOriginX + solidImg.width/2-5) || (obj.PosX < cell.x - solidOriginX - solidImg.width/2)))){
if (obj.onground == 0){
obj.VelY += 1;
obj.onground = 0;
obj.PosY = cell.y + obj.maskImg.height-13;
}
}
Любые идеи о том, как исправить ЭТО беспорядок выше?остановить его от телепортации?Он предназначен только для того, чтобы проверить, касается ли верх маски столкновения (красный прямоугольник) блока, как будто он пытается прыгнуть через него, но он предназначен для того, чтобы не допустить этого, чтобы вы ударились головой и упали вниз.Заранее спасибо!