А какая разница 2д или 3д? Мне кажется там и там нужно по frustum.
Код
boolean isVisibleSprite(final Camera camera, GameSprite sprite){ //позиция и размер храниться в векторах. return camera.frustrum.boundsIsFrustrum(sprite.getPosition(), sprite.getSize()); }
void render(){ for(GameSprite sprite : sprites){ if(isVisibleSprite(ortCamera, sprite) batch.draw(sprite.getTexture(), sprite.pos.x,sprite.pos.y); // как то так. }
Зачем вообще зомби или монстры? Борись со стихиями! Предположим ночью -60 днем, а днем +60. В промежутки, утро или вечер выбегаешь на улицу поискать какой нибудь хлам... Ну или там тучка вылезла... пока солнце кроет также лутаеш.
Захотелось больше разнообразия? добавь в те промежутки ураганы, ливни из кислоты и т.д Ну или в край местную фауну плотоядных растений. Еще больше разнообразия? добавь чтобы растения двигались(очень медленно конечно) Через несколько суток они окружат твое убежище и тебе хана(ну или успел убежать и сменить хату(или что там еще).
з.ы Немного дунуть и мысли будут... А так можно просто от развития темы норм вещи выдумать.
Чтобы еще отдельно не создавать тему спрошу тут. Какой версии lwjgl пользуетесь? 3 или 2? Если на третей, то как устанавливали перспективную камеру? там вроде только ортогональная шла с фреймворком.
Попробовал еще раз разобраться в твоем коде, но сломал мозг Примерно код у тебя работает так: 1) Прыгает на позицию. 2) Проверяет можно ли было прыгнут туда. 3) Прыгает обратно, если было нельзя.
Я бы сделал так: 1) Проверяю можно ли прыгать. 2) Прыгаю если можно.
public class Player extends GameItem { Vector3f playerTemp; GameItem[] gameItems; public Player(String name) { super(name); this.setPosition(0, 5, 0); playerTemp = new Vector3f(0, 5, 0); }
public void update(GameItem[] gameItems, Camera camera, float delta) { System.out.println(this.getPosition() + ", " + playerTemp); this.setRotation(camera.getRotation().x, camera.getRotation().y, camera.getRotation().z); camera.setPosition(this.getPosition().x, this.getPosition().y, this.getPosition().z); this.gameItems = gameItems; playerTemp.x = this.position.x; playerTemp.y = this.position.y; playerTemp.z = this.position.z; } public boolean getCollision(float x, float y, float z){ for(int i = 0; i < gameItems.length; i++){ if(gameItems[i] != this && gameItems[i].name != "ZERO") { if((this.getPosition().x + x >= gameItems[i].getPosition().x -gameItems[i].getScale() && this.getPosition().x + x <= gameItems[i].getPosition().x+gameItems[i].getScale()) && (this.getPosition().y + y >= gameItems[i].getPosition().y -gameItems[i].getScale() && this.getPosition().y + y <= gameItems[i].getPosition().y+gameItems[i].getScale()*2) && (this.getPosition().z + z >= gameItems[i].getPosition().z -gameItems[i].getScale() && this.getPosition().z + z <= gameItems[i].getPosition().z+gameItems[i].getScale())){ return true; }else{ return false; } } } }
А он и не должен по твоему коду останавливаться. Если игрок заходи с боку, то у него грубо устанавливаются координаты. То есть выглядит так: 1) Сдвинулся внутрь куба. 2) Записал значения в temp. 3)Сработал If и установил значения temp в позицию игрока.
Если пример в цифрах то: 1) x = 3 , y = 3 , z = 3 (он уже в кубе) 2) temp.x = x , temp.z = z (то есть вносим те же самые координаты,что внутри куба). Выходит temp.x = 3, temp.z = 3 3) x = temp.x , z = temp.z . Выходит x =3, z = 3. Что была проверка, что не было...
Тебе нужно хранить отдельно старые координаты от текущих. Попробуй перенести