Пятница, 22 Ноября 2024, 09:46

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Java проблема в столкновениях
JuwellДата: Понедельник, 23 Июля 2012, 12:31 | Сообщение # 1
участник
Сейчас нет на сайте
Делаю платформер на Джава и хочу сделать систему столкновений игрока и блока.
Сделал набросок кода, герой не проходит через блок, но как сделать чтобы с него можно было выйти?
Вот код
Code
    public void checkCollision(){
      Rectangle r1 = getBounds();
      Rectangle character = p.getBounds();
      if(r1.intersects(character)){
       collision = true;
      }
      if(collision){
       System.out.println("STUCK!");
       p.xLeftSpeed = 0;
       p.xRightSpeed = 0;
       collision = false;
      }
      else{
       p.moveLeft();
       p.moveRight();
      }
     }
     

Добавлено (23.07.2012, 12:23)
---------------------------------------------
Герой просто зависает возле блока и на нажатия клавиш не реагирует

Добавлено (23.07.2012, 12:31)
---------------------------------------------
Все уже сам разобрался cool

llibertyДата: Понедельник, 23 Июля 2012, 12:41 | Сообщение # 2
был не раз
Сейчас нет на сайте
если разобрались - напишите как) другим тоже может быть интересно)

Сообщение отредактировал lliberty - Понедельник, 23 Июля 2012, 12:42
FadeBakerДата: Понедельник, 23 Июля 2012, 12:58 | Сообщение # 3
JavaSE Game Developer
Сейчас нет на сайте
Juwell, как у тебя реализовано движение, каким образом размещены блоки по уровню? Желательно предоставь код, если хочешь эффективное решение проблемы.

Уроки по 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.
JuwellДата: Понедельник, 23 Июля 2012, 14:40 | Сообщение # 4
участник
Сейчас нет на сайте
Я в классе player дописал
Code
     public void moveRight() {
             x = x + xRightSpeed;
     }
     public void moveLeft() {
         x = x + xLeftSpeed;
         if(xLeftSpeed == -1){
          xLeftSpeed = 0;
         }
}

а в основном классе
Code
public Rectangle getBounds(){
   return new Rectangle(x, y, 100, 100);
     }
      
     public void actionPerformed(ActionEvent e) {
      checkCollision();
             p.moveLeft();
             p.moveRight();
             repaint();
     }
      
     public void checkCollision(){
      Rectangle r1 = getBounds();
      Rectangle character = p.getBounds();
      if(r1.intersects(character)){
       collision = true;
      }
      if(collision){
       p.xRightSpeed = 0;
       p.xLeftSpeed = -1;
       collision = false;
      }
     }
и все вышло
FadeBakerДата: Понедельник, 23 Июля 2012, 15:40 | Сообщение # 5
JavaSE Game Developer
Сейчас нет на сайте
Juwell, у тебя персонаж может скользить по блокам?

Уроки по 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.
JuwellДата: Понедельник, 23 Июля 2012, 15:58 | Сообщение # 6
участник
Сейчас нет на сайте
да уже все работает biggrin
TimKruzДата: Понедельник, 23 Июля 2012, 16:25 | Сообщение # 7
старожил
Сейчас нет на сайте
Juwell, зачем тебе отдельно скорость вперёд и отдельно назад (и переменная, и функции)? Лучше объединить в просто скорость (по x), и "скорость назад" обозначать отрицательной величиной, правда, код нужно будет изменить. А смысл переменной collision вообще неясен... wacko
Quote (Fade)
у тебя персонаж может скользить по блокам?

Судя по коду, у него персонаж движется только горизонтально, игнорируя нижние и верхние блоки, а корректно отталкивается только от блоков справа...
Кстати, непонятно, как персонаж будет двигаться влево, ведь в функции "налево" стоит знак "+" (как и в "направо"), а при значении -1 она будет сбрасываться... wacko

P.S. Какое отношение алгоритмическая проблема имеет именно к Java? Этот код на любом языке будет выглядеть одинаково, так что тебе в раздел "общие обсуждения программистов"...


FadeBakerДата: Понедельник, 23 Июля 2012, 18:30 | Сообщение # 8
JavaSE Game Developer
Сейчас нет на сайте
Вот мой универсальный алгоритм столкновений. Уровень состоит из блоков, которые записаны в одномерном массиве:
Code
public void move(double xSpeed, double ySpeed) {
    if (canMove(xSpeed, 0)) x += xSpeed;
    if (canMove(0, ySpeed)) y += ySpeed;
}
   
public boolean canMove(double xSpeed, double ySpeed) {
    Level l = Game.ID.level;
    Collide bounds = new Collide(x + xSpeed, y + ySpeed, maskW, maskH);
    int wr = 3, yr = 3;
    for (int i = 0; i < wr * yr; i++) {
       int xx = (int) (x / Block.SIZE) + (i % 3) - 1;
       int yy = (int) (y / Block.SIZE) + (i / 3) - 1;
       if (l.getBlock(xx + yy * l.w).solid) {
          if (new Collide(xx * Block.SIZE, yy * Block.SIZE, Block.SIZE, Block.SIZE).intersects(bounds)) {
             return false;
          }
       }
    }
    return true;
}


Уроки по 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.
  • Страница 1 из 1
  • 1
Поиск:

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