Проблема с обнаружением столкновений в игре JavaFX после руководства RysnowJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема с обнаружением столкновений в игре JavaFX после руководства Rysnow

Сообщение Anonymous »

Я работаю над проектом JavaFX, вдохновленным руководством Rysnow по созданию игр на YouTube ( Я внимательно следил за руководством, но у меня возникли проблемы с обнаружением столкновений. Несмотря на то, что я распечатал координаты для отладки, мне не удалось заставить их работать правильно.
Вот что я пробовал:
  • Пошагово следовал инструкциям.
  • Распечатал координаты героя, чтобы проверить позиции.
Я загрузил файлы своего проекта здесь: ссылка MediaFire.
Может ли кто-нибудь помочь мне понять, что я делаю не так с обнаружением столкновений? Мы будем очень признательны за любые идеи или советы.
Спасибо!
package MAIN;

import HERO.Entity;

public class CollisionChecker {
ScreenSettings sSettings;

public CollisionChecker(ScreenSettings sSettings) {
this.sSettings = sSettings;
}

public void checkTile(Entity entity) {
int leftX = entity.worldX + (int) entity.rec.getX();
int rightX = entity.worldX + (int) (entity.rec.getX() + entity.rec.getWidth());
int topY = entity.worldY + (int) entity.rec.getY();
int bottomY = entity.worldY + (int) (entity.rec.getY() + entity.rec.getHeight());

int entityLeftCol = leftX / sSettings.tileSize;
int entityRightCol = rightX / sSettings.tileSize;
int entityTopRow = topY / sSettings.tileSize;
int entityBottomRow = bottomY / sSettings.tileSize;

int tileNum1, tileNum2;

switch (entity.direction) {
case "top":
entityTopRow = (topY - entity.speed) / sSettings.tileSize;
tileNum1 = sSettings.cMap.map[entityLeftCol][entityTopRow];
tileNum2 = sSettings.cMap.map[entityRightCol][entityTopRow];
System.out.println(sSettings.cMap.tile[tileNum1].collision);
if (sSettings.cMap.tile[tileNum1].collision || sSettings.cMap.tile[tileNum2].collision) {
// entity.collision = true;
}
break;

case "down":
entityBottomRow = (bottomY + entity.speed) / sSettings.tileSize;
tileNum1 = sSettings.cMap.map[entityLeftCol][entityBottomRow];
tileNum2 = sSettings.cMap.map[entityRightCol][entityBottomRow];
System.out.println(sSettings.cMap.tile[tileNum1].collision);
if (sSettings.cMap.tile[tileNum1].collision || sSettings.cMap.tile[tileNum2].collision) {
entity.collision = true;
}
break;

case "left":
entityLeftCol = (leftX - entity.speed) / sSettings.tileSize;
tileNum1 = sSettings.cMap.map[entityLeftCol][entityTopRow];
tileNum2 = sSettings.cMap.map[entityLeftCol][entityBottomRow];
System.out.println(sSettings.cMap.tile[tileNum1].collision);
if (sSettings.cMap.tile[tileNum1].collision || sSettings.cMap.tile[tileNum2].collision) {
entity.collision = true;
}
break;

case "right":
entityRightCol = (rightX + entity.speed) / sSettings.tileSize;
tileNum1 = sSettings.cMap.map[entityRightCol][entityTopRow];
tileNum2 = sSettings.cMap.map[entityRightCol][entityBottomRow];
System.out.println(sSettings.cMap.tile[tileNum1].collision);
if (sSettings.cMap.tile[tileNum1].collision || sSettings.cMap.tile[tileNum2].collision) {
entity.collision = true;
}
break;
}
}
}


public Hero(ScreenSettings settings) {
this.settings = settings;
this.control = this.settings.control;
this.canvas = new Canvas(settings.WIDTH, settings.HEIGHT);
this.screenX= settings.WIDTH /2 -(settings.tileSize/2);
this.screenY = settings.HEIGHT /2 -(settings.tileSize/2);
this.tileSize = settings.OrigTile *4;

rec = new Rectangle(8,16,32,32);
rec.setFill(Color.ALICEBLUE);
Default();
}

//core repaint
public void reDrawCharacter(){
Movement();
}

public void Default(){
direction = "left";
worldY = settings.tileSize *10;
worldX = settings.tileSize *10;
gc = canvas.getGraphicsContext2D();
PlayerChangeMovement();
settings.pane.getChildren().add(canvas);
}

public void Movement() {
if (control.top) {
worldY -= speed;
direction = "top";
}
if (control.down) {
worldY += speed;
direction = "down";
}
if (control.right) {
worldX -= speed;
direction = "right";
}
if (control.left){
worldX += speed;
direction = "left";
}
collision = false;
settings.cCheker.checkTile(this);
if (!control.left && !control.right && !control.down && !control.top) {
StandBy();
} else {
PlayerChangeMovement();
}
}


package HERO;

import javafx.scene.image.Image;
import javafx.scene.shape.Rectangle;

public class Entity{
Image img;
public int worldX;
public int worldY;

public int speed = 9;
public int spireteNum;
public boolean collision;
public String direction;
public Rectangle rec;
}


Подробнее здесь: https://stackoverflow.com/questions/786 ... w-tutorial
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»