Пятница, 19 Апреля 2024, 21:51

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Java » Столкновения
Столкновения
minecrafter2Дата: Четверг, 01 Января 2015, 20:49 | Сообщение # 1
участник
Сейчас нет на сайте
Код

if(p.player().intersects(w.wall_1())){
   if(p.y < 64 ){
    p.y -= 1;
   }
   if(p.y > 64 ){
    p.y += 1;
   }
   if(p.x < 64 ){
    p.x -= 1;
   }
   if(p.x > 64 ){
    p.x += 1;
   }
  }

Можно ли подругому сделать остановку персонажа,а то таким способом очень неудобно и появляется множество багов!
Тоесть мне надо как-то надо заменить вот эту часть:
Код

if(p.y < 64 ){
    p.y -= 1;
   }
   if(p.y > 64 ){
    p.y += 1;
   }
   if(p.x < 64 ){
    p.x -= 1;
   }
   if(p.x > 64 ){
    p.x += 1;
   }


Майнкрафт - лучшая игра в мире
daunДата: Четверг, 01 Января 2015, 21:05 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
И как, с такими условиями приблизиться к 64?
minecrafter2Дата: Четверг, 01 Января 2015, 21:18 | Сообщение # 3
участник
Сейчас нет на сайте
Так там стена.Нам не надо туда приближаться.

Майнкрафт - лучшая игра в мире
daunДата: Четверг, 01 Января 2015, 21:27 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Понял, нужно отталкивание. Встань на середину комнаты, представь координатную сетку, и попробуй сам же выполнить свои же команды. Твой комп наверное тебя ненавидит.)
minecrafter2Дата: Четверг, 01 Января 2015, 21:32 | Сообщение # 5
участник
Сейчас нет на сайте
Ну попробовал... Иии...?Так как релиазовать отталкивание другим способом?

Майнкрафт - лучшая игра в мире
daunДата: Четверг, 01 Января 2015, 21:44 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
if(p.x > 70 ){p.y -= 1;}
if(p.x < 60 ){p.y += 1;}
if(p.y > 70 ){p.y -= 1;}
if(p.y < 60 ){p.y += 1;}
minecrafter2Дата: Четверг, 01 Января 2015, 21:50 | Сообщение # 7
участник
Сейчас нет на сайте
Так это по сути тоже самое!А мне надо ДРУГИМ способом.

Майнкрафт - лучшая игра в мире
daunДата: Четверг, 01 Января 2015, 22:08 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Понял, не хочется каждую стенку ручками прописывать, тогда способы зависят от выбранной структуры по которой строится игра или чо там.
FadeBakerДата: Пятница, 02 Января 2015, 01:34 | Сообщение # 9
JavaSE Game Developer
Сейчас нет на сайте
Ну смотри. Есть, допустим, стена, вписанная в прямоугольник, имеющий, как ты, наверное, знаешь, четыре стороны, каждая из которых имеет свои координаты в пространстве. Для того, чтобы проверить пересечение с этим прямоугольником, нужно, понятное дело, представить и твой объект в виде такого же прямоугольника. Чтобы тебе было более понятно, покажу на примере:
Код
public boolean intersects(Rectangle r1, Rectangle r2) {
    return r1.x + r1.w > r2.x && r1.y + r1.h > r2.y && r1.x < r2.x + r2.w && r1.y < r2.y + r2.h;
}

Здесь происходит банальная проверка на вхождение одного прямоугольника в другой. Ниже пример кода, запрещающего игроку двигаться сквозь препятствия:
Код
public void tick() { //метод обновления логики игрока
    float xa = 0; //переменные, определяющие смещение игрока
    float ya = 0;
    float spd = 2f;
    if (Key.down(Keys.W)) ya -= spd;
    if (Key.down(Keys.S)) ya += spd;
    if (Key.down(Keys.A)) xa -= spd;
    if (Key.down(Keys.D)) xa += spd;
    Rectange r = new Rectangle(x + xa, y + ya, w, h); //w и h - размер объекта игрока
    boolean stopped = false; //игрок пока может двигаться
    for (Wall wall : walls) { //walls - список стен
       if (r.intersects(wall.getBounds())) stopped = true; //getBounds() должен возвращать прямоугольник, в который вписана стена
                    //проверяем на пересечение с каждой из стен, если пересечение было, то запрещаем движение
       if (stopped) break; //и прекращаем проверку
    }
    if (!stopped) { //если можно двигаться - двигаемся
       x += xa;
       y += ya;
    }
}


Как-то так.


Уроки по GM
Minecraft 2D на GM
— Мои проекты —
Blood Harvest [2D] — Original
Blood Harvest [2D]: Remastered Edition
Adventure Craft [2D] — Sandbox
Space Shock [2D] — Scroll Shooter
Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
minecrafter2Дата: Пятница, 02 Января 2015, 14:56 | Сообщение # 10
участник
Сейчас нет на сайте
FadeBaker, Спасибо,помог.

Майнкрафт - лучшая игра в мире
Форум игроделов » Программирование » Java » Столкновения
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг