You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

583 lines
23 KiB

package com.dungeoncrawler.view;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TiledMapRenderer;
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer;
import com.badlogic.gdx.math.Circle;
import com.badlogic.gdx.math.Intersector;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.utils.Timer;
import com.dungeoncrawler.model.Dungeon;
import com.dungeoncrawler.model.Entity;
import com.dungeoncrawler.model.entities.*;
import java.awt.Shape;
import java.util.ArrayList;
import java.util.Arrays;
public class GameScreen {
//PLAYER
public EntitySprite player;
//ENTITIES
public EntitySprite[] entitySprites;
Entity[] entities;
//DMG visualization
BitmapFont font;
DamageFontContainer[] dmgContainer;
//MAP
private Map m;
TiledMapRenderer tmr;
TiledMap tm;
public ArrayList<AnimatedObject> objects;
public ArrayList<AnimatedObject> mapItems;
public ArrayList<AnimatedObject> doors;
Timer animations;
Timer animatePlayer;
Timer roomChangeTimer;
Timer doorUnlockTimer;
int roomChangeAnimationState;
boolean roomLoading;
boolean unlockDoor;
Texture roomChangeTexture;
Sprite roomChangeSprite;
TextureRegion[][] roomChangeTextureRegion;
int roomChangeRow;
Player p;
HudContainer hc;
// Sound
public Music music;
//Inventory TEST
// CONTROLS
ArrayList<Button> controls;
int mouseX;
int mouseY;
float animationSpeed = 0.1f;
public GameScreen(Dungeon d, float volume) {
//CONTROLS
entities = d.getCurrentEntities();
//PLAYER
Texture[] playerTexture = new Texture[4];
String gender = d.getPlayer().getGender();
playerTexture[0] = new Texture(Gdx.files.internal("sprites/player/player_"+d.getPlayer().getSkin()+"_"+gender+".png"));
playerTexture[1] = new Texture(Gdx.files.internal("sprites/player/player_"+d.getPlayer().getSkin()+"_"+gender+".png"));
playerTexture[2] = new Texture(Gdx.files.internal("sprites/player/player_"+d.getPlayer().getSkin()+"_"+gender+".png"));
playerTexture[3] = new Texture(Gdx.files.internal("sprites/player/player_"+d.getPlayer().getSkin()+"_"+gender+".png"));
//DMG visualization
font = new BitmapFont();
font.setColor(1, 0, 0, 1);
dmgContainer = new DamageFontContainer[10];
player = new EntitySprite(playerTexture, 64, 64);
player.update(200, 200);
//ENTITIES
entitySprites = new EntitySprite[15];
//MAP
float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
m = new Map();
Texture[] tempTextures = new Texture[d.getLevel().length];
for(int i = 0; i < tempTextures.length; i++){
int j = i+1;
tempTextures[i] = new Texture(Gdx.files.internal("tilesets/tileset_floor_" + j + ".png"));
}
MapGenerator mg = new MapGenerator(tempTextures);
m = mg.generateMap(d);
mg.ichWillSpielen(m.getMaps());
tm = new TiledMap();
tmr = new OrthogonalTiledMapRenderer(tm);
music = Gdx.audio.newMusic(Gdx.files.internal("music/gamemusic.mp3"));
music.setVolume(volume);
music.play();
animations = new Timer();
animations.scheduleTask(new Timer.Task() {
@Override
public void run() {
if(objects != null){
for(AnimatedObject object : objects){
object.updateAnimation();
}
}
}
},0, 0.1f);
animatePlayer = new Timer();
animatePlayer.scheduleTask(new Timer.Task() {
@Override
public void run() {
player.updateAnimation(p);
for(int i = 0; i < entitySprites.length; i++){
if(entitySprites[i] != null){
entitySprites[i].updateAnimation(entities[i]);
}
}
}
}, 0, animationSpeed);
//Inventory TEST
hc = new HudContainer();
roomChangeTimer = new Timer();
roomLoading = false;
roomChangeSprite = new Sprite();
roomChangeRow = 0;
roomChangeSprite.setPosition(0f, 0f);
roomChangeTimer.scheduleTask(new Timer.Task() {
@Override
public void run() {
if(roomChangeRow >= 9){
roomLoading = false;
roomChangeRow = 0;
roomChangeTimer.stop();
}
else{
roomChangeRow++;
}
}
},0, 0.03f);
// CONTROLS
controls = new ArrayList();
int hudX = -160;
int hudY = 25;
controls.add(new Button("sprites/controls/arrowLeft.png", hudX + 0, hudY + 50, 0));
controls.add(new Button("sprites/controls/arrowUp.png", hudX + 50, hudY + 100, 1));
controls.add(new Button("sprites/controls/arrowRight.png", hudX + 100, hudY + 50, 2));
controls.add(new Button("sprites/controls/arrowDown.png", hudX + 50, hudY + 0, 3));
controls.add(new Button("sprites/controls/arrowLeft.png", 550-170, 75, 4));
controls.add(new Button("sprites/controls/arrowUp.png", 600-170, 125, 5));
controls.add(new Button("sprites/controls/arrowRight.png", 650-170, 75, 6));
controls.add(new Button("sprites/controls/arrowDown.png", 600-170, 25, 7));
controls.add(new Button("sprites/controls/pickUp.png", 160-110, 30, 8));
controls.add(new Button("sprites/controls/equip1.png", 160-110, 120, 9));
controls.add(new Button("sprites/controls/drop.png", 160+110, 30, 10));
controls.add(new Button("sprites/controls/equip2.png", 160+110, 120, 11));
controls.add(new Button("sprites/controls/use.png", 600-170, 200, 12));
// INVENTORY
controls.add(new Button("sprites/controls/inventorySlot.png", -118, 334, 20)); //0
controls.add(new Button("sprites/controls/inventorySlot.png", -69, 334, 21)); //1
controls.add(new Button("sprites/controls/inventorySlot.png", -144, 282, 22)); //2
controls.add(new Button("sprites/controls/inventorySlot.png", -92, 282, 23)); //3
controls.add(new Button("sprites/controls/inventorySlot.png", -42, 282, 24)); //4
controls.add(new Button("sprites/controls/inventorySlot.png", -144, 231, 25)); //5
controls.add(new Button("sprites/controls/inventorySlot.png", -92, 231, 26)); //6
controls.add(new Button("sprites/controls/inventorySlot.png", -42, 231, 27)); //7
}
public void render (SpriteBatch batch, Player p, Entity[] e, int tileX, int tileY, int level, int roomPosX, int roomPosY, OrthographicCamera camera) {
entities = e;
this.p = p;
//playerMoving = (p.getMovementX() != 0 || p.getMovementY() != 0);
//setzt player Sprite auf richtige Position
player.update((int) p.getxPos(), (int) p.getyPos());
if(p.getMovementX() > 1){
player.setDirection(1);
player.updateFlip();
}
else if(p.getMovementX() < -1){
player.setDirection(0);
player.updateFlip();
}
tm = getM().getMaps()[level][roomPosX][roomPosY].getMap();
objects = getM().getMaps()[level][roomPosX][roomPosY].getObjects();
mapItems = getM().getMaps()[level][roomPosX][roomPosY].getMapItems();
doors = getM().getMaps()[level][roomPosX][roomPosY].getDoors();
if(tm != null){
tmr = new OrthogonalTiledMapRenderer(tm);
}
//MAP
tmr.setView(camera);
tmr.render();
updateEntitySprites(e);
ArrayList<EntitySprite> temp = new ArrayList<>();
for(EntitySprite entity : entitySprites){
if(entity != null){
temp.add(entity);
}
}
EntitySprite[] renderArray = new EntitySprite[temp.size() + 1];
for(int i = 0; i < renderArray.length; i++){
if(i == renderArray.length - 1){
renderArray[i] = player;
}
else{
renderArray[i] = temp.get(i);
}
}
Arrays.sort(renderArray);
//BATCH
batch.begin();
for(AnimatedObject object : objects){
object.getSprite().draw(batch);
}
for(AnimatedObject mapItem : mapItems){
mapItem.getSprite().draw(batch);
}
for(AnimatedObject door : doors){
door.getSprite().draw(batch);
}
for(EntitySprite eSprite : renderArray){
eSprite.getSprites()[0].draw(batch);
}
if(roomLoading == true){
roomChangeSprite.setRegion(roomChangeTextureRegion[0][roomChangeRow]);
roomChangeSprite.draw(batch);
}
for(int x = 0; x < dmgContainer.length; x++){
if(dmgContainer[x] != null){
String text = ""+dmgContainer[x].getValue();
font.draw(batch, text, dmgContainer[x].getCurrentX(), dmgContainer[x].getCurrentY());
}
}
for(Button button : controls){
button.getSprite().draw(batch);
}
batch.end();
// BUTTON HITBOXES
/*
ShapeRenderer lol = new ShapeRenderer();
lol.setProjectionMatrix(camera.combined);
lol.begin(ShapeRenderer.ShapeType.Filled);
for(Button button : controls){
lol.rect(button.getxPos(), button.getyPos(), button.getWidth(), button.getHeight());
}
lol.circle(mouseX,mouseY,15);
lol.end();
*/
}
public void generateEntitySprites(Entity[] e){
entitySprites = new EntitySprite[15];
for(int i = 0; i < e.length; i++){
generateNewEntitySprite(e[i], i);
}
}
public void generateNewEntitySprite(Entity e, int i){
if(e != null){
Texture[] tx = new Texture[1];
//nimmt entity ID -> 0 = Archer || 1 = Swordsman || 2 = Arrow || 3 = Wizard
double g = Math.random();
String gender;
if(g >= 0.5){
gender = "m";
}
else{
gender = "w";
}
switch(e.getId()){
case 0:
tx[0] = new Texture("sprites/archer/archer_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 1:
tx[0] = new Texture("sprites/swordsman/swordsman_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 2:
tx[0] = new Texture("sprites/projectile/arrow.png");
entitySprites[i] = new EntitySprite(tx, 24, 5);
break;
case 3:
tx[0] = new Texture("sprites/wizard/wizard_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 4:
tx[0] = new Texture("sprites/spell/spell.png");
entitySprites[i] = new EntitySprite(tx, 16, 16);
break;
case 5:
tx[0] = new Texture("sprites/projectile/laser.png");
entitySprites[i] = new EntitySprite(tx, 36, 15);
break;
case 6:
tx[0] = new Texture("sprites/wizard/firewizard_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 7:
tx[0] = new Texture("sprites/spell/firespell.png");
entitySprites[i] = new EntitySprite(tx, 16, 16);
break;
case 8:
tx[0] = new Texture("sprites/wizard/earthwizard_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 9:
tx[0] = new Texture("sprites/spell/earthspell.png");
entitySprites[i] = new EntitySprite(tx, 16, 16);
break;
case 10:
tx[0] = new Texture("sprites/swordsman/fireswordsman_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 11:
tx[0] = new Texture("sprites/archer/icearcher_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 12:
tx[0] = new Texture("sprites/projectile/icearrow.png");
entitySprites[i] = new EntitySprite(tx, 24, 5);
break;
case 13:
tx[0] = new Texture("sprites/archer/firearcher_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 14:
tx[0] = new Texture("sprites/projectile/firearrow.png");
entitySprites[i] = new EntitySprite(tx, 24, 5);
break;
case 15:
tx[0] = new Texture("sprites/swordsman/iceswordsman_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 16:
tx[0] = new Texture("sprites/wizard/icewizard_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 17:
tx[0] = new Texture("sprites/spell/icespell.png");
entitySprites[i] = new EntitySprite(tx, 16, 16);
break;
case 18:
tx[0] = new Texture("sprites/wizard/waterwizard_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 19:
tx[0] = new Texture("sprites/spell/waterspell.png");
entitySprites[i] = new EntitySprite(tx, 16, 16);
break;
case 20:
tx[0] = new Texture("sprites/wizard/healwizard_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 21:
tx[0] = new Texture("sprites/spell/healspell.png");
entitySprites[i] = new EntitySprite(tx, 16, 16);
break;
case 22:
tx[0] = new Texture("sprites/wizard/naturewizard_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 23:
tx[0] = new Texture("sprites/spell/naturespell.png");
entitySprites[i] = new EntitySprite(tx, 16, 16);
break;
case 24:
tx[0] = new Texture("sprites/wizard/darkwizard_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 25:
tx[0] = new Texture("sprites/spell/darkspell.png");
entitySprites[i] = new EntitySprite(tx, 16, 16);
break;
case 26:
tx[0] = new Texture("sprites/swordsman/darkswordsman_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 27:
tx[0] = new Texture("sprites/archer/darkarcher_"+gender+".png");
entitySprites[i] = new EntitySprite(tx, 64, 64);
break;
case 28:
tx[0] = new Texture("sprites/projectile/darkarrow.png");
entitySprites[i] = new EntitySprite(tx, 24, 5);
break;
}
entitySprites[i].update((int) e.getxPos() + 32, (int) e.getyPos() + 32);
if(e.getType() == 2){
entitySprites[i].getSprites()[0].setRotation((float) Math.toDegrees(e.getAngle()));
}
if(e.isToDelete()){
entitySprites[i].setDie(2);
}
entitySprites[i].updateAnimation(e);
}
}
public void updateEntitySprites(Entity[] e){
for(int i = 0; i < e.length; i++){
if(e[i] != null){
entitySprites[i].update((int) e[i].getxPos(), (int) e[i].getyPos());
}
}
}
public void deleteEntitySprite(int i){
entitySprites[i] = null;
}
public void updateDamageContainer(){
for(int x = 0; x < dmgContainer.length; x++){
if(dmgContainer[x] != null){
if(dmgContainer[x].getCurrentLifetime() >= dmgContainer[x].getLifetime()){
dmgContainer[x] = null;
}
else{
dmgContainer[x].setCurrentLifetime(dmgContainer[x].getCurrentLifetime() + 1);
dmgContainer[x].setCurrentY(dmgContainer[x].getCurrentY() + 1);
}
}
}
}
public void cleanUp(){
music.dispose();
animations.clear();
animatePlayer.clear();
}
public void startLoadingScreen(){
roomChangeSprite = new Sprite(new Texture("sprites/roomChange.png"));
roomChangeSprite.setPosition(0,0);
roomChangeTextureRegion = roomChangeSprite.split(528,432);
roomLoading = true;
roomChangeTimer.start();
}
public void startUnlockScreen(){
roomChangeSprite = new Sprite(new Texture("sprites/unlock.png"));
roomChangeSprite.setPosition(400,400);
roomChangeTextureRegion = roomChangeSprite.split(48,64);
roomLoading = true;
roomChangeTimer.start();
}
//GETTER
public EntitySprite getPlayer(){
return player;
}
public boolean getIsLoading(){
return roomLoading;
}
/**
* @return the m
*/
public Map getM() {
return m;
}
public void stop(){
animations.stop();
animatePlayer.stop();
}
public void resume(){
animations.start();
animatePlayer.start();
}
public void end(){
animations.stop();
animatePlayer.stop();
cleanUp();
}
public void createDmgFont(int value, int startX, int startY){
for(int i = 0; i < dmgContainer.length; i++){
if(dmgContainer[i]== null){
dmgContainer[i] = new DamageFontContainer(value, startX, startY);
i = dmgContainer.length + 1;
}
}
}
public ArrayList<Integer> click(int x, int y){
x = (int)(((float)x) / (float)Gdx.graphics.getWidth() * 700f) -170;
y = 380- (int)(((float)y) / (float)Gdx.graphics.getHeight() * 380f)+ 25;
mouseX = x;
mouseY = y;
ArrayList<Integer> clicks = new ArrayList();
Circle mouse = new Circle(x,y,20);
for(Button button : controls){
if(Intersector.overlaps(mouse, button.getSprite().getBoundingRectangle())){
clicks.add(button.getId());
}
}
return clicks;
}
}