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