From 488bb78d8b50dffe5fcb6635f1144a0e849c2e1c Mon Sep 17 00:00:00 2001 From: Trutz Date: Mon, 12 Apr 2021 17:09:53 +0200 Subject: [PATCH] Projekt Alien Defence von Schick&Kannix eingekauft --- .gitignore | 163 ++++++++ .idea/.gitignore | 3 + .idea/.name | 1 + .idea/codeStyles/Project.xml | 7 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/compiler.xml | 6 + .idea/gradle.xml | 18 + .idea/jarRepositories.xml | 20 + .idea/misc.xml | 7 + .idea/modules/VL_AlienDefence.iml | 8 + .idea/vcs.xml | 6 + README.md | 15 +- build.gradle | 37 ++ gradle.properties | 2 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 +++++++++ gradlew.bat | 89 ++++ settings.gradle | 2 + sql/alien_defence.sql | 188 +++++++++ .../controller/AlienDefenceController.java | 49 +++ .../java/controller/AttemptController.java | 46 +++ src/main/java/controller/GameController.java | 152 +++++++ src/main/java/controller/HitCounter.java | 99 +++++ src/main/java/controller/LevelController.java | 81 ++++ .../java/controller/TargetController.java | 113 +++++ src/main/java/model/Attempt.java | 51 +++ src/main/java/model/Hitbox.java | 86 ++++ src/main/java/model/Level.java | 149 +++++++ src/main/java/model/Point.java | 43 ++ src/main/java/model/Target.java | 118 ++++++ .../persistence/IAttemptPersistance.java | 14 + .../model/persistence/ILevelPersistance.java | 38 ++ .../java/model/persistence/IPersistance.java | 10 + .../model/persistence/ITargetPersistance.java | 17 + .../model/persistence/IUserPersistance.java | 9 + .../java/model/persistenceDB/AccessDB.java | 55 +++ .../java/model/persistenceDB/AttemptDB.java | 148 +++++++ .../java/model/persistenceDB/LevelDB.java | 112 +++++ .../model/persistenceDB/PersistanceDB.java | 44 ++ .../java/model/persistenceDB/TargetDB.java | 118 ++++++ .../model/persistenceDummy/AttemptDummy.java | 52 +++ .../model/persistenceDummy/LevelDummy.java | 61 +++ .../persistenceDummy/PersistanceDummy.java | 45 ++ .../model/persistenceDummy/TargetDummy.java | 38 ++ .../model/persistenceDummy/UserDummy.java | 19 + src/main/java/toDo/CreateUserWindow.java | 6 + src/main/java/toDo/User.java | 153 +++++++ src/main/java/toDo/UserController.java | 43 ++ src/main/java/toDo/UserDB.java | 56 +++ src/main/java/view/StartAlienDefence.java | 18 + src/main/java/view/game/GameGUI.java | 93 +++++ src/main/java/view/game/GameJPanel.java | 106 +++++ .../java/view/game/MouseClickListener.java | 21 + src/main/java/view/game/TargetPainter.java | 56 +++ src/main/java/view/menue/Highscore.java | 80 ++++ src/main/java/view/menue/LevelChooser.java | 113 +++++ src/main/java/view/menue/LevelEditor.java | 386 ++++++++++++++++++ .../java/view/menue/LeveldesignWindow.java | 74 ++++ src/main/java/view/menue/MainMenu.java | 237 +++++++++++ src/main/resources/pictures/Bildquellen.txt | 18 + src/main/resources/pictures/YouLoose.png | Bin 0 -> 21918 bytes src/main/resources/pictures/YouWin.png | Bin 0 -> 18813 bytes src/main/resources/pictures/background_1.jpg | Bin 0 -> 511884 bytes src/main/resources/pictures/background_10.jpg | Bin 0 -> 253937 bytes src/main/resources/pictures/background_2.jpg | Bin 0 -> 590549 bytes src/main/resources/pictures/background_3.jpg | Bin 0 -> 1169054 bytes src/main/resources/pictures/background_4.jpg | Bin 0 -> 317205 bytes src/main/resources/pictures/background_5.jpg | Bin 0 -> 606639 bytes src/main/resources/pictures/background_6.jpg | Bin 0 -> 334101 bytes src/main/resources/pictures/background_7.jpg | Bin 0 -> 397285 bytes src/main/resources/pictures/background_8.jpg | Bin 0 -> 775723 bytes src/main/resources/pictures/background_9.jpg | Bin 0 -> 179423 bytes .../resources/pictures/ballon Bildquelle.txt | 1 + src/main/resources/pictures/ballon.png | Bin 0 -> 37654 bytes src/main/resources/pictures/crosshair.png | Bin 0 -> 887 bytes src/main/resources/pictures/explosion.png | Bin 0 -> 50678 bytes .../resources/pictures/italy Bildquelle.txt | 1 + src/main/resources/pictures/lemon.jpg | Bin 0 -> 87512 bytes src/main/resources/pictures/logo.png | Bin 0 -> 116453 bytes src/main/resources/pictures/ufo_1.png | Bin 0 -> 43437 bytes src/main/resources/pictures/ufo_2.png | Bin 0 -> 83348 bytes src/main/resources/pictures/ufo_3.png | Bin 0 -> 49189 bytes src/main/resources/pictures/ufo_4.png | Bin 0 -> 48312 bytes src/main/resources/pictures/ufo_5.png | Bin 0 -> 47174 bytes 85 files changed, 3994 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules/VL_AlienDefence.iml create mode 100644 .idea/vcs.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 sql/alien_defence.sql create mode 100644 src/main/java/controller/AlienDefenceController.java create mode 100644 src/main/java/controller/AttemptController.java create mode 100644 src/main/java/controller/GameController.java create mode 100644 src/main/java/controller/HitCounter.java create mode 100644 src/main/java/controller/LevelController.java create mode 100644 src/main/java/controller/TargetController.java create mode 100644 src/main/java/model/Attempt.java create mode 100644 src/main/java/model/Hitbox.java create mode 100644 src/main/java/model/Level.java create mode 100644 src/main/java/model/Point.java create mode 100644 src/main/java/model/Target.java create mode 100644 src/main/java/model/persistence/IAttemptPersistance.java create mode 100644 src/main/java/model/persistence/ILevelPersistance.java create mode 100644 src/main/java/model/persistence/IPersistance.java create mode 100644 src/main/java/model/persistence/ITargetPersistance.java create mode 100644 src/main/java/model/persistence/IUserPersistance.java create mode 100644 src/main/java/model/persistenceDB/AccessDB.java create mode 100644 src/main/java/model/persistenceDB/AttemptDB.java create mode 100644 src/main/java/model/persistenceDB/LevelDB.java create mode 100644 src/main/java/model/persistenceDB/PersistanceDB.java create mode 100644 src/main/java/model/persistenceDB/TargetDB.java create mode 100644 src/main/java/model/persistenceDummy/AttemptDummy.java create mode 100644 src/main/java/model/persistenceDummy/LevelDummy.java create mode 100644 src/main/java/model/persistenceDummy/PersistanceDummy.java create mode 100644 src/main/java/model/persistenceDummy/TargetDummy.java create mode 100644 src/main/java/model/persistenceDummy/UserDummy.java create mode 100644 src/main/java/toDo/CreateUserWindow.java create mode 100644 src/main/java/toDo/User.java create mode 100644 src/main/java/toDo/UserController.java create mode 100644 src/main/java/toDo/UserDB.java create mode 100644 src/main/java/view/StartAlienDefence.java create mode 100644 src/main/java/view/game/GameGUI.java create mode 100644 src/main/java/view/game/GameJPanel.java create mode 100644 src/main/java/view/game/MouseClickListener.java create mode 100644 src/main/java/view/game/TargetPainter.java create mode 100644 src/main/java/view/menue/Highscore.java create mode 100644 src/main/java/view/menue/LevelChooser.java create mode 100644 src/main/java/view/menue/LevelEditor.java create mode 100644 src/main/java/view/menue/LeveldesignWindow.java create mode 100644 src/main/java/view/menue/MainMenu.java create mode 100644 src/main/resources/pictures/Bildquellen.txt create mode 100644 src/main/resources/pictures/YouLoose.png create mode 100644 src/main/resources/pictures/YouWin.png create mode 100644 src/main/resources/pictures/background_1.jpg create mode 100644 src/main/resources/pictures/background_10.jpg create mode 100644 src/main/resources/pictures/background_2.jpg create mode 100644 src/main/resources/pictures/background_3.jpg create mode 100644 src/main/resources/pictures/background_4.jpg create mode 100644 src/main/resources/pictures/background_5.jpg create mode 100644 src/main/resources/pictures/background_6.jpg create mode 100644 src/main/resources/pictures/background_7.jpg create mode 100644 src/main/resources/pictures/background_8.jpg create mode 100644 src/main/resources/pictures/background_9.jpg create mode 100644 src/main/resources/pictures/ballon Bildquelle.txt create mode 100644 src/main/resources/pictures/ballon.png create mode 100644 src/main/resources/pictures/crosshair.png create mode 100644 src/main/resources/pictures/explosion.png create mode 100644 src/main/resources/pictures/italy Bildquelle.txt create mode 100644 src/main/resources/pictures/lemon.jpg create mode 100644 src/main/resources/pictures/logo.png create mode 100644 src/main/resources/pictures/ufo_1.png create mode 100644 src/main/resources/pictures/ufo_2.png create mode 100644 src/main/resources/pictures/ufo_3.png create mode 100644 src/main/resources/pictures/ufo_4.png create mode 100644 src/main/resources/pictures/ufo_5.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..30aa607 --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/intellij +# Edit at https://www.toptal.com/developers/gitignore?templates=intellij + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# End of https://www.toptal.com/developers/gitignore/api/intellij + + +# Created by https://www.toptal.com/developers/gitignore/api/java +# Edit at https://www.toptal.com/developers/gitignore?templates=java + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# End of https://www.toptal.com/developers/gitignore/api/java + + +# Created by https://www.toptal.com/developers/gitignore/api/gradle +# Edit at https://www.toptal.com/developers/gitignore?templates=gradle + +### Gradle ### +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties + +### Gradle Patch ### +**/build/ + +# End of https://www.toptal.com/developers/gitignore/api/gradle diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..717cc5c --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +AlienDefence \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..919ce1f --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..ac216bc --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..8c8418f --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1b578d5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules/VL_AlienDefence.iml b/.idea/modules/VL_AlienDefence.iml new file mode 100644 index 0000000..f491540 --- /dev/null +++ b/.idea/modules/VL_AlienDefence.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 216bf88..c5e10c4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ -# VL_AlienDefence -Projekt Alien Defence von Schick&Kannix eingekauft +# Lernsituation "Alien Defence" +Fast wäre die Firma Schick&Kannix insolvent gegangen, wenn Ihre Firma die Gamepool GmbH sie nicht aufgekauft hätte. Im Projektportfolio der Schick&Kannix finden Sie ein altes Pflichtenheft für die Entwicklung eines Shoot-’em-up-Computerspiels, das zu einem Software-Erstellungsvertrag für die Future Technologie Consulting GmbH gehört. Diese wollen keine schnarchnasigen Mitarbeiter mehr einstellen und wollen als Einstellungstest die Bewerber mit diesem Spiel auf Reaktion und Geschicklichkeit mit der Maus testen. Als Fertigstellungstermin ist offensichtlich der 1.4. diesen Jahres vereinbart worden. Während Ihre kaufmännische Abteilung fieberhaft nach dem Vertrag sucht, müssen Sie sich um die noch nicht umgesetzten Punkte des Pflichtenheftes kümmern und die Programmierung des Spiels fertigstellen. + +Ihnen liegen eine funktionierende Angriffswelt, verschiedene Menüs und ein spielbares Testlevel vor. Allerdings fehlen Ihnen noch diverse UserStories und die Software sieht noch sehr unfertig aus. Zentraler Bestandteil des Pflichtenheftes ist, dass nach jedem Level die erreichten Punkte für den*die Spieler*in in eine Highscore-Liste eingetragen werden sollen. Das Score-System errechnet sich aus dem Prozentsatz der abgeschossenen Objekte sowie der gesamten Reaktionszeit. Alle Daten müssen in einer zugrundeliegenden Datenbank persistent gehalten werden, die Ihnen die Mitarbeiter*innen der Schick&Kannix halbfertig noch hinterlassen haben. + +**Auftrag: Sichten Sie anhand der Entwurfsdokumente und des Scrumboards den Arbeitsstand und die Softwarearchitektur des Spiels Alien Defence und stellen Sie in einem Team die Software termingerecht fertig.** + +In den Räumlichkeiten der Schick&Kannix gibt es einiges, was Ihnen bei der Entwicklung helfen kann. Zum einen finden Sie hier den Quellcode des Spiels. + +Auch wurde ein Scrumboard zurückgelassen, das noch die aktuellen ToDos bei dem Projekt zeigt. +Außerdem gibt es eine kleine Fachbibliothek mit Literatur, die für die Fertigstellung der Software wichtig ist, und die Sie in jedem Abschnitt in Moodle finden. + +Also auf gehts ans Werk! \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..864e019 --- /dev/null +++ b/build.gradle @@ -0,0 +1,37 @@ +plugins { + id 'java' +} + +group 'de.oszimt.ls' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' +} + +test { + useJUnitPlatform() +} + +/** + * 1st approach: Setting encoding during compilation in Java and Test classes + */ +compileJava.options.encoding = "UTF-8" +compileTestJava.options.encoding = "UTF-8" + +/** + * 2nd approach: Setting encoding during compilation in Java and Test classes + */ +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" +} + +tasks.withType(Test) { + systemProperty "file.encoding", "UTF-8" +} + diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..1e81d89 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.warning.mode=none +org.gradle.jvmargs=-Dfile.encoding=UTF8 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..be52383 --- /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-6.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/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 +# +# https://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 or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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=`expr $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" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@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 https://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 Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@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 execute + +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 execute + +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 + +: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 %* + +: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..e9a8d3f --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'AlienDefence' + diff --git a/sql/alien_defence.sql b/sql/alien_defence.sql new file mode 100644 index 0000000..0a6a2dc --- /dev/null +++ b/sql/alien_defence.sql @@ -0,0 +1,188 @@ +-- phpMyAdmin SQL Dump +-- version 4.0.9 +-- http://www.phpmyadmin.net +-- +-- Host: 127.0.0.1 +-- Erstellungszeit: 11. Feb 2021 um 09:23 +-- Server Version: 5.6.14 +-- PHP-Version: 5.5.6 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; + +-- +-- Datenbank: `alien_defence` +-- + +-- -------------------------------------------------------- + +-- +-- Tabellenstruktur für Tabelle `levels` +-- + +CREATE TABLE IF NOT EXISTS `levels` ( + `P_level_id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL, + `background` varchar(100) NOT NULL, + `duration` int(11) NOT NULL, + PRIMARY KEY (`P_level_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=4 ; + +-- +-- Daten für Tabelle `levels` +-- + +INSERT INTO `levels` (`P_level_id`, `name`, `background`, `duration`) VALUES +(1, 'Level 1', 'background_1.jpg', 10000), +(2, 'Level 2', 'background_2.jpg', 5000), +(3, 'Level 3', 'background_10.jpg', 10000); + +-- -------------------------------------------------------- + +-- +-- Tabellenstruktur für Tabelle `targets` +-- + +CREATE TABLE IF NOT EXISTS `targets` ( + `P_target_id` int(11) NOT NULL AUTO_INCREMENT, + `F_level_id` int(11) NOT NULL, + `x_position` int(11) NOT NULL, + `y_position` int(11) NOT NULL, + `width` int(11) NOT NULL, + `height` int(11) NOT NULL, + `time` int(11) NOT NULL, + `duration` int(11) NOT NULL, + `image_address` varchar(100) NOT NULL, + PRIMARY KEY (`P_target_id`), + KEY `FK LEVELS ID` (`F_level_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=60 ; + +-- +-- Daten für Tabelle `targets` +-- + +INSERT INTO `targets` (`P_target_id`, `F_level_id`, `x_position`, `y_position`, `width`, `height`, `time`, `duration`, `image_address`) VALUES +(40, 1, 100, 100, 150, 50, 1000, 2000, 'ufo_1.png'), +(41, 1, 500, 100, 150, 50, 2000, 2000, 'ufo_2.png'), +(44, 1, 800, 800, 150, 50, 3000, 2000, 'ufo_3.png'), +(51, 1, 600, 400, 150, 50, 4000, 1000, 'ufo_4.png'), +(52, 1, 200, 400, 150, 50, 5000, 1500, 'ufo_5.png'), +(53, 1, 1000, 800, 150, 50, 6000, 1000, 'ufo_3.png'), +(54, 1, 500, 500, 150, 50, 7000, 1000, 'ufo_1.png'), +(55, 2, 600, 400, 150, 50, 1000, 2000, 'ufo_3.png'), +(56, 2, 400, 600, 150, 50, 2000, 2000, 'ufo_2.png'), +(57, 3, 600, 400, 150, 50, 1000, 1000, 'ufo_3.png'), +(58, 3, 600, 400, 150, 50, 6000, 1000, 'ufo_3.png'), +(59, 3, 100, 300, 400, 150, 4000, 1000, 'ufo_3.png'); + +-- -------------------------------------------------------- + +-- +-- Tabellenstruktur für Tabelle `attempts` +-- + +CREATE TABLE IF NOT EXISTS `attempts` ( + `P_attempt_id` int(11) NOT NULL AUTO_INCREMENT, + `F_user_id` int(11) NOT NULL, + `F_level_id` int(11) NOT NULL, + `shots` int(11) NOT NULL, + `hits` int(11) NOT NULL, + `reaction_time` int(11) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + PRIMARY KEY (`P_attempt_id`), + KEY `FK PARTICIPANTS ID` (`F_user_id`), + KEY `FK LEVELS2 ID` (`F_level_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=333 ; + +-- +-- Daten für Tabelle `attempt` +-- + +INSERT INTO `attempts` (`P_attempt_id`, `F_user_id`, `F_level_id`, `shots`, `hits`, `reaction_time`, `date`, `time`) VALUES +(278, 1, 3, 3, 2, 2214, '2020-08-15', '09:23:32'), +(279, 1, 3, 3, 3, -942, '2020-08-15', '09:24:04'), +(299, 1, 3, 3, 2, 3533, '2020-08-15', '10:16:46'), +(300, 1, 3, 5, 2, 2451, '2020-08-15', '10:17:21'), +(303, 1, 3, 5, 3, -979, '2020-08-15', '10:32:21'), +(304, 1, 3, 9, 2, 878, '2020-08-15', '10:32:49'), +(313, 1, 2, 2, 1, 571, '2020-08-15', '13:56:01'), +(314, 1, 2, 4, 2, 1101, '2020-08-15', '14:21:01'), +(315, 1, 1, 10, 4, 514, '2020-08-15', '14:21:30'), +(316, 1, 2, 3, 2, 724, '2020-08-15', '14:23:59'), +(317, 1, 2, 0, 0, 0, '2020-08-15', '16:03:36'), +(318, 1, 2, 4, 2, 651, '2020-08-15', '16:23:43'), +(319, 1, 2, 6, 2, 1262, '2020-08-15', '17:09:40'), +(320, 1, 2, 6, 2, 784, '2020-08-15', '17:11:35'), +(321, 1, 2, 3, 1, 1857, '2020-08-15', '17:11:51'), +(322, 1, 1, 7, 6, 1021, '2021-02-09', '10:15:41'), +(323, 1, 1, 6, 6, 664, '2021-02-09', '10:16:19'), +(324, 1, 1, 5, 5, 1000, '2021-02-09', '15:14:03'), +(325, 1, 1, 20, 7, 300, '2021-02-09', '15:14:45'), +(326, 1, 1, 5, 5, 703, '2021-02-09', '15:57:42'), +(327, 1, 1, 0, 0, 0, '2021-02-09', '16:20:42'), +(328, 1, 1, 7, 7, 622, '2021-02-09', '17:37:38'), +(329, 1, 3, 2, 2, -1772, '2021-02-09', '17:37:57'), +(330, 1, 1, 27, 6, 935, '2021-02-10', '15:34:13'), +(331, 1, 1, 7, 7, 660, '2021-02-10', '15:44:01'), +(332, 1, 1, 3, 3, 1013, '2021-02-11', '08:39:39'); + +-- -------------------------------------------------------- + +-- +-- Tabellenstruktur für Tabelle `users` +-- + +CREATE TABLE IF NOT EXISTS `users` ( + `P_user_id` int(11) NOT NULL AUTO_INCREMENT, + `first_name` varchar(100) NOT NULL, + `sur_name` varchar(100) NOT NULL, + `birthday` date NOT NULL, + `street` varchar(100) NOT NULL, + `house_number` varchar(6) NOT NULL, + `postal_code` char(5) NOT NULL, + `city` varchar(100) NOT NULL, + `login_name` varchar(100) NOT NULL, + `password` varchar(100) NOT NULL, + `salary_expectations` int(100) NOT NULL, + `marital_status` varchar(100) NOT NULL, + `final_grade` decimal(3,2) NOT NULL, + PRIMARY KEY (`P_user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=6 ; + +-- +-- Daten für Tabelle `users` +-- + +INSERT INTO `users` (`P_user_id`, `first_name`, `sur_name`, `birthday`, `street`, `house_number`, `postal_code`, `city`, `login_name`, `password`, `salary_expectations`, `marital_status`, `final_grade`) VALUES +(1, 'Mike', 'Leveltester', '2000-10-25', 'Testweg', '1', '10245', 'Berlin', 'test', 'pass', 36000, 'Roboter', '1.00'), +(2, 'MC', 'A', '1998-02-03', 'Brooklynstreet', '2', '10113', 'NYC', 'user', 'pass', 100000, 'ledig', '2.40'), +(3, 'Susanne', 'König', '2001-12-25', 'Hasenweg', '4', '08900', 'Bretnig-Hauswalde', 'susi', 'pass', 20000, 'verheirate', '2.90'), +(4, 'Jan', 'Jonas', '2004-02-29', 'Galihag', '111C', '10317', 'Berlin', 'jan', 'pass', 44444, 'ledig', '1.00'), +(5, 'Felix', 'DelSande', '1985-04-01', 'Lerchenweg', '23', '10245', 'Berlin', 'felix', 'pass', 36000, 'ledig', '3.70'); + +-- +-- Constraints der exportierten Tabellen +-- + +-- +-- Constraints der Tabelle `targets` +-- +ALTER TABLE `targets` + ADD CONSTRAINT `FK LEVELS ID` FOREIGN KEY (`F_level_id`) REFERENCES `levels` (`P_level_id`); + +ALTER TABLE `attempts` + ADD CONSTRAINT `FK LEVEL ID` FOREIGN KEY (`F_level_id`) REFERENCES `levels` (`P_level_id`); + +ALTER TABLE `attempts` + ADD CONSTRAINT `FK USER ID` FOREIGN KEY (`F_user_id`) REFERENCES `users` (`P_user_id`); + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/src/main/java/controller/AlienDefenceController.java b/src/main/java/controller/AlienDefenceController.java new file mode 100644 index 0000000..24ae958 --- /dev/null +++ b/src/main/java/controller/AlienDefenceController.java @@ -0,0 +1,49 @@ +package controller; + +import model.Level; +import model.persistence.IPersistance; +import toDo.User; + +public class AlienDefenceController { + + //Teilcontroller + private GameController gameController; + private LevelController levelController; + private TargetController targetController; + private AttemptController attemptController; + //TODO UserController implementieren + + //Persistenz + private IPersistance alienDefenceModel; + + public AlienDefenceController(IPersistance alienDefenceModel) { + super(); + this.alienDefenceModel = alienDefenceModel; + this.attemptController = new AttemptController(alienDefenceModel); + this.levelController = new LevelController(alienDefenceModel); + this.targetController = new TargetController(alienDefenceModel); + } + + public IPersistance getAlienDefenceModel() { + return alienDefenceModel; + } + + public AttemptController getAttemptController() { + return attemptController; + } + + public LevelController getLevelController() { + return levelController; + } + + public TargetController getTargetController() { + return targetController; + } + + public GameController startGame(Level selectedLevel, User user) { + this.gameController = new GameController(selectedLevel, user, this); + return this.gameController; + } + + +} diff --git a/src/main/java/controller/AttemptController.java b/src/main/java/controller/AttemptController.java new file mode 100644 index 0000000..6a476d0 --- /dev/null +++ b/src/main/java/controller/AttemptController.java @@ -0,0 +1,46 @@ +package controller; + +import java.util.Vector; + +import model.Level; +import model.persistence.IAttemptPersistance; +import model.persistence.IPersistance; + +public class AttemptController { + + private IAttemptPersistance attemptPersistance; + + /** + * erstellt ein neues Objekt eines AttemptController welches Attemptobjekte in + * der übergebenen Datenhaltung persisiert + * + * @param alienDefenceModel.getAttemptDB() + * Persistenzklasse der Attemptobjekte + */ + public AttemptController(IPersistance alienDefenceModel) { + this.attemptPersistance = alienDefenceModel.getAttemptPersistance(); + } + + public Vector> getAllAttemptsPerLevel(Level level, int game_id) { + return attemptPersistance.getAllAttemptsPerLevel(level, game_id); + } + + public int getPlayerPosition() { + return attemptPersistance.getPlayerPosition(); + } + + public void deleteHighscore(int level_id) { + attemptPersistance.deleteHighscore(level_id); + } + + /** + * calculates points from attempt for highscore TODO create formula here + * + * @param level Levelobjekt + * @param hitcounter Controllerobjekt das die Treffer und Reaktionszeiten misst + * @return points + */ + public int calculatePoints(Level level, HitCounter hitcounter) { + return -1; + } +} diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 0000000..69fdccc --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,152 @@ +package controller; + +import java.util.LinkedList; +import java.util.List; + +import model.Level; +import model.Point; +import model.Target; +import toDo.User; +import view.menue.Highscore; + +public class GameController { + + private AlienDefenceController alienDefenceController; + private Level currentLevel; + private User currentUser; + private boolean hasWon; + private HitCounter hitCounter; + private boolean setHighscore = true; + private long timer = 0L, starttimer = 0L, endtimer = 0L; + private List targets; + + public GameController(Level selectedLevel, User user, AlienDefenceController alienDefenceController) { + + this.currentLevel = selectedLevel; + this.currentUser = user; + this.hitCounter = new HitCounter(currentLevel.getTargets().size()); + this.targets = currentLevel.getTargets(); + this.hasWon = false; + this.alienDefenceController = alienDefenceController; + } + + public void doLogik(long delta) { + timer += delta; + + // time for next logic step + + // section to run once a second + if (timer >= 1000) { + timer -= 100; + + if (this.isAllTargetDestroyed()) { + this.hasWon = true; + } + + if ((this.timeleft() <= 0 || this.isHasWon()) && this.setHighscore) { + + setHighscore = false; //damit keine doppelten Eintrüge erzeugt werden + + // TODO Highscoreeintrag erzeugen Highscore >> F_user_id, F_level_id, shots, + // hits, reaction_time + System.out.println("Highscoreeintrag für " + currentLevel.getName() + ": " + currentUser.getFirst_name() + + " hat " + this.getShotsFired() + " mal auf " + this.getTargets().size() + + " Ziele gefeuert und " + this.getHits() + " mal getroffen."); + System.out.println("Highscorepunkte: " + alienDefenceController.getAttemptController().calculatePoints(this.currentLevel, this.hitCounter)); + int insert_id = 0; + // AttemptDB attemptDB = + // this.alienDefenceController.getAlienDefenceModel().getAttemptPersistance(); + // int insert_id = attemptDB.createHighscoreEntry(currentUser.getP_user_id(), + // currentLevel.getLevel_id(), + // this.getShotsFired(), this.getHits(), relReactionDiffernce); + + new Highscore(this.alienDefenceController.getAttemptController(), currentLevel, + insert_id); + + } + } + // steps that use only delta + } + + // fire + public void fireShot(int x, int y) { + boolean isHit = false; + + // iterates through all targets and checks if a target is hit + for (Target t : targets) { + if (t.getHitbox().contains(new Point(x, y)) && !t.isHit()) { + + long differnce = time() - t.getTime(); + this.hitCounter.addReactionTime(differnce); + + if (differnce > 0 && (t.getTime() + t.getDuration()) > time()) { + isHit = true; + t.setHit(true); + } + } + } + + // hit + if (isHit) { + this.hitCounter.hit(); + } else + this.hitCounter.miss(); + + } + + public double getAccuracy() { + return hitCounter.getAccuracy(); + } + + public Level getCurrLevel() { + return currentLevel; + } + + public int getHits() { + return this.hitCounter.getHit(); + } + + public int getShotsFired() { + return this.hitCounter.getShots(); + } + + public List getTargets() { + return (this.targets != null) ? this.targets : (new LinkedList()); + } + + private boolean isAllTargetDestroyed() { + for (Target t : this.targets) { + if (!t.isHit()) + + return false; + } + return true; + } + + public boolean isHasWon() { + return this.hasWon; + } + + public void setCurrLevel(Level currLevel) { + this.currentLevel = currLevel; + } + + public void setHasWon(boolean hasWon) { + this.hasWon = hasWon; + } + + public void startLevel() { + this.starttimer = System.currentTimeMillis(); + this.endtimer = this.starttimer + currentLevel.getDuration(); + } + + public long time() { + return System.currentTimeMillis() - this.starttimer; + } + + public long timeleft() { + return (starttimer == 0) ? this.currentLevel.getDuration() + : (this.endtimer - System.currentTimeMillis()) / 1000; + } + +} diff --git a/src/main/java/controller/HitCounter.java b/src/main/java/controller/HitCounter.java new file mode 100644 index 0000000..af3a5da --- /dev/null +++ b/src/main/java/controller/HitCounter.java @@ -0,0 +1,99 @@ +package controller; + +public class HitCounter { + + private int shots, hit, targets; + private long sumReactionDiffernce; + + /** + * erstellt einen neuen Hitcounter + * + * @param target + * Anzahl der zu zühlenden Ziele, übergeben Sie die maximale Anzahl + * der Ziele des Levels + */ + public HitCounter(int target) { + this.reset(target); + } + + /** + * gibt die Anzahl der abgegebenen Schüsse zurück + * @return Anzahl der abgegebenen Schüsse + */ + public int getShots() { + return shots; + } + + /** + * gibt die Anzahl der Treffer zurück + * @return Anzahl der Treffer + */ + public int getHit() { + return hit; + } + + /** + * gibt die Anzahl der noch nicht getroffenen Targets zurück + * @return Anzahl der noch nicht getroffenen Targets + */ + public int getTargets() { + return targets; + } + + /** + * setzt den Wert der Target auf dem im Parameter übergebenen Wert + * @param targets neue Targetanzahl nicht getroffener Ziele + */ + public void setTargets(int targets) { + this.targets = targets; + } + + public long getReactionTime() { + if(this.getHit() == 0) + return 0; + else + return this.sumReactionDiffernce / this.getHit(); + } + + public long getSumReactionDiffernce() { + return sumReactionDiffernce; + } + + public void addReactionTime(long time) { + this.sumReactionDiffernce += time; + } + + /** + * registriert einen Treffer + */ + public void hit() { + this.hit++; + this.shots++; + } + + /** + * registriert einen Fehlschuss + */ + public void miss() { + this.shots++; + } + + /** + * berechnet die Treffergenauigkeit + * @return Wert zwischen 0-100% der Treffergenauigkeit auf 2 Nachkommastellen gerundet + */ + public double getAccuracy() { + return Math.round((100.0 / this.shots * this.hit) * 100.0) / 100.0; + } + + /** + * setzt den HitCounter zurück + * @param target + */ + public void reset(int target) { + this.targets = target; + this.shots = 0; + this.hit = 0; + this.sumReactionDiffernce = 0L; + } +} diff --git a/src/main/java/controller/LevelController.java b/src/main/java/controller/LevelController.java new file mode 100644 index 0000000..f8d903f --- /dev/null +++ b/src/main/java/controller/LevelController.java @@ -0,0 +1,81 @@ +package controller; + +import java.util.List; + +import model.Level; +import model.persistence.ILevelPersistance; +import model.persistence.IPersistance; + +public class LevelController { + + private ILevelPersistance levelPersistance; + public final String DEFAULT_LEVELNAME = "unnamed"; + public final String DEFAULT_BACKGROUND_PICTURE_URL = "background_1.jpg"; + public final long DEFAULT_DURATION = 90000L; + + /** + * erstellt ein neues Objekt eines LevelControllers, welche Levelobjekte der + * übergebenen Datenhaltung persistiert + * + * @param alienDefenceModel + * Persistenzklasse des gesamten Model + */ + public LevelController(IPersistance alienDefenceModel) { + this.levelPersistance = alienDefenceModel.getLevelPersistance(); + } + + /** + * legt ein neues Level mit den Standardwerten an + * + * @return Levelobjekt + */ + public Level createLevel() { + int level_id = levelPersistance.createLevel(DEFAULT_LEVELNAME, DEFAULT_BACKGROUND_PICTURE_URL, DEFAULT_DURATION); + return new Level(level_id); + } + + /** + * gibt das konkrete Level zurück + * + * @param level_id + * @return Levelobjekt oder null bei nicht vorhandener Level_id + */ + public Level readLevel(int level_id) { + List levels = levelPersistance.readAllLevel(); + for (int i = 0; i < levels.size(); i++) { + if (level_id == levels.get(i).getLevel_id()) { + return levels.get(i); + } + } + return null; + } + + /** + * liest alle Level aus der DB + * + * @return Levelliste + */ + public List readAllLevels() { + return this.levelPersistance.readAllLevel(); + } + + /** + * validiert die ünderungen und speichert das Level ab + * + * @param lvl + */ + public void updateLevel(Level lvl) { + // TODO write Code to validate Level-Data + levelPersistance.updateLevel(lvl); + } + + /** + * lüscht ein Level aus der Datenhaltung + * + * @param level_id + */ + public void deleteLevel(int level_id) { + this.levelPersistance.deleteLevel(level_id); + } + +} diff --git a/src/main/java/controller/TargetController.java b/src/main/java/controller/TargetController.java new file mode 100644 index 0000000..9c0a8d6 --- /dev/null +++ b/src/main/java/controller/TargetController.java @@ -0,0 +1,113 @@ +package controller; + +import java.util.List; +import java.util.ListIterator; + +import model.Level; +import model.Target; +import model.persistence.IPersistance; +import model.persistence.ITargetPersistance; + +public class TargetController { + + private ITargetPersistance targetPersistance; + + /** + * erstellt ein neues Objekt eines TargetControllers welches Targetobjekte in + * der übergebenen Datenhaltung persisiert + * + * @param alienDefenceModel + * Persistenzklasse der Targetobjekte + */ + public TargetController(IPersistance alienDefenceModel) { + this.targetPersistance = alienDefenceModel.getTargetPersistance(); + } + + /** + * fügt dem gewühlten Level ein neues Target hinzu + * + * @param target + * neues Ziel + * @param lvl + * ausgewühltes Level + * @return -1 wenn die Operation nicht geklappt hat, sonst die Target_id des + * neuen Ziels + */ + public Target createTarget(Level lvl) { + Target target = new Target(600, 400, 150, 50, 1000, 1000, "ufo_3.png"); + int image_id = 1; + int target_id = targetPersistance.createTarget(target, lvl.getLevel_id(), image_id); + target.setTarget_id(target_id); + lvl.getTargets().add(target); + + return target; + } + + /** + * gibt alle Targets zu einem Level aus der Datenhaltung aus + * + * @param level_id + * eindeutige Nummer des Levels + * @return Liste mit Zielen des Levels + */ + public List readTargets(int level_id) { + return this.targetPersistance.readAllTargetsPerLevel(level_id); + } + + /** + * tauscht ein Target im Levelobjekt aus und persistiert die ünderungen + * + * @param lvl + * zu welchem Level das Target gehürt + * @param target + * das zu ündernde Target + * @return true wenn das angegebene Target in der Liste gefunden wurde, false + * wenn nicht + */ + public boolean updateTarget(Level lvl, Target target) { + boolean success = false; + // Target im Level austauschen + ListIterator iterator = lvl.getTargets().listIterator(); + while (iterator.hasNext()) { + if (iterator.next().getTarget_id() == target.getTarget_id()) { + iterator.set(target); + success = true; + } + } + // Target in der Persistenz ündern + if (success) { + this.targetPersistance.updateTarget(target); + } + return success; + } + + /** + * lüscht ein Target aus dem Levelobjekt und persistiert die ünderungen + * + * @param lvl + * zu welchem Level das Target gehürt + * @param target + * das zu lüschende Target + * @return true wenn das angegebene Target in der Liste gefunden wurde, false + * wenn nicht + */ + public boolean deleteTarget(Level lvl, int target_id) { + boolean success = false; + + ListIterator iterator = lvl.getTargets().listIterator(); + while (iterator.hasNext()) { + if (iterator.next().getTarget_id() == target_id) { + iterator.remove(); + success = true; + } + } + + // Target in Persistenz lüschen + if (success) { + this.targetPersistance.deleteTarget(target_id); + } + + return success; + } + +} diff --git a/src/main/java/model/Attempt.java b/src/main/java/model/Attempt.java new file mode 100644 index 0000000..3e5a01e --- /dev/null +++ b/src/main/java/model/Attempt.java @@ -0,0 +1,51 @@ +package model; + +import java.time.LocalDateTime; +import java.util.Vector; + +import toDo.User; + +public class Attempt { + + // Attribute + private User user; + private Level level; + private int placement; + private double hitsShots; + private double hitsTargets; + private double reactionDuration; + private double highscorePoints; + private LocalDateTime datetime; + + // Konstruktor + public Attempt(int place, Level level, double hitsShots, double hitsTargets, double reactionDuration, + double highscoreFormula, User user, LocalDateTime datetime) { + super(); + this.placement = place; + this.level = level; + this.reactionDuration = reactionDuration; + this.highscorePoints = highscoreFormula; + this.user = user; + this.hitsShots = hitsShots; + this.hitsTargets = hitsTargets; + this.datetime = datetime; + } + + public Vector getRowVector() { + Vector v = new Vector(8); + v.addElement(String.valueOf(this.placement)); + v.addElement(this.user.getFirst_name() + " " + this.user.getSur_name()); + v.addElement(this.datetime.getDayOfMonth() +"."+this.datetime.getMonthValue() + "." + this.datetime.getYear());; + v.addElement(this.datetime.getHour() + ":" + this.datetime.getMinute()); + v.addElement(String.valueOf((int) this.hitsTargets)); + v.addElement(String.valueOf((int) this.hitsShots)); + v.addElement(String.valueOf((int) this.reactionDuration)); + v.addElement(String.valueOf((int) this.highscorePoints)); + return v; + } + + public Level getLevel() { + return this.level; + } + +} diff --git a/src/main/java/model/Hitbox.java b/src/main/java/model/Hitbox.java new file mode 100644 index 0000000..c8ea5d1 --- /dev/null +++ b/src/main/java/model/Hitbox.java @@ -0,0 +1,86 @@ +package model; + +import java.util.Random; + +public class Hitbox { + private Point point; + private int width; + private int height; + public static final int MAXWIDTH = 1200; + public static final int MAXHEIGHT = 1000; + private static Random rand = new Random(); + + public Hitbox() { + this.point = new Point(); + this.width = 0; + this.height = 0; + } + + public Hitbox(int x, int y, int breite, int hoehe) { + super(); + this.point = new Point(x, y); + this.setWidth(breite); + this.setHeight(hoehe); + } + + public int getX() { + return this.point.getX(); + } + + public void setX(int x) { + this.point.setX(x); + } + + public int getY() { + return this.point.getY(); + } + + public void setY(int y) { + this.point.setY(y); + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = Math.abs(width); + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = Math.abs(height); + } + + public boolean contains(Point p) { + return contains(p.getX(), p.getY()); + } + + public boolean contains(int x, int y) { + return this.point.getX() <= x && x <= this.point.getX() + this.width && this.point.getY() <= y + && y <= this.point.getY() + this.height; + } + + public boolean contains(Hitbox hitbox) { + Point upperleft = new Point(hitbox.getX(), hitbox.getY()); + Point lowerright = new Point(hitbox.getX() + hitbox.getWidth(), hitbox.getY() + hitbox.getHeight()); + return contains(upperleft) && contains(lowerright); + } + + public static Hitbox generateRandomHitbox() { + int x = rand.nextInt(MAXWIDTH + 1); + int y = rand.nextInt(MAXHEIGHT + 1); + int width = rand.nextInt(MAXWIDTH - x + 1); + int height = rand.nextInt(MAXHEIGHT - y + 1); + return new Hitbox(x, y, width, height); + } + + @Override + public String toString() { + return "Hitbox [x=" + this.point.getX() + ", y=" + this.point.getY() + ", width=" + width + ", height=" + height + + "]"; + } +} diff --git a/src/main/java/model/Level.java b/src/main/java/model/Level.java new file mode 100644 index 0000000..bf68385 --- /dev/null +++ b/src/main/java/model/Level.java @@ -0,0 +1,149 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class Level { + + /** unique value */ + private int level_id; + /** name of that level */ + private String name; + /** List of Targets */ + private List targets; + /** duration a level lasts im ms */ + private long duration; + /** default duration for a level is 90s */ + public final long DEFAULT_DURATION = 90000L; + /** path to background image */ + private String backgroundImage; + + public Level() { + this.targets = new ArrayList(100); + this.name = "unnamed"; + this.duration = DEFAULT_DURATION; + this.backgroundImage = "background_1.jpg"; + } + + public Level(int level_id) { + this(); + this.level_id = level_id; + } + + public int getLevel_id() { + return this.level_id; + } + + public void setLevel_id(int level_id) { + this.level_id = level_id; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public List getTargets() { + return this.targets; + } + + public void setTargets(List targets) { + this.targets = targets; + } + + public long getDuration() { + return this.duration; + } + + public void setDuration(long duration) { + this.duration = duration; + } + + public String getBackgroundImage() { + return backgroundImage; + }; + + public void setBackgroundImage(String backgroundImage) { + this.backgroundImage = backgroundImage; + } + + public String[][] getTargetsAsTableModel() { + String[][] result = new String[this.targets.size()][]; + int i = 0; + for (Target t : this.targets) { + result[i++] = t.getData(); + } + return result; + } + + public String[] getData() { + return new String[] { "" + this.level_id, this.name, this.backgroundImage, "" + this.targets.size(), + "" + this.duration }; + } + + public String toString() { + return "Level [level_id=" + level_id + ", name=" + name + ", duration=" + duration + ", backgroundImage=" + + backgroundImage + ", targets=" + targets + "]"; + } + + /** use this Level only for test porposes */ + public static Level getDefaultLevel() { + Level level = new Level(); + // Objekte des Levels hier eintragen + level.targets.add(new Target(100, 100, 75, 150, 0, 500000, "lemon.png")); + level.targets.add(new Target(200, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(300, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(400, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(500, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(600, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(700, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(800, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(900, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(1000, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(1100, 100, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(100, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(200, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(300, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(400, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(500, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(600, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(700, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(800, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(900, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(1000, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(1100, 300, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(100, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(200, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(300, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(400, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(500, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(600, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(700, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(800, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(900, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(1000, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(1100, 500, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(100, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(200, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(300, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(400, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(500, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(600, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(700, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(800, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(900, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(1000, 700, 75, 150, 0, 500000, "ballon.png")); + level.targets.add(new Target(1100, 700, 75, 150, 0, 500000, "ballon.png")); + level.duration = 25000L; + level.name = "DefaultTestLevel 001"; + level.level_id = 1; + return level; + } + + public static String[] getLevelDescriptions() { + return new String[] { "Nr.", "Name", "Hintergrund", "Targets", "Dauer" }; + } +} diff --git a/src/main/java/model/Point.java b/src/main/java/model/Point.java new file mode 100644 index 0000000..9093ba3 --- /dev/null +++ b/src/main/java/model/Point.java @@ -0,0 +1,43 @@ +package model; + +public class Point { + private int x; + private int y; + + public Point() { + this.x = 0; + this.y = 0; + } + + public Point(int x, int y) { + super(); + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public boolean equals(Point p) { + return this.x == p.getX() && this.y == p.getY(); + } + + @Override + public String toString() { + return "Punkt [x=" + x + ", y=" + y + "]"; + } + +} diff --git a/src/main/java/model/Target.java b/src/main/java/model/Target.java new file mode 100644 index 0000000..c3cd136 --- /dev/null +++ b/src/main/java/model/Target.java @@ -0,0 +1,118 @@ +package model; + +import java.util.Random; + +public class Target { + + private int target_id; + /** the area of a target */ + private Hitbox hitbox; + /** time a target appears after game begins */ + private long time; + /** time a target is able to hit */ + private long duration; + private boolean hit; + private String imageAddress; + + /** image of target */ + + public Target() { + super(); + this.target_id = 0; + this.hitbox = new Hitbox(100, 100, 150, 50); + this.time = 1000; + this.duration = Long.MAX_VALUE; + this.setHit(false); + this.setImageAddress("ufo_1.png"); + } + + public Target(int x, int y, int width, int height, long time, long duration, String image) { + super(); + this.target_id = 0; + this.hitbox = new Hitbox(x, y, width, height); + this.time = time; + this.duration = duration; + this.setHit(false); + this.setImageAddress(image); + } + + public Target(Hitbox hitbox, long time, long duration) { + super(); + this.target_id = 0; + this.hitbox = hitbox; + this.time = time; + this.duration = duration; + this.setHit(false); + } + + public int getTarget_id() { + return target_id; + } + + public void setTarget_id(int target_id) { + this.target_id = target_id; + } + + public Hitbox getHitbox() { + return hitbox; + } + + public void setHitbox(Hitbox hitbox) { + this.hitbox = hitbox; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public long getDuration() { + return duration; + } + + public void setDuration(long duration) { + this.duration = duration; + } + + public boolean isHit() { + return hit; + } + + public void setHit(boolean hit) { + this.hit = hit; + } + + public String getImageAddress() { + return imageAddress; + } + + public void setImageAddress(String imageAdress) { + this.imageAddress = imageAdress; + } + + public static Target getRandomTarget(int screenResolution_X, int screenResolution_Y) { + Random rand = new Random(); + return new Target(rand.nextInt(screenResolution_X - 50), rand.nextInt(screenResolution_Y - 50), 350, 129, 0, + 90000, "ufo_4.png"); + } + + public String[] getData() { + return new String[] { this.target_id + "", this.hitbox.getX() + "", this.hitbox.getY() + "", + this.hitbox.getWidth() + "", this.hitbox.getHeight() + "", this.getImageAddress(), this.getTime() + "", + this.getDuration() + "" }; + } + + public static String[] getTableDescriptions() { + return new String[] { "Nr.", "X", "Y", "Breite", "Hühe", "Bild", "Startzeit", "Dauer" }; + } + + @Override + public String toString() { + return "Target [target_id=" + target_id + ", hitbox=" + hitbox + ", time=" + time + ", duration=" + duration + + ", hit=" + hit + ", imageAddress=" + imageAddress + "]"; + } + +} diff --git a/src/main/java/model/persistence/IAttemptPersistance.java b/src/main/java/model/persistence/IAttemptPersistance.java new file mode 100644 index 0000000..015c364 --- /dev/null +++ b/src/main/java/model/persistence/IAttemptPersistance.java @@ -0,0 +1,14 @@ +package model.persistence; + +import java.util.Vector; + +import model.Level; + +public interface IAttemptPersistance { + + int createHighscoreEntry(int F_user_id, int F_level_id, int shots, int hits, long reaction_time); + int getPlayerPosition(); + Vector> getAllAttemptsPerLevel(Level level, int game_id); + //no update needed + void deleteHighscore(int level_id); +} diff --git a/src/main/java/model/persistence/ILevelPersistance.java b/src/main/java/model/persistence/ILevelPersistance.java new file mode 100644 index 0000000..fa26c11 --- /dev/null +++ b/src/main/java/model/persistence/ILevelPersistance.java @@ -0,0 +1,38 @@ +package model.persistence; + +import java.util.List; + +import model.Level; + +public interface ILevelPersistance { + + /** + * legt in der Datenbank ein neues Level an + * + * @return level_id für das neue Level + */ + int createLevel(String levelname, String backgroundUrl, long duration); + + /** + * gibt alle Level aus der Datenbank als Liste zurück + * + * @return Liste aller Level + */ + List readAllLevel(); + + /** + * aktualisiert die Daten eines Levels + * + * @param lvl + * ein Levelobjekt + */ + void updateLevel(Level lvl); + + /** + * lüscht ein Level aus der Datenbank + * + * @param P_level_id + */ + void deleteLevel(int level_id); + +} \ No newline at end of file diff --git a/src/main/java/model/persistence/IPersistance.java b/src/main/java/model/persistence/IPersistance.java new file mode 100644 index 0000000..aee96a0 --- /dev/null +++ b/src/main/java/model/persistence/IPersistance.java @@ -0,0 +1,10 @@ +package model.persistence; + +public interface IPersistance { + + IAttemptPersistance getAttemptPersistance(); + ILevelPersistance getLevelPersistance(); + ITargetPersistance getTargetPersistance(); + IUserPersistance getUserPersistance(); + +} diff --git a/src/main/java/model/persistence/ITargetPersistance.java b/src/main/java/model/persistence/ITargetPersistance.java new file mode 100644 index 0000000..3aca497 --- /dev/null +++ b/src/main/java/model/persistence/ITargetPersistance.java @@ -0,0 +1,17 @@ +package model.persistence; + +import java.util.List; + +import model.Target; + +public interface ITargetPersistance { + + int createTarget(Target target, int level_id, int image_id); + + List readAllTargetsPerLevel(int level_id); + + void updateTarget(Target target); + + void deleteTarget(int target_id); + +} \ No newline at end of file diff --git a/src/main/java/model/persistence/IUserPersistance.java b/src/main/java/model/persistence/IUserPersistance.java new file mode 100644 index 0000000..87cf03b --- /dev/null +++ b/src/main/java/model/persistence/IUserPersistance.java @@ -0,0 +1,9 @@ +package model.persistence; + +import toDo.User; + +public interface IUserPersistance { + + User readUser(String username); + +} \ No newline at end of file diff --git a/src/main/java/model/persistenceDB/AccessDB.java b/src/main/java/model/persistenceDB/AccessDB.java new file mode 100644 index 0000000..001fa32 --- /dev/null +++ b/src/main/java/model/persistenceDB/AccessDB.java @@ -0,0 +1,55 @@ +package model.persistenceDB; + +public class AccessDB { + + // Attribute + private String dbName; + private String user; + private String password; + private String url; + + // Konstruktor + public AccessDB() { + this.url = "jdbc:mysql://localhost:3306/"; + this.dbName = "alien_defence"; + this.user = "root"; + this.password = ""; + } + + // Getter und Setter + public String getDbName() { + return dbName; + } + + public void setDbName(String dbName) { + this.dbName = dbName; + } + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getFullURL() { + return this.url + this.dbName; + } +} diff --git a/src/main/java/model/persistenceDB/AttemptDB.java b/src/main/java/model/persistenceDB/AttemptDB.java new file mode 100644 index 0000000..b2b7a08 --- /dev/null +++ b/src/main/java/model/persistenceDB/AttemptDB.java @@ -0,0 +1,148 @@ +package model.persistenceDB; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.Vector; + +import model.Attempt; +import model.Level; +import model.persistence.IAttemptPersistance; +import toDo.User; + +public class AttemptDB implements IAttemptPersistance { + + // Attribute + private AccessDB dbAccess; + private int playerPosition = -100000; + + // Konstuktor + public AttemptDB(AccessDB dbAccess) { + this.dbAccess = dbAccess; + } + + // Eintrag des Spiels in die Highscore wird vorgenommen - Aufgerufen wird von + // der Klasse GameController + public int createHighscoreEntry(int F_user_id, int F_level_id, int shots, int hits, long reaction_time) { + String sql = "INSERT INTO attempts (F_user_id, F_level_id, shots, hits, reaction_time, date, time)" + + " values (?, ?, ?, ?, ?, ?, ?)"; + int last_inserted_id = 0; + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); + PreparedStatement statement = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);) { + + // Aktuelle Datum und Uhrzeit holen und in Strings speichern + LocalDate datum = LocalDate.now(); // Erstellt Datum-Objekt heute + LocalTime time = LocalTime.now(); + String now = time.getHour() + ":" + time.getMinute() + ":" + time.getSecond(); + + statement.setInt(1, F_user_id); + statement.setInt(2, F_level_id); + statement.setInt(3, shots); + statement.setInt(4, hits); + statement.setLong(5, reaction_time); + statement.setString(6, datum.toString()); + statement.setString(7, now); + + statement.execute(); + + ResultSet rs = statement.getGeneratedKeys(); // Letzte eingtragene ID + if (rs.next()) { + last_inserted_id = rs.getInt(1); + } + + } catch (SQLException ex) { + System.err.println(ex.getMessage()); + } + return last_inserted_id; + } + + public Vector> getAllAttemptsPerLevel(Level level, int game_id) { + Vector> vecTests = null; + String url = dbAccess.getUrl() + dbAccess.getDbName(); + + String highscoreFormula = "(hits / targets * 1000)*0.4 + (hits / shots * 1000)*0.2 + (1000 - (reaction_time / sum_duration * 1000))*0.4"; + + String query = "SELECT P_attempt_id, targets, shots, hits, reaction_time, first_name, sur_name, date, time, (hits / targets * 1000) AS hitsTargets, (hits / shots * 1000) AS hitsShots, (1000 - (reaction_time / sum_duration * 1000)) AS reactionDuration," + + highscoreFormula + "AS highscoreFormula FROM " + + "(SELECT F_level_id, COUNT(P_target_id) AS targets, SUM(duration ) AS sum_duration FROM `targets` WHERE F_level_id = " + + level.getLevel_id() + ") AS count_targets INNER JOIN " + + "attempts ON attempts.F_level_id = count_targets.F_level_id INNER JOIN " + + "users ON P_user_id = F_user_id ORDER BY highscoreFormula DESC, reactionDuration DESC"; + + try { + Connection con = DriverManager.getConnection(url, dbAccess.getUser(), dbAccess.getPassword()); + Statement stmt = con.createStatement(); + ResultSet results = stmt.executeQuery(query); + vecTests = getVecTest(level, game_id, results); + + } catch (SQLException ex) { + System.err.println(ex.getMessage()); + } + return vecTests; + } + + public int getPlayerPosition() { + return this.playerPosition; + } + + // 2 Diese Methode wird vom Konstruktor aufgerufen. + // Daten aus der Datenbank werden in einem zweidimensionalen Vector gespeichert. + private Vector> getVecTest(Level level, int gameId, ResultSet results) { + + Vector> vecTests = new Vector>(); + try { + int nummerierung = 0; + while (results.next()) { + + nummerierung++; + + //Markierung des Spielers für Highscoreansicht + //TODO Verstoü gegen 3 Schichtenarchitektur beheben + if (results.getInt("P_attempt_id") == gameId) + this.playerPosition = nummerierung - 1; + + LocalDate date = results.getDate("date").toLocalDate(); + User user = new User(); + user.setFirst_name(results.getString("first_name")); + user.setSur_name(results.getString("sur_name")); + LocalDateTime dateTime = date.atTime(results.getTime("time").toLocalTime()); + Attempt tmp = new Attempt(nummerierung, level, results.getDouble("hitsShots"), + results.getDouble("hitsTargets"), results.getInt("reactionDuration"), + results.getInt("highscoreFormula"), user, dateTime); + + Vector v = tmp.getRowVector(); + vecTests.add(v); + } + } catch (SQLException ex) { + System.err.println(ex.getMessage()); + } + return vecTests; + } + + // lüscht alle Eintrüge + public void deleteHighscore(int level_id) { + + String url = dbAccess.getFullURL(); + try { + + Connection con = DriverManager.getConnection(url, dbAccess.getUser(), dbAccess.getPassword()); + + String query = "DELETE FROM attempts WHERE F_level_id = ?"; + + PreparedStatement preparedStmt = con.prepareStatement(query); + preparedStmt.setInt(1, level_id); + + preparedStmt.execute(); + + } catch (SQLException ex) { + System.err.println(ex.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/model/persistenceDB/LevelDB.java b/src/main/java/model/persistenceDB/LevelDB.java new file mode 100644 index 0000000..9f433ad --- /dev/null +++ b/src/main/java/model/persistenceDB/LevelDB.java @@ -0,0 +1,112 @@ +package model.persistenceDB; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; +import java.util.Vector; + +import model.Level; +import model.persistence.ILevelPersistance; +import model.persistence.ITargetPersistance; + +public class LevelDB implements ILevelPersistance { + + private AccessDB dbAccess; + + public LevelDB(AccessDB dbAccess) { + this.dbAccess = dbAccess; + } + + public int createLevel(String levelname, String backgroundUrl, long duration) { + String sql = "INSERT INTO levels (name, background, duration) VALUES (?, ?, ?);"; + + int lastKey = -1; + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); + PreparedStatement statement = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);) { + + statement.setString(1, levelname); + statement.setString(2, backgroundUrl); + statement.setLong(3, duration); + + statement.execute(); + + ResultSet generatedKeys = statement.getGeneratedKeys(); + if (generatedKeys.next()) { + lastKey = generatedKeys.getInt(1); + } + generatedKeys.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + + return lastKey; + } + + public List readAllLevel() { + String sql = "SELECT * FROM levels ORDER BY P_level_id;"; + List allLevels = new Vector(); + + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); + Statement statement = con.createStatement(); + ResultSet rs = statement.executeQuery(sql)) { + + while (rs.next()) { + + Level level = new Level(); + level.setLevel_id(rs.getInt("P_level_id")); // ID von Level + level.setName(rs.getString("name")); // Name von Level + level.setDuration(rs.getInt("duration")); // Dauer von Level + level.setBackgroundImage(rs.getString("background")); // Hintergrundsbild + + // Targets auslesen und dem Level hinzufügen + ITargetPersistance targetDB = new TargetDB(this.dbAccess); + + level.setTargets(targetDB.readAllTargetsPerLevel(level.getLevel_id())); + + allLevels.add(level); + } + + } catch (SQLException e) { + e.getMessage(); + e.printStackTrace(); + } + return allLevels; + } + + public void updateLevel(Level lvl) { + String sql = "UPDATE levels SET name = ?, background = ?, duration = ? WHERE p_level_id = ?;"; + + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); PreparedStatement statement = con.prepareStatement(sql)) { + + statement.setString(1, lvl.getName()); + statement.setString(2, lvl.getBackgroundImage()); + statement.setLong(3, lvl.getDuration()); + statement.setInt(4, lvl.getLevel_id()); + + statement.executeUpdate(); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void deleteLevel(int level_id) { + String sql = "DELETE FROM levels WHERE P_level_id = " + level_id + ";"; + + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); Statement statement = con.createStatement()) { + + statement.executeUpdate(sql); + + } catch (SQLException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/model/persistenceDB/PersistanceDB.java b/src/main/java/model/persistenceDB/PersistanceDB.java new file mode 100644 index 0000000..c763dc3 --- /dev/null +++ b/src/main/java/model/persistenceDB/PersistanceDB.java @@ -0,0 +1,44 @@ +package model.persistenceDB; + +import model.persistence.IAttemptPersistance; +import model.persistence.ILevelPersistance; +import model.persistence.IPersistance; +import model.persistence.ITargetPersistance; +import model.persistence.IUserPersistance; +import toDo.UserDB; + +public class PersistanceDB implements IPersistance{ + + private LevelDB levelDB; + private UserDB userDB; + private AttemptDB attemptDB; + private TargetDB targetDB; + + public PersistanceDB() { + AccessDB dbAccess = new AccessDB(); + this.levelDB = new LevelDB(dbAccess); + this.userDB = new UserDB(dbAccess); + this.attemptDB = new AttemptDB(dbAccess); + this.targetDB = new TargetDB(dbAccess); + } + + @Override + public IAttemptPersistance getAttemptPersistance() { + return this.attemptDB; + } + + @Override + public ILevelPersistance getLevelPersistance() { + return this.levelDB; + } + + @Override + public ITargetPersistance getTargetPersistance() { + return this.targetDB; + } + + @Override + public IUserPersistance getUserPersistance() { + return this.userDB; + } +} diff --git a/src/main/java/model/persistenceDB/TargetDB.java b/src/main/java/model/persistenceDB/TargetDB.java new file mode 100644 index 0000000..84cef10 --- /dev/null +++ b/src/main/java/model/persistenceDB/TargetDB.java @@ -0,0 +1,118 @@ +package model.persistenceDB; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; +import java.util.Vector; + +import model.Hitbox; +import model.Target; +import model.persistence.ITargetPersistance; + +public class TargetDB implements ITargetPersistance { + private AccessDB dbAccess; + + public TargetDB(AccessDB dbAccess) { + super(); + if (dbAccess != null) + this.dbAccess = dbAccess; + else + this.dbAccess = new AccessDB(); + } + + public int createTarget(Target target, int level_id, int image_id) { + String sql = "INSERT INTO targets (F_level_id, image_address, x_position, y_position, width, height, time, duration) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"; + int lastKey = -1; + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); + PreparedStatement statement = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);) { + + statement.setInt(1, level_id); + statement.setString(2, target.getImageAddress()); + statement.setInt(3, target.getHitbox().getX()); + statement.setInt(4, target.getHitbox().getY()); + statement.setInt(5, target.getHitbox().getWidth()); + statement.setInt(6, target.getHitbox().getHeight()); + statement.setLong(7, target.getTime()); + statement.setLong(8, target.getDuration()); + statement.execute(); + + ResultSet generatedKeys = statement.getGeneratedKeys(); + if (generatedKeys.next()) { + lastKey = generatedKeys.getInt(1); + } + generatedKeys.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + + return lastKey; + } + + public List readAllTargetsPerLevel(int level_id) { + String sql = "SELECT * FROM targets WHERE F_level_id = ? ORDER BY P_target_id;"; + List alltargets = new Vector(); + + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); PreparedStatement statement = con.prepareStatement(sql)) { + + statement.setInt(1, level_id); + + ResultSet rs = statement.executeQuery(); + + while (rs.next()) { + + Target target = new Target(); + target.setTarget_id(rs.getInt("P_target_id")); + target.setHitbox(new Hitbox(rs.getInt("x_position"), rs.getInt("y_position"), rs.getInt("width"), + rs.getInt("height"))); + target.setTime(rs.getLong("time")); + target.setDuration(rs.getLong("duration")); + target.setImageAddress(rs.getString("image_address")); + + alltargets.add(target); + } + + } catch (SQLException e) { + e.getMessage(); + e.printStackTrace(); + } + return alltargets; + } + + public void updateTarget(Target target) { + String sql = "UPDATE targets SET x_position = ?, y_position = ?, width = ?, height = ?, time = ?, duration = ?, image_address = ? WHERE P_target_id = ?;"; + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); PreparedStatement statement = con.prepareStatement(sql)) { + + statement.setInt(1, target.getHitbox().getX()); + statement.setInt(2, target.getHitbox().getY()); + statement.setInt(3, target.getHitbox().getWidth()); + statement.setInt(4, target.getHitbox().getHeight()); + statement.setLong(5, target.getTime()); + statement.setLong(6, target.getDuration()); + statement.setString(7, target.getImageAddress()); + statement.setInt(8, target.getTarget_id()); + statement.executeUpdate(); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void deleteTarget(int target_id) { + String sql = "DELETE FROM targets WHERE P_target_id = " + target_id + ";"; + + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); Statement statement = con.createStatement()) { + statement.executeUpdate(sql); + + } catch (SQLException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/model/persistenceDummy/AttemptDummy.java b/src/main/java/model/persistenceDummy/AttemptDummy.java new file mode 100644 index 0000000..dbd7995 --- /dev/null +++ b/src/main/java/model/persistenceDummy/AttemptDummy.java @@ -0,0 +1,52 @@ +package model.persistenceDummy; + +import java.util.Vector; + +import model.Level; +import model.persistence.IAttemptPersistance; + +/** + * Klasse mit Dummywerten zum Testen der View und des Controllers + * @author Tim Tenbusch + * + */ +public class AttemptDummy implements IAttemptPersistance{ + + public int createHighscoreEntry(int F_user_id, int F_level_id, int shots, int hits, long reaction_time) { + // fleiüig speichern + return 1; + } + + public Vector> getAllAttemptsPerLevel(Level level, int game_id) { + Vector> highscore = new Vector>(); + Vector eintrag1 = new Vector(); + Vector eintrag2 = new Vector(); + eintrag1.addElement("1"); + eintrag2.addElement("2"); + eintrag1.addElement("Dummy Persistenz"); + eintrag2.addElement("Vorname Nachname"); + eintrag1.addElement("17.02.2021"); + eintrag2.addElement("18.02.2021"); + eintrag1.addElement("15:21"); + eintrag2.addElement("17:01"); + eintrag1.addElement("7"); + eintrag2.addElement("9"); + eintrag1.addElement("421"); + eintrag2.addElement("13"); + eintrag1.addElement("250"); + eintrag2.addElement("270"); + eintrag1.addElement("356"); + eintrag2.addElement("481"); + highscore.add(eintrag1); + highscore.add(eintrag2); + return highscore; + } + + public int getPlayerPosition() { + return 1; + } + + public void deleteHighscore(int level_id) { + //Omnomnom Anfrage gefressen + } +} diff --git a/src/main/java/model/persistenceDummy/LevelDummy.java b/src/main/java/model/persistenceDummy/LevelDummy.java new file mode 100644 index 0000000..c0b8edf --- /dev/null +++ b/src/main/java/model/persistenceDummy/LevelDummy.java @@ -0,0 +1,61 @@ +package model.persistenceDummy; + +import java.util.ArrayList; +import java.util.List; + +import model.Level; +import model.Target; +import model.persistence.ILevelPersistance; + +public class LevelDummy implements ILevelPersistance { + + public int createLevel(String levelname, String backgroundUrl, long duration) { + return 1; + } + + public List readAllLevel() { + List levels = new ArrayList(); + Level level1 = new Level(); + level1.setLevel_id(1); + level1.setName("Level 1"); + level1.setBackgroundImage("background_1.jpg"); + level1.setDuration(10000); + List targets = new ArrayList(); + Target t1 = new Target(100, 100, 150, 50, 1000, 2000, "ufo_1.png"); + targets.add(t1); + Target t2 = new Target(5, 100, 150, 50, 2000, 2000, "ufo_2.png"); + targets.add(t2); + Target t3 = new Target(800, 800, 150, 50, 3000, 2000, "ufo_3.png"); + targets.add(t3); + Target t4 = new Target(600, 400, 150, 50, 4000, 2000, "ufo_4.png"); + targets.add(t4); + Target t5 = new Target(220, 400, 150, 50, 5000, 2000, "ufo_5.png"); + targets.add(t5); + + level1.setTargets(targets); + levels.add(level1); + Level level2 = new Level(); + level2.setLevel_id(2); + level2.setName("Level 2"); + level2.setBackgroundImage("background_2.jpg"); + level2.setDuration(5000); + level2.setTargets(targets); + levels.add(level2); + Level level3 = new Level(); + level3.setLevel_id(3); + level3.setName("Level 3"); + level3.setBackgroundImage("background_10.jpg"); + level3.setDuration(10000); + level3.setTargets(targets); + levels.add(level3); + return levels; + } + + public void updateLevel(Level lvl) { + + } + + public void deleteLevel(int level_id) { + + } +} diff --git a/src/main/java/model/persistenceDummy/PersistanceDummy.java b/src/main/java/model/persistenceDummy/PersistanceDummy.java new file mode 100644 index 0000000..a933195 --- /dev/null +++ b/src/main/java/model/persistenceDummy/PersistanceDummy.java @@ -0,0 +1,45 @@ +package model.persistenceDummy; + +import model.persistence.IAttemptPersistance; +import model.persistence.ILevelPersistance; +import model.persistence.IPersistance; +import model.persistence.ITargetPersistance; +import model.persistence.IUserPersistance; + +public class PersistanceDummy implements IPersistance{ + + private LevelDummy levelDummy; + private UserDummy userDummy; + private AttemptDummy attemptDummy; + private TargetDummy targetDummy; + + public PersistanceDummy() { + + this.levelDummy = new LevelDummy(); + this.userDummy = new UserDummy(); + this.attemptDummy = new AttemptDummy(); + this.targetDummy = new TargetDummy(); + } + + @Override + public IAttemptPersistance getAttemptPersistance() { + return this.attemptDummy; + } + + @Override + public ILevelPersistance getLevelPersistance() { + return this.levelDummy; + } + + @Override + public ITargetPersistance getTargetPersistance() { + return this.targetDummy; + } + + @Override + public IUserPersistance getUserPersistance() { + return this.userDummy; + } + + +} diff --git a/src/main/java/model/persistenceDummy/TargetDummy.java b/src/main/java/model/persistenceDummy/TargetDummy.java new file mode 100644 index 0000000..3a3ca16 --- /dev/null +++ b/src/main/java/model/persistenceDummy/TargetDummy.java @@ -0,0 +1,38 @@ +package model.persistenceDummy; + +import java.util.ArrayList; +import java.util.List; + +import model.Target; +import model.persistence.ITargetPersistance; + +public class TargetDummy implements ITargetPersistance { + + public int createTarget(Target target, int level_id, int image_id) { + return 1; + } + + public List readAllTargetsPerLevel(int level_id) { + List targets = new ArrayList(); + Target t1 = new Target(100, 100, 150, 50, 1000, 2000, "ufo_1.png"); + targets.add(t1); + Target t2 = new Target(5, 100, 150, 50, 2000, 2000, "ufo_2.png"); + targets.add(t2); + Target t3 = new Target(800, 800, 150, 50, 3000, 2000, "ufo_3.png"); + targets.add(t3); + Target t4 = new Target(600, 400, 150, 50, 4000, 2000, "ufo_4.png"); + targets.add(t4); + Target t5 = new Target(220, 400, 150, 50, 5000, 2000, "ufo_5.png"); + targets.add(t5); + return targets; + } + + public void updateTarget(Target target) { + + } + + public void deleteTarget(int target_id) { + + } + +} diff --git a/src/main/java/model/persistenceDummy/UserDummy.java b/src/main/java/model/persistenceDummy/UserDummy.java new file mode 100644 index 0000000..9d7b77a --- /dev/null +++ b/src/main/java/model/persistenceDummy/UserDummy.java @@ -0,0 +1,19 @@ +package model.persistenceDummy; + +import java.time.LocalDate; + +import model.persistence.IUserPersistance; +import toDo.User; + +/** + * Dummyklasse zum Testen + * @author Tim Tenbusch + * + */ +public class UserDummy implements IUserPersistance { + + public User readUser(String username) { + return new User(1, "Dummy", "Persistenz", LocalDate.now(), "Dummystr.", "12C", "11111", "Nowhere", username, "pass", 12000, "gefangen", 1.58); + } + +} diff --git a/src/main/java/toDo/CreateUserWindow.java b/src/main/java/toDo/CreateUserWindow.java new file mode 100644 index 0000000..cb26920 --- /dev/null +++ b/src/main/java/toDo/CreateUserWindow.java @@ -0,0 +1,6 @@ +package toDo; + +//TODO create a usermanagement +public class CreateUserWindow { + +} diff --git a/src/main/java/toDo/User.java b/src/main/java/toDo/User.java new file mode 100644 index 0000000..e2cae63 --- /dev/null +++ b/src/main/java/toDo/User.java @@ -0,0 +1,153 @@ +package toDo; + +import java.time.LocalDate; + +public class User { + + private int p_user_id; + private String first_name; + private String sur_name; + private LocalDate birthday; + private String street; + private String house_number; + private String postal_code; + private String city; + private String loginname; + private String password; + private int salary_expectations; + private String marital_status; + private double final_grade; + + public User(int p_user_id, String first_name, String sur_name, LocalDate birthday, String street, + String house_number, String postal_code, String city, String loginname, String password, + int salary_expectations, String marital_status, double final_grade) { + super(); + this.p_user_id = p_user_id; + this.first_name = first_name; + this.sur_name = sur_name; + this.birthday = birthday; + this.street = street; + this.house_number = house_number; + this.postal_code = postal_code; + this.city = city; + this.loginname = loginname; + this.password = password; + this.salary_expectations = salary_expectations; + this.marital_status = marital_status; + this.final_grade = final_grade; + } + + public User(int p_user_id, String login, String password) { + super(); + this.p_user_id = p_user_id; + this.loginname = login; + this.password = password; + } + + public User() { + } + + public int getP_user_id() { + return p_user_id; + } + + public void setP_user_id(int p_user_id) { + this.p_user_id = p_user_id; + } + + public String getFirst_name() { + return first_name; + } + + public void setFirst_name(String first_name) { + this.first_name = first_name; + } + + public String getSur_name() { + return sur_name; + } + + public void setSur_name(String sur_name) { + this.sur_name = sur_name; + } + + public LocalDate getBirthday() { + return birthday; + } + + public void setBirthday(LocalDate birthday) { + this.birthday = birthday; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getHouse_number() { + return house_number; + } + + public void setHouse_number(String house_number) { + this.house_number = house_number; + } + + public String getPostal_code() { + return postal_code; + } + + public void setPostal_code(String postal_code) { + this.postal_code = postal_code; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getLoginname() { + return loginname; + } + + public void setLoginname(String loginname) { + this.loginname = loginname; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public double getFinal_grade() { + return final_grade; + } + + public void setFinal_grade(double final_grade) { + this.final_grade = final_grade; + } + + public String getMarital_status() { + return marital_status; + } + + public void setMarital_status(String marital_status) { + this.marital_status = marital_status; + } + + public int getSalary_expectations() { + return salary_expectations; + } + + public void setSalary_expectations(int salary_expectations) { + this.salary_expectations = salary_expectations; + } +} \ No newline at end of file diff --git a/src/main/java/toDo/UserController.java b/src/main/java/toDo/UserController.java new file mode 100644 index 0000000..456872e --- /dev/null +++ b/src/main/java/toDo/UserController.java @@ -0,0 +1,43 @@ +package toDo; + +import model.persistence.IUserPersistance; + +/** + * controller for users + * @author Clara Zufall + * TODO implement this class + */ +public class UserController { + + private IUserPersistance userPersistance; + + public UserController(IUserPersistance userPersistance) { + this.userPersistance = userPersistance; + } + + public void createUser(User user) { + + } + + /** + * liest einen User aus der Persistenzschicht und gibt das Userobjekt zurück + * @param username eindeutige Loginname + * @param passwort das richtige Passwort + * @return Userobjekt, null wenn der User nicht existiert + */ + public User readUser(String username, String passwort) { + return null; + } + + public void changeUser(User user) { + + } + + public void deleteUser(User user) { + + } + + public boolean checkPassword(String username, String passwort) { + return false; + } +} diff --git a/src/main/java/toDo/UserDB.java b/src/main/java/toDo/UserDB.java new file mode 100644 index 0000000..ed463cb --- /dev/null +++ b/src/main/java/toDo/UserDB.java @@ -0,0 +1,56 @@ +package toDo; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import model.persistence.IUserPersistance; +import model.persistenceDB.AccessDB; + +/** + * databaseconnection for userobjects, Story usermanagement + * @author Clara Zufall + * TODO finish this class + */ +public class UserDB implements IUserPersistance{ + + private AccessDB dbAccess; + + public UserDB(AccessDB dbAccess) { + this.dbAccess = dbAccess; + } + + /** + * read userdata by unique username + * + * @param username + * @return userobject, null if user didn't exists + */ + public User readUser(String username) { + String sql = "SELECT * FROM users WHERE login_name = ? ;"; + User user = null; + try (Connection con = DriverManager.getConnection(this.dbAccess.getFullURL(), this.dbAccess.getUser(), + this.dbAccess.getPassword()); PreparedStatement statement = con.prepareStatement(sql)) { + + statement.setString(1, username); + + ResultSet rs = statement.executeQuery(); + + while (rs.next()) { + user = new User(rs.getInt("P_user_id"), rs.getString("first_name"), rs.getString("sur_name"), + rs.getDate("birthday").toLocalDate(), rs.getString("street"), rs.getString("house_number"), + rs.getString("postal_code"), rs.getString("city"), rs.getString("login_name"), + rs.getString("password"), rs.getInt("salary_expectations"), rs.getString("marital_status"), + rs.getBigDecimal("final_grade").doubleValue()); + } + + } catch (SQLException ex) { + System.err.println(ex.getMessage()); + } + + return user; + } + +} diff --git a/src/main/java/view/StartAlienDefence.java b/src/main/java/view/StartAlienDefence.java new file mode 100644 index 0000000..a7f81d9 --- /dev/null +++ b/src/main/java/view/StartAlienDefence.java @@ -0,0 +1,18 @@ +package view; + +import controller.AlienDefenceController; +import model.persistence.IPersistance; +import model.persistenceDummy.PersistanceDummy; +import view.menue.MainMenu; + +public class StartAlienDefence { + + public static void main(String[] args) { + + IPersistance alienDefenceModel = new PersistanceDummy();//TODO new PersistanceDB(); + AlienDefenceController alienDefenceController = new AlienDefenceController(alienDefenceModel); + MainMenu mainMenu = new MainMenu(alienDefenceController); + + mainMenu.setVisible(true); + } +} diff --git a/src/main/java/view/game/GameGUI.java b/src/main/java/view/game/GameGUI.java new file mode 100644 index 0000000..c9412c2 --- /dev/null +++ b/src/main/java/view/game/GameGUI.java @@ -0,0 +1,93 @@ +package view.game; + +import java.awt.Color; +import java.awt.Point; +import java.awt.Toolkit; + +import javax.swing.ImageIcon; +import javax.swing.JFrame; + +import controller.GameController; + +/** + * GUI der Klasse _______ + * + * @author Tenbusch + * + */ +public class GameGUI extends JFrame { + + private static final long serialVersionUID = 1L; + private GameJPanel spielfeld; + private GameController gc; + public final long STARTTIME; + private final int WIDTH = 1280; + private final int HEIGHT = 960; + + // Konstruktor + public GameGUI(GameController gc) { + super("Spiel v0.0 - FPS: "); + + setCursor(Toolkit.getDefaultToolkit().createCustomCursor(new ImageIcon("pictures/crosshair.png").getImage(), + new Point(10, 10), "Cursor")); + + // Fenstergestaltung + setSize(WIDTH, HEIGHT); + setLocation(10, 10); + setResizable(false); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + // Controller registrieren + this.gc = gc; + + setBackground(new Color(200, 200, 200)); + + gc.setHasWon(false); + + spielfeld = new GameJPanel(gc); + getContentPane().add(spielfeld); + setVisible(true); + + // Startzeit setzen + STARTTIME = System.currentTimeMillis(); + } + + public void start() { + + long lastStep = System.currentTimeMillis() - 1; + + // Spielfeld vorbereiten + gc.startLevel(); + + while (true) { + + // FPS berechnen + long delta = System.currentTimeMillis() - lastStep; + lastStep = System.currentTimeMillis(); + setTitle("Spiel v0.0 - FPS: " + (1000 / delta)); + + // Spiellogik + this.gc.doLogik(delta); + + repaint(); + + try { + Thread.sleep(1); + } catch (Exception e) { + + } + + if (gc.isHasWon() || gc.timeleft() <= -1) { + + try { + Thread.sleep(1000); + } catch (InterruptedException ignored) { + } + dispose(); + break; + } + + } + + } + +} diff --git a/src/main/java/view/game/GameJPanel.java b/src/main/java/view/game/GameJPanel.java new file mode 100644 index 0000000..0b593e7 --- /dev/null +++ b/src/main/java/view/game/GameJPanel.java @@ -0,0 +1,106 @@ +package view.game; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +import javax.imageio.ImageIO; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +import controller.GameController; +import model.Target; + +@SuppressWarnings("serial") +public class GameJPanel extends JPanel { + + // Attribute die zum Zeichnen aus dem Controller geholt werden müssen (konkrete + // Objekte erst in init() erzeugen) + private GameController gc; + private MouseClickListener mouseClickListener; + private List rechteckePainter; + private BufferedImage img, win, loose; + private JLabel lblTimeleft; + + public GameJPanel(GameController gc) { + super(); // do the JPanel-stuff + this.gc = gc; + this.mouseClickListener = new MouseClickListener(gc); + this.addMouseListener(this.mouseClickListener); + this.lblTimeleft = new JLabel(gc.timeleft() + "s"); + this.lblTimeleft.setHorizontalAlignment(SwingConstants.RIGHT); + this.lblTimeleft.setBounds(1000, 10, 200, 40); + this.lblTimeleft.setFont(new Font("Comic Sans Serif", Font.BOLD, 30)); + init(); + + } + + /** + * Spielfläche initialisieren + */ + public void init() { + try { + this.img = ImageIO.read(new File("./pictures/" + this.gc.getCurrLevel().getBackgroundImage())); + this.win = ImageIO.read(new File("./pictures/YouWin.png")); + this.loose = ImageIO.read(new File("./pictures/YouLoose.png")); + + } catch (IOException e) { + e.printStackTrace(); + } + + LinkedList rechteckePainter = new LinkedList(); + for (Target t : gc.getTargets()) { + rechteckePainter.add(new TargetPainter(t)); + } + this.rechteckePainter = rechteckePainter; + } + + @Override + public void paintComponent(Graphics g) { + + // Abfrage Gewinn oder + if (gc.timeleft() <= 0 || gc.isHasWon()) { + + g.setColor(Color.GRAY); + if (gc.isHasWon()) { + g.drawImage(this.win, 300, 120, null); + } else { + g.drawImage(this.loose, 300, 120, null); + } + g.setFont(new Font("Arial", Font.PLAIN, 16)); + // g.drawString(gc.getShotsFired() + " Schüsse mit " + gc.getAccuracy() + " % + // Treffergenauigkeit", 300, 850); + + } else { + + // Spielfeldhintergrund zeichnen + if (img != null) { + g.drawImage(this.img, 0, 0, null); + } else { + g.setColor(Color.GREEN); + g.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + + // System.out.println(gc.time()); + // Targets zeichnen + for (TargetPainter rp : this.rechteckePainter) { + rp.paint(g, gc.time()); + } + + // Sekundenanzeige + if (gc.timeleft() <= 5) + g.setColor(Color.RED); + else + g.setColor(Color.WHITE); + g.setFont(new Font("Comic Sans Serif", Font.PLAIN, 30)); + g.drawString(gc.timeleft() + "", 1210, 40); + + } + } +} diff --git a/src/main/java/view/game/MouseClickListener.java b/src/main/java/view/game/MouseClickListener.java new file mode 100644 index 0000000..a04e174 --- /dev/null +++ b/src/main/java/view/game/MouseClickListener.java @@ -0,0 +1,21 @@ +package view.game; + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import controller.GameController; + +public class MouseClickListener extends MouseAdapter { + + private GameController gc; + + public MouseClickListener(GameController gc) { + this.gc = gc; + } + + @Override + public void mousePressed(MouseEvent e) { + gc.fireShot(e.getX(), e.getY()); + } + +} diff --git a/src/main/java/view/game/TargetPainter.java b/src/main/java/view/game/TargetPainter.java new file mode 100644 index 0000000..b2a66e1 --- /dev/null +++ b/src/main/java/view/game/TargetPainter.java @@ -0,0 +1,56 @@ +package view.game; + +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; + +import model.Target; + +public class TargetPainter { + + private Target target; + private BufferedImage image; + private BufferedImage imageDestroyed; + + public TargetPainter(Target target) { + this.target = target; + try { + this.image = ImageIO.read(new File("./pictures/" + target.getImageAddress())); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + this.imageDestroyed = ImageIO.read(new File("./pictures/explosion.png")); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + public void paint(Graphics g, long time) { + + long targetStartTime = target.getTime(); + long targetEndTime = target.getTime() + target.getDuration(); + + // Prüft, ob das Target erscheint. + if ((time < targetStartTime || time > targetEndTime)) + return; + + if (this.target.isHit() && time < targetEndTime) { + + g.drawImage(this.imageDestroyed, this.target.getHitbox().getX(), this.target.getHitbox().getY(), + this.target.getHitbox().getWidth(), this.target.getHitbox().getHeight(), null); + + return; + + } + + g.drawImage(this.image, this.target.getHitbox().getX(), this.target.getHitbox().getY(), + this.target.getHitbox().getWidth(), this.target.getHitbox().getHeight(), null); + } + +} diff --git a/src/main/java/view/menue/Highscore.java b/src/main/java/view/menue/Highscore.java new file mode 100644 index 0000000..f26fc08 --- /dev/null +++ b/src/main/java/view/menue/Highscore.java @@ -0,0 +1,80 @@ +package view.menue; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Vector; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; + +import controller.AttemptController; +import model.Level; + +public class Highscore extends JFrame { + + // Attribute + private AttemptController attemptController; + private Level level; + + public Highscore(AttemptController attemptController, Level level) { + this(attemptController, level, 0); + } + + // Konstruktor + public Highscore(AttemptController attemptController, Level level, int game_id) { + this.attemptController = attemptController; + this.level = level; + + // Zweidimensioaler Vector, mit Inhalt der Tabelle wird geholt. + Vector> vecRow = attemptController.getAllAttemptsPerLevel(level, game_id); + + int mark = attemptController.getPlayerPosition(); + + setLayout(new BorderLayout(5, 10)); + + // Spaltenüberschriften + Vector title = new Vector<>(); + title.add("Rang"); + title.add("Spieler"); + title.add("Datum"); + title.add("Uhrzeit"); + title.add("Trefferwert"); + title.add("Genauigkeitswert"); + title.add("Reaktionswert"); + title.add("Highscore-Wert"); + + // Tablle basierend auf zweidimensionalem Vector + JTable table = new JTable(vecRow, title); + if (mark >= 0) + table.setRowSelectionInterval(mark, mark); + setMinimumSize(new Dimension(650, 500)); + getContentPane().add(new JScrollPane(table), BorderLayout.NORTH); + setTitle("Highscore-Liste"); // Titel + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + pack(); + setVisible(true); + + JButton btnZielndern = new JButton("Highscoreliste löschen"); + btnZielndern.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + btnAendern_Clicked(arg0); + } + }); + + JPanel pnlSouth = new JPanel(); + pnlSouth.add(btnZielndern); + + // fügt Panel mit Button hinzu + add(pnlSouth, BorderLayout.SOUTH); + } + + public void btnAendern_Clicked(ActionEvent evt) { + this.attemptController.deleteHighscore(level.getLevel_id()); + dispose(); + } +} \ No newline at end of file diff --git a/src/main/java/view/menue/LevelChooser.java b/src/main/java/view/menue/LevelChooser.java new file mode 100644 index 0000000..3e1f6bd --- /dev/null +++ b/src/main/java/view/menue/LevelChooser.java @@ -0,0 +1,113 @@ +package view.menue; + +import java.awt.BorderLayout; +import java.awt.Font; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.SwingConstants; +import javax.swing.table.DefaultTableModel; + +import controller.LevelController; +import model.Level; + +@SuppressWarnings("serial") +public class LevelChooser extends JPanel { + + private LevelController lvlControl; + private LeveldesignWindow leveldesignWindow; + private JTable tblLevels; + private DefaultTableModel jTableData; + + /** + * Create the panel. + * + * @param leveldesignWindow + */ + public LevelChooser(LevelController lvlControl, LeveldesignWindow leveldesignWindow) { + this.lvlControl = lvlControl; + this.leveldesignWindow = leveldesignWindow; + + setLayout(new BorderLayout()); + + JPanel pnlButtons = new JPanel(); + add(pnlButtons, BorderLayout.SOUTH); + + JButton btnNewLevel = new JButton("Neues Level"); + btnNewLevel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + btnNewLevel_Clicked(); + } + }); + pnlButtons.add(btnNewLevel); + + JButton btnUpdateLevel = new JButton("ausgew\u00E4hltes Level bearbeiten"); + btnUpdateLevel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + btnUpdateLevel_Clicked(); + } + }); + pnlButtons.add(btnUpdateLevel); + + JButton btnDeleteLevel = new JButton("Level l\u00F6schen"); + btnDeleteLevel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + btnDeleteLevel_Clicked(); + } + }); + pnlButtons.add(btnDeleteLevel); + + JLabel lblLevelauswahl = new JLabel("Levelauswahl"); + lblLevelauswahl.setFont(new Font("Arial", Font.BOLD, 18)); + lblLevelauswahl.setHorizontalAlignment(SwingConstants.CENTER); + add(lblLevelauswahl, BorderLayout.NORTH); + + JScrollPane spnLevels = new JScrollPane(); + add(spnLevels, BorderLayout.CENTER); + + tblLevels = new JTable(); + tblLevels.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + spnLevels.setViewportView(tblLevels); + + this.updateTableData(); + } + + private String[][] getLevelsAsTableModel() { + List levels = this.lvlControl.readAllLevels(); + String[][] result = new String[levels.size()][]; + int i = 0; + for (Level l : levels) { + result[i++] = l.getData(); + } + return result; + } + + public void updateTableData() { + this.jTableData = new DefaultTableModel(this.getLevelsAsTableModel(), Level.getLevelDescriptions()); + this.tblLevels.setModel(jTableData); + } + + public void btnNewLevel_Clicked() { + this.leveldesignWindow.startLevelEditor(); + } + + public void btnUpdateLevel_Clicked() { + int level_id = Integer + .parseInt((String) this.tblLevels.getModel().getValueAt(this.tblLevels.getSelectedRow(), 0)); + this.leveldesignWindow.startLevelEditor(level_id); + } + + public void btnDeleteLevel_Clicked() { + int level_id = Integer + .parseInt((String) this.tblLevels.getModel().getValueAt(this.tblLevels.getSelectedRow(), 0)); + this.lvlControl.deleteLevel(level_id); + this.updateTableData(); + } +} diff --git a/src/main/java/view/menue/LevelEditor.java b/src/main/java/view/menue/LevelEditor.java new file mode 100644 index 0000000..5ef99a9 --- /dev/null +++ b/src/main/java/view/menue/LevelEditor.java @@ -0,0 +1,386 @@ +package view.menue; + +import java.awt.BorderLayout; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.SystemColor; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.SwingConstants; +import javax.swing.border.EmptyBorder; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.DefaultTableModel; + +import controller.LevelController; +import controller.TargetController; +import model.Level; +import model.Target; + +@SuppressWarnings("serial") +public class LevelEditor extends JPanel { + + private LevelController lvlControl; + private TargetController targetControl; + private LeveldesignWindow leveldesignWindow; + private Level lvl; + private JTable tblTargets; + private DefaultTableModel jTableData; + private JTextField tfdLevelname; + private JTextField tfdLevel_id; + private JTextField tfdLevelDuration; + private JTextField tfdTarget_id; + private JTextField tfdX; + private JTextField tfdY; + private JTextField tfdWidth; + private JTextField tfdHeight; + private JTextField tfdStarttime; + private JTextField tfdTargetDuration; + private JTextField tfdLevelBackground; + private JTextField tfdTargetImage; + + /** + * Create the frame. + */ + public LevelEditor(LeveldesignWindow leveldesignWindow, LevelController lvlControl, TargetController targetControl, + Level lvl) { + this.leveldesignWindow = leveldesignWindow; + this.lvlControl = lvlControl; + this.targetControl = targetControl; + this.lvl = lvl; + + setBorder(new EmptyBorder(5, 5, 5, 5)); + setLayout(new BorderLayout()); + + JLabel lblLeveleditor = new JLabel("Leveleditor"); + lblLeveleditor.setHorizontalAlignment(SwingConstants.CENTER); + lblLeveleditor.setFont(new Font("Arial", Font.BOLD, 18)); + add(lblLeveleditor, BorderLayout.NORTH); + + JPanel pnlMain = new JPanel(); + add(pnlMain, BorderLayout.CENTER); + pnlMain.setLayout(new GridLayout(0, 2, 20, 0)); + + tblTargets = new JTable(); + tblTargets.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + tblTargets.getSelectionModel().addListSelectionListener(new RowListener()); + jTableData = new DefaultTableModel(this.lvl.getTargetsAsTableModel(), Target.getTableDescriptions()); + tblTargets.setModel(jTableData); + + JScrollPane spnTargets = new JScrollPane(tblTargets); + pnlMain.add(spnTargets); + + JPanel pnlInputs = new JPanel(); + pnlMain.add(pnlInputs); + pnlInputs.setLayout(new BorderLayout(0, 0)); + + JPanel pnlInputMask = new JPanel(); + pnlInputMask.setBackground(SystemColor.activeCaption); + pnlInputMask.setBorder(new EmptyBorder(10, 5, 10, 5)); + pnlInputs.add(pnlInputMask, BorderLayout.NORTH); + pnlInputMask.setLayout(new GridLayout(0, 2, 0, 10)); + + + JLabel lblLevelUeberschrift = new JLabel("Level"); + lblLevelUeberschrift.setFont(new Font("Arial", Font.BOLD, 18)); + pnlInputMask.add(lblLevelUeberschrift); + + JLabel lblLevelUeberschrift2 = new JLabel(""); + pnlInputMask.add(lblLevelUeberschrift2); + + JLabel lblLevelid = new JLabel("Level ID"); + pnlInputMask.add(lblLevelid); + + tfdLevel_id = new JTextField(this.lvl.getLevel_id() + ""); + tfdLevel_id.setEditable(false); + tfdLevel_id.setHorizontalAlignment(SwingConstants.RIGHT); + pnlInputMask.add(tfdLevel_id); + tfdLevel_id.setColumns(10); + + JLabel lblLevelname = new JLabel("Name des Level"); + pnlInputMask.add(lblLevelname); + + tfdLevelname = new JTextField(this.lvl.getName()); + tfdLevelname.setHorizontalAlignment(SwingConstants.RIGHT); + pnlInputMask.add(tfdLevelname); + tfdLevelname.setColumns(10); + + + JLabel lblLevelDuration = new JLabel("Spieldauer (Millisekunden)"); + pnlInputMask.add(lblLevelDuration); + + tfdLevelDuration = new JTextField(this.lvl.getDuration() + ""); + tfdLevelDuration.setHorizontalAlignment(SwingConstants.RIGHT); + pnlInputMask.add(tfdLevelDuration); + tfdLevelDuration.setColumns(10); + + JButton btnBack = new JButton("zurück zur Levelauswahl"); + btnBack.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + btnBack_Clicked(arg0); + } + }); + + + JLabel lblbackground = new JLabel("Hintergrundsbild"); + pnlInputMask.add(lblbackground); + + tfdLevelBackground = new JTextField(); + tfdLevelBackground.setHorizontalAlignment(SwingConstants.RIGHT); + pnlInputMask.add(tfdLevelBackground); + tfdLevelBackground.setColumns(10); + pnlInputMask.add(btnBack); + + + JButton btnSaveLevelChanges = new JButton("\u00C4nderungen am Level speichern"); + btnSaveLevelChanges.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + btnSaveLevelChanges_Clicked(arg0); + } + }); + pnlInputMask.add(btnSaveLevelChanges); + + + JPanel pnlInputMaskTargets = new JPanel(); + pnlInputMaskTargets.setBorder(new EmptyBorder(10, 5, 10, 5)); + pnlInputMaskTargets.setBackground(SystemColor.inactiveCaption); + pnlInputs.add(pnlInputMaskTargets, BorderLayout.CENTER); + pnlInputMaskTargets.setLayout(new GridLayout(0, 2, 0, 10)); + + + JLabel lblUeberschrift = new JLabel("Targets"); + lblUeberschrift.setFont(new Font("Arial", Font.BOLD, 18)); + pnlInputMaskTargets.add(lblUeberschrift); + + JLabel lbllblUeberschrift2 = new JLabel(""); + pnlInputMaskTargets.add(lbllblUeberschrift2); + + + JLabel lblTargetid = new JLabel("Target ID"); + pnlInputMaskTargets.add(lblTargetid); + + tfdTarget_id = new JTextField(); + pnlInputMaskTargets.add(tfdTarget_id); + tfdTarget_id.setColumns(10); + + tfdTarget_id.setEditable(false); + + + JLabel lblZiel = new JLabel("Ziel:"); + pnlInputMaskTargets.add(lblZiel); + + JLabel lblZiel2 = new JLabel(""); + pnlInputMaskTargets.add(lblZiel2); + + + JLabel lblTargetpicture = new JLabel("Bilddatei des Ziels"); + lblTargetpicture.setHorizontalAlignment(SwingConstants.LEFT); + pnlInputMaskTargets.add(lblTargetpicture); + + tfdTargetImage = new JTextField(); + tfdTargetImage.setHorizontalAlignment(SwingConstants.LEFT); + pnlInputMaskTargets.add(tfdTargetImage); + tfdTargetImage.setColumns(10); + + + JLabel lblBreite = new JLabel("Breite des Ziels"); + pnlInputMaskTargets.add(lblBreite); + + tfdWidth = new JTextField(); + pnlInputMaskTargets.add(tfdWidth); + tfdWidth.setColumns(10); + + + JLabel lblHhe = new JLabel("Höhe des Ziels"); + pnlInputMaskTargets.add(lblHhe); + + tfdHeight = new JTextField(); + pnlInputMaskTargets.add(tfdHeight); + tfdHeight.setColumns(10); + + + JLabel lblX = new JLabel("X Position des Ziels (max. 1280 - Breite) "); + pnlInputMaskTargets.add(lblX); + + tfdX = new JTextField(); + pnlInputMaskTargets.add(tfdX); + tfdX.setColumns(10); + + + JLabel lblY = new JLabel("Y Position des Ziels (max. 960 - Höhe)"); + pnlInputMaskTargets.add(lblY); + + tfdY = new JTextField(); + pnlInputMaskTargets.add(tfdY); + tfdY.setColumns(10); + + + JLabel lblZeiten = new JLabel("Zeiten: "); + pnlInputMaskTargets.add(lblZeiten); + + JLabel lblZeiten2 = new JLabel(" "); + pnlInputMaskTargets.add(lblZeiten2); + + + JLabel lblStartzeit = new JLabel("Startzeit in nach Spielstart (Millisekunden)"); + pnlInputMaskTargets.add(lblStartzeit); + + tfdStarttime = new JTextField(); + pnlInputMaskTargets.add(tfdStarttime); + tfdStarttime.setColumns(10); + + + JLabel lblAnzeigedauer = new JLabel("Anzeigedauer (Millisekunden)"); + pnlInputMaskTargets.add(lblAnzeigedauer); + + tfdTargetDuration = new JTextField(); + pnlInputMaskTargets.add(tfdTargetDuration); + tfdTargetDuration.setColumns(10); + + + JPanel panel_2 = new JPanel(); + pnlInputs.add(panel_2, BorderLayout.SOUTH); + + JButton btnNeuesZiel = new JButton("Neues Ziel"); + btnNeuesZiel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + btnErstellen_Clicked(arg0); + } + }); + panel_2.add(btnNeuesZiel); + + JButton btnZielndern = new JButton("Ziel \u00E4ndern"); + btnZielndern.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + btnAendern_Clicked(arg0); + } + }); + panel_2.add(btnZielndern); + + JButton btnDeleteTarget = new JButton("Ziel l\u00F6schen"); + btnDeleteTarget.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + btnLoeschen_Clicked(arg0); + } + }); + panel_2.add(btnDeleteTarget); + + } + + public Level getLvl() { + return lvl; + } + + public void setLvl(Level lvl) { + this.lvl = lvl; + updateTableData(); + this.tfdLevel_id.setText("" + lvl.getLevel_id()); + this.tfdLevelname.setText(lvl.getName()); + this.tfdLevelDuration.setText("" + lvl.getDuration()); + this.tfdLevelBackground.setText(lvl.getBackgroundImage()); + } + + public void updateTableData() { + jTableData = new DefaultTableModel(this.lvl.getTargetsAsTableModel(), Target.getTableDescriptions()); + tblTargets.setModel(jTableData); + } + + public void targetAnzeigen_JTable(int row) { + this.tfdTarget_id.setText((String) tblTargets.getValueAt(row, 0)); + this.tfdX.setText((String) tblTargets.getValueAt(row, 1)); + this.tfdY.setText((String) tblTargets.getValueAt(row, 2)); + this.tfdWidth.setText((String) tblTargets.getValueAt(row, 3)); + this.tfdHeight.setText((String) tblTargets.getValueAt(row, 4)); + this.tfdTargetImage.setText((String) tblTargets.getValueAt(row, 5)); + this.tfdStarttime.setText((String) tblTargets.getValueAt(row, 6)); + this.tfdTargetDuration.setText((String) tblTargets.getValueAt(row, 7)); + } + + public void targetAnzeigen_JTable(Target target) { + this.tfdTarget_id.setText(target.getTarget_id() + ""); + this.tfdX.setText(target.getHitbox().getX() + ""); + this.tfdY.setText(target.getHitbox().getY() + ""); + this.tfdWidth.setText(target.getHitbox().getWidth() + ""); + this.tfdHeight.setText(target.getHitbox().getHeight() + ""); + this.tfdTargetImage.setText(target.getImageAddress()); + this.tfdStarttime.setText(target.getTime() + ""); + this.tfdTargetDuration.setText(target.getDuration() + ""); + } + + public Target targetAuslesen() { + Target currentTarget = null; + for (Target t : this.lvl.getTargets()) { + if (t.getTarget_id() == Integer.parseInt(tfdTarget_id.getText())) { + currentTarget = t; + } + } + if (currentTarget != null) { + + currentTarget.getHitbox().setX(Integer.parseInt(tfdX.getText())); + currentTarget.getHitbox().setY(Integer.parseInt(tfdY.getText())); + currentTarget.getHitbox().setWidth(Integer.parseInt(tfdWidth.getText())); + currentTarget.getHitbox().setHeight(Integer.parseInt(tfdHeight.getText())); + + currentTarget.setDuration(Long.parseLong(tfdTargetDuration.getText())); + currentTarget.setTime(Long.parseLong(tfdStarttime.getText())); + currentTarget.setImageAddress(tfdTargetImage.getText()); + } + return currentTarget; + } + + public void btnErstellen_Clicked(ActionEvent evt) { + Target target = this.targetControl.createTarget(this.lvl); + if (target != null) + targetAnzeigen_JTable(target); + updateTableData(); + } + + public void btnLoeschen_Clicked(ActionEvent evt) { + int target_id = Integer.parseInt(this.tfdTarget_id.getText()); + this.targetControl.deleteTarget(this.lvl, target_id); + updateTableData(); + // TODO clear Textfield-Data + } + + public void btnAendern_Clicked(ActionEvent evt) { + this.targetControl.updateTarget(this.lvl, this.targetAuslesen()); + updateTableData(); + } + + /** + * Zurück zur Levelauswahl + * + * @param evt + */ + public void btnBack_Clicked(ActionEvent evt) { + this.leveldesignWindow.showLevelChooser(); + } + + public void btnSaveLevelChanges_Clicked(ActionEvent evt) { + this.lvl.setName(this.tfdLevelname.getText()); + this.lvl.setBackgroundImage(this.tfdLevelBackground.getText()); + this.lvl.setDuration(Integer.parseInt(this.tfdLevelDuration.getText())); + + this.lvlControl.updateLevel(this.lvl); + } + + private class RowListener implements ListSelectionListener { + public void valueChanged(ListSelectionEvent event) { + if (event.getValueIsAdjusting()) { + return; + } + if (tblTargets.getSelectedRow() < 0) + tblTargets.clearSelection(); + else + targetAnzeigen_JTable(tblTargets.getSelectedRow()); + } + } +} diff --git a/src/main/java/view/menue/LeveldesignWindow.java b/src/main/java/view/menue/LeveldesignWindow.java new file mode 100644 index 0000000..cffc086 --- /dev/null +++ b/src/main/java/view/menue/LeveldesignWindow.java @@ -0,0 +1,74 @@ +package view.menue; + +import java.awt.CardLayout; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; + +import controller.LevelController; +import controller.TargetController; +import model.Level; + +@SuppressWarnings("serial") +public class LeveldesignWindow extends JFrame { + + private LevelController lvlControl; + private JPanel contentPane; + private LevelChooser cardChooseLevel; + private LevelEditor cardLevelEditor; + + private CardLayout cards; + + /** + * Create the frame. + */ + public LeveldesignWindow(LevelController lvlControl, TargetController targetControl) { + this.lvlControl = lvlControl; + + setTitle("Leveldesigner"); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setBounds(100, 100, 1200, 800); + contentPane = new JPanel(); + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + setContentPane(contentPane); + this.cards = new CardLayout(); + contentPane.setLayout(cards); + + this.cardChooseLevel = new LevelChooser(lvlControl, this); + contentPane.add(cardChooseLevel, "levelChooser"); + + this.cardLevelEditor = new LevelEditor(this, lvlControl, targetControl, Level.getDefaultLevel()); + contentPane.add(cardLevelEditor, "levelEditor"); + + this.showLevelChooser(); + this.setVisible(true); + } + + /** + * display leveleditor with a new level + */ + public void startLevelEditor() { + this.cardLevelEditor.setLvl(this.lvlControl.createLevel()); + this.cards.show(contentPane, "levelEditor"); + } + + /** + * disply leveleditor with a new level + * + * @param level_id + */ + public void startLevelEditor(int level_id) { + this.cardLevelEditor.setLvl(this.lvlControl.readLevel(level_id)); + this.cards.show(contentPane, "levelEditor"); + } + + /** + * display a jTable with all Levels + */ + public void showLevelChooser() { + this.cards.show(contentPane, "levelChooser"); + this.cardChooseLevel.updateTableData(); + } + +} diff --git a/src/main/java/view/menue/MainMenu.java b/src/main/java/view/menue/MainMenu.java new file mode 100644 index 0000000..e660b85 --- /dev/null +++ b/src/main/java/view/menue/MainMenu.java @@ -0,0 +1,237 @@ +package view.menue; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import javax.swing.border.EmptyBorder; + +import controller.AlienDefenceController; +import controller.GameController; +import model.Level; +import model.persistenceDB.PersistanceDB; +import toDo.User; +import view.game.GameGUI; + +@SuppressWarnings("serial") +public class MainMenu extends JFrame { + + private AlienDefenceController alienDefenceController; + private JTextField loginTextField; + private JPasswordField passwordTextField; + private int selectedLevel = 0; + + private String[] getLevelNames(List arrLevel) { + String[] arrLevelNames = new String[arrLevel.size()]; + + for (int i = 0; i < arrLevel.size(); i++) { + arrLevelNames[i] = arrLevel.get(i).getName(); // Array aus Arraylist erstellt + } + + return arrLevelNames; + } + + // Konstruktor + public MainMenu(AlienDefenceController alienDefenceController) { + + this.alienDefenceController = alienDefenceController; + + // Frame Formatierungen + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(100, 100, 450, 300); + JPanel contentPane = new JPanel(); + contentPane.setBackground(new Color(0, 0, 0)); + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + setContentPane(contentPane); + contentPane.setLayout(new GridBagLayout()); // GridBagLayout + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.HORIZONTAL; + + // JLable mit üBerschrift + JLabel lblheadline = new JLabel(" ALIEN DEFENCE"); + lblheadline.setForeground(new Color(124, 252, 0)); + lblheadline.setFont(new Font("Yu Gothic UI", Font.BOLD, 20)); + c.gridx = 0; + c.gridy = 0; + contentPane.add(lblheadline, c); + + // JPanel mit Logo + JPanel p = new JPanel() { + private static final long serialVersionUID = 1L; + + private ImageIcon imageIcon = new ImageIcon("./pictures/logo.png"); + private Image image = imageIcon.getImage(); + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + if (image != null) { + g.drawImage(image, 5, 8, 145, 145, this); + } + } + }; + c.ipady = 150; // make this component tall + c.ipadx = 120; + c.weightx = 0.0; + c.gridwidth = 15; + c.gridx = 0; + c.gridy = 1; + contentPane.add(p, c); + + // Text Login + JLabel loginText = new JLabel("Login: "); // Einfacher Text + loginText.setForeground(Color.orange); + c.ipady = 0; + c.ipadx = 0; + c.gridwidth = 0; + c.gridx = 0; + c.gridy = 2; + contentPane.add(loginText, c); + + // Textfeld + loginTextField = new JTextField(15); + c.gridy = 3; + contentPane.add(loginTextField, c); + + // Text Passwort + JLabel passwordText = new JLabel("Passwort: "); // Einfacher Text + passwordText.setForeground(Color.orange); + c.gridy = 4; + contentPane.add(passwordText, c); + + // Textfeld + passwordTextField = new JPasswordField(15); + c.gridy = 5; + contentPane.add(passwordTextField, c); + + // Text Level + JLabel levelText = new JLabel("Level: "); // Einfacher Text + levelText.setForeground(Color.orange); + c.gridy = 6; + contentPane.add(levelText, c); + + // Levelliste für die ComboBox abrufen + List arrLevel = this.alienDefenceController.getLevelController().readAllLevels(); + String[] arrLevelNames = getLevelNames(arrLevel); + + // Level Auswahlbox - ActionListener + JComboBox combo = new JComboBox(arrLevelNames); + c.gridy = 7; + contentPane.add(combo, c); + ActionListener actLisCombo = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + selectedLevel = combo.getSelectedIndex(); + } + }; + combo.addActionListener(actLisCombo); // Listener + + // Button Spielen - ActionListener + JButton btnNewButton = new JButton("Spielen"); + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + + // User aus Datenbank holen + User user = alienDefenceController.getAlienDefenceModel().getUserPersistance().readUser(loginTextField.getText()); + + // Spielstarten, wenn Nutzer existiert und Passwort übereinstimmt + if (user != null && user.getPassword().equals(new String(passwordTextField.getPassword()))) { + + Thread t = new Thread("GameThread") { + @Override + public void run() { + + GameController gameController = alienDefenceController.startGame(arrLevel.get(selectedLevel), user); + new GameGUI(gameController).start(); + } + }; + t.start(); + } else { + // Fehlermeldung - Zugangsdaten fehlerhaft + JOptionPane.showMessageDialog(null, "Zugangsdaten nicht korrekt", "Fehler", + JOptionPane.ERROR_MESSAGE); + } + } + }); + c.gridy = 8; + contentPane.add(btnNewButton, c); + + // Button Testen - ActionListener + JButton btnTestButton = new JButton("Testen"); + btnTestButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + + // Erstellt Modell von aktuellen Nutzer + User user = new User(1, "test", "pass"); + + Thread t = new Thread("GameThread") { + + @Override + public void run() { + + List arrLevel = alienDefenceController.getLevelController().readAllLevels(); + + GameController gameController = alienDefenceController.startGame(arrLevel.get(selectedLevel), user); + new GameGUI(gameController).start(); + } + }; + t.start(); + } + }); + c.gridy = 9; + contentPane.add(btnTestButton, c); + + // Button Highscore + JButton btnNewButton_2 = new JButton("Highscore"); + + btnNewButton_2.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new Highscore(alienDefenceController.getAttemptController(), arrLevel.get(selectedLevel)); + } + }); + // selectedLevel + + c.gridy = 10; + contentPane.add(btnNewButton_2, c); + + // Button Leveleditor + JButton btnNewButton_1 = new JButton("Leveleditor"); + btnNewButton_1.setBackground(Color.ORANGE); + btnNewButton_1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new LeveldesignWindow(alienDefenceController.getLevelController(), alienDefenceController.getTargetController()); + } + }); + c.gridy = 11; + contentPane.add(btnNewButton_1, c); + + // Button Beenden + JButton btnNewButton_3 = new JButton("Beenden"); + btnNewButton_3.setBackground(Color.GRAY); + btnNewButton_3.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + c.gridy = 12; + c.anchor = GridBagConstraints.PAGE_END; + contentPane.add(btnNewButton_3, c); + this.pack(); + } + +} \ No newline at end of file diff --git a/src/main/resources/pictures/Bildquellen.txt b/src/main/resources/pictures/Bildquellen.txt new file mode 100644 index 0000000..9852a34 --- /dev/null +++ b/src/main/resources/pictures/Bildquellen.txt @@ -0,0 +1,18 @@ +ufo_1.png: https://pixabay.com/de/illustrations/raumschiff-ufo-weltraum-weltall-3435510/ +ufo_2.png: https://pixabay.com/de/illustrations/ufo-raumschiff-astronaut-2718084/ +ufo_3.png: https://pixabay.com/de/illustrations/ufo-au%C3%9Ferirdischer-raum-raumschiff-3157681/ +ufo_4.png: https://pixabay.com/de/illustrations/ufo-au%C3%9Ferirdischer-raumschiff-raum-4199301/ +ufo_5.png: https://pixabay.com/de/illustrations/ufo-au%C3%9Ferirdisch-science-fiction-5113558/ +logo.png: https://pixabay.com/de/vectors/schild-verbot-verbotsschild-1283415/ +background_1.png: https://pixabay.com/de/photos/tianjin-d%C3%A4mmerung-stadt-landschaft-2185510/ +background_2.png: https://pixabay.com/de/photos/fluss-h%C3%BCgel-abend-california-1590010/ +background_3.png: https://pixabay.com/de/photos/im-freien-new-york-skyline-nyc-5129182/ +background_4.png: https://pixabay.com/de/illustrations/au%C3%9Ferirdischer-landschaft-planeten-4849881/ +background_5.png: https://pixabay.com/de/photos/milchstra%C3%9Fe-sterne-nacht-himmel-923738/ +background_6.png: https://pixabay.com/de/photos/schwarz-und-wei%C3%9F-dom-architektur-5089030/ +background_7.png: https://pixabay.com/de/illustrations/industrie-dystopie-ende-der-welt-5078196/ +background_8.png: https://pixabay.com/de/photos/italien-landschaft-landschaftlich-1758193/ +background_9.png: https://pixabay.com/de/photos/landschaft-herbst-nebel-dorf-615429/ +background_10.png: https://pixabay.com/de/illustrations/ufo-raumschiff-science-fiction-1942755/ +explosion.png: https://pixabay.com/de/vectors/explosion-detonation-hochkonjunktur-417894/ + diff --git a/src/main/resources/pictures/YouLoose.png b/src/main/resources/pictures/YouLoose.png new file mode 100644 index 0000000000000000000000000000000000000000..567471bd1d54f171a4d9c1f7400d622a934a4d3c GIT binary patch literal 21918 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/pictures/YouWin.png b/src/main/resources/pictures/YouWin.png new file mode 100644 index 0000000000000000000000000000000000000000..14f560e2c74653b42ea1307b39afe58b1c665479 GIT binary patch literal 18813 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 MS=C2{GUg%wAJc$vga7~l literal 0 HcmV?d00001 diff --git a/src/main/resources/pictures/background_1.jpg b/src/main/resources/pictures/background_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d55e466ea190e75b41cba1340207626549e1363 GIT binary patch literal 511884 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