commit 3b358c317b70d1198e2d26ba87efda8c0bf887e1 Author: Jonathan Hager Date: Fri Jun 26 08:04:19 2020 +0200 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ecc1c89 --- /dev/null +++ b/.gitignore @@ -0,0 +1,127 @@ +## Java + +*.class +*.war +*.ear +hs_err_pid* + +## Robovm +/ios/robovm-build/ + +## GWT +/html/war/ +/html/gwt-unitCache/ +.apt_generated/ +.gwt/ +gwt-unitCache/ +www-test/ +.gwt-tmp/ + +## Android Studio and Intellij and Android in general +/android/libs/armeabi/ +/android/libs/armeabi-v7a/ +/android/libs/arm64-v8a/ +/android/libs/x86/ +/android/libs/x86_64/ +/android/gen/ +.idea/ +*.ipr +*.iws +*.iml +/android/out/ +com_crashlytics_export_strings.xml + +## Eclipse + +.classpath +.project +.metadata/ +/android/bin/ +/core/bin/ +/desktop/bin/ +/html/bin/ +/ios/bin/ +/ios-moe/bin/ +*.tmp +*.bak +*.swp +*~.nib +.settings/ +.loadpath +.externalToolBuilders/ +*.launch + +## NetBeans + +/nbproject/private/ +/android/nbproject/private/ +/core/nbproject/private/ +/desktop/nbproject/private/ +/html/nbproject/private/ +/ios/nbproject/private/ +/ios-moe/nbproject/private/ + +/build/ +/android/build/ +/core/build/ +/desktop/build/ +/html/build/ +/ios/build/ +/ios-moe/build/ + +/nbbuild/ +/android/nbbuild/ +/core/nbbuild/ +/desktop/nbbuild/ +/html/nbbuild/ +/ios/nbbuild/ +/ios-moe/nbbuild/ + +/dist/ +/android/dist/ +/core/dist/ +/desktop/dist/ +/html/dist/ +/ios/dist/ +/ios-moe/dist/ + +/nbdist/ +/android/nbdist/ +/core/nbdist/ +/desktop/nbdist/ +/html/nbdist/ +/ios/nbdist/ +/ios-moe/nbdist/ + +nbactions.xml +nb-configuration.xml + +## Gradle + +/local.properties +.gradle/ +gradle-app.setting +/build/ +/android/build/ +/core/build/ +/desktop/build/ +/html/build/ +/ios/build/ +/ios-moe/build/ + +## OS Specific +.DS_Store +Thumbs.db + +## iOS +/ios/xcode/*.xcodeproj/* +!/ios/xcode/*.xcodeproj/xcshareddata +!/ios/xcode/*.xcodeproj/project.pbxproj +/ios/xcode/native/ +/ios/IOSLauncher.app +/ios/IOSLauncher.app.dSYM + +/ios-moe/xcode/*.xcodeproj/* +!/ios-moe/xcode/*.xcodeproj/xcshareddata +!/ios-moe/xcode/*.xcodeproj/project.pbxproj +/ios-moe/xcode/native/ diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 0000000..3e654f4 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/android/assets/badlogic.jpg b/android/assets/badlogic.jpg new file mode 100644 index 0000000..4390da6 Binary files /dev/null and b/android/assets/badlogic.jpg differ diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..45f09ea --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,92 @@ +android { + buildToolsVersion "30.0.0" + compileSdkVersion 30 + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + + } + packagingOptions { + exclude 'META-INF/robovm/ios/robovm.xml' + } + defaultConfig { + applicationId "com.dungeoncrawler.control" + minSdkVersion 14 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + + +// called every time gradle gets executed, takes the native dependencies of +// the natives configuration, and extracts them to the proper libs/ folders +// so they get packed with the APK. +task copyAndroidNatives { + doFirst { + file("libs/armeabi/").mkdirs() + file("libs/armeabi-v7a/").mkdirs() + file("libs/arm64-v8a/").mkdirs() + file("libs/x86_64/").mkdirs() + file("libs/x86/").mkdirs() + + configurations.natives.files.each { jar -> + def outputDir = null + if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a") + if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a") + if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi") + if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64") + if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86") + if(outputDir != null) { + copy { + from zipTree(jar) + into outputDir + include "*.so" + } + } + } + } +} + +tasks.whenTaskAdded { packageTask -> + if (packageTask.name.contains("package")) { + packageTask.dependsOn 'copyAndroidNatives' + } +} + +task run(type: Exec) { + def path + def localProperties = project.file("../local.properties") + if (localProperties.exists()) { + Properties properties = new Properties() + localProperties.withInputStream { instr -> + properties.load(instr) + } + def sdkDir = properties.getProperty('sdk.dir') + if (sdkDir) { + path = sdkDir + } else { + path = "$System.env.ANDROID_HOME" + } + } else { + path = "$System.env.ANDROID_HOME" + } + + def adb = path + "/platform-tools/adb" + commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.dungeoncrawler.control/com.dungeoncrawler.control.AndroidLauncher' +} + +eclipse.project.name = appName + "-android" diff --git a/android/ic_launcher-web.png b/android/ic_launcher-web.png new file mode 100644 index 0000000..8f0110d Binary files /dev/null and b/android/ic_launcher-web.png differ diff --git a/android/proguard-rules.pro b/android/proguard-rules.pro new file mode 100644 index 0000000..b166b1e --- /dev/null +++ b/android/proguard-rules.pro @@ -0,0 +1,45 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +-verbose + +-dontwarn android.support.** +-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication +-dontwarn com.badlogic.gdx.utils.GdxBuild +-dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild +-dontwarn com.badlogic.gdx.jnigen.BuildTarget* +-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild + +-keep class com.badlogic.gdx.controllers.android.AndroidControllers + +-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* { + (com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration); +} + +-keepclassmembers class com.badlogic.gdx.physics.box2d.World { + boolean contactFilter(long, long); + void beginContact(long); + void endContact(long); + void preSolve(long, long); + void postSolve(long, long); + boolean reportFixture(long); + float reportRayFixture(long, float, float, float, float, float); +} diff --git a/android/project.properties b/android/project.properties new file mode 100644 index 0000000..3fefa92 --- /dev/null +++ b/android/project.properties @@ -0,0 +1,9 @@ +# This file is used by the Eclipse ADT plugin. It is unnecessary for IDEA and Android Studio projects, which +# configure Proguard and the Android target via the build.gradle file. + +# To enable ProGuard to work with Eclipse ADT, uncomment this (available properties: sdk.dir, user.home) +# and ensure proguard.jar in the Android SDK is up to date (or alternately reduce the android target to 23 or lower): +# proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-rules.pro + +# Project target. +target=android-19 diff --git a/android/res/drawable-anydpi-v26/ic_launcher.xml b/android/res/drawable-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6c7313a --- /dev/null +++ b/android/res/drawable-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/android/res/drawable-anydpi-v26/ic_launcher_foreground.xml b/android/res/drawable-anydpi-v26/ic_launcher_foreground.xml new file mode 100644 index 0000000..5916ee8 --- /dev/null +++ b/android/res/drawable-anydpi-v26/ic_launcher_foreground.xml @@ -0,0 +1,40 @@ + + + + + + + + + diff --git a/android/res/drawable-hdpi/ic_launcher.png b/android/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000..91f696b Binary files /dev/null and b/android/res/drawable-hdpi/ic_launcher.png differ diff --git a/android/res/drawable-mdpi/ic_launcher.png b/android/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000..c1ab239 Binary files /dev/null and b/android/res/drawable-mdpi/ic_launcher.png differ diff --git a/android/res/drawable-xhdpi/ic_launcher.png b/android/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000..2011cc0 Binary files /dev/null and b/android/res/drawable-xhdpi/ic_launcher.png differ diff --git a/android/res/drawable-xxhdpi/ic_launcher.png b/android/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..25fcef0 Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/android/res/drawable-xxxhdpi/ic_launcher.png b/android/res/drawable-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..d109946 Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_launcher.png differ diff --git a/android/res/values/color.xml b/android/res/values/color.xml new file mode 100644 index 0000000..933353e --- /dev/null +++ b/android/res/values/color.xml @@ -0,0 +1,4 @@ + + + #FFFFFFFF + diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml new file mode 100644 index 0000000..2271e95 --- /dev/null +++ b/android/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + The Restless Caverns + + diff --git a/android/res/values/styles.xml b/android/res/values/styles.xml new file mode 100644 index 0000000..3f00fc5 --- /dev/null +++ b/android/res/values/styles.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/android/src/com/dungeoncrawler/control/AndroidLauncher.java b/android/src/com/dungeoncrawler/control/AndroidLauncher.java new file mode 100644 index 0000000..45f9716 --- /dev/null +++ b/android/src/com/dungeoncrawler/control/AndroidLauncher.java @@ -0,0 +1,16 @@ +package com.dungeoncrawler.control; + +import android.os.Bundle; + +import com.badlogic.gdx.backends.android.AndroidApplication; +import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; +import com.dungeoncrawler.control.Controller; + +public class AndroidLauncher extends AndroidApplication { + @Override + protected void onCreate (Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); + initialize(new Controller(), config); + } +} diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..338c25e --- /dev/null +++ b/build.gradle @@ -0,0 +1,87 @@ +buildscript { + + + repositories { + mavenLocal() + mavenCentral() + maven { url "https://plugins.gradle.org/m2/" } + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + jcenter() + google() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.4.1' + + + } +} + +allprojects { + apply plugin: "eclipse" + + version = '1.0' + ext { + appName = "The Restless Caverns" + gdxVersion = '1.9.10' + roboVMVersion = '2.3.8' + box2DLightsVersion = '1.4' + ashleyVersion = '1.7.0' + aiVersion = '1.8.0' + } + + repositories { + mavenLocal() + mavenCentral() + jcenter() + google() + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { url "https://oss.sonatype.org/content/repositories/releases/" } + } +} + +project(":desktop") { + apply plugin: "java-library" + + + dependencies { + implementation project(":core") + api "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" + api "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" + api "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" + + } +} + +project(":android") { + apply plugin: "android" + + configurations { natives } + + dependencies { + implementation project(":core") + api "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" + api "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" + natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi" + natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a" + natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a" + natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86" + natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64" + + } +} + +project(":core") { + apply plugin: "java-library" + + + dependencies { + api "com.badlogicgames.gdx:gdx:$gdxVersion" + api "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" + + } +} diff --git a/core/assets/music/gamemusic.mp3 b/core/assets/music/gamemusic.mp3 new file mode 100644 index 0000000..b5bdcee Binary files /dev/null and b/core/assets/music/gamemusic.mp3 differ diff --git a/core/assets/music/mainmenu.mp3 b/core/assets/music/mainmenu.mp3 new file mode 100644 index 0000000..2c24926 Binary files /dev/null and b/core/assets/music/mainmenu.mp3 differ diff --git a/core/assets/sprites/MAINSCREEN.png b/core/assets/sprites/MAINSCREEN.png new file mode 100644 index 0000000..7cf5af8 Binary files /dev/null and b/core/assets/sprites/MAINSCREEN.png differ diff --git a/core/assets/sprites/amulet.png b/core/assets/sprites/amulet.png new file mode 100644 index 0000000..95bd391 Binary files /dev/null and b/core/assets/sprites/amulet.png differ diff --git a/core/assets/sprites/archer/archer_m.png b/core/assets/sprites/archer/archer_m.png new file mode 100644 index 0000000..e840069 Binary files /dev/null and b/core/assets/sprites/archer/archer_m.png differ diff --git a/core/assets/sprites/archer/archer_w.png b/core/assets/sprites/archer/archer_w.png new file mode 100644 index 0000000..3f2e979 Binary files /dev/null and b/core/assets/sprites/archer/archer_w.png differ diff --git a/core/assets/sprites/archer/darkarcher_m.png b/core/assets/sprites/archer/darkarcher_m.png new file mode 100644 index 0000000..98b843c Binary files /dev/null and b/core/assets/sprites/archer/darkarcher_m.png differ diff --git a/core/assets/sprites/archer/darkarcher_w.png b/core/assets/sprites/archer/darkarcher_w.png new file mode 100644 index 0000000..fe0cf83 Binary files /dev/null and b/core/assets/sprites/archer/darkarcher_w.png differ diff --git a/core/assets/sprites/archer/firearcher_m.png b/core/assets/sprites/archer/firearcher_m.png new file mode 100644 index 0000000..093e4f1 Binary files /dev/null and b/core/assets/sprites/archer/firearcher_m.png differ diff --git a/core/assets/sprites/archer/firearcher_w.png b/core/assets/sprites/archer/firearcher_w.png new file mode 100644 index 0000000..2629364 Binary files /dev/null and b/core/assets/sprites/archer/firearcher_w.png differ diff --git a/core/assets/sprites/archer/icearcher_m.png b/core/assets/sprites/archer/icearcher_m.png new file mode 100644 index 0000000..bc48117 Binary files /dev/null and b/core/assets/sprites/archer/icearcher_m.png differ diff --git a/core/assets/sprites/archer/icearcher_w.png b/core/assets/sprites/archer/icearcher_w.png new file mode 100644 index 0000000..8dd6f66 Binary files /dev/null and b/core/assets/sprites/archer/icearcher_w.png differ diff --git a/core/assets/sprites/backButton.png b/core/assets/sprites/backButton.png new file mode 100644 index 0000000..a277684 Binary files /dev/null and b/core/assets/sprites/backButton.png differ diff --git a/core/assets/sprites/controlsButton.png b/core/assets/sprites/controlsButton.png new file mode 100644 index 0000000..2188584 Binary files /dev/null and b/core/assets/sprites/controlsButton.png differ diff --git a/core/assets/sprites/controlsContainer.PNG b/core/assets/sprites/controlsContainer.PNG new file mode 100644 index 0000000..a618593 Binary files /dev/null and b/core/assets/sprites/controlsContainer.PNG differ diff --git a/core/assets/sprites/cursor.png b/core/assets/sprites/cursor.png new file mode 100644 index 0000000..4360bb2 Binary files /dev/null and b/core/assets/sprites/cursor.png differ diff --git a/core/assets/sprites/dmgAmulet.png b/core/assets/sprites/dmgAmulet.png new file mode 100644 index 0000000..f727c11 Binary files /dev/null and b/core/assets/sprites/dmgAmulet.png differ diff --git a/core/assets/sprites/door.png b/core/assets/sprites/door.png new file mode 100644 index 0000000..5adc75b Binary files /dev/null and b/core/assets/sprites/door.png differ diff --git a/core/assets/sprites/doorbottom.png b/core/assets/sprites/doorbottom.png new file mode 100644 index 0000000..8307527 Binary files /dev/null and b/core/assets/sprites/doorbottom.png differ diff --git a/core/assets/sprites/doorleft.png b/core/assets/sprites/doorleft.png new file mode 100644 index 0000000..53a02d5 Binary files /dev/null and b/core/assets/sprites/doorleft.png differ diff --git a/core/assets/sprites/doorright.png b/core/assets/sprites/doorright.png new file mode 100644 index 0000000..d296cff Binary files /dev/null and b/core/assets/sprites/doorright.png differ diff --git a/core/assets/sprites/female.png b/core/assets/sprites/female.png new file mode 100644 index 0000000..75074d8 Binary files /dev/null and b/core/assets/sprites/female.png differ diff --git a/core/assets/sprites/hud.png b/core/assets/sprites/hud.png new file mode 100644 index 0000000..b2e39ff Binary files /dev/null and b/core/assets/sprites/hud.png differ diff --git a/core/assets/sprites/hudInventory.png b/core/assets/sprites/hudInventory.png new file mode 100644 index 0000000..a2ff6ef Binary files /dev/null and b/core/assets/sprites/hudInventory.png differ diff --git a/core/assets/sprites/key.png b/core/assets/sprites/key.png new file mode 100644 index 0000000..88374ac Binary files /dev/null and b/core/assets/sprites/key.png differ diff --git a/core/assets/sprites/left.png b/core/assets/sprites/left.png new file mode 100644 index 0000000..50d83d9 Binary files /dev/null and b/core/assets/sprites/left.png differ diff --git a/core/assets/sprites/logo.png b/core/assets/sprites/logo.png new file mode 100644 index 0000000..c0b960b Binary files /dev/null and b/core/assets/sprites/logo.png differ diff --git a/core/assets/sprites/male.png b/core/assets/sprites/male.png new file mode 100644 index 0000000..9764149 Binary files /dev/null and b/core/assets/sprites/male.png differ diff --git a/core/assets/sprites/player/player_0_m.png b/core/assets/sprites/player/player_0_m.png new file mode 100644 index 0000000..d2eaa07 Binary files /dev/null and b/core/assets/sprites/player/player_0_m.png differ diff --git a/core/assets/sprites/player/player_0_w.png b/core/assets/sprites/player/player_0_w.png new file mode 100644 index 0000000..333ae91 Binary files /dev/null and b/core/assets/sprites/player/player_0_w.png differ diff --git a/core/assets/sprites/player/player_1_m.png b/core/assets/sprites/player/player_1_m.png new file mode 100644 index 0000000..67d9a9a Binary files /dev/null and b/core/assets/sprites/player/player_1_m.png differ diff --git a/core/assets/sprites/player/player_1_w.png b/core/assets/sprites/player/player_1_w.png new file mode 100644 index 0000000..2ef144d Binary files /dev/null and b/core/assets/sprites/player/player_1_w.png differ diff --git a/core/assets/sprites/player/player_2_m.png b/core/assets/sprites/player/player_2_m.png new file mode 100644 index 0000000..747d137 Binary files /dev/null and b/core/assets/sprites/player/player_2_m.png differ diff --git a/core/assets/sprites/player/player_2_w.png b/core/assets/sprites/player/player_2_w.png new file mode 100644 index 0000000..0da4e85 Binary files /dev/null and b/core/assets/sprites/player/player_2_w.png differ diff --git a/core/assets/sprites/player/player_3_m.png b/core/assets/sprites/player/player_3_m.png new file mode 100644 index 0000000..4dfb801 Binary files /dev/null and b/core/assets/sprites/player/player_3_m.png differ diff --git a/core/assets/sprites/player/player_3_w.png b/core/assets/sprites/player/player_3_w.png new file mode 100644 index 0000000..2c2dff9 Binary files /dev/null and b/core/assets/sprites/player/player_3_w.png differ diff --git a/core/assets/sprites/player/player_4_m.png b/core/assets/sprites/player/player_4_m.png new file mode 100644 index 0000000..4b921ac Binary files /dev/null and b/core/assets/sprites/player/player_4_m.png differ diff --git a/core/assets/sprites/player/player_4_w.png b/core/assets/sprites/player/player_4_w.png new file mode 100644 index 0000000..7772d2d Binary files /dev/null and b/core/assets/sprites/player/player_4_w.png differ diff --git a/core/assets/sprites/player/player_5_m.png b/core/assets/sprites/player/player_5_m.png new file mode 100644 index 0000000..9b54576 Binary files /dev/null and b/core/assets/sprites/player/player_5_m.png differ diff --git a/core/assets/sprites/player/player_5_w.png b/core/assets/sprites/player/player_5_w.png new file mode 100644 index 0000000..4d935d5 Binary files /dev/null and b/core/assets/sprites/player/player_5_w.png differ diff --git a/core/assets/sprites/player/player_6_m.png b/core/assets/sprites/player/player_6_m.png new file mode 100644 index 0000000..4ba40c4 Binary files /dev/null and b/core/assets/sprites/player/player_6_m.png differ diff --git a/core/assets/sprites/player/player_6_w.png b/core/assets/sprites/player/player_6_w.png new file mode 100644 index 0000000..6c1b2d7 Binary files /dev/null and b/core/assets/sprites/player/player_6_w.png differ diff --git a/core/assets/sprites/playerHealthBar.png b/core/assets/sprites/playerHealthBar.png new file mode 100644 index 0000000..eef1574 Binary files /dev/null and b/core/assets/sprites/playerHealthBar.png differ diff --git a/core/assets/sprites/playerHealthBarContainer.png b/core/assets/sprites/playerHealthBarContainer.png new file mode 100644 index 0000000..a6dc0fa Binary files /dev/null and b/core/assets/sprites/playerHealthBarContainer.png differ diff --git a/core/assets/sprites/potion.png b/core/assets/sprites/potion.png new file mode 100644 index 0000000..f5a0c27 Binary files /dev/null and b/core/assets/sprites/potion.png differ diff --git a/core/assets/sprites/projectile/arrow.png b/core/assets/sprites/projectile/arrow.png new file mode 100644 index 0000000..7df0703 Binary files /dev/null and b/core/assets/sprites/projectile/arrow.png differ diff --git a/core/assets/sprites/projectile/darkarrow.png b/core/assets/sprites/projectile/darkarrow.png new file mode 100644 index 0000000..46610eb Binary files /dev/null and b/core/assets/sprites/projectile/darkarrow.png differ diff --git a/core/assets/sprites/projectile/firearrow.png b/core/assets/sprites/projectile/firearrow.png new file mode 100644 index 0000000..6fae466 Binary files /dev/null and b/core/assets/sprites/projectile/firearrow.png differ diff --git a/core/assets/sprites/projectile/icearrow.png b/core/assets/sprites/projectile/icearrow.png new file mode 100644 index 0000000..c370296 Binary files /dev/null and b/core/assets/sprites/projectile/icearrow.png differ diff --git a/core/assets/sprites/projectile/laser.png b/core/assets/sprites/projectile/laser.png new file mode 100644 index 0000000..b6730d4 Binary files /dev/null and b/core/assets/sprites/projectile/laser.png differ diff --git a/core/assets/sprites/quitButton.png b/core/assets/sprites/quitButton.png new file mode 100644 index 0000000..ee2b467 Binary files /dev/null and b/core/assets/sprites/quitButton.png differ diff --git a/core/assets/sprites/restartButton.png b/core/assets/sprites/restartButton.png new file mode 100644 index 0000000..763c305 Binary files /dev/null and b/core/assets/sprites/restartButton.png differ diff --git a/core/assets/sprites/right.png b/core/assets/sprites/right.png new file mode 100644 index 0000000..199c983 Binary files /dev/null and b/core/assets/sprites/right.png differ diff --git a/core/assets/sprites/roomChange.png b/core/assets/sprites/roomChange.png new file mode 100644 index 0000000..a3739c5 Binary files /dev/null and b/core/assets/sprites/roomChange.png differ diff --git a/core/assets/sprites/selected.png b/core/assets/sprites/selected.png new file mode 100644 index 0000000..635ae9f Binary files /dev/null and b/core/assets/sprites/selected.png differ diff --git a/core/assets/sprites/settingsButton.png b/core/assets/sprites/settingsButton.png new file mode 100644 index 0000000..207ffb2 Binary files /dev/null and b/core/assets/sprites/settingsButton.png differ diff --git a/core/assets/sprites/skinContainer.png b/core/assets/sprites/skinContainer.png new file mode 100644 index 0000000..db61eaa Binary files /dev/null and b/core/assets/sprites/skinContainer.png differ diff --git a/core/assets/sprites/spell/darkspell.png b/core/assets/sprites/spell/darkspell.png new file mode 100644 index 0000000..5039b53 Binary files /dev/null and b/core/assets/sprites/spell/darkspell.png differ diff --git a/core/assets/sprites/spell/earthspell.png b/core/assets/sprites/spell/earthspell.png new file mode 100644 index 0000000..9a73349 Binary files /dev/null and b/core/assets/sprites/spell/earthspell.png differ diff --git a/core/assets/sprites/spell/firespell.png b/core/assets/sprites/spell/firespell.png new file mode 100644 index 0000000..88fd816 Binary files /dev/null and b/core/assets/sprites/spell/firespell.png differ diff --git a/core/assets/sprites/spell/healspell.png b/core/assets/sprites/spell/healspell.png new file mode 100644 index 0000000..908a757 Binary files /dev/null and b/core/assets/sprites/spell/healspell.png differ diff --git a/core/assets/sprites/spell/icespell.png b/core/assets/sprites/spell/icespell.png new file mode 100644 index 0000000..61c3508 Binary files /dev/null and b/core/assets/sprites/spell/icespell.png differ diff --git a/core/assets/sprites/spell/naturespell.png b/core/assets/sprites/spell/naturespell.png new file mode 100644 index 0000000..67b237f Binary files /dev/null and b/core/assets/sprites/spell/naturespell.png differ diff --git a/core/assets/sprites/spell/spell.png b/core/assets/sprites/spell/spell.png new file mode 100644 index 0000000..8df5006 Binary files /dev/null and b/core/assets/sprites/spell/spell.png differ diff --git a/core/assets/sprites/spell/waterspell.png b/core/assets/sprites/spell/waterspell.png new file mode 100644 index 0000000..9900213 Binary files /dev/null and b/core/assets/sprites/spell/waterspell.png differ diff --git a/core/assets/sprites/startButton.png b/core/assets/sprites/startButton.png new file mode 100644 index 0000000..484a67d Binary files /dev/null and b/core/assets/sprites/startButton.png differ diff --git a/core/assets/sprites/swordsman/darkswordsman_m.png b/core/assets/sprites/swordsman/darkswordsman_m.png new file mode 100644 index 0000000..827f93e Binary files /dev/null and b/core/assets/sprites/swordsman/darkswordsman_m.png differ diff --git a/core/assets/sprites/swordsman/darkswordsman_w.png b/core/assets/sprites/swordsman/darkswordsman_w.png new file mode 100644 index 0000000..da848f4 Binary files /dev/null and b/core/assets/sprites/swordsman/darkswordsman_w.png differ diff --git a/core/assets/sprites/swordsman/fireswordsman_m.png b/core/assets/sprites/swordsman/fireswordsman_m.png new file mode 100644 index 0000000..d18b1c4 Binary files /dev/null and b/core/assets/sprites/swordsman/fireswordsman_m.png differ diff --git a/core/assets/sprites/swordsman/fireswordsman_w.png b/core/assets/sprites/swordsman/fireswordsman_w.png new file mode 100644 index 0000000..962a69f Binary files /dev/null and b/core/assets/sprites/swordsman/fireswordsman_w.png differ diff --git a/core/assets/sprites/swordsman/iceswordsman_m.png b/core/assets/sprites/swordsman/iceswordsman_m.png new file mode 100644 index 0000000..7255e0a Binary files /dev/null and b/core/assets/sprites/swordsman/iceswordsman_m.png differ diff --git a/core/assets/sprites/swordsman/iceswordsman_w.png b/core/assets/sprites/swordsman/iceswordsman_w.png new file mode 100644 index 0000000..27fe1a4 Binary files /dev/null and b/core/assets/sprites/swordsman/iceswordsman_w.png differ diff --git a/core/assets/sprites/swordsman/swordsman_m.png b/core/assets/sprites/swordsman/swordsman_m.png new file mode 100644 index 0000000..327d352 Binary files /dev/null and b/core/assets/sprites/swordsman/swordsman_m.png differ diff --git a/core/assets/sprites/swordsman/swordsman_w.png b/core/assets/sprites/swordsman/swordsman_w.png new file mode 100644 index 0000000..5dddc5d Binary files /dev/null and b/core/assets/sprites/swordsman/swordsman_w.png differ diff --git a/core/assets/sprites/torch.png b/core/assets/sprites/torch.png new file mode 100644 index 0000000..d4d5dfb Binary files /dev/null and b/core/assets/sprites/torch.png differ diff --git a/core/assets/sprites/unlock.png b/core/assets/sprites/unlock.png new file mode 100644 index 0000000..7f9faab Binary files /dev/null and b/core/assets/sprites/unlock.png differ diff --git a/core/assets/sprites/volume.png b/core/assets/sprites/volume.png new file mode 100644 index 0000000..16e19d9 Binary files /dev/null and b/core/assets/sprites/volume.png differ diff --git a/core/assets/sprites/volumeButton.png b/core/assets/sprites/volumeButton.png new file mode 100644 index 0000000..d9ee060 Binary files /dev/null and b/core/assets/sprites/volumeButton.png differ diff --git a/core/assets/sprites/volumeDownButton.png b/core/assets/sprites/volumeDownButton.png new file mode 100644 index 0000000..72560c1 Binary files /dev/null and b/core/assets/sprites/volumeDownButton.png differ diff --git a/core/assets/sprites/volumeUpButton.png b/core/assets/sprites/volumeUpButton.png new file mode 100644 index 0000000..83b98dd Binary files /dev/null and b/core/assets/sprites/volumeUpButton.png differ diff --git a/core/assets/sprites/wizard/darkwizard_m.png b/core/assets/sprites/wizard/darkwizard_m.png new file mode 100644 index 0000000..67c35e3 Binary files /dev/null and b/core/assets/sprites/wizard/darkwizard_m.png differ diff --git a/core/assets/sprites/wizard/darkwizard_w.png b/core/assets/sprites/wizard/darkwizard_w.png new file mode 100644 index 0000000..b1835bf Binary files /dev/null and b/core/assets/sprites/wizard/darkwizard_w.png differ diff --git a/core/assets/sprites/wizard/earthwizard_m.png b/core/assets/sprites/wizard/earthwizard_m.png new file mode 100644 index 0000000..69897f1 Binary files /dev/null and b/core/assets/sprites/wizard/earthwizard_m.png differ diff --git a/core/assets/sprites/wizard/earthwizard_w.png b/core/assets/sprites/wizard/earthwizard_w.png new file mode 100644 index 0000000..2c156d4 Binary files /dev/null and b/core/assets/sprites/wizard/earthwizard_w.png differ diff --git a/core/assets/sprites/wizard/firewizard_m.png b/core/assets/sprites/wizard/firewizard_m.png new file mode 100644 index 0000000..4516f34 Binary files /dev/null and b/core/assets/sprites/wizard/firewizard_m.png differ diff --git a/core/assets/sprites/wizard/firewizard_w.png b/core/assets/sprites/wizard/firewizard_w.png new file mode 100644 index 0000000..1444cca Binary files /dev/null and b/core/assets/sprites/wizard/firewizard_w.png differ diff --git a/core/assets/sprites/wizard/healwizard_m.png b/core/assets/sprites/wizard/healwizard_m.png new file mode 100644 index 0000000..2488b33 Binary files /dev/null and b/core/assets/sprites/wizard/healwizard_m.png differ diff --git a/core/assets/sprites/wizard/healwizard_w.png b/core/assets/sprites/wizard/healwizard_w.png new file mode 100644 index 0000000..5f9152f Binary files /dev/null and b/core/assets/sprites/wizard/healwizard_w.png differ diff --git a/core/assets/sprites/wizard/icewizard_m.png b/core/assets/sprites/wizard/icewizard_m.png new file mode 100644 index 0000000..3b25858 Binary files /dev/null and b/core/assets/sprites/wizard/icewizard_m.png differ diff --git a/core/assets/sprites/wizard/icewizard_w.png b/core/assets/sprites/wizard/icewizard_w.png new file mode 100644 index 0000000..e043ddf Binary files /dev/null and b/core/assets/sprites/wizard/icewizard_w.png differ diff --git a/core/assets/sprites/wizard/naturewizard_m.png b/core/assets/sprites/wizard/naturewizard_m.png new file mode 100644 index 0000000..d34478d Binary files /dev/null and b/core/assets/sprites/wizard/naturewizard_m.png differ diff --git a/core/assets/sprites/wizard/naturewizard_w.png b/core/assets/sprites/wizard/naturewizard_w.png new file mode 100644 index 0000000..2a329e6 Binary files /dev/null and b/core/assets/sprites/wizard/naturewizard_w.png differ diff --git a/core/assets/sprites/wizard/waterwizard_m.png b/core/assets/sprites/wizard/waterwizard_m.png new file mode 100644 index 0000000..8ba639a Binary files /dev/null and b/core/assets/sprites/wizard/waterwizard_m.png differ diff --git a/core/assets/sprites/wizard/waterwizard_w.png b/core/assets/sprites/wizard/waterwizard_w.png new file mode 100644 index 0000000..8036e55 Binary files /dev/null and b/core/assets/sprites/wizard/waterwizard_w.png differ diff --git a/core/assets/sprites/wizard/wizard_m.png b/core/assets/sprites/wizard/wizard_m.png new file mode 100644 index 0000000..dcd1749 Binary files /dev/null and b/core/assets/sprites/wizard/wizard_m.png differ diff --git a/core/assets/sprites/wizard/wizard_w.png b/core/assets/sprites/wizard/wizard_w.png new file mode 100644 index 0000000..9d818bd Binary files /dev/null and b/core/assets/sprites/wizard/wizard_w.png differ diff --git a/core/assets/tilesets/tileset_floor_1.png b/core/assets/tilesets/tileset_floor_1.png new file mode 100644 index 0000000..7dd375f Binary files /dev/null and b/core/assets/tilesets/tileset_floor_1.png differ diff --git a/core/assets/tilesets/tileset_floor_2.png b/core/assets/tilesets/tileset_floor_2.png new file mode 100644 index 0000000..6b2de00 Binary files /dev/null and b/core/assets/tilesets/tileset_floor_2.png differ diff --git a/core/assets/tilesets/tileset_floor_3.png b/core/assets/tilesets/tileset_floor_3.png new file mode 100644 index 0000000..0f9c7c1 Binary files /dev/null and b/core/assets/tilesets/tileset_floor_3.png differ diff --git a/core/assets/tilesets/tileset_floor_4.png b/core/assets/tilesets/tileset_floor_4.png new file mode 100644 index 0000000..8d27e8f Binary files /dev/null and b/core/assets/tilesets/tileset_floor_4.png differ diff --git a/core/assets/tilesets/tileset_floor_5.png b/core/assets/tilesets/tileset_floor_5.png new file mode 100644 index 0000000..0e4a98e Binary files /dev/null and b/core/assets/tilesets/tileset_floor_5.png differ diff --git a/core/assets/tilesets/tileset_floor_6.png b/core/assets/tilesets/tileset_floor_6.png new file mode 100644 index 0000000..a62b1a4 Binary files /dev/null and b/core/assets/tilesets/tileset_floor_6.png differ diff --git a/core/assets/tilesets/tileset_floor_7.png b/core/assets/tilesets/tileset_floor_7.png new file mode 100644 index 0000000..222bb74 Binary files /dev/null and b/core/assets/tilesets/tileset_floor_7.png differ diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..2abc640 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,8 @@ +apply plugin: "java" + +sourceCompatibility = 1.7 +[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' + +sourceSets.main.java.srcDirs = [ "src/" ] + +eclipse.project.name = appName + "-core" diff --git a/core/src/THE_VOID/ArcherKI.java b/core/src/THE_VOID/ArcherKI.java new file mode 100644 index 0000000..7012756 --- /dev/null +++ b/core/src/THE_VOID/ArcherKI.java @@ -0,0 +1,57 @@ +package THE_VOID; + +/* + if(xPlayer == xPos){ //PLAYER auf X-Achse von Archer + if(yPlayer == yPos){} // //PLAYER pos = Archer pos + else if(yPlayer > yPos){movementY = 1f;} // //PLAYER ueber Archer + else if(yPlayer < yPos){movementY = -1f;} // //PLAYER unter Archer + } // + else if(yPlayer == yPos){ //PLAYER auf Y-Achse von Archer + if(xPlayer == xPos){} // //PLAYER pos = Archer pos + else if(xPlayer > xPos){movementX = 1f;} // //PLAYER rechts von Archer + else if(xPlayer < xPos){movementX = -1f;} // //PLAYER links von Archer + } // + else if(xPlayer > xPos){ //PLAYER rechts von Archer + if(yPlayer > yPos){ // //PLAYER ist im Quadrant I + if((yPlayer - yPos) > (xPlayer - xPos)){ // // //Weg zu PLAYER x kuerzer als zu PLAYER y + movementX = 1f; // // // + } // // // + else{ // // //Weg zu PLAYER y kuerzer als zu PLAYER x + movementY = 1f; // // + } // // + } // // + else if(yPlayer < yPos){ // //PLAYER ist im Quadrant II + if((yPos - yPlayer) > (xPlayer - xPos)){ // //Weg zu PLAYER x kuerzer als zu PLAYER y + movementX = 1f; // // + } // // + else{ // //Weg zu PLAYER y kuerzer als zu PLAYER y + movementY = -1f; // + } // + } // + } // + else if(xPlayer < xPos){ //PLAYER links von Archer + if(yPlayer < yPos){ // //PLAYER ist im Quadrant III + if((yPlayer - yPos) > (xPlayer - xPos)){ // // //Weg zu PLAYER x kuerzer als zu PLAYER y + movementX = -1f; // // // + } // // // + else{ // // //Weg zu PLAYER y kuerzer als zu PLAYER x + movementY = -1f; // // + } // // + } // // + else if(yPlayer > yPos){ // //PLAYER ist im Quadrant IV + if((yPlayer - yPos) > (xPos - xPlayer)){ // //Weg zu PLAYER x kuerzer als zu PLAYER y + movementX = -1; // // + } // // + else{ // //Weg zu PLAYER y kuerzer als zu PLAYER x + movementY = 1; // + } //////////// + } + } + + if(yPos + movementY < 0){ + + } + else if(xPos + movementX < 0){ + + }*/ + diff --git a/core/src/com/dungeoncrawler/Main.java b/core/src/com/dungeoncrawler/Main.java new file mode 100644 index 0000000..7211c28 --- /dev/null +++ b/core/src/com/dungeoncrawler/Main.java @@ -0,0 +1,11 @@ +package com.dungeoncrawler; + +import com.badlogic.gdx.ApplicationAdapter; + +public class Main extends ApplicationAdapter { + + + public Main(){ + } + +} diff --git a/core/src/com/dungeoncrawler/StaticMath.java b/core/src/com/dungeoncrawler/StaticMath.java new file mode 100644 index 0000000..6dd36e1 --- /dev/null +++ b/core/src/com/dungeoncrawler/StaticMath.java @@ -0,0 +1,57 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler; + +/** + * + * @author jonathan + */ +public class StaticMath { + + public static double calculateAngle(int xPos1, int yPos1, int xPos2, int yPos2){ + float deltaX = xPos2 - xPos1; + float deltaY = yPos2 - yPos1; + + double alpha; + if(deltaY == 0){ + if(deltaX < 0){ + alpha = Math.PI; + } + else{ + alpha = 0; + } + } + else if(deltaX == 0 && deltaY >= 0){ + alpha = Math.PI / 2; + } + else if(deltaX == 0 && deltaY < 0){ + alpha = Math.PI / -2; + } + else{ + alpha = Math.abs(Math.atan(deltaY / deltaX)); + + if(deltaX < 0 && deltaY < 0){ + alpha = Math.PI + alpha; + } + else if(deltaX < 0 && deltaY > 0){ + alpha = Math.PI - alpha; + } + else if(deltaX > 0 && deltaY < 0){ + alpha = 2*Math.PI - alpha; + } + } + + return alpha; + } + + public static double calculateDistance(int xPos1, int yPos1, int xPos2, int yPos2, double angle){ + float deltaX = xPos2 - xPos1; + float deltaY = yPos2 - yPos1; + + double distance = Math.abs((deltaY / Math.sin(angle))); + return distance; + } +} diff --git a/core/src/com/dungeoncrawler/control/Controller.java b/core/src/com/dungeoncrawler/control/Controller.java new file mode 100644 index 0000000..0160172 --- /dev/null +++ b/core/src/com/dungeoncrawler/control/Controller.java @@ -0,0 +1,1082 @@ + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.control; + +import com.badlogic.gdx.ApplicationAdapter; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.InputProcessor; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.maps.MapLayers; +import com.badlogic.gdx.maps.MapObjects; +import com.badlogic.gdx.maps.objects.RectangleMapObject; +import com.badlogic.gdx.math.Intersector; +import com.badlogic.gdx.math.Rectangle; +import com.dungeoncrawler.view.*; +import com.dungeoncrawler.model.Dungeon; +import com.dungeoncrawler.model.DungeonGenerator; +import com.dungeoncrawler.model.entities.*; +import com.dungeoncrawler.model.Entity; +import com.badlogic.gdx.utils.Timer; +import com.dungeoncrawler.model.ItemContainer; +import java.util.ArrayList; + +public class Controller extends ApplicationAdapter implements InputProcessor{ + + + SpriteBatch batch; + Dungeon d; + DungeonGenerator dg; + Timer tEntities; + + //SCREENS + + MainMenuScreen mm; + GameScreen gs; + HudContainer hc; + PauseScreen ps; + SettingsScreen ss; + ControlsScreen cs; + EndScreen es; + + // + int tileX; + int tileY; + + int roomPosX; + int roomPosY; + + int roomX; + int roomY; + + int level; + + int roomAmount; + float volume; + + + Timer entityMovement; + + boolean isPaused; + + int playerSkin; + + boolean checkDoor; + boolean checkDie; + + boolean end; + + int kills; + + @Override + public void create(){ + + checkDoor = true; + checkDie = true; + + kills = 0; + + end = false; + + playerSkin = 0; + isPaused = false; + + volume = 0.05f; + + roomX = 10; + roomY = 6; + + batch = new SpriteBatch(); + mm = new MainMenuScreen(volume); + dg = new DungeonGenerator(); + gs = null; + cs = null; + hc = null; + es = null; + + d = dg.generateDungeon(roomX - 1, roomY - 1, 48, new Player()); + dg.ichWillSpielen(d); + + tileX = roomX / 2; + tileY = roomY / 2; + + roomAmount = d.getLevel()[0].getRooms().length; + + level = 0; + + roomPosX = roomAmount / 2; + roomPosY = roomAmount / 2; + + d.setCurrentLevel(d.getLevel()[level]); + d.setCurrentRoom(d.getCurrentLevel().getRooms()[roomPosX][roomPosY]); + d.setCurrentEntities(d.getCurrentRoom().getEnemies()); + + Gdx.input.setInputProcessor(this); + + + entityMovement = new Timer(); + + entityMovement.scheduleTask(new Timer.Task() { + @Override + public void run() { + + if(gs != null){ + if(gs.player.getAttackState() == 2){ + playerAttack(d.getCurrentEntities(), d.getPlayer(), d.getPlayer().getDirection()); + } + + for(int i = 0; i < d.getCurrentEntities().length; i++){ + + if(d.getCurrentEntities()[i] != null){ + // Gets the collisions relevant sprites + MapObjects mapObjects = gs.getM().getMaps()[level][roomPosX][roomPosY].getMap().getLayers().get(0).getObjects(); + MapObjects doors = gs.getM().getMaps()[level][roomPosX][roomPosY].getMap().getLayers().get(4).getObjects(); + Rectangle playerSprite = gs.getPlayer().getFullCollisionSprite(); + + Entity temp = d.getCurrentEntities()[i]; + + int x = (int) temp.getxPos(); + int y = (int) temp.getyPos(); + + boolean attacks = d.getCurrentEntities()[i].move((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos()); + if(d.getPlayer().isToDelete()){ + attacks = false; + } + // Attacke wird gestartet, wenn noch keine laueft + if(attacks && gs.entitySprites[i].getAttackState() == 0){ + gs.entitySprites[i].startAttack(); + } + + EntitySprite tempObject = gs.entitySprites[i]; + tempObject.update((int) temp.getxPos(), (int) temp.getyPos()); + + boolean overlaps = false; + boolean delete = false; + + if(Intersector.overlaps(tempObject.getCollisionSprite(), playerSprite) && temp.isTargetsPlayer()){ + overlaps = true; + + if(d.getCurrentEntities()[i].getType() == 2 && d.getCurrentEntities()[i].isTargetsPlayer()){ + delete = true; + d.getCurrentEntities()[i].attack(d.getPlayer()); + + } + else{ + if(d.getCurrentEntities()[i].getType() == 0 && !d.getPlayer().isToDelete()){ + switch(gs.entitySprites[i].getAttackState()){ + case 0: + gs.entitySprites[i].startAttack(); + break; + case 1: + break; + case 2: + d.getCurrentEntities()[i].attack(d.getPlayer()); + gs.entitySprites[i].resetAttackState(); + break; + default: + } + } + } + } + else{ + + for(RectangleMapObject rectangleObject : mapObjects.getByType(RectangleMapObject.class)){ + Rectangle rectangle = rectangleObject.getRectangle(); + + if(Intersector.overlaps(tempObject.getCollisionSprite(), rectangle)){ + overlaps = true; + + if(d.getCurrentEntities()[i].getType() == 2){ + delete = true; + } + + break; + } + } + + for(RectangleMapObject rectangleObject : doors.getByType(RectangleMapObject.class)){ + Rectangle rectangle = rectangleObject.getRectangle(); + + if(Intersector.overlaps(tempObject.getCollisionSprite(), rectangle)){ + overlaps = true; + + if(d.getCurrentEntities()[i].getType() == 2){ + delete = true; + } + + break; + } + } + + if(d.getCurrentEntities()[i].getType() != 2){ + for(int j = 0; j < gs.entitySprites.length; j++){ + if(i != j){ + if(d.getCurrentEntities()[j] != null && d.getCurrentEntities()[j].getType() != 2 && !d.getCurrentEntities()[j].isToDelete()){ + if(Intersector.overlaps(tempObject.getCollisionSprite(), gs.entitySprites[j].getCollisionSprite())){ + overlaps = true; + break; + } + } + } + } + } + } + + if(temp.getType() == 2 && !temp.isTargetsPlayer()){ + for(int j = 0; j < gs.entitySprites.length; j++){ + if(i != j){ + if(d.getCurrentEntities()[j] != null && d.getCurrentEntities()[j].getType() != 2 && !d.getCurrentEntities()[j].getToDelete()){ + if(Intersector.overlaps(tempObject.getFullCollisionSprite(), gs.entitySprites[j].getFullCollisionSprite())){ + delete = true; + boolean isDead = d.getCurrentEntities()[i].attack(d.getCurrentEntities()[j]); + gs.createDmgFont((int) d.getPlayer().getDmg(),(int) d.getCurrentEntities()[j].getxPos(),(int) d.getCurrentEntities()[j].getyPos()); + if(isDead){ + gs.entitySprites[j].setDie(1); + d.getCurrentEntities()[j].setToDelete(true); + kills++; + } + break; + } + } + } + } + } + + if(d.getCurrentEntities()[i].getType() == 1 && gs.entitySprites[i].getAttackState() == 2){ + Entity arrow = d.getCurrentEntities()[i].shoot((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos()); + + for(int k = 5; k < d.getCurrentEntities().length; k++){ + if(d.getCurrentEntities()[k] == null){ + d.getCurrentEntities()[k] = arrow; + gs.generateNewEntitySprite(arrow, k); + break; + } + } + } + + if(gs.entitySprites[i].getAttackState() == 2){ + gs.entitySprites[i].resetAttackState(); + } + + if(overlaps){ + d.getCurrentEntities()[i].setxPos(x); + d.getCurrentEntities()[i].setyPos(y); + + tempObject.update(x, y); + } + + gs.entitySprites[i] = tempObject; + + + + if(delete || d.getCurrentEntities()[i].isToDelete()){ + if(d.getCurrentEntities()[i].getType()== 2){ + d.getCurrentEntities()[i] = null; + gs.deleteEntitySprite(i); + } + else{ + if(gs.entitySprites[i].getDie() == 0){ + gs.entitySprites[i].setDie(1); + } + else if(gs.entitySprites[i].getDie() == 2){ + //d.getCurrentEntities()[i] = null; + } + } + } + + gs.updateDamageContainer(); + } + } + + if(!hasEnemies()){ + gs.getM().getMaps()[level][roomPosX][roomPosY].raiseDoors(); + } + } + } + },0, 0.03f); + + } + + + @Override + public void render(){ + Gdx.gl.glClearColor(0, 0, 0, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + if(end == true){ + if(es == null){ + isPaused = true; + entityMovement.stop(); + gs.end(); + gs.getCamera().update(); + batch.setProjectionMatrix(gs.getCamera().combined); + gs = null; + hc = null; + es = new EndScreen(kills); + } + es.render(batch, volume); + return; + } + if(mm != null){ + mm.render(batch); + } + if(ss != null){ + ss.render(batch, volume); + } + if(cs != null){ + cs.render(batch); + } + if(ps != null){ + ps.render(batch, volume, gs.getCamera()); + } + + //PASSIERT IN GAMESCREEN + if(gs != null && mm == null && isPaused == false && es == null){ + + float tempX = d.getPlayer().getxPos(); + float tempY = d.getPlayer().getyPos(); + // Position des Players, etc. werden aktualisiert + updateObjects(level, roomPosX, roomPosY); + + + // tile[] beinhaltet die x und y Nummer des tiles, in dem sich der Player befindet + tileX = (int) d.getPlayer().getxPos() / 48; + tileY = (int) d.getPlayer().getyPos() / 48; + + if(tileX == 0 || tileX == roomX || tileY == 0 || tileY == roomY){ + updateRoom((int) tempX, (int) tempY); + } + + + + // Render methode zum rendern der einzelnen Sprites wird aufgerufen + if(gs != null){; + d.getPlayer().updateItems(); + gs.render(batch, d.getPlayer(), d.getCurrentEntities(), tileX, tileY, level, roomPosX, roomPosY); + hc.updateHud(batch, d.getPlayer()); + } + + } + } + + + @Override + public void dispose () { + batch.dispose(); + } + + public void updateObjects(int level, int roomPosX, int roomPosY){ + + MapLayers layers = gs.getM().getMaps()[level][roomPosX][roomPosY].getMap().getLayers(); + MapObjects objects = layers.get(0).getObjects(); + MapObjects exit = layers.get(3).getObjects(); + MapObjects door = layers.get(4).getObjects(); + + updatePlayer(objects, exit, door); + } + + public void updatePlayer(MapObjects objects, MapObjects exit, MapObjects door){ + + float x = d.getPlayer().getxPos(); + d.getPlayer().updateX(); + + gs.getPlayer().updateCollisionX((int) d.getPlayer().getxPos()); + + for(RectangleMapObject rectangleObject : objects.getByType(RectangleMapObject.class)){ + Rectangle rectangle = rectangleObject.getRectangle(); + + if(Intersector.overlaps(rectangle, gs.getPlayer().getCollisionSprite())){ + + d.getPlayer().setxPos(x); + + } + } + + for(RectangleMapObject rectangleObject : exit.getByType(RectangleMapObject.class)){ + Rectangle tempDoor = rectangleObject.getRectangle(); + + if(Intersector.overlaps(gs.getPlayer().getCollisionSprite(), tempDoor) && !d.getPlayer().checkKey()){ + d.getPlayer().setxPos(x); + } + } + + if(hasEnemies() && checkDoor){ + for(RectangleMapObject rectangleObject : door.getByType(RectangleMapObject.class)){ + Rectangle tempDoor = rectangleObject.getRectangle(); + + if(Intersector.overlaps(gs.getPlayer().getCollisionSprite(), tempDoor)){ + d.getPlayer().setxPos(x); + } + } + } + + float y = d.getPlayer().getyPos(); + d.getPlayer().updateY(); + gs.getPlayer().updateCollision((int) d.getPlayer().getxPos(),(int) d.getPlayer().getyPos()); + + for(RectangleMapObject rectangleObject : objects.getByType(RectangleMapObject.class)){ + Rectangle rectangle = rectangleObject.getRectangle(); + + if(Intersector.overlaps(rectangle, gs.getPlayer().getCollisionSprite())){ + + d.getPlayer().setyPos(y); + + } + } + + for(RectangleMapObject rectangleObject : exit.getByType(RectangleMapObject.class)){ + Rectangle tempDoor = rectangleObject.getRectangle(); + + if(Intersector.overlaps(gs.getPlayer().getCollisionSprite(), tempDoor) && !d.getPlayer().checkKey()){ + d.getPlayer().setyPos(y); + + } + } + + if(hasEnemies() && checkDoor){ + for(RectangleMapObject rectangleObject : door.getByType(RectangleMapObject.class)){ + Rectangle tempDoor = rectangleObject.getRectangle(); + + if(Intersector.overlaps(gs.getPlayer().getCollisionSprite(), tempDoor)){ + d.getPlayer().setyPos(y); + } + } + } + + if(d.getPlayer().getHp() <= 0 && checkDie){ + if(gs.player.getDie() == 0){ + gs.player.setDie(1); + d.getPlayer().setToDelete(true); + } + else if(gs.player.getDie() == 2){ + end = true; + return; + } + } + + d.getPlayer().updateDirection(); + } + + public void updateRoom(int tempX, int tempY){ + + + // Temp variablen werden wieder auf ihre Plätze geschrieben + + // Entities + d.getCurrentRoom().setEnemies(d.getCurrentEntities()); + + // Room + d.getCurrentLevel().setRoom(d.getCurrentRoom(), roomPosX, roomPosY); + + // Level + d.setLevel(d.getCurrentLevel(), level); + + clearEnemies(); + + // oben + if(tileX == (roomX / 2) && tileY == roomY){ + + roomPosY += 1; + d.getPlayer().setxPos((roomX / 2)* 48); + d.getPlayer().setyPos(48); + } + + // rechts + if(tileX == roomX && tileY == (roomY / 2)){ + + roomPosX += 1; + d.getPlayer().setxPos(48); + d.getPlayer().setyPos((roomY / 2)*48); + } + + // unten + if(tileX == (roomX / 2) && tileY == 0){ + + roomPosY -= 1; + d.getPlayer().setxPos((roomX / 2)*48); + d.getPlayer().setyPos(roomY*48 - 48); + } + + // links + if(tileX == 0 && tileY == (roomY / 2)){ + + roomPosX -= 1; + d.getPlayer().setxPos((roomX*48) - 48); + d.getPlayer().setyPos((roomY / 2)*48); + } + + if(roomPosX == d.getCurrentLevel().getExit()[0] && roomPosY == d.getCurrentLevel().getExit()[1]){ + if(level < 6){ + + d.getPlayer().deleteKey(); + gs.startUnlockScreen(); + + d.getPlayer().updateStats(level + 1); + + + level++; + + tileX = roomX / 2; + tileY = roomY / 2; + + int roomAmount = d.getLevel()[level].getRooms().length; + roomPosX = roomAmount / 2; + roomPosY = roomAmount / 2; + } + else{ // Dungeon Exit + end = true; + return; + } + } + + d.setCurrentLevel(d.getLevel()[level]); + d.setCurrentRoom(d.getCurrentLevel().getRooms()[roomPosX][roomPosY]); + d.setCurrentEntities(d.getCurrentRoom().getEnemies()); + + gs.generateEntitySprites(d.getCurrentEntities()); + + gs.startLoadingScreen(); + + if(hasEnemies()){ + gs.getM().getMaps()[level][roomPosX][roomPosY].lowerDoors(); + } + } + + + public ArrayList playerPickUp(){ + + ArrayList tempItems = d.getCurrentRoom().getItems(); + ArrayList tempSprites = gs.getM().getMaps()[level][roomPosX][roomPosY].getMapItems(); + ArrayList garbageCollector = new ArrayList<>(); + + for(int i = tempItems.size() - 1; i >= 0; i--){ + if(tempSprites.get(i).getSprite() != null){ + if(Intersector.overlaps(gs.getPlayer().getCollisionSprite(), tempSprites.get(i).getSprite().getBoundingRectangle())){ + garbageCollector.add(tempItems.get(i)); + + + tempItems.remove(i); + tempSprites.remove(i); + } + } + } + + d.getCurrentRoom().setItems(tempItems); + + return garbageCollector; + + } + + public Entity[] playerAttack(Entity e[], Player p, int attackDirection){ + EntitySprite player = gs.getPlayer(); + EntitySprite[] entitySprites = gs.entitySprites; + + if(player.getAttackState() == 0){ + player.startAttack(); + } + else if(player.getAttackState() == 1){ + player.resetAttackState(); + player.startAttack(); + } + else if(player.getAttackState() == 2){ + + Rectangle collision = new Rectangle(0, 0, gs.player.getCollisionSprite().getWidth(), gs.player.getFullCollisionSprite().getHeight()); + + if(attackDirection == 0){ + collision.setPosition(p.getxPos() - 32f, p.getyPos()); + } + else if(attackDirection== 1){ + collision.setPosition(p.getxPos() + 32f, p.getyPos()); + } + + for(int i = 0; i < e.length ; i++){ + if(entitySprites[i] != null && e[i] != null){ + if(Intersector.overlaps(entitySprites[i].getCollisionSprite(), collision)){ + if(entitySprites[i].getDie() == 0){ + if(e[i].getHp() - p.getDmg() <= 0){ + e[i].setHp(0); + gs.createDmgFont((int) p.getDmg(),(int)e[i].getxPos() + 10,(int) e[i].getyPos() + 20); + e[i].setToDelete(true); + kills++; + } + else{ + e[i].setHp(e[i].getHp() - p.getDmg()); + gs.createDmgFont((int) p.getDmg(),(int)e[i].getxPos() + 10,(int) e[i].getyPos() + 20); + } + } + } + } + } + + player.resetAttackState(); + } + + return e; + } + + @Override + public boolean keyDown(int keycode) { + + if(keycode == Input.Keys.A){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().setMovementX(-d.getPlayer().getMovementSpeed()); + } + } + + if(keycode == Input.Keys.D){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().setMovementX(d.getPlayer().getMovementSpeed()); + } + } + + if(keycode == Input.Keys.S){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().setMovementY(-d.getPlayer().getMovementSpeed()); + } + } + + if(keycode == Input.Keys.W){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().setMovementY(d.getPlayer().getMovementSpeed()); + } + } + + if(keycode == Input.Keys.SPACE){ + if(mm != null){} + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + d.setCurrentEntities(playerAttack(d.getCurrentEntities(), d.getPlayer(), 0)); + } + } + + + + if(keycode == Input.Keys.F){ + if(mm != null){} + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + if(!d.getPlayer().inventoryFull()){ + ArrayList garbage = playerPickUp(); + + for(ItemContainer item : garbage){ + d.getPlayer().getInv().addItem(item.getItem()); + } + } + } + } + + if(keycode == Input.Keys.R){ + if(mm != null){} + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().equipSlot(0); + d.getPlayer().updateItems(); + } + } + if(keycode == Input.Keys.T){ + if(mm != null){} + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().equipSlot(1); + d.getPlayer().updateItems(); + } + } + + + + if(keycode == Input.Keys.Q){ + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + if(d.getPlayer().getInv().getItem(d.getPlayer().getInv().getSelected()) != null){ + d.getCurrentRoom().spawnItem((int)d.getPlayer().getxPos(), (int)d.getPlayer().getyPos(), d.getPlayer().getInv().getItem(d.getPlayer().getInv().getSelected())); + gs.getM().getMaps()[level][roomPosX][roomPosY].addItem(48, 48,(int)d.getPlayer().getxPos(), (int)d.getPlayer().getyPos(), d.getPlayer().getInv().getItem(d.getPlayer().getInv().getSelected())); + d.getPlayer().getInv().dropItem(); + d.getPlayer().updateItems(); + } + } + } + + if(keycode == Input.Keys.E){ + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + d.getPlayer().useItem(d.getPlayer().getInv().getSelected()); + } + } + + if(keycode == Input.Keys.ESCAPE && !end){ + if(gs != null && gs.getIsLoading() == false && isPaused == false){ + stop(); + } + else if(gs != null && gs.getIsLoading() == false && isPaused == true){ + resume(); + } + } + + if(keycode == Input.Keys.LEFT){ + if(mm != null){} + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + Entity lol = d.getPlayer().shoot((int) d.getPlayer().getxPos() - 1, (int) d.getPlayer().getyPos()); + + for(int k = 5; k < d.getCurrentEntities().length; k++){ + if(d.getCurrentEntities()[k] == null && gs.player.getSecondaryAttackState() != 1){ + d.getCurrentEntities()[k] = lol; + gs.generateNewEntitySprite(lol, k); + gs.player.startSecondaryAttack(); + break; + } + } + } + } + + if(keycode == Input.Keys.UP){ + if(mm != null){} + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + Entity lol = d.getPlayer().shoot((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos() + 1); + + for(int k = 5; k < d.getCurrentEntities().length; k++){ + if(d.getCurrentEntities()[k] == null && gs.player.getSecondaryAttackState() != 1){ + d.getCurrentEntities()[k] = lol; + gs.generateNewEntitySprite(lol, k); + gs.player.startSecondaryAttack(); + break; + } + } + } + } + if(keycode == Input.Keys.RIGHT){ + if(mm != null){} + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + Entity lol = d.getPlayer().shoot((int) d.getPlayer().getxPos() + 1, (int) d.getPlayer().getyPos()); + + for(int k = 5; k < d.getCurrentEntities().length; k++){ + if(d.getCurrentEntities()[k] == null && gs.player.getSecondaryAttackState() != 1){ + d.getCurrentEntities()[k] = lol; + gs.generateNewEntitySprite(lol, k); + gs.player.startSecondaryAttack(); + break; + } + } + } + } + if(keycode == Input.Keys.DOWN){ + if(mm != null){} + if(gs != null && gs.getIsLoading() == false && !d.getPlayer().isToDelete()){ + Entity lol = d.getPlayer().shoot((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos() - 1); + + for(int k = 5; k < d.getCurrentEntities().length; k++){ + if(d.getCurrentEntities()[k] == null && gs.player.getSecondaryAttackState() != 1){ + d.getCurrentEntities()[k] = lol; + gs.generateNewEntitySprite(lol, k); + gs.player.startSecondaryAttack(); + break; + } + } + } + } + if(keycode == Input.Keys.NUM_0){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(0); + } + } + if(keycode == Input.Keys.NUM_1){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(0); + } + } + if(keycode == Input.Keys.NUM_2){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(1); + } + } + if(keycode == Input.Keys.NUM_3){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(2); + } + } + if(keycode == Input.Keys.NUM_4){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(3); + } + } + if(keycode == Input.Keys.NUM_5){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(4); + } + } + if(keycode == Input.Keys.NUM_6){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(5); + } + } + if(keycode == Input.Keys.NUM_7){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(6); + } + } + if(keycode == Input.Keys.NUM_8){ + if(mm != null){ + } + if(gs != null && !d.getPlayer().isToDelete()){ + d.getPlayer().getInv().setSelected(7); + } + } + + return true; + } + + @Override + public boolean keyUp(int keycode) { + if(keycode == Input.Keys.A){ + if(mm != null){ + } + if(gs != null){ + if(d.getPlayer().getMovementX() < 0){ + d.getPlayer().setMovementX(0); + } + } + } + + if(keycode == Input.Keys.D){ + if(mm != null){ + } + if(gs != null){ + if(d.getPlayer().getMovementX() > 0){ + d.getPlayer().setMovementX(0); + } + } + } + + if(keycode == Input.Keys.S){ + if(mm != null){ + } + if(gs != null){ + if(d.getPlayer().getMovementY() < 0){ + d.getPlayer().setMovementY(0); + } + + } + } + + if(keycode == Input.Keys.W){ + if(mm != null){ + } + if(gs != null){ + if(d.getPlayer().getMovementY() > 0){ + d.getPlayer().setMovementY(0); + } + } + } + + return true; + } + + @Override + public boolean keyTyped(char c) { + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) + { + if(button == Input.Buttons.LEFT){ + switch(click(screenX, screenY)){ + case -1: // -1: nothing hit -- 0: go ingame -- 1: EXIT game -- 2: goto settings -- 3: goto controls -- 4: goto MainMenuScreen -- 9: volume down -- 10: volume up -- 11: restart game + + return true; + case 0: + mm.cleanUp(); + mm = null; + gs = new GameScreen(d, volume); + gs.generateEntitySprites(d.getCurrentEntities()); + hc = new HudContainer(); + gs.startLoadingScreen(); + return true; + + case 1: + mm.cleanUp(); + mm = null; + gs = new GameScreen(d, volume); + return true; + + case 2: + mm.hide(); + cs = null; + ss = new SettingsScreen(); + return true; + + case 3: + if(mm != null){ + mm.hide(); + } + ss = null; + cs = new ControlsScreen(); + return true; + + case 4: + ss = null; + cs = null; + mm.show(); + return true; + + case 5: + resume(); + return true; + + case 6: + d.getPlayer().setSkin(mm.getSkin()); + d.getPlayer().setGender(mm.getGender()); + return true; + + + case 9: + if(volume > 0f){ + volume -= 0.05f; + } + if(mm != null){ + mm.music.setVolume(volume); + } + if(gs != null){ + gs.music.setVolume(volume); + } + return true; + case 10: + if(volume < 1f){ + volume += 0.05f; + } + + if(mm != null){ + mm.music.setVolume(volume); + } + if(gs != null){ + gs.music.setVolume(volume); + } + return true; + case 11: + create(); + return true; + } + + if(gs != null && gs.getIsLoading() == false){ + + + return true; + } + } + return true; + } + + public int click(int x, int y){ + if(es != null){ + return es.click(x, y); + } + if(ps != null){ + return ps.click(x,y); + } + if(mm != null && mm.getHidden() == false){ + return mm.click(x, y); + } + if(ss != null){ + return ss.click(x, y); + } + if(cs != null){ + return cs.click(x, y); + } + if(gs != null && isPaused == true){ + + } + return -1; + } + + + @Override + public boolean touchUp(int i, int i1, int i2, int i3) { + return false; + } + + @Override + public boolean touchDragged(int i, int i1, int i2) { + return false; + } + + @Override + public boolean mouseMoved(int i, int i1) { + return false; + } + + @Override + public boolean scrolled(int i) { + if(gs != null){ + if(i == -1 && d.getPlayer().getInv().getSelected() == 0){return true;} + else if(i == 1 && d.getPlayer().getInv().getSelected() == 7){return true;} + else{ + d.getPlayer().getInv().scroll(i); + return true; + } + } + return true; + } + + public void stop(){ + isPaused = true; + entityMovement.stop(); + gs.stop(); + cs = null; + ps = new PauseScreen(); + } + public void resume(){ + isPaused = false; + entityMovement.start(); + gs.resume(); + + ps = null; + gs.startLoadingScreen(); + } + + public boolean hasEnemies(){ + for(Entity e : d.getCurrentEntities()){ + if(e != null && !e.isToDelete()){ + if(e.isTargetsPlayer()){ + return true; + } + } + } + + return false; + } + + public void clearEnemies(){ + for(int i = 0; i < d.getCurrentEntities().length; i++){ + Entity e = d.getCurrentEntities()[i]; + + if(e != null && !e.isToDelete()){ + if(!e.isTargetsPlayer()){ + d.getCurrentEntities()[i] = null; + //gs.deleteEntitySprite(i); + } + } + } + } +} diff --git a/core/src/com/dungeoncrawler/model/Dungeon.java b/core/src/com/dungeoncrawler/model/Dungeon.java new file mode 100644 index 0000000..9bf5893 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/Dungeon.java @@ -0,0 +1,107 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model; + +import com.dungeoncrawler.model.entities.Player; + +/** + * + * @author jonathan + */ +public class Dungeon { + private Level level[]; + private Player player; + + private Level currentLevel; + private Room currentRoom; + private Entity[] currentEntities; + + public Dungeon(Player player){ + this.level = new Level[7]; + this.player = player; + } + + public void update(){ + // TODO: Implementieren + } + + /** + * @return the level + */ + public Level[] getLevel() { + return this.level; + } + + /** + * @param level the level to set + */ + public void setLevel(Level[] level) { + this.level = level; + } + + public void setLevel(Level level, int i){ + if(i < this.level.length){ + this.level[i] = level; + } + } + + /** + * @return the player + */ + public Player getPlayer() { + return this.player; + } + + /** + * @param player the player to set + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * @return the currentLevel + */ + public Level getCurrentLevel() { + return currentLevel; + } + + /** + * @param currentLevel the currentLevel to set + */ + public void setCurrentLevel(Level currentLevel) { + this.currentLevel = currentLevel; + } + + /** + * @return the currentRoom + */ + public Room getCurrentRoom() { + return currentRoom; + } + + /** + * @param currentRoom the currentRoom to set + */ + public void setCurrentRoom(Room currentRoom) { + this.currentRoom = currentRoom; + } + + /** + * @return the currentEntities + */ + public Entity[] getCurrentEntities() { + return currentEntities; + } + + /** + * @param currentEntities the currentEntities to set + */ + public void setCurrentEntities(Entity[] currentEntities) { + this.currentEntities = currentEntities; + } + +} diff --git a/core/src/com/dungeoncrawler/model/DungeonGenerator.java b/core/src/com/dungeoncrawler/model/DungeonGenerator.java new file mode 100644 index 0000000..4039d51 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/DungeonGenerator.java @@ -0,0 +1,412 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model; + +import com.dungeoncrawler.model.entities.*; +import com.dungeoncrawler.model.items.Amulet; +import com.dungeoncrawler.model.items.DmgAmulet; +import com.dungeoncrawler.model.items.Potion; +import com.dungeoncrawler.model.items.Key; +import java.util.ArrayList; + +/** + * + * @author jonathan + */ +public class DungeonGenerator { + + public DungeonGenerator(){ + + } + + public Dungeon generateDungeon(int sizeX, int sizeY, int tileSize, Player player){ + + Dungeon tempDungeon = new Dungeon(player); + int levelAmount = tempDungeon.getLevel().length; + + for(int i = 0; i < levelAmount; i++){ + tempDungeon.setLevel(generateLevel(sizeX, sizeY, tileSize, i+1), i); + } + + return tempDungeon; + + } + + private Level generateLevel(int sizeX, int sizeY, int tileSize, int lvl){ + int roomAmount = (int) (Math.random() * 6) + 5; + Level tempLevel = new Level(roomAmount); + + System.out.println(roomAmount); + + // TODO: Zufällig Türen setzen + + int xPos = roomAmount / 2; + int yPos = roomAmount / 2; + + tempLevel.setRoom(generateRoom(sizeX, sizeY, tileSize, lvl, false), xPos, yPos); + + // Schleife läuft so lange, bis die entsprechende Anzahl an Räumen generiert wurde + for(int i = 1; i < roomAmount;){ + + // Zufallszahl für die Richtung wird generiert, Oben: 0, Rechts: 1, Unten: 2, Links: 3 + int direction = (int) (Math.random() * 4); + + switch (direction) { + // Oben + case 0: + if(yPos != roomAmount - 1){ + yPos += 1; + } + break; + // Rechts + case 1: + if(xPos != roomAmount - 1){ + xPos += 1; + } + break; + // Unten + case 2: + if(yPos != 0){ + yPos -= 1; + } + break; + // Links + case 3: + if(xPos != 0){ + xPos -= 1; + } + break; + } + + // An der neuen Stelle vom Cursor gibt es noch keinen Raum + if(tempLevel.getRooms()[xPos][yPos] == null){ + tempLevel.setRoom(generateRoom(sizeX, sizeY, tileSize, lvl, true), xPos, yPos); + + // i darf nur erhöht werden, wenn auch ein Raum generiert wurde + i++; + } + + + } + + int keyRoom = (int) (Math.random()*roomAmount); + + int i = 0; + for(int x = 0; x < roomAmount; x++){ + for(int y = 0; y < roomAmount; y++){ + if(tempLevel.getRooms()[x][y] != null){ + if(i == keyRoom){ + Item tempItem = new Key(lvl); + ItemContainer tempContainer = new ItemContainer(((sizeX / 2) + 1) * 48, ((sizeY / 2) + 1) * 48, tempItem); + tempLevel.getRooms()[x][y].getItems().add(tempContainer); + } + + i++; + } + } + } + + // Exit wird generiert + if(lvl >= 7 && false){ + tempLevel.setExit(-1, 0); + tempLevel.setExit(-1, 1); + } + else{ + boolean istFertig = false; + do{ + // Zufallszahl für die Richtung wird generiert, Oben: 0, Rechts: 1, Unten: 2, Links: 3 + int direction = (int) (Math.random() * 4); + + switch (direction) { + // Oben + case 0: + if(yPos != roomAmount - 1){ + yPos += 1; + } + break; + // Rechts + case 1: + if(xPos != roomAmount - 1){ + xPos += 1; + } + break; + // Unten + case 2: + if(yPos != 0){ + yPos -= 1; + } + break; + // Links + case 3: + if(xPos != 0){ + xPos -= 1; + } + break; + } + + // An der neuen Stelle vom Cursor gibt es noch keinen Raum + if(tempLevel.getRooms()[xPos][yPos] == null){ + tempLevel.setRoom(generateRoom(sizeX, sizeY, tileSize, lvl, false), xPos, yPos); + + tempLevel.setExit(xPos, 0); + tempLevel.setExit(yPos, 1); + + istFertig = true; + } + } while(!istFertig); + } + + return tempLevel; + } + + private Room generateRoom(int sizeX, int sizeY, int tileSize, int lvl, boolean allowEnemies){ + int itemAmount = (int) (Math.random() * 2); + int enemyAmount = (int) (Math.random() * 5); + + Room tempRoom = new Room(new ArrayList(itemAmount), new Entity[15]); + + if(allowEnemies){ + // Items werden generiert + int[][] belegt = new int[itemAmount][2]; + for(int j = 0; j < belegt.length; j++){ + belegt[j][0] = -1; + belegt[j][1] = -1; + } + + for(int i = 0; i < itemAmount; i++){ + + int xTile; + int yTile; + + boolean istFertig = false; + do { + System.out.println("läuft"); + + // Tiles des Entities werden generiert + + xTile = generateTile(sizeX); + yTile = generateTile(sizeY); + + + // Test, ob Tiles bereits belegt + boolean hatGeklappt = true; + for(int j = 0; j < belegt.length; j++){ + if(j != i){ + if(xTile == belegt[j][0] && yTile == belegt[j][1]){ + hatGeklappt = false; + break; + } + } + } + + if(hatGeklappt == true){ + // Tiles zum Array hinzufügen + for(int j = 0; j < belegt.length; j++){ + if(belegt[j][0] == -1){ + belegt[j][0] = xTile; + belegt[j][1] = yTile; + } + } + + istFertig = true; + } + + } while(!istFertig); + + + // Berechnung der Positionen + + int xPos = xTile * tileSize; + int yPos = yTile * tileSize; + + // Typ des Entities wird generiert + + Item tempItem; + + int id = (int) (Math.random() * 3); + switch(id){ + case 0: + tempItem = new Amulet(lvl); + break; + + case 1: + tempItem = new Potion(lvl); + break; + case 2: + tempItem = new DmgAmulet(lvl); + break; + + default: + tempItem = null; + } + + if(tempItem == null){ + System.out.println("Es gibt Probleme, schau mal beim Raumgenerator nach. Es sind sogar sehr problematische Probleme mit den Items"); + } + + if(tempItem != null){ + ItemContainer tempContainer; + tempContainer = new ItemContainer(xPos, yPos, tempItem); + tempRoom.getItems().add(tempContainer); + } + + + } + + // Entities werden generiert + belegt = new int[enemyAmount][2]; + for(int j = 0; j < belegt.length; j++){ + belegt[j][0] = -1; + belegt[j][1] = -1; + } + + for(int i = 0; i < enemyAmount; i++){ + + int xTile; + int yTile; + + boolean istFertig = false; + do { + System.out.println("läuft"); + + // Tiles des Entities werden generiert + + xTile = generateTile(sizeX); + yTile = generateTile(sizeY); + + + // Test, ob Tiles bereits belegt + boolean hatGeklappt = true; + for(int j = 0; j < belegt.length; j++){ + if(j != i){ + if(xTile == belegt[j][0] && yTile == belegt[j][1]){ + hatGeklappt = false; + break; + } + } + } + + if(hatGeklappt == true){ + // Tiles zum Array hinzufügen + for(int j = 0; j < belegt.length; j++){ + if(belegt[j][0] == -1){ + belegt[j][0] = xTile; + belegt[j][1] = yTile; + } + } + + istFertig = true; + } + + } while(!istFertig); + + + // Berechnung der Positionen + + int xPos = xTile * tileSize; + int yPos = yTile * tileSize; + + // Typ des Entities wird generiert + + Entity temp; + + int id = (int) (Math.random() * 16); + switch(id){ + case 0: + temp = new Archer(xPos, yPos, lvl); + break; + case 1: + temp = new Swordsman(xPos, yPos, lvl); + break; + case 2: + temp = new Wizard(xPos, yPos, lvl); + break; + case 3: + temp = new Firewizard(xPos, yPos, lvl); + break; + case 4: + temp = new Earthwizard(xPos, yPos, lvl); + break; + case 5: + temp = new Fireswordsman(xPos, yPos, lvl); + break; + case 6: + temp = new Icearcher(xPos, yPos, lvl); + break; + case 7: + temp = new Firearcher(xPos, yPos, lvl); + break; + case 8: + temp = new Iceswordsman(xPos, yPos, lvl); + break; + case 9: + temp = new Icewizard(xPos, yPos, lvl); + break; + case 10: + temp = new Waterwizard(xPos, yPos, lvl); + break; + case 11: + //temp = new Healwizard(xPos, yPos, lvl); + /* wird nicht gespawnt + BUG: HP über 100%, also crash in HUD container lol + keine Lust zu beheben + --TODO-- + */ + temp = null; + break; + case 12: + temp = new Naturewizard(xPos, yPos, lvl); + break; + case 13: + temp = new Darkwizard(xPos, yPos, lvl); + break; + case 14: + temp = new Darkswordsman(xPos, yPos, lvl); + break; + case 15: + temp = new Darkarcher(xPos, yPos, lvl); + break; + default: + temp = null; + } + + if(temp == null){ + System.out.println("Es gibt Probleme, schau mal beim Raumgenerator nach. Es sind sogar sehr problematische Probleme"); + } + + tempRoom.setEnemies(temp, i); + } + } + + return tempRoom; + } + + private int generateTile(int size){ + int tile = ((int) (Math.random() * size) + 1); + return tile; + } + + public void ichWillSpielen(Dungeon d){ + + for(int i=0;i= 0; k--){ + if(temp.getRooms()[j][k] == null){ + System.out.print("0 "); + } + else{ + System.out.print("1 "); + } + } + System.out.println(); + } + } + } +} diff --git a/core/src/com/dungeoncrawler/model/Entity.java b/core/src/com/dungeoncrawler/model/Entity.java new file mode 100644 index 0000000..3d395f7 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/Entity.java @@ -0,0 +1,226 @@ +package com.dungeoncrawler.model; + +public abstract class Entity { + + protected float xPos; + protected float yPos; + protected float hp; + protected float maxhp; + protected float dmg; + protected int lvl; + protected float movementX; + protected float movementY; + protected int id; + protected int type; + protected int direction; + protected Inventory inv; + private boolean toDelete; + private double angle; + protected boolean targetsPlayer; + protected int standartDef; + protected int def; + + + + public Entity(float xPos, float yPos, int lvl){ + this.xPos = xPos; + this.yPos = yPos; + this.lvl = lvl; + this.movementX = 0; + this.movementY = 0; + this.direction = 2; + this.toDelete = false; + this.targetsPlayer = true; + this.standartDef = 0; + this.def = 0; + } + + public boolean attack(Entity e){ + if(e.getHp() - (this.dmg - e.getDef()) <= 0){ + e.setHp(0); + e.toDelete = true; + return true; + } + else{ + e.setHp(e.getHp() - (this.dmg - e.getDef())); + + /* + if(e.getMovementX() >= 0){ + e.setMovementX(e.getMovementX() - 2); + } + else{ + e.setMovementX(e.getMovementX() + 2); + } + + if(e.getMovementY() >= 0){ + e.setMovementY(e.getMovementY() - 2); + } + else{ + e.setMovementY(e.getMovementY() + 2); + } + */ + + return false; + } + + + } + + public Entity shoot(int xPosPlayer, int yPosPlayer){ + return null; + } + + public void update(){ + xPos += movementX; + yPos += movementY; + } + public void updateX(){ + xPos += movementX; + } + public void updateY(){ + yPos += movementY; + } + public void downgrade(){ + xPos -= movementX; + yPos -= movementY; + } + public void die(){ + + } + abstract public boolean move(int xPosPlayer, int yPosPlayer); + + public void updateDirection(){ + if(movementX > 1){ + direction = 1; + } + else if(movementX < -1){ + direction = 0; + } + } + + // GETTER + SETTER + public float getxPos() { + return xPos; + } + + public void setxPos(float xPos) { + this.xPos = xPos; + } + + public float getyPos() { + return yPos; + } + + public void setyPos(float yPos) { + this.yPos = yPos; + } + + public float getHp() { + return hp; + } + + public void setHp(float hp) { + this.hp = hp; + } + + public float getMaxhp() { + return maxhp; + } + + public void setMaxhp(float maxhp) { + this.maxhp = maxhp; + } + + public float getDmg() { + return dmg; + } + + public void setDmg(float dmg) { + this.dmg = dmg; + } + + public int getLvl() { + return lvl; + } + + public void setLvl(int lvl) { + this.lvl = lvl; + } + + public float getMovementX(){ + return movementX; + } + + public void setMovementX(float movementX){ + this.movementX = movementX; + } + + public float getMovementY(){ + return movementY; + } + + public void setMovementY(float movementY){ + this.movementY = movementY; + } + + public int getId(){ + return this.id; + } + + public int getDirection(){ + return direction; + } + + public void setDirection(int direction){ + this.direction = direction; + } + + public boolean getToDelete(){ + return this.isToDelete(); + } + + /** + * @return the angle + */ + public double getAngle() { + return angle; + } + + /** + * @param angle the angle to set + */ + public void setAngle(double angle) { + this.angle = angle; + } + + /** + * @return the toDelete + */ + public boolean isToDelete() { + return toDelete; + } + + /** + * @param toDelete the toDelete to set + */ + public void setToDelete(boolean toDelete) { + this.toDelete = toDelete; + } + + /** + * @return the type + */ + public int getType() { + return type; + } + + /** + * @return the targetsPlayer + */ + public boolean isTargetsPlayer() { + return targetsPlayer; + } + public int getDef(){ + return def; + } +} \ No newline at end of file diff --git a/core/src/com/dungeoncrawler/model/Inventory.java b/core/src/com/dungeoncrawler/model/Inventory.java new file mode 100644 index 0000000..cbb946e --- /dev/null +++ b/core/src/com/dungeoncrawler/model/Inventory.java @@ -0,0 +1,114 @@ +package com.dungeoncrawler.model; + +import com.dungeoncrawler.model.items.Key; + + +public class Inventory { + + Item items[]; + int selected; + int width; + int height; + + public Inventory(){ + items = new Item[8]; + selected = 2; + } + + public void addItem(Item i) + { + for(int n = 2; n < items.length; n++){ + if(items[n] == null){ + items[n] = i; + n = items.length + 1; + break; + } + } + } + + public void equipSlot(int slot){ + if(selected == 0 || selected == 1){ + Item temp0 = items[selected]; + items[selected] = null; + addItem(temp0); + } + else{ + if(items[selected] == null || items[selected].getId() == 0 || items[selected].getId() == 1){} + else{ + Item temp = items[slot]; + items[slot] = items[selected]; + items[selected] = temp; + } + } + } + + + public boolean inventoryFull(){ + for(int i = 2; i items; + private Entity[] enemies; + int lvl; + + public Room(ArrayList items, Entity[] enemies){ + this.items = items; + this.enemies = enemies; + + } + + + public void spawnEnemies(int xPos, int yPos, Entity enemy){ + enemy.setxPos(xPos); + enemy.setyPos(yPos); + } + + public void spawnItem(int xPos, int yPos, Item i){ + items.add(new ItemContainer(xPos, yPos, i)); + } + + /** + * @return the enemies + */ + public Entity[] getEnemies() { + return enemies; + } + + /** + * @param enemies the enemies to set + */ + public void setEnemies(Entity[] enemies) { + this.enemies = enemies; + } + + public void setEnemies(Entity enemy, int i){ + this.enemies[i] = enemy; + } + + /** + * @return the items + */ + public ArrayList getItems() { + return items; + } + + /** + * @param items the items to set + */ + public void setItems(ArrayList items) { + this.items = items; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Archer.java b/core/src/com/dungeoncrawler/model/entities/Archer.java new file mode 100644 index 0000000..000acfe --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Archer.java @@ -0,0 +1,99 @@ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +public class Archer extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Archer(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 75*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 5*lvl; + this.id = 0; + this.type = 1; + minRange = 70; + maxRange = 210; + attackSpeed = 70; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 2; + + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Projectile a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Projectile(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 2, true); + int tempX = (int) (6 * Math.cos(alpha)); + int tempY = (int) (6 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Darkarcher.java b/core/src/com/dungeoncrawler/model/entities/Darkarcher.java new file mode 100644 index 0000000..d003b37 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Darkarcher.java @@ -0,0 +1,99 @@ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +public class Darkarcher extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Darkarcher(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 100*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 7*lvl; + this.id = 27; + this.type = 1; + minRange = 80; + maxRange = 240; + attackSpeed = 100; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 2; + + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (4 * Math.cos(alpha)); + movementY = (int) (4 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Projectile a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Projectile(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 28, true); + int tempX = (int) (6 * Math.cos(alpha)); + int tempY = (int) (6 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Darkswordsman.java b/core/src/com/dungeoncrawler/model/entities/Darkswordsman.java new file mode 100644 index 0000000..9784a5b --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Darkswordsman.java @@ -0,0 +1,39 @@ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +public class Darkswordsman extends Entity { + + public Darkswordsman(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 120*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 12*lvl; + this.id = 26; + this.type = 0; + + // TODO: Sinnvolle Werte finden + direction = 2; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer){ + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + movementX = (int) (4 * Math.cos(alpha)); + movementY = (int) (4 * Math.sin(alpha)); + + xPos += movementX; + yPos += movementY; + + updateDirection(); + } + return false; + } + + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Darkwizard.java b/core/src/com/dungeoncrawler/model/entities/Darkwizard.java new file mode 100644 index 0000000..6ec51e4 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Darkwizard.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Darkwizard extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Darkwizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 80*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 10*lvl; + this.id = 24; + this.type = 1; + minRange = 140; + maxRange = 170; + attackSpeed = 70; // higher = slower + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < 144){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Spell a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Spell(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 25, true); + int tempX = (int) (5 * Math.cos(alpha)); + int tempY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Earthwizard.java b/core/src/com/dungeoncrawler/model/entities/Earthwizard.java new file mode 100644 index 0000000..8a04216 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Earthwizard.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Earthwizard extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Earthwizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 75*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 8*lvl; + this.id = 8; + this.type = 1; + minRange = 60; + maxRange = 150; + attackSpeed = 80; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Spell a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Spell(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 9, true); + int tempX = (int) (5 * Math.cos(alpha)); + int tempY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Firearcher.java b/core/src/com/dungeoncrawler/model/entities/Firearcher.java new file mode 100644 index 0000000..bef2554 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Firearcher.java @@ -0,0 +1,99 @@ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +public class Firearcher extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Firearcher(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 80*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 8*lvl; + this.id = 13; + this.type = 1; + minRange = 60; + maxRange = 200; + attackSpeed = 55; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 2; + + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Projectile a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Projectile(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 14, true); + int tempX = (int) (6 * Math.cos(alpha)); + int tempY = (int) (6 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Fireswordsman.java b/core/src/com/dungeoncrawler/model/entities/Fireswordsman.java new file mode 100644 index 0000000..3025fe1 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Fireswordsman.java @@ -0,0 +1,39 @@ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +public class Fireswordsman extends Entity { + + public Fireswordsman(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 100*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 15*lvl; + this.id = 10; + this.type = 0; + + // TODO: Sinnvolle Werte finden + direction = 2; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer){ + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + movementX = (int) (5 * Math.cos(alpha)); + movementY = (int) (5 * Math.sin(alpha)); + + xPos += movementX; + yPos += movementY; + + updateDirection(); + } + return false; + } + + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Firewizard.java b/core/src/com/dungeoncrawler/model/entities/Firewizard.java new file mode 100644 index 0000000..d6e15d2 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Firewizard.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Firewizard extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Firewizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 75*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 9*lvl; + this.id = 6; + this.type = 1; + minRange = 50; + maxRange = 130; + attackSpeed = 60; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Spell a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + + a = new Spell(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 7, true); + int tempX = (int) (5 * Math.cos(alpha)); + int tempY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Healwizard.java b/core/src/com/dungeoncrawler/model/entities/Healwizard.java new file mode 100644 index 0000000..c3354a4 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Healwizard.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Healwizard extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Healwizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 80*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 12*lvl; + this.id = 20; + this.type = 1; + minRange = 64; + maxRange = 124; + attackSpeed = 60; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Spell a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + + a = new Spell(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 21, true); + int tempX = (int) (5 * Math.cos(alpha)); + int tempY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Icearcher.java b/core/src/com/dungeoncrawler/model/entities/Icearcher.java new file mode 100644 index 0000000..facbb9c --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Icearcher.java @@ -0,0 +1,99 @@ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +public class Icearcher extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Icearcher(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 100*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 7*lvl; + this.id = 11; + this.type = 1; + minRange = 80; + maxRange = 240; + attackSpeed = 100; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 2; + + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (4 * Math.cos(alpha)); + movementY = (int) (4 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Projectile a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Projectile(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 12, true); + int tempX = (int) (6 * Math.cos(alpha)); + int tempY = (int) (6 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Iceswordsman.java b/core/src/com/dungeoncrawler/model/entities/Iceswordsman.java new file mode 100644 index 0000000..9a7df54 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Iceswordsman.java @@ -0,0 +1,39 @@ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +public class Iceswordsman extends Entity { + + public Iceswordsman(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 130*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 14*lvl; + this.id = 15; + this.type = 0; + + // TODO: Sinnvolle Werte finden + direction = 2; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer){ + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + movementX = (int) (4 * Math.cos(alpha)); + movementY = (int) (4 * Math.sin(alpha)); + + xPos += movementX; + yPos += movementY; + + updateDirection(); + } + return false; + } + + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Icewizard.java b/core/src/com/dungeoncrawler/model/entities/Icewizard.java new file mode 100644 index 0000000..ec49a02 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Icewizard.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Icewizard extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Icewizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 80*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 10*lvl; + this.id = 16; + this.type = 1; + minRange = 70; + maxRange = 190; + attackSpeed = 80; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Spell a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + + a = new Spell(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 17, true); + int tempX = (int) (5 * Math.cos(alpha)); + int tempY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Naturewizard.java b/core/src/com/dungeoncrawler/model/entities/Naturewizard.java new file mode 100644 index 0000000..31c2344 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Naturewizard.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Naturewizard extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Naturewizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 75*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 8*lvl; + this.id = 22; + this.type = 1; + minRange = 60; + maxRange = 150; + attackSpeed = 80; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Spell a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Spell(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 23, true); + int tempX = (int) (5 * Math.cos(alpha)); + int tempY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Player.java b/core/src/com/dungeoncrawler/model/entities/Player.java new file mode 100644 index 0000000..7ddb37a --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Player.java @@ -0,0 +1,185 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; +import com.dungeoncrawler.model.Inventory; +import com.dungeoncrawler.model.Item; +/** + * + * @author Jan + */ +public class Player extends Entity { + + float standartDmg; + float standartMaxHp; + + int skin; + String gender; + float standartMovementSpeed; + float movementSpeed; + + public Player() { + super(200, 200, 1); + this.skin = 0; + this.lvl = 1; + this.gender = "m"; + this.maxhp = 50 * lvl; + this.hp = this.maxhp; + this.standartMaxHp = 50 * lvl; + this.standartDef = 2 * lvl; + this.def = standartDef; + + this.dmg = 20*lvl; + this.standartDmg = this.dmg; + id = -1; + type = -1; + inv = new Inventory(); + // TODO: Sinnvolle Werte finden + this.targetsPlayer = false; + + this.standartMovementSpeed = 3; + this.movementSpeed = this.standartMovementSpeed; + + } + + public void updateStats(int ey){ + this.lvl = ey+1; + this.maxhp = 50 * this.lvl; + this.standartMaxHp = 50 * this.lvl; + this.standartDmg = 20 * this.lvl; + this.dmg = this.standartDmg; + this.standartDef = 4 * lvl; + this.def = this.standartDef; + updateItems(); + } + + public void pickUp(Item item){ + inv.addItem(item); + } + public Inventory getInv(){ + return inv; + } + + public void updateItems(){ + this.dmg = this.standartDmg; + this.def = this.standartDef; + this.maxhp = this.standartMaxHp; + this.movementSpeed = this.standartMovementSpeed; + if(hp > maxhp){ + hp = maxhp; + } + + if(inv.getItem(0) != null && inv.getItem(1) == null){ + this.dmg = this.standartDmg + inv.getItem(0).getDmg(); + this.maxhp = this.standartMaxHp + inv.getItem(0).getExtraHp(); + this.def = this.standartDef + inv.getItem(0).getDef(); + this.movementSpeed = this.standartMovementSpeed + inv.getItem(0).getMovementBoost(); + } + if(inv.getItem(1) != null && inv.getItem(0) == null){ + this.dmg = this.standartDmg + inv.getItem(1).getDmg(); + this.maxhp = this.standartMaxHp + inv.getItem(1).getExtraHp(); + this.def = this.standartDef + inv.getItem(1).getDef(); + this.movementSpeed = this.standartMovementSpeed + inv.getItem(1).getMovementBoost(); + } + if(inv.getItem(1) != null &&inv.getItem(0) != null){ + this.dmg = this.standartDmg + inv.getItem(0).getDmg() + inv.getItem(1).getDmg(); + this.maxhp = this.standartMaxHp + inv.getItem(0).getExtraHp()+ inv.getItem(1).getExtraHp(); + this.def = this.standartDef + inv.getItem(0).getDef() + inv.getItem(1).getDef(); + this.movementSpeed = this.standartMovementSpeed + inv.getItem(0).getMovementBoost() + inv.getItem(1).getMovementBoost(); + } + + + } + + public void useItem(int x){ + if(inv.getItem(x) != null){ + switch(inv.getItem(x).getId()){ + case 0: + // nix lol weil key + break; + case 1: + if(hp >= maxhp){ + + } + else{ + if(hp + inv.getItem(x).getHeal() >= maxhp){ + hp = maxhp; + } + else{ + this.hp = hp + inv.getItem(x).getHeal(); + } + inv.setItem(x, null); + } + break; + case 2: + // nix lol weil amulet + break; + } + + } + } + + public boolean move(int x, int y){ + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Projectile a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Projectile(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 5, false); + int tempMovementX = (int) (8 * Math.cos(alpha)); + int tempMovementY = (int) (8 * Math.sin(alpha)); + + a.setMovementX(tempMovementX + (0.5f * movementX)); + a.setMovementY(tempMovementY + (0.5f * movementY)); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } + + public boolean checkKey(){ + return inv.checkKey(); + } + + public void deleteKey(){ + inv.deleteKey(); + } + + public void setSkin(int i){ + skin = i; + } + public int getSkin(){ + return skin; + } + public void setGender(String i){ + gender = i; + } + public String getGender(){ + return gender; + } + public boolean inventoryFull(){ + return inv.inventoryFull(); + } + public float getMovementSpeed(){ + return movementSpeed; + } + + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Projectile.java b/core/src/com/dungeoncrawler/model/entities/Projectile.java new file mode 100644 index 0000000..fff393b --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Projectile.java @@ -0,0 +1,48 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.model.Entity; + + +public class Projectile extends Entity{ + float xStart; + float yStart; + int direction; + int lifetime; + + public Projectile(float xPos, float yPos, int lvl, int dmg, int id, boolean targetsPlayer){ + super(xPos, yPos, lvl); + xStart = xPos; + yStart = yPos; + this.dmg = dmg; + this.id = id; + type = 2; + this.lifetime = 0; + this.targetsPlayer = targetsPlayer; + } + + public float getxStart(){ + return xStart; + } + public float getyStart(){ + return yStart; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + lifetime++; + + xPos += movementX; + yPos += movementY; + + if(this.lifetime > 50){ + this.setToDelete(true); + } + + return false; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Spell.java b/core/src/com/dungeoncrawler/model/entities/Spell.java new file mode 100644 index 0000000..e5f4965 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Spell.java @@ -0,0 +1,56 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + + +public class Spell extends Entity{ + float xStart; + float yStart; + int direction; + int lifetime; + + public Spell(float xPos, float yPos, int lvl, int dmg, int id, boolean targetsPlayer){ + super(xPos, yPos, lvl); + xStart = xPos; + yStart = yPos; + this.dmg = dmg; + this.id = id; + type = 2; + this.lifetime = 0; + this.targetsPlayer = targetsPlayer; + } + + public float getxStart(){ + return xStart; + } + public float getyStart(){ + return yStart; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + lifetime++; + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + movementX = (int) (5 * Math.cos(alpha)); + movementY = (int) (5 * Math.sin(alpha)); + + xPos += movementX; + yPos += movementY; + + updateDirection(); + + if(this.lifetime > 50){ + this.setToDelete(true); + } + + return false; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Swordsman.java b/core/src/com/dungeoncrawler/model/entities/Swordsman.java new file mode 100644 index 0000000..b92d74b --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Swordsman.java @@ -0,0 +1,39 @@ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +public class Swordsman extends Entity { + + public Swordsman(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 120*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 12*lvl; + this.id = 1; + this.type = 0; + + // TODO: Sinnvolle Werte finden + direction = 2; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer){ + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + movementX = (int) (4 * Math.cos(alpha)); + movementY = (int) (4 * Math.sin(alpha)); + + xPos += movementX; + yPos += movementY; + + updateDirection(); + } + return false; + } + + +} diff --git a/core/src/com/dungeoncrawler/model/entities/Waterwizard.java b/core/src/com/dungeoncrawler/model/entities/Waterwizard.java new file mode 100644 index 0000000..9326876 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Waterwizard.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Waterwizard extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Waterwizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 80*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 12*lvl; + this.id = 18; + this.type = 1; + minRange = 65; + maxRange = 130; + attackSpeed = 50; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < minRange){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Spell a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + + a = new Spell(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 19, true); + int tempX = (int) (5 * Math.cos(alpha)); + int tempY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/model/entities/Wizard.java b/core/src/com/dungeoncrawler/model/entities/Wizard.java new file mode 100644 index 0000000..08135fd --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Wizard.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.StaticMath; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Wizard extends Entity{ + + int counter; + final int minRange; + final int maxRange; + final int attackSpeed; + + public Wizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 80*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 10*lvl; + this.id = 3; + this.type = 1; + minRange = 140; + maxRange = 170; + attackSpeed = 70; // higher = slower + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer + 32, yPosPlayer + 32); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); + + if(distance >= minRange && distance <= maxRange && counter % attackSpeed == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + if(distance < 144){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= minRange && distance <= maxRange){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Spell a = null; + + if(!isToDelete()){ + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Spell(this.xPos + 32, this.yPos + 32, this.lvl,(int) this.dmg, 4, true); + int tempX = (int) (5 * Math.cos(alpha)); + int tempY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(tempX); + a.setMovementY(tempY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/model/items/Amulet.java b/core/src/com/dungeoncrawler/model/items/Amulet.java new file mode 100644 index 0000000..c1c93f2 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/items/Amulet.java @@ -0,0 +1,24 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.items; + +import com.dungeoncrawler.model.Item; + +/** + * + * @author jonathan + */ +public class Amulet extends Item { + + public Amulet(int lvl) { + super(lvl); + this.extraHp = 10 * lvl; + this.def = 3 * lvl; + this.movementBoost = 0; + this.id = 2; + } + +} diff --git a/core/src/com/dungeoncrawler/model/items/DmgAmulet.java b/core/src/com/dungeoncrawler/model/items/DmgAmulet.java new file mode 100644 index 0000000..0e5c5aa --- /dev/null +++ b/core/src/com/dungeoncrawler/model/items/DmgAmulet.java @@ -0,0 +1,23 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.items; + +import com.dungeoncrawler.model.Item; + +/** + * + * @author jonathan + */ +public class DmgAmulet extends Item { + + public DmgAmulet(int lvl) { + super(lvl); + this.dmg = 8 * lvl; + this.movementBoost = 0.5f; + this.id = 3; + } + +} diff --git a/core/src/com/dungeoncrawler/model/items/Key.java b/core/src/com/dungeoncrawler/model/items/Key.java new file mode 100644 index 0000000..a99d3a0 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/items/Key.java @@ -0,0 +1,21 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.items; + +import com.dungeoncrawler.model.Item; + +/** + * + * @author jonathan + */ +public class Key extends Item { + + public Key(int lvl) { + super(lvl); + this.id = 0; + } + +} diff --git a/core/src/com/dungeoncrawler/model/items/Potion.java b/core/src/com/dungeoncrawler/model/items/Potion.java new file mode 100644 index 0000000..a1a6814 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/items/Potion.java @@ -0,0 +1,26 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.items; + +import com.dungeoncrawler.model.Item; + +/** + * + * @author jonathan + */ +public class Potion extends Item { + + public Potion(int lvl) { + super(lvl); + this.heal = lvl * 25; + this.dmg = 0; + this.def = 0; + this.extraHp = 0; + this.movementBoost = 0; + this.id = 1; + } + +} diff --git a/core/src/com/dungeoncrawler/view/AnimatedObject.java b/core/src/com/dungeoncrawler/view/AnimatedObject.java new file mode 100644 index 0000000..7e7baf7 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/AnimatedObject.java @@ -0,0 +1,117 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureRegion; + +/** + * + * @author jonathan + */ +public class AnimatedObject { + private Sprite sprite; + private TextureRegion[][] texture; + private int frame; + private int row; + + public AnimatedObject(Texture tx, int tileWidth, int tileHeight){ + texture = TextureRegion.split(tx, tileWidth, tileHeight); + + frame = (int) (Math.random()*texture[0].length); + row = (int) (Math.random()*texture.length); + + sprite = new Sprite(texture[getRow()][getFrame()]); + } + + public void updateAnimation(){ + if(getFrame() >= texture[0].length - 1){ + setFrame(0); + } + else{ + setFrame(getFrame() + 1); + } + + sprite.setRegion(texture[getRow()][getFrame()]); + + } + + public void updateTexture(){ + sprite.setRegion(texture[getRow()][getFrame()]); + } + + public void updateBackwards(){ + if(getFrame() <= 0){ + setFrame(texture[0].length - 1); + } + else{ + setFrame(getFrame() - 1); + } + + sprite.setRegion(texture[getRow()][getFrame()]); + } + + /** + * @return the sprite + */ + public Sprite getSprite() { + return sprite; + } + + /** + * @param sprite the sprite to set + */ + public void setSprite(Sprite sprite) { + this.sprite = sprite; + } + + public void setSpritePosition(int xPos, int yPos){ + sprite.setPosition(xPos, yPos); + } + + /** + * @return the texture + */ + public TextureRegion[][] getTexture() { + return texture; + } + + /** + * @param texture the texture to set + */ + public void setTexture(TextureRegion[][] texture) { + this.texture = texture; + } + + /** + * @return the frame + */ + public int getFrame() { + return frame; + } + + /** + * @param frame the frame to set + */ + public void setFrame(int frame) { + this.frame = frame; + } + + /** + * @return the row + */ + public int getRow() { + return row; + } + + /** + * @param row the row to set + */ + public void setRow(int row) { + this.row = row; + } +} diff --git a/core/src/com/dungeoncrawler/view/ControlsScreen.java b/core/src/com/dungeoncrawler/view/ControlsScreen.java new file mode 100644 index 0000000..68b183d --- /dev/null +++ b/core/src/com/dungeoncrawler/view/ControlsScreen.java @@ -0,0 +1,100 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.math.Intersector; +import com.badlogic.gdx.math.Rectangle; + +/** + * + * @author bfz + */ +public class ControlsScreen { + float w; + float h; + BitmapFont font; + + + Sprite backButtonSprite; + Sprite controlsContainerSprite; + + public ControlsScreen(){ + w = Gdx.graphics.getWidth(); + h = Gdx.graphics.getHeight(); + float wc = w/2; + font = new BitmapFont(); + + backButtonSprite = new Sprite(new Texture("sprites/backButton.png")); + backButtonSprite.setPosition(0,0); + controlsContainerSprite = new Sprite(new Texture("sprites/controlsContainer.png")); + controlsContainerSprite.setPosition(480,180); + + + } + + public void render (SpriteBatch batch) { + Gdx.gl.glClearColor(0, 0, 0, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + batch.begin(); + + controlsContainerSprite.draw(batch); + //font.getData().setScale(2); + font.draw(batch,"UP:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+380); + font.draw(batch,"W", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+380); + font.draw(batch,"LEFT:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+360); + font.draw(batch,"A", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+360); + font.draw(batch,"DOWN:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+340); + font.draw(batch,"S", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+340); + font.draw(batch,"RIGHT:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+320); + font.draw(batch,"D", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+320); + + font.draw(batch,"SHOOT UP:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+280); + font.draw(batch,"ARROW-KEY UP", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+280); + font.draw(batch,"SHOOT LEFT:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+260); + font.draw(batch,"ARROW-KEY LEFT", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+260); + font.draw(batch,"SHOOT DOWN:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+240); + font.draw(batch,"ARROW-KEY DOWN", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+240); + font.draw(batch,"SHOOT RIGHT:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+220); + font.draw(batch,"ARROW-KEY RIGHT", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+220); + + font.draw(batch,"MELEE ATTACK:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+180); + font.draw(batch,"SPACE", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+180); + + font.draw(batch,"EQUIP ITEM:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+140); + font.draw(batch,"R", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+140); + font.draw(batch,"DROP ITEM:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+120); + font.draw(batch,"Q", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+120); + font.draw(batch,"USE ITEM:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+100); + font.draw(batch,"E", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+100); + font.draw(batch,"SELECT ITEM:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+80); + font.draw(batch,"SCROLL WHEEL", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+80); + + backButtonSprite.draw(batch); + batch.end(); + } + + public int click(int x, int y){ // prueft ob cursor mit button (START) ueberlappt + + Rectangle r = new Rectangle(); + r.set(x, h-y, 1, 1); + if(Intersector.overlaps(r, backButtonSprite.getBoundingRectangle())){ + return 2; //go settingScreen + } + + return -1; + + } + + + +} diff --git a/core/src/com/dungeoncrawler/view/DamageFontContainer.java b/core/src/com/dungeoncrawler/view/DamageFontContainer.java new file mode 100644 index 0000000..23feaba --- /dev/null +++ b/core/src/com/dungeoncrawler/view/DamageFontContainer.java @@ -0,0 +1,99 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import sun.awt.OSInfo; + +/** + * + * @author Jan + */ +public class DamageFontContainer { + private int value; + private int currentX; + private int currentY; + private int lifetime; + private int currentLifetime; + + public DamageFontContainer(int value, int startX, int startY){ + this.value = value; + this.currentX = startX; + this.currentY = startY; + this.lifetime = 60; + this.currentLifetime = 0; + + } + + /** + * @return the value + */ + public int getValue() { + return value; + } + + /** + * @param value the value to set + */ + public void setValue(int value) { + this.value = value; + } + + /** + * @return the currentX + */ + public int getCurrentX() { + return currentX; + } + + /** + * @param currentX the currentX to set + */ + public void setCurrentX(int currentX) { + this.currentX = currentX; + } + + /** + * @return the currentY + */ + public int getCurrentY() { + return currentY; + } + + /** + * @param currentY the currentY to set + */ + public void setCurrentY(int currentY) { + this.currentY = currentY; + } + + /** + * @return the lifetime + */ + public int getLifetime() { + return lifetime; + } + + /** + * @param lifetime the lifetime to set + */ + public void setLifetime(int lifetime) { + this.lifetime = lifetime; + } + + /** + * @return the lifelength + */ + public int getCurrentLifetime() { + return currentLifetime; + } + + /** + * @param currentLifetime the lifelength to set + */ + public void setCurrentLifetime(int currentLifetime) { + this.currentLifetime = currentLifetime; + } +} diff --git a/core/src/com/dungeoncrawler/view/EndScreen.java b/core/src/com/dungeoncrawler/view/EndScreen.java new file mode 100644 index 0000000..8453299 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/EndScreen.java @@ -0,0 +1,67 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.Gdx; +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.Sprite; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Intersector; +import com.badlogic.gdx.math.Rectangle; + +/** + * + * @author Jan + */ +public class EndScreen { + float w; + float h; + + Sprite restartButton; + + BitmapFont font; + + int kills; + + + public EndScreen(int kills){ + w = Gdx.graphics.getWidth(); + h = Gdx.graphics.getHeight(); + float wc = w/2; + + this.kills = kills; + + font = new BitmapFont(); + + restartButton = new Sprite(new Texture("sprites/restartButton.png")); + restartButton.setPosition(w / 2 - restartButton.getWidth() / 2, h / 4 - restartButton.getHeight() / 2); + } + + public void render (SpriteBatch batch, float volume) { + + batch.begin(); + restartButton.draw(batch); + font.getData().setScale(5); + font.draw(batch, "ENDE", w/2-100, h-h/8); + font.getData().setScale(2); + font.draw(batch, "Kills: "+kills, restartButton.getX()+30, restartButton.getY() + 200); + batch.end(); + } + + public int click(int x, int y){ + + Rectangle r = new Rectangle(x,h-y,1,1); + if(Intersector.overlaps(r, restartButton.getBoundingRectangle())){ + return 11; //NEUSTART + } + return -1; + + } +} diff --git a/core/src/com/dungeoncrawler/view/EntitySprite.java b/core/src/com/dungeoncrawler/view/EntitySprite.java new file mode 100644 index 0000000..692c581 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/EntitySprite.java @@ -0,0 +1,324 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class EntitySprite implements Comparable { + + // 0: pants, 1: body, 2: head, 3: hair, 4: collision + private Sprite[] sprites; + private Rectangle collisionSprite; + private Rectangle fullCollisionSprite; + private TextureRegion[][][] regions; + private int[] frames; + private int attackState; + private int secondaryAttackState; + private int die; + + // 0: links, 1: rechts + private int direction; + + public EntitySprite(Texture[] textures, int width, int height){ + sprites = new Sprite[1]; + regions = new TextureRegion[1][][]; + + // 0: idle, 1: walking, 2: attack, 3: die, 4: secondaryAttack + frames = new int[5]; + direction = 0; + attackState = 0; + secondaryAttackState = 0; + die = 0; + + for(int i = 0; i < sprites.length; i++){ + regions[i] = TextureRegion.split(textures[i], width, height); + sprites[i] = new Sprite(regions[i][0][0]); + collisionSprite = new Rectangle(0, 0, sprites[0].getWidth() / 2, sprites[0].getHeight() / 4); + } + + this.fullCollisionSprite = new Rectangle(0, 0, collisionSprite.getWidth(), sprites[0].getHeight()); + } + + public void updateAnimation(Entity e){ + if(e != null){ + boolean moves = false; + if(e.getMovementX() != 0 || e.getMovementY() != 0){ + moves = true; + } + direction = e.getDirection(); + + if(getDie() >= 1){ + updateDie(); + } + else if(attackState == 1){ + updateFlip(); + updateAttack(); + } + else if(secondaryAttackState == 1){ + updateFlip(); + updateSecondaryAttack(); + } + else if(moves){ + updateFlip(); + updateWalking(); + } + else{ + updateIdle(); + } + } + } + + public void updateDie(){ + if(die == 2){ + sprites[0].setRegion(regions[0][4][9]); + updateFlip(); + } + else if(frames[3] >= 9){ + setDie(2); + } + else{ + frames[3]++; + sprites[0].setRegion(regions[0][4][frames[3]]); + updateFlip(); + } + } + + public void updateAttack(){ + frames[0] = 0; + frames[1] = 0; + frames[4] = 0; + + if(frames[2] >= 6){ + frames[2] = 0; + attackState = 2; + updateFlip(); + } + else{ + frames[2]++; + + sprites[0].setRegion(regions[0][3][frames[2]]); + updateFlip(); + } + } + + public void updateSecondaryAttack(){ + frames[0] = 0; + frames[1] = 0; + frames[2] = 0; + + if(frames[4] >= 3){ + frames[4] = 0; + secondaryAttackState = 2; + } + else{ + frames[4]++; + + sprites[0].setRegion(regions[0][1][frames[4]]); + updateFlip(); + } + } + + public void updateIdle(){ + frames[1] = 0; + frames[2] = 0; + frames[4] = 0; + + if(frames[0] >= 9){ + frames[0] = 0; + } + else{ + frames[0]++; + } + + sprites[0].setRegion(regions[0][2][frames[0]]); + updateFlip(); + } + + public void updateWalking(){ + frames[0] = 0; + frames[2] = 0; + frames[4] = 0; + + if(frames[1] >= 9){ + frames[1] = 0; + } + else{ + frames[1]++; + } + + + sprites[0].setRegion(regions[0][0][frames[1]]); + updateFlip(); + } + + public void updateFlip(){ + + if(direction == 0 && !sprites[0].isFlipX()){ + sprites[0].flip(true, false); + } + else if(direction == 1 && sprites[0].isFlipX()){ + sprites[0].flip(false, false); + } + } + + public void update(int xPos, int yPos){ + for(int i = 0; i < sprites.length; i++){ + sprites[i].setPosition(xPos - sprites[0].getWidth() / 4, yPos); + } + + updateCollision(xPos, yPos); + + } + + public void updateCollision(int xPos, int yPos){ + collisionSprite.setPosition(xPos, yPos); + getFullCollisionSprite().setPosition(xPos, yPos); + } + public void updateCollisionX(int xPos){ + collisionSprite.setX(xPos); + } + public void updateCollisionY(int yPos){ + collisionSprite.setY(yPos); + } + + /** + * @return the sprites + */ + public Sprite[] getSprites() { + return sprites; + } + + /** + * @param sprites the sprites to set + */ + public void setSprites(Sprite[] sprites) { + this.sprites = sprites; + } + + /** + * @return the collisionSprite + */ + public Rectangle getCollisionSprite() { + return collisionSprite; + } + + /** + * @param collisionSprite the collisionSprite to set + */ + public void setCollisionSprite(Rectangle collisionSprite) { + this.collisionSprite = collisionSprite; + } + + /** + * @return the regions + */ + public TextureRegion[][][] getRegions() { + return regions; + } + + /** + * @param regions the regions to set + */ + public void setRegions(TextureRegion[][][] regions) { + this.regions = regions; + } + + /** + * @return the frames + */ + public int[] getFrames() { + return frames; + } + + /** + * @param frames the frames to set + */ + public void setFrames(int[] frames) { + this.frames = frames; + } + + /** + * @return the direction + */ + public int getDirection() { + return direction; + } + + /** + * @param direction the direction to set + */ + public void setDirection(int direction) { + this.direction = direction; + } + + /** + * @return the fullCollisionSprite + */ + public Rectangle getFullCollisionSprite() { + return fullCollisionSprite; + } + + public int getAttackState(){ + return this.attackState; + } + + public void resetAttackState(){ + this.attackState = 0; + frames[2] = 0; + } + + public void startAttack(){ + this.attackState = 1; + } + + public int getSecondaryAttackState(){ + return this.secondaryAttackState; + } + + public void resetSecondaryAttackState(){ + this.secondaryAttackState = 0; + frames[4] = 0; + } + + public void startSecondaryAttack(){ + this.secondaryAttackState = 1; + } + + /** + * @return the die + */ + public int getDie() { + return die; + } + + /** + * @param die the die to set + */ + public void setDie(int die) { + this.die = die; + } + + @Override + public int compareTo(EntitySprite t) { + if(collisionSprite.getY() > t.getCollisionSprite().getY()){ + return -1; + } + else if(collisionSprite.getY() == t.getCollisionSprite().getY()){ + return 0; + } + else{ + return 1; + } + } +} diff --git a/core/src/com/dungeoncrawler/view/GameScreen.java b/core/src/com/dungeoncrawler/view/GameScreen.java new file mode 100644 index 0000000..5ad74e7 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/GameScreen.java @@ -0,0 +1,530 @@ +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.maps.tiled.TiledMap; +import com.badlogic.gdx.maps.tiled.TiledMapRenderer; +import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; +import com.badlogic.gdx.math.Intersector; +import com.badlogic.gdx.utils.Timer; +import com.dungeoncrawler.model.Dungeon; +import com.dungeoncrawler.model.Entity; +import com.dungeoncrawler.model.entities.*; +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; + OrthographicCamera camera; + public ArrayList objects; + public ArrayList mapItems; + public ArrayList 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 + + 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(); + camera = new OrthographicCamera(1, h/w); + camera.translate(175f, 215f); + + + 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); + + } + + public void render (SpriteBatch batch, Player p, Entity[] e, int tileX, int tileY, int level, int roomPosX, int roomPosY) { + + 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(); + + camera.zoom = 700f; // Standart 700f + camera.update(); + batch.setProjectionMatrix(camera.combined); + + updateEntitySprites(e); + + ArrayList 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()); + } + } + + batch.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(){ + camera.zoom = 1600; + camera.translate(625f, 241f); + animations.stop(); + animatePlayer.stop(); + } + public void resume(){ + camera.zoom = 700; + camera.translate(-625f, -241f); + animations.start(); + animatePlayer.start(); + } + public void end(){ + camera.zoom = 1600; + camera.translate(625f, 241f); + 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 OrthographicCamera getCamera(){ + return camera; + } + +} diff --git a/core/src/com/dungeoncrawler/view/HudContainer.java b/core/src/com/dungeoncrawler/view/HudContainer.java new file mode 100644 index 0000000..9cb1012 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/HudContainer.java @@ -0,0 +1,236 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.dungeoncrawler.model.Item; +import com.dungeoncrawler.model.entities.Player; + +/** + * + * @author bfz + */ +public class HudContainer { + Sprite HudSprite; + Texture[] InventoryItemTextures; + Sprite[] InventoryItemSprites; + float[] invXPos; + float[] invYPos; + int selected; + Sprite selectedSprite; + Sprite playerHealthSprite; + float playerHealthX; + float playerHealthY; + + BitmapFont font; + float HudPosX; + float HudPosY; + + Sprite Inventory; + Sprite healthBarContainer; + + public HudContainer(){ + + + font = new BitmapFont(); + font.setColor(1, 1, 1, 1); + Texture selectedTexture = new Texture("sprites/selected.png"); + selectedSprite = new Sprite(selectedTexture); + Texture HudTexture = new Texture("sprites/hud.png"); + HudSprite = new Sprite(HudTexture); + HudSprite.setX(-HudSprite.getWidth()); + HudSprite.setY(20f); + InventoryItemTextures = new Texture[8]; + InventoryItemSprites = new Sprite[8]; + invXPos = new float[8]; + invYPos = new float[8]; + + Texture inv = new Texture("sprites/hudInventory.png"); + Inventory = new Sprite(inv); + + Texture healthContainer = new Texture("sprites/playerHealthBarContainer.png"); + healthBarContainer = new Sprite(healthContainer); + + playerHealthSprite = new Sprite(); + + HudPosX = HudSprite.getX(); + HudPosY = HudSprite.getY(); + + playerHealthX = HudPosX+36f; + playerHealthY = HudPosY+260f; + + healthBarContainer.setPosition(HudPosX + 8,HudPosY + 252); + Inventory.setPosition(HudPosX + 7,HudPosY + 7); + + float InvX = Inventory.getX(); + float InvY = Inventory.getY(); + + //Equipped 1 + invXPos[0] = InvX + 30f; + invYPos[0] = InvY + 105f; + //Equipped 2 + invXPos[1] = InvX + 78f; + invYPos[1] = InvY + 105f; + + + invXPos[2] = InvX + 3f; + invYPos[2] = InvY + 54f; + invXPos[3] = InvX + 54f; + invYPos[3] = InvY + 54f; + invXPos[4] = InvX + 105f; + invYPos[4] = InvY + 54f; + + invXPos[5] = InvX + 3f; + invYPos[5] = InvY + 3f; + invXPos[6] = InvX + 54f; + invYPos[6] = InvY + 3f; + invXPos[7] = InvX + 105f; + invYPos[7] = InvY + 3f; + + selected = 2; + selectedSprite.setX(invXPos[selected] - 2f); + selectedSprite.setY(invYPos[selected] - 2f); + + + + } + + public void updateHud(SpriteBatch batch, Player p){ + InventoryItemSprites = new Sprite[8]; + + selected = p.getInv().getSelected(); + + Item[] items = p.getInv().getItem(); + + for(int x = 0; x < items.length; x++){ + if(items[x] != null){ + addItem(items[x], x); + } + } + selectedSprite.setX(invXPos[selected] - 2f); + selectedSprite.setY(invYPos[selected] - 2f); + + float n; + if(p.getHp() > 0 && p.getMaxhp() != 0){ + n = p.getHp() / p.getMaxhp(); + } + else{ + n = 0.01f; + } + + if(n > 1){ + n = 1; + } + if(n <= 0){ + n = 0.01f; + } + Texture playerHealthTexture = new Texture("sprites/playerHealthBar.png"); + int newWidth = (int) (n * playerHealthTexture.getWidth()); + TextureRegion[][] playerHealthRegion = TextureRegion.split(playerHealthTexture,newWidth, playerHealthTexture.getHeight()); + playerHealthSprite = new Sprite(playerHealthRegion[0][0]); + playerHealthSprite.setPosition(playerHealthX, playerHealthY); + + batch.begin(); + HudSprite.draw(batch); + + healthBarContainer.draw(batch); + Inventory.draw(batch); + + for(int i = 0; i < InventoryItemSprites.length ;i++){ + if(InventoryItemSprites[i] != null){ + InventoryItemSprites[i].draw(batch); + } + } + selectedSprite.draw(batch); + playerHealthSprite.draw(batch); + font.draw(batch, p.getHp() + " / " + p.getMaxhp(), playerHealthSprite.getX()+18, playerHealthSprite.getY()+14); + if(items[selected] != null){ + + String selectedName = ""; + int selectedPerkValue = 0; + String perk = ""; + String lvl = "Lvl: "+ items[selected].getLvl(); + + switch(items[selected].getId()){ + case 0: + selectedName = "key "; + break; + case 1: + selectedName = "Potion "; + perk = "Heal: "; + selectedPerkValue = items[selected].getHeal(); + break; + case 2: + selectedName = "Amulet "; + perk = "Defense: "; + selectedPerkValue = items[selected].getDef(); + break; + case 3: + selectedName = "Amulet "; + perk = "Damage: "; + selectedPerkValue = items[selected].getDmg(); + break; + + } + font.draw(batch, selectedName + lvl, HudPosX + 40, HudPosY + 210); + font.draw(batch, perk + selectedPerkValue, HudPosX + 40, HudPosY + 190); + } + + + batch.end(); + + + } + + public void addItem(Item item, int x){ + switch(item.getId()){ + case 0: + if(InventoryItemSprites[x] == null){ + InventoryItemTextures[x] = new Texture("sprites/key.png"); + InventoryItemSprites[x] = new Sprite(InventoryItemTextures[x]); + InventoryItemSprites[x].setX(invXPos[x]); + InventoryItemSprites[x].setY(invYPos[x]); + break; + } + break; + case 1: + if(InventoryItemSprites[x] == null){ + InventoryItemTextures[x] = new Texture("sprites/potion.png"); + InventoryItemSprites[x] = new Sprite(InventoryItemTextures[x]); + InventoryItemSprites[x].setX(invXPos[x]); + InventoryItemSprites[x].setY(invYPos[x]); + break; + } + break; + case 2: + if(InventoryItemSprites[x] == null){ + InventoryItemTextures[x]= new Texture("sprites/amulet.png"); + InventoryItemSprites[x] = new Sprite(InventoryItemTextures[x]); + InventoryItemSprites[x].setX(invXPos[x]); + InventoryItemSprites[x].setY(invYPos[x]); + break; + } + break; + case 3: + if(InventoryItemSprites[x] == null){ + InventoryItemTextures[x]= new Texture("sprites/dmgAmulet.png"); + InventoryItemSprites[x] = new Sprite(InventoryItemTextures[x]); + InventoryItemSprites[x].setX(invXPos[x]); + InventoryItemSprites[x].setY(invYPos[x]); + break; + } + break; + } + } + + public void setSelected(int i){ + selected = i; + } +} diff --git a/core/src/com/dungeoncrawler/view/MainMenuScreen.java b/core/src/com/dungeoncrawler/view/MainMenuScreen.java new file mode 100644 index 0000000..1178959 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/MainMenuScreen.java @@ -0,0 +1,265 @@ +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.Pixmap; +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.math.Intersector; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.utils.Timer; + +public class MainMenuScreen{ + + + + //MENU-SCREEN + + Sprite startButtonSprite; + Sprite quitButtonSprite; + Sprite backgroundSprite; + Sprite settingsButtonSprite; + Sprite maleButton; + Sprite femaleButton; + + boolean hidden; + + + //CAMERA + float w = Gdx.graphics.getWidth(); + float h = Gdx.graphics.getHeight(); + OrthographicCamera camera; + + + // Sound + public Music music; + + //PLAYER PREVIEW + Sprite playerSprite; + TextureRegion[][][] playerRegion; + int shownPlayer; + Timer preview; + int animationState; + + Sprite skinContainer; + Sprite buttonRight; + Sprite buttonLeft; + + String gender; + + + public MainMenuScreen(float volume) { + + //MENU-SCREEN + w = Gdx.graphics.getWidth(); + h = Gdx.graphics.getHeight(); + float wc = w/2; + + gender = "m"; + + hidden = false; + + Texture backgroundTexture = new Texture("sprites/MAINSCREEN.png"); + Texture startButtonTexture = new Texture("sprites/startButton.png"); + Texture quitButtonTexture = new Texture("sprites/quitButton.png"); + Texture settingsButtonTexture = new Texture("sprites/settingsButton.png"); + Texture maleButtonTexture = new Texture("sprites/male.png"); + Texture femaleButtonTexture = new Texture("sprites/female.png"); + + backgroundSprite = new Sprite(backgroundTexture); + startButtonSprite = new Sprite(startButtonTexture); + quitButtonSprite = new Sprite(quitButtonTexture); + settingsButtonSprite = new Sprite(settingsButtonTexture); + maleButton = new Sprite(maleButtonTexture); + femaleButton = new Sprite(femaleButtonTexture); + + backgroundSprite.setX(0); + backgroundSprite.setY(0); + startButtonSprite.setX(backgroundSprite.getX() + 100); + startButtonSprite.setY(backgroundSprite.getY() + 350); + quitButtonSprite.setX(backgroundSprite.getX() + 100); + quitButtonSprite.setY(backgroundSprite.getY() + 50); + settingsButtonSprite.setPosition(backgroundSprite.getX() + 100, backgroundSprite.getX() + 150); + + + + //camera = new OrthographicCamera(1, h/w); + //camera.translate(backgroundSprite.getWidth()/2, backgroundSprite.getHeight()/2); + //camera.zoom = 1150f; + //camera.update(); + + Pixmap pm = new Pixmap(Gdx.files.internal("sprites/cursor.png")); + Gdx.graphics.setCursor(Gdx.graphics.newCursor(pm, 0, 0)); + pm.dispose(); + + //ENTITIES + + //PLAYER PREVIEW + + playerRegion = new TextureRegion[7][][]; + shownPlayer = 0; + animationState = 0; + + for(int i = 0; i < playerRegion.length; i++){ + playerRegion[i] = TextureRegion.split(new Texture("sprites/player/player_"+i+"_"+gender+".png"), 64, 64); + } + + playerSprite = new Sprite(playerRegion[shownPlayer][0][animationState]); + + + skinContainer = new Sprite(new Texture("sprites/skinContainer.png")); + buttonLeft = new Sprite(new Texture("sprites/left.png")); + buttonRight = new Sprite(new Texture("sprites/right.png")); + + skinContainer.setPosition(backgroundSprite.getX() + 100,backgroundSprite.getY() + 250); + buttonLeft.setPosition(skinContainer.getX() + 7, skinContainer.getY()+25); + buttonRight.setPosition(skinContainer.getX() + 106, skinContainer.getY()+25); + playerSprite.setPosition(skinContainer.getX() + 50, skinContainer.getY() + 15); + + maleButton.setPosition(skinContainer.getX()+165, skinContainer.getY()); + femaleButton.setPosition(skinContainer.getX()+165, skinContainer.getY()); + + preview = new Timer(); + preview.scheduleTask(new Timer.Task() { + @Override + public void run() { + if(animationState >= 9){ + animationState = 0; + } + else{ + animationState++; + } + playerSprite.setRegion(playerRegion[shownPlayer][0][animationState]); + } + },0, 0.1f); + + + // Sound + music = Gdx.audio.newMusic(Gdx.files.internal("music/mainmenu.mp3")); + music.setVolume(volume); + music.play(); + + } + + + public void render (SpriteBatch batch) { + + + batch.begin(); + //batch.setProjectionMatrix(camera.combined); + if(hidden == false){ + + backgroundSprite.draw(batch); + startButtonSprite.draw(batch); + quitButtonSprite.draw(batch); + settingsButtonSprite.draw(batch); + skinContainer.draw(batch); + buttonLeft.draw(batch); + buttonRight.draw(batch); + + + playerSprite.draw(batch); + + + + if(gender.equals("m")){ + maleButton.draw(batch); + } + else{ + femaleButton.draw(batch); + } + } + batch.end(); + } + + + public int click(int x, int y){ // prueft ob cursor mit button (START) ueberlappt + if(hidden == false){ + + Rectangle r = new Rectangle(); + r.set(x, h-y, 1, 1); + if(Intersector.overlaps(r, startButtonSprite.getBoundingRectangle())){ + return 0; //go ingame + } + if(Intersector.overlaps(r, quitButtonSprite.getBoundingRectangle())){ + return 1; //Exit Game + } + if(Intersector.overlaps(r, settingsButtonSprite.getBoundingRectangle())){ + return 2; //Settings + } + if(Intersector.overlaps(r, buttonLeft.getBoundingRectangle())){ + if(shownPlayer > 0){ + shownPlayer--; + return 6; + } + return -1; + } + if(Intersector.overlaps(r, buttonRight.getBoundingRectangle())){ + if(shownPlayer < playerRegion.length - 1){ + shownPlayer++; + return 6; + } + return -1; + } + if(Intersector.overlaps(r, buttonLeft.getBoundingRectangle())){ + if(shownPlayer > 0){ + shownPlayer--; + return 6; + } + return -1; + } + if(Intersector.overlaps(r, maleButton.getBoundingRectangle())){ + if(gender.equals("m")){ + gender = "w"; + updateGender(); + return 6; + } + else{ + gender = "m"; + updateGender(); + return 6; + } + } + } + return -1; + + } + + public void updateGender(){ + for(int i = 0; i < playerRegion.length; i++){ + playerRegion[i] = TextureRegion.split(new Texture("sprites/player/player_"+i+"_"+gender+".png"), 64, 64); + } + playerSprite = new Sprite(playerRegion[shownPlayer][0][animationState]); + playerSprite.setPosition(skinContainer.getX() + 50, skinContainer.getY() + 15); + } + + public void cleanUp(){ + music.dispose(); + } + + public void hide(){ + hidden = true; + } + + public void show(){ + hidden = false; + } + + public boolean getHidden(){ + return hidden; + } + + public int getSkin(){ + return shownPlayer; + } + public String getGender(){ + return gender; + } + + + } diff --git a/core/src/com/dungeoncrawler/view/Map.java b/core/src/com/dungeoncrawler/view/Map.java new file mode 100644 index 0000000..e2fa357 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/Map.java @@ -0,0 +1,35 @@ + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package com.dungeoncrawler.view; + +/** + * + * @author jonathan + */ +public class Map { + private MapContainer[][][] maps; + + public Map(){ + + } + + /** + * @return the maps + */ + public MapContainer[][][] getMaps() { + return maps; + } + + /** + * @param maps the maps to set + */ + public void setMaps(MapContainer[][][] maps) { + this.maps = maps; + } + +} diff --git a/core/src/com/dungeoncrawler/view/MapContainer.java b/core/src/com/dungeoncrawler/view/MapContainer.java new file mode 100644 index 0000000..6a1083e --- /dev/null +++ b/core/src/com/dungeoncrawler/view/MapContainer.java @@ -0,0 +1,196 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.maps.tiled.TiledMap; +import com.badlogic.gdx.utils.Timer; +import com.dungeoncrawler.model.Item; +import java.util.ArrayList; + +/** + * + * @author jonathan + */ +public class MapContainer { + private TiledMap map; + private ArrayList objects; + private ArrayList mapItems; + private ArrayList doors; + private boolean doorsDown; + private EntitySprite[] enemies; + private Timer doorTimer; + private int doorState; + + public MapContainer(TiledMap map){ + this.map = map; + this.objects = new ArrayList<>(); + this.mapItems = new ArrayList<>(); + this.enemies = new EntitySprite[15]; + doors = new ArrayList<>(); + doorTimer = new Timer(); + + // 0: up, 1: animation, 2: down + doorState = 0; + } + + + public void addItem(int width, int height, int xPos, int yPos, Item i){ + AnimatedObject ao; + switch(i.getId()){ + case 0: // key + ao = new AnimatedObject(new Texture("sprites/key.png"), width, height); + mapItems.add(ao); + ao.setSpritePosition(xPos, yPos); + break; + case 1: // potion + ao = new AnimatedObject(new Texture("sprites/potion.png"), width, height); + mapItems.add(ao); + ao.setSpritePosition(xPos, yPos); + break; + case 2: // amulet + ao = new AnimatedObject(new Texture("sprites/amulet.png"), width, height); + mapItems.add(ao); + ao.setSpritePosition(xPos, yPos); + break; + case 3: // DamageAmulet + ao = new AnimatedObject(new Texture("sprites/dmgAmulet.png"), width, height); + mapItems.add(ao); + ao.setSpritePosition(xPos, yPos); + break; + + } + } + + public void lowerDoors(){ + if(doorState == 0){ + doorState = 1; + + for(AnimatedObject door : doors){ + door.setFrame(9); + } + + doorTimer.scheduleTask(new Timer.Task() { + @Override + public void run() { + for(AnimatedObject door : doors){ + door.updateBackwards(); + } + if(doors.get(0).getFrame() == 0){ + doorState = 2; + doorTimer.clear(); + } + } + }, 0, 0.08f); + } + } + + public void raiseDoors(){ + if(doorState == 2){ + doorState = 1; + + for(AnimatedObject door : doors){ + door.setFrame(0); + } + + doorTimer.scheduleTask(new Timer.Task() { + @Override + public void run() { + for(AnimatedObject door : doors){ + door.updateAnimation(); + } + if(doors.get(0).getFrame() >= 9){ + doorState = 0; + doorTimer.clear(); + } + } + }, 0, 0.08f); + } + } + + /** + * @return the map + */ + public TiledMap getMap() { + return map; + } + + /** + * @param map the map to set + */ + public void setMap(TiledMap map) { + this.map = map; + } + + /** + * @return the objects + */ + public ArrayList getObjects() { + return objects; + } + + /** + * @param objects the objects to set + */ + public void setObjects(ArrayList objects) { + this.objects = objects; + } + + /** + * @return the mapItems + */ + public ArrayList getMapItems() { + return mapItems; + } + + + /** + * @param mapItems the mapItems to set + */ + public void setMapItems(ArrayList mapItems) { + this.mapItems = mapItems; + } + + /** + * @return the enemies + */ + public EntitySprite[] getEnemies() { + return enemies; + } + + /** + * @param enemies the enemies to set + */ + public void setEnemies(EntitySprite[] enemies) { + this.enemies = enemies; + } + + public void setEnemies(EntitySprite enemy, int i) { + this.enemies[i] = enemy; + } + + /** + * @return the doorsDown + */ + public boolean isDoorsDown() { + return doorsDown; + } + + /** + * @return the doors + */ + public ArrayList getDoors() { + return doors; + } + + /** + * @param doors the doors to set + */ + public void setDoors(ArrayList doors) { + this.doors = doors; + } + +} diff --git a/core/src/com/dungeoncrawler/view/MapGenerator.java b/core/src/com/dungeoncrawler/view/MapGenerator.java new file mode 100644 index 0000000..c7ccf67 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/MapGenerator.java @@ -0,0 +1,441 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.maps.MapLayer; +import com.badlogic.gdx.maps.MapLayers; +import com.badlogic.gdx.maps.objects.RectangleMapObject; +import com.badlogic.gdx.maps.tiled.TiledMap; +import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; +import com.badlogic.gdx.maps.tiled.tiles.StaticTiledMapTile; +import com.dungeoncrawler.model.Dungeon; +import com.dungeoncrawler.model.Item; +import com.dungeoncrawler.model.ItemContainer; +import com.dungeoncrawler.model.Level; +import com.dungeoncrawler.model.Room; + +/** + * + * @author jonathan + */ +public class MapGenerator { + TextureRegion[][][] allTiles; + TextureRegion[][] splitTiles; + Texture torchT; + Texture amulet; + Texture key; + Texture potion; + Texture DmgAmulet; + Texture doorTop; + Texture doorLeft; + Texture doorRight; + Texture doorBottom; + + public MapGenerator(Texture[] tiles){ + allTiles = new TextureRegion[7][][]; + + for(int i = 0; i < tiles.length; i++){ + allTiles[i] = TextureRegion.split(tiles[i], 48, 48); + } + torchT = new Texture("sprites/torch.png"); + amulet = new Texture("sprites/amulet.png"); + DmgAmulet = new Texture("sprites/dmgAmulet.png"); + key = new Texture("sprites/key.png"); + potion = new Texture("sprites/potion.png"); + doorTop = new Texture("sprites/door.png"); + doorLeft = new Texture("sprites/doorleft.png"); + doorRight = new Texture("sprites/doorright.png"); + doorBottom = new Texture("sprites/doorbottom.png"); + + } + + public Map generateMap(Dungeon d){ + Map temp = new Map(); + + int levelAmount = d.getLevel().length; + + MapContainer[][][] tempMap = new MapContainer[levelAmount][][]; + + // Jedes Level wird generiert + for(int i = 0; i < levelAmount; i++){ + MapContainer[][] tempLevel = generateLevel(i, d.getLevel()[i]); + tempMap[i] = tempLevel; + } + + temp.setMaps(tempMap); + return temp; + } + + private MapContainer[][] generateLevel(int i, Level l){ + + splitTiles = allTiles[i]; + + int sizeX = l.getRooms().length; + int sizeY = l.getRooms()[0].length; + + MapContainer[][] tempLevel = new MapContainer[sizeX][sizeY]; + + for(int x = 0; x < sizeX; x++){ + for(int y = 0; y < sizeY; y++){ + Room room = l.getRooms()[x][y]; + + if(room != null){ + int tempX = 9; + int tempY = 5; + + int mapDimensionX = tempX + 2; + int mapDimensionY = tempY + 2; + + // Raum wird generiert + MapContainer temp = generateRoom(room, tempX, tempY, i); + TiledMap tempRoom = temp.getMap(); + + // Wenn es Fehler gibt, dann wohl hier: Viel Spaß beim Suchen! Danke! + MapLayer collisionLayer = tempRoom.getLayers().get(0); + MapLayer exitLayer = tempRoom.getLayers().get(3); + MapLayer doorLayer = tempRoom.getLayers().get(4); + TiledMapTileLayer staticLayer = (TiledMapTileLayer) tempRoom.getLayers().get(2); + + RectangleMapObject bottom = (RectangleMapObject) collisionLayer.getObjects().get(0); + RectangleMapObject left = (RectangleMapObject) collisionLayer.getObjects().get(1); + RectangleMapObject top = (RectangleMapObject) collisionLayer.getObjects().get(2); + RectangleMapObject right = (RectangleMapObject) collisionLayer.getObjects().get(3); + + // Ausgang oben + if(y < l.getRooms()[0].length - 1 && l.getRooms()[x][y + 1] != null){ + + if(x == l.getExit()[0] && y+1 == l.getExit()[1]){ + staticLayer.getCell((tempX / 2) + 1, tempY + 1).setTile(new StaticTiledMapTile(splitTiles[1][5])); //oben1 + staticLayer.getCell((tempX / 2) + 1, tempY + 2).setTile(new StaticTiledMapTile(splitTiles[0][5])); //oben2 + staticLayer.getCell((tempX / 2) + 1, tempY + 3).setTile(new StaticTiledMapTile(splitTiles[4][3])); //oben3 + staticLayer.getCell((tempX / 2) + 0, tempY + 3).setTile(new StaticTiledMapTile(splitTiles[3][5])); //oben3-1 + staticLayer.getCell((tempX / 2) + 2, tempY + 3).setTile(new StaticTiledMapTile(splitTiles[2][5])); //oben3+1 + + RectangleMapObject door = new RectangleMapObject((mapDimensionX / 2) * 48, mapDimensionY*48 - 48, 48, 48); + exitLayer.getObjects().add(door); + } + else{ + // X: Exakte Mitte der Gesamtlänge, Y: Gesamtlänge + staticLayer.getCell((tempX / 2) + 1, tempY + 1).setTile(new StaticTiledMapTile(splitTiles[0][0])); //oben1 + staticLayer.getCell((tempX / 2) + 1, tempY + 2).setTile(new StaticTiledMapTile(splitTiles[0][0])); //oben2 + staticLayer.getCell((tempX / 2) + 1, tempY + 3).setTile(new StaticTiledMapTile(splitTiles[0][0])); //oben3 + staticLayer.getCell((tempX / 2) + 0, tempY + 3).setTile(new StaticTiledMapTile(splitTiles[3][5])); //oben3-1 + staticLayer.getCell((tempX / 2) + 2, tempY + 3).setTile(new StaticTiledMapTile(splitTiles[2][5])); //oben3+1 + + AnimatedObject door = new AnimatedObject(this.doorTop, 48, 144); + + door.setSpritePosition(((tempX / 2) + 1) * 48, (tempY + 1) * 48); + door.setFrame(9); + door.updateTexture(); + + temp.getDoors().add(door); + } + + collisionLayer.getObjects().remove(top); + + RectangleMapObject tempLeft = new RectangleMapObject(0, mapDimensionY*48 - 48, (mapDimensionX / 2) * 48, 48); + RectangleMapObject tempRight = new RectangleMapObject(((mapDimensionX / 2) + 1) * 48, mapDimensionY*48 - 48, (mapDimensionX / 2) * 48, 48); + + collisionLayer.getObjects().add(tempLeft); + collisionLayer.getObjects().add(tempRight); + + RectangleMapObject door = new RectangleMapObject((mapDimensionX / 2) * 48, mapDimensionY*48 - 48, 48, 48); + doorLayer.getObjects().add(door); + } + + // Ausgang rechts + if(x < l.getRooms().length - 1 && l.getRooms()[x + 1][y] != null){ + + if(x+1 == l.getExit()[0] && y == l.getExit()[1]){ + staticLayer.getCell(tempX + 1, (tempY / 2) + 1).setTile(new StaticTiledMapTile(splitTiles[0][6])); //rechts + + RectangleMapObject door = new RectangleMapObject(mapDimensionX*48 - 48, (mapDimensionY / 2) * 48, 48, 48); + exitLayer.getObjects().add(door); + } + else{ + // X: Gesamtlänge, Y: Exakte Mitte der Gesamtlänge + staticLayer.getCell(tempX + 1, (tempY / 2) + 0).setTile(new StaticTiledMapTile(splitTiles[4][4])); //rechts-1 + staticLayer.getCell(tempX + 1, (tempY / 2) + 1).setTile(new StaticTiledMapTile(splitTiles[0][0])); //rechts1 + staticLayer.getCell(tempX + 1, (tempY / 2) + 2).setTile(new StaticTiledMapTile(splitTiles[1][1])); //rechts2 + staticLayer.getCell(tempX + 1, (tempY / 2) + 3).setTile(new StaticTiledMapTile(splitTiles[0][1])); //rechts3 + staticLayer.getCell(tempX + 1, (tempY / 2) + 4).setTile(new StaticTiledMapTile(splitTiles[2][5])); //rechts4 + + AnimatedObject tempObject = new AnimatedObject(torchT, 48, 96); + tempObject.getSprite().setPosition((tempX + 1) * 48, ((tempY / 2) + 2) * 48); + temp.getObjects().add(tempObject); + + AnimatedObject door = new AnimatedObject(this.doorRight, 48, 144); + door.setSpritePosition((tempX + 1) * 48, ((tempY / 2) + 1) * 48); + + door.setFrame(9); + door.updateTexture(); + + temp.getDoors().add(door); + } + + collisionLayer.getObjects().remove(right); + + RectangleMapObject tempTop = new RectangleMapObject(mapDimensionX*48 - 48, ((mapDimensionY / 2) + 1) * 48, 48, (mapDimensionY / 2) * 48); + RectangleMapObject tempBottom = new RectangleMapObject(mapDimensionX*48 - 48, 0, 48, (mapDimensionY / 2) * 48); + + collisionLayer.getObjects().add(tempTop); + collisionLayer.getObjects().add(tempBottom); + + RectangleMapObject door = new RectangleMapObject(mapDimensionX*48 - 48, (mapDimensionY / 2) * 48, 48, 48); + doorLayer.getObjects().add(door); + } + + // Ausgang unten + if(y > 0 && l.getRooms()[x][y - 1] != null){ + + if(x == l.getExit()[0] && y-1 == l.getExit()[1]){ + staticLayer.getCell((tempX / 2) + 1, 0).setTile(new StaticTiledMapTile(splitTiles[1][6])); //unten + + RectangleMapObject door = new RectangleMapObject((mapDimensionX / 2) * 48, 0, 48, 48); + exitLayer.getObjects().add(door); + } + else{ + // X: Exakte Mitte der Gesamtlänge, Y: 0 + staticLayer.getCell((tempX / 2) + 0, 0).setTile(new StaticTiledMapTile(splitTiles[4][5])); //unten-1 + staticLayer.getCell((tempX / 2) + 1, 0).setTile(new StaticTiledMapTile(splitTiles[0][0])); //unten1 + staticLayer.getCell((tempX / 2) + 2, 0).setTile(new StaticTiledMapTile(splitTiles[4][4])); //unten2 + + AnimatedObject door = new AnimatedObject(this.doorBottom, 48, 48); + + door.setSpritePosition(((tempX / 2) + 1) * 48, 0); + door.setFrame(9); + door.updateTexture(); + + temp.getDoors().add(door); + } + + collisionLayer.getObjects().remove(bottom); + + RectangleMapObject tempLeft = new RectangleMapObject(0, 0, (mapDimensionX / 2) * 48, 48); + RectangleMapObject tempRight = new RectangleMapObject(((mapDimensionX / 2) + 1) * 48, 0, (mapDimensionX / 2) * 48, 48); + + collisionLayer.getObjects().add(tempLeft); + collisionLayer.getObjects().add(tempRight); + + RectangleMapObject door = new RectangleMapObject((mapDimensionX / 2) * 48, 0, 48, 48); + doorLayer.getObjects().add(door); + } + + // Ausgang links + if(x > 0 && l.getRooms()[x - 1][y] != null){ + + if(x-1 == l.getExit()[0] && y == l.getExit()[1]){ + staticLayer.getCell(0, (tempY / 2) + 1).setTile(new StaticTiledMapTile(splitTiles[2][6])); //links + + RectangleMapObject door = new RectangleMapObject(0, (mapDimensionY / 2) * 48, 48, 48); + exitLayer.getObjects().add(door); + } + else{ + // X: 0, Y: Exakte Mitte der Gesamtlänge + staticLayer.getCell(0, (tempY / 2) + 0).setTile(new StaticTiledMapTile(splitTiles[4][5])); //links-1 + staticLayer.getCell(0, (tempY / 2) + 1).setTile(new StaticTiledMapTile(splitTiles[0][0])); //links1 + staticLayer.getCell(0, (tempY / 2) + 2).setTile(new StaticTiledMapTile(splitTiles[1][1])); //links2 + staticLayer.getCell(0, (tempY / 2) + 3).setTile(new StaticTiledMapTile(splitTiles[0][1])); //links3 + staticLayer.getCell(0, (tempY / 2) + 4).setTile(new StaticTiledMapTile(splitTiles[3][5])); //links4 + + AnimatedObject tempObject = new AnimatedObject(torchT, 48, 96); + tempObject.getSprite().setPosition(0, ((tempY / 2) + 2) * 48); + temp.getObjects().add(tempObject); + + AnimatedObject door = new AnimatedObject(this.doorLeft, 48, 144); + + door.setSpritePosition(0, ((tempY / 2) + 1) * 48); + door.setFrame(9); + door.updateTexture(); + + temp.getDoors().add(door); + } + + collisionLayer.getObjects().remove(left); + + RectangleMapObject tempTop = new RectangleMapObject(0, ((mapDimensionY / 2) + 1) * 48, 48, (mapDimensionY / 2) * 48); + RectangleMapObject tempBottom = new RectangleMapObject(0, 0, 48, (mapDimensionY / 2) * 48); + + collisionLayer.getObjects().add(tempTop); + collisionLayer.getObjects().add(tempBottom); + + RectangleMapObject door = new RectangleMapObject(0, (mapDimensionY / 2) * 48, 48, 48); + doorLayer.getObjects().add(door); + } + + temp.setMap(tempRoom); + tempLevel[x][y] = temp; + } + + } + } + + return tempLevel; + } + + private MapContainer generateRoom(Room r, int roomDimensionX, int roomDimensionY, int lvl){ + TiledMap tempRoom = new TiledMap(); + MapContainer temp = new MapContainer(tempRoom); + + // roomDimension bezieht sich auf die Größe des Raumes, da aber noch die Wände fehlen, + // muss auf die Größe jeweils 2 addiert werden. + int mapDimensionX = roomDimensionX + 2; + int mapDimensionY = roomDimensionY + 2; + + // Drei layer für die Map werden erstellt, die jeweils unterschiedliche Sachen speichern sollen: + // collisionLayer: Hier werden alle unsichtbaren Sprites gespeichert, anhand derer die Kollisionen berechnet werden + // dynamicLayer: Beinhaltet alle Sprites, die ihre Postition ändern können (Entities, Items) + // staticLayer: Beinhaltet alle Tiles und alles statische, was sich im Raum nicht ändern kann + MapLayers layers = tempRoom.getLayers(); + + MapLayer collisionLayer = new MapLayer(); + TiledMapTileLayer dynamicLayer = new TiledMapTileLayer(mapDimensionX, mapDimensionY + 2, 48, 48); + TiledMapTileLayer staticLayer = new TiledMapTileLayer(mapDimensionX, mapDimensionY + 2, 48, 48); + MapLayer exitLayer = new MapLayer(); + MapLayer doorLayer = new MapLayer(); + + RectangleMapObject bottom = new RectangleMapObject(0, 0, mapDimensionX*48, 48); + collisionLayer.getObjects().add(bottom); + + RectangleMapObject left = new RectangleMapObject(0, 0, 48, mapDimensionY*48); + collisionLayer.getObjects().add(left); + + RectangleMapObject top = new RectangleMapObject(0, mapDimensionY*48 - 48, mapDimensionX*48, 48); + collisionLayer.getObjects().add(top); + + RectangleMapObject right = new RectangleMapObject(mapDimensionX*48 - 48, 0, 48, mapDimensionY*48); + collisionLayer.getObjects().add(right); + + collisionLayer.setVisible(false); + + // Schleife läuft über jedes Teil des Raumes und generiert ein Tile aus dem tileset + for(int x = 0; x < mapDimensionX + 2; x++){ + for(int y = 0; y < mapDimensionY + 2; y++){ + + TiledMapTileLayer.Cell cell = new TiledMapTileLayer.Cell(); + + // links + if(x == 0){ + cell.setTile(new StaticTiledMapTile(splitTiles[4][2])); + } + // unten + else if(y == 0){ + cell.setTile(new StaticTiledMapTile(splitTiles[4][1])); + } + // rechts + else if(x == mapDimensionX - 1){ + cell.setTile(new StaticTiledMapTile(splitTiles[4][0])); + } + // oben1 + else if(y == mapDimensionY - 1){ + if(x == roomDimensionX / 2 - 1 || x == roomDimensionX / 2 + 3){ + + AnimatedObject tempObject = new AnimatedObject(torchT, 48, 96); + tempObject.getSprite().setPosition(x * 48, y * 48); + temp.getObjects().add(tempObject); + } + + cell.setTile(new StaticTiledMapTile(splitTiles[1][1])); + } + // oben2 + else if(y == mapDimensionY){ + cell.setTile(new StaticTiledMapTile(splitTiles[0][1])); + } + // oben3 + else if(y == mapDimensionY + 1){ + cell.setTile(new StaticTiledMapTile(splitTiles[4][3])); + } + else{ + cell.setTile(new StaticTiledMapTile(splitTiles[0][0])); + } + + // Ecken + + // unten links + if(x == 0 && y == 0){ + cell.setTile(new StaticTiledMapTile(splitTiles[2][2])); + } + // oben links + else if(x == 0 && y == mapDimensionY + 1){ + cell.setTile(new StaticTiledMapTile(splitTiles[3][2])); + } + // oben rechts + else if(x == mapDimensionX - 1 && y == mapDimensionY + 1){ + cell.setTile(new StaticTiledMapTile(splitTiles[0][2])); + } + // unten rechts + else if(x == mapDimensionX -1 && y == 0){ + cell.setTile(new StaticTiledMapTile(splitTiles[1][2])); + } + + staticLayer.setCell(x, y, cell); + } + } + + layers.add(collisionLayer); + layers.add(dynamicLayer); + layers.add(staticLayer); + layers.add(exitLayer); + layers.add(doorLayer); + + for(int i = 0; i < r.getItems().size(); i++){ + if(r.getItems().get(i) != null){ + ItemContainer container = r.getItems().get(i); + Item item = container.getItem(); + + AnimatedObject itemSprite = null; + switch(item.getId()){ + case 0: + itemSprite = new AnimatedObject(key, 48, 48); + break; + + case 1: + itemSprite = new AnimatedObject(potion, 48, 48); + break; + + case 2: + itemSprite = new AnimatedObject(amulet, 48, 48); + break; + + case 3: + itemSprite = new AnimatedObject(DmgAmulet, 48, 48); + break; + } + + itemSprite.getSprite().setPosition(container.getxPos(), container.getyPos()); + temp.getMapItems().add(itemSprite); + } + } + + return temp; + } + + public void ichWillSpielen(MapContainer[][][] map){ + + for(int i=0;i= 0; k--){ + if(temp[j][k] == null){ + System.out.print("0 "); + } + else{ + System.out.print("1 "); + } + } + System.out.println(); + } + } + } + + +} diff --git a/core/src/com/dungeoncrawler/view/PauseScreen.java b/core/src/com/dungeoncrawler/view/PauseScreen.java new file mode 100644 index 0000000..b24e830 --- /dev/null +++ b/core/src/com/dungeoncrawler/view/PauseScreen.java @@ -0,0 +1,198 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.Game; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +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.Sprite; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Intersector; +import com.badlogic.gdx.math.Rectangle; + +/** + * + * @author bfz + */ +public class PauseScreen{ + float w = Gdx.graphics.getWidth(); + float h = Gdx.graphics.getHeight(); + + + BitmapFont font; + + Texture volumeButtonTexture; + Texture volumeUpTexture; + Texture volumeDownTexture; + Texture volumeTexture; + Texture backButtonTexture; + Texture quitButtonTexture; + Texture controlsButtonTexture; + + Sprite controlsButtonSprite; + Sprite volumeButtonSprite; + Sprite volumeUpSprite; + Sprite volumeDownSprite; + Sprite volumeSprite; + Sprite backButtonSprite; + Sprite quitButtonSprite; + + Sprite controlsContainerSprite; + + boolean showControls; + + public PauseScreen(){ + + w = Gdx.graphics.getWidth(); + h = Gdx.graphics.getHeight(); + float wc = w/2; + showControls = false; + font = new BitmapFont(); + + controlsButtonTexture = new Texture("sprites/controlsButton.png"); + volumeButtonTexture = new Texture("sprites/volumeButton.png"); + volumeUpTexture = new Texture("sprites/volumeUpButton.png"); + volumeDownTexture = new Texture("sprites/volumeDownButton.png"); + volumeTexture = new Texture("sprites/volume.png"); + backButtonTexture = new Texture("sprites/backButton.png"); + quitButtonTexture = new Texture("sprites/quitButton.png"); + + controlsButtonSprite = new Sprite(controlsButtonTexture); + volumeButtonSprite = new Sprite(volumeButtonTexture); + volumeUpSprite = new Sprite(volumeUpTexture); + volumeDownSprite = new Sprite(volumeDownTexture); + volumeSprite = new Sprite(volumeTexture); + backButtonSprite = new Sprite(backButtonTexture); + quitButtonSprite = new Sprite(quitButtonTexture); + + controlsButtonSprite.setPosition(200, 600); + volumeButtonSprite.setPosition(200, 500); + volumeDownSprite.setPosition(volumeButtonSprite.getX() + 230, volumeButtonSprite.getY()+28); + volumeUpSprite.setPosition(volumeButtonSprite.getX() + 340, volumeButtonSprite.getY()+28); + backButtonSprite.setPosition(0, 0); + quitButtonSprite.setPosition(200,300); + + controlsContainerSprite = new Sprite(new Texture("sprites/controlsContainer.png")); + controlsContainerSprite.setPosition(800,250); + + } + + + public void render (SpriteBatch batch, float volume, OrthographicCamera camera) { + + + + float n = 0; + if(volume != 0){ + n = volume / 1f; + } + + int newWidth = (int) (n * volumeTexture.getWidth()); + if(newWidth == 0){ + TextureRegion[][] volumeRegion = TextureRegion.split(volumeTexture,1, volumeTexture.getHeight()); + volumeSprite = new Sprite(volumeRegion[0][0]); + volumeSprite.setPosition(-5,-5); + } + else{ + TextureRegion[][] volumeRegion = TextureRegion.split(volumeTexture,newWidth, volumeTexture.getHeight()); + volumeSprite = new Sprite(volumeRegion[0][0]); + volumeSprite.setPosition(volumeButtonSprite.getX() + 278, volumeButtonSprite.getY()+34); + } + + + + batch.begin(); + camera.update(); + batch.setProjectionMatrix(camera.combined); + volumeButtonSprite.draw(batch); + volumeUpSprite.draw(batch); + volumeDownSprite.draw(batch); + volumeSprite.draw(batch); + backButtonSprite.draw(batch); + controlsButtonSprite.draw(batch); + //quitButtonSprite.draw(batch); + + + if(showControls){ + controlsContainerSprite.draw(batch); + //font.getData().setScale(2); + font.draw(batch,"UP:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+380); + font.draw(batch,"W", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+380); + font.draw(batch,"LEFT:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+360); + font.draw(batch,"A", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+360); + font.draw(batch,"DOWN:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+340); + font.draw(batch,"S", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+340); + font.draw(batch,"RIGHT:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+320); + font.draw(batch,"D", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+320); + + font.draw(batch,"SHOOT UP:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+280); + font.draw(batch,"ARROW-KEY UP", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+280); + font.draw(batch,"SHOOT LEFT:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+260); + font.draw(batch,"ARROW-KEY LEFT", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+260); + font.draw(batch,"SHOOT DOWN:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+240); + font.draw(batch,"ARROW-KEY DOWN", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+240); + font.draw(batch,"SHOOT RIGHT:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+220); + font.draw(batch,"ARROW-KEY RIGHT", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+220); + + font.draw(batch,"MELEE ATTACK:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+180); + font.draw(batch,"SPACE", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+180); + + font.draw(batch,"EQUIP ITEM:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+140); + font.draw(batch,"R", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+140); + font.draw(batch,"DROP ITEM:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+120); + font.draw(batch,"Q", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+120); + font.draw(batch,"USE ITEM:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+100); + font.draw(batch,"E", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+100); + font.draw(batch,"SELECT ITEM:", controlsContainerSprite.getX() + 20, controlsContainerSprite.getY()+80); + font.draw(batch,"SCROLL WHEEL", controlsContainerSprite.getX() + 220, controlsContainerSprite.getY()+80); + } + batch.end(); + } + + + public int click(int x, int y){ // prueft ob cursor mit button (START) ueberlappt + + + + Rectangle r = new Rectangle(); + r.set(x, h-y, 1600, 900); + /* + if(Intersector.overlaps(r, quitButtonSprite.getBoundingRectangle())){ + return 11; //restart Game + } + */ + if(Intersector.overlaps(r, backButtonSprite.getBoundingRectangle())){ + return 5; //proceed Game + } + if(Intersector.overlaps(r, controlsButtonSprite.getBoundingRectangle())){ + if(showControls){ + showControls = false; + } + else{ + showControls = true; + } + return -1; //controlsScreen + } + if(Intersector.overlaps(r, volumeDownSprite.getBoundingRectangle())){ + return 9; //volume DOWN + } + if(Intersector.overlaps(r, volumeUpSprite.getBoundingRectangle())){ + return 10; //volume UP + } + + + return -1; + + } + + + +} diff --git a/core/src/com/dungeoncrawler/view/SettingsScreen.java b/core/src/com/dungeoncrawler/view/SettingsScreen.java new file mode 100644 index 0000000..480031e --- /dev/null +++ b/core/src/com/dungeoncrawler/view/SettingsScreen.java @@ -0,0 +1,128 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.view; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Intersector; +import com.badlogic.gdx.math.Rectangle; + +/** + * + * @author bfz + */ +public class SettingsScreen { + float w = Gdx.graphics.getWidth(); + float h = Gdx.graphics.getHeight(); + + Texture controlsButtonTexture; + Texture volumeButtonTexture; + Texture volumeUpTexture; + Texture volumeDownTexture; + Texture volumeTexture; + Texture backButtonTexture; + + Sprite controlsButtonSprite; + Sprite volumeButtonSprite; + Sprite volumeUpSprite; + Sprite volumeDownSprite; + Sprite volumeSprite; + Sprite backButtonSprite; + + public SettingsScreen(){ + + w = Gdx.graphics.getWidth(); + h = Gdx.graphics.getHeight(); + float wc = w/2; + + controlsButtonTexture = new Texture("sprites/controlsButton.png"); + volumeButtonTexture = new Texture("sprites/volumeButton.png"); + volumeUpTexture = new Texture("sprites/volumeUpButton.png"); + volumeDownTexture = new Texture("sprites/volumeDownButton.png"); + volumeTexture = new Texture("sprites/volume.png"); + backButtonTexture = new Texture("sprites/backButton.png"); + + controlsButtonSprite = new Sprite(controlsButtonTexture); + volumeButtonSprite = new Sprite(volumeButtonTexture); + volumeUpSprite = new Sprite(volumeUpTexture); + volumeDownSprite = new Sprite(volumeDownTexture); + volumeSprite = new Sprite(volumeTexture); + backButtonSprite = new Sprite(backButtonTexture); + + controlsButtonSprite.setPosition(200, 600); + volumeButtonSprite.setPosition(200, 500); + volumeDownSprite.setPosition(volumeButtonSprite.getX() + 230, volumeButtonSprite.getY()+28); + volumeUpSprite.setPosition(volumeButtonSprite.getX() + 340, volumeButtonSprite.getY()+28); + backButtonSprite.setPosition(0, 0); + } + + + public void render (SpriteBatch batch, float volume) { + Gdx.gl.glClearColor(0, 0, 0, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + + + + + float n = 0; + if(volume != 0){ + n = volume / 1f; + } + + int newWidth = (int) (n * volumeTexture.getWidth()); + if(newWidth == 0){ + TextureRegion[][] volumeRegion = TextureRegion.split(volumeTexture,1, volumeTexture.getHeight()); + volumeSprite = new Sprite(volumeRegion[0][0]); + volumeSprite.setPosition(-5,-5); + } + else{ + TextureRegion[][] volumeRegion = TextureRegion.split(volumeTexture,newWidth, volumeTexture.getHeight()); + volumeSprite = new Sprite(volumeRegion[0][0]); + volumeSprite.setPosition(volumeButtonSprite.getX() + 278, volumeButtonSprite.getY()+34); + } + + + batch.begin(); + controlsButtonSprite.draw(batch); + volumeButtonSprite.draw(batch); + volumeUpSprite.draw(batch); + volumeDownSprite.draw(batch); + volumeSprite.draw(batch); + backButtonSprite.draw(batch); + batch.end(); + } + + + public int click(int x, int y){ // prueft ob cursor mit button (START) ueberlappt + + + + Rectangle r = new Rectangle(); + r.set(x, h-y, 1, 1); + if(Intersector.overlaps(r, controlsButtonSprite.getBoundingRectangle())){ + return 3; //ControlsScreen + } + if(Intersector.overlaps(r, backButtonSprite.getBoundingRectangle())){ + return 4; //MainMenuScreen + } + if(Intersector.overlaps(r, volumeDownSprite.getBoundingRectangle())){ + return 9; //volume DOWN + } + if(Intersector.overlaps(r, volumeUpSprite.getBoundingRectangle())){ + return 10; //volume UP + } + + return -1; + + } + + +} diff --git a/desktop/build.gradle b/desktop/build.gradle new file mode 100644 index 0000000..f174c7d --- /dev/null +++ b/desktop/build.gradle @@ -0,0 +1,41 @@ +apply plugin: "java" + +sourceCompatibility = 1.7 +sourceSets.main.java.srcDirs = [ "src/" ] +sourceSets.main.resources.srcDirs = ["../android/assets"] + +project.ext.mainClassName = "com.dungeoncrawler.control.desktop.DesktopLauncher" +project.ext.assetsDir = new File("../android/assets") + +task run(dependsOn: classes, type: JavaExec) { + main = project.mainClassName + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + workingDir = project.assetsDir + ignoreExitValue = true +} + +task debug(dependsOn: classes, type: JavaExec) { + main = project.mainClassName + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + workingDir = project.assetsDir + ignoreExitValue = true + debug = true +} + +task dist(type: Jar) { + manifest { + attributes 'Main-Class': project.mainClassName + } + dependsOn configurations.runtimeClasspath + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + with jar +} + + +dist.dependsOn classes + +eclipse.project.name = appName + "-desktop" diff --git a/desktop/src/com/dungeoncrawler/control/desktop/DesktopLauncher.java b/desktop/src/com/dungeoncrawler/control/desktop/DesktopLauncher.java new file mode 100644 index 0000000..478dde4 --- /dev/null +++ b/desktop/src/com/dungeoncrawler/control/desktop/DesktopLauncher.java @@ -0,0 +1,12 @@ +package com.dungeoncrawler.control.desktop; + +import com.badlogic.gdx.backends.lwjgl.LwjglApplication; +import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; +import com.dungeoncrawler.control.Controller; + +public class DesktopLauncher { + public static void main (String[] arg) { + LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); + new LwjglApplication(new Controller(), config); + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..ff329ac --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.daemon=true +org.gradle.jvmargs=-Xms128m -Xmx1500m +org.gradle.configureondemand=false diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..5c2d1cf Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..f4d7b2b --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..b0d6d0a --- /dev/null +++ b/gradlew @@ -0,0 +1,188 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..15e1ee3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..77ae463 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include 'desktop', 'android', 'core' \ No newline at end of file