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.
|
|
| |