init refactoring exercise
This commit is contained in:
38
refactoring/flappy-bird/.gitignore
vendored
Normal file
38
refactoring/flappy-bird/.gitignore
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
8
refactoring/flappy-bird/.idea/.gitignore
generated
vendored
Normal file
8
refactoring/flappy-bird/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
7
refactoring/flappy-bird/.idea/encodings.xml
generated
Normal file
7
refactoring/flappy-bird/.idea/encodings.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
14
refactoring/flappy-bird/.idea/misc.xml
generated
Normal file
14
refactoring/flappy-bird/.idea/misc.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_23" default="true" project-jdk-name="openjdk-23" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
6
refactoring/flappy-bird/.idea/vcs.xml
generated
Normal file
6
refactoring/flappy-bird/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
BIN
refactoring/flappy-bird/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
BIN
refactoring/flappy-bird/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
Binary file not shown.
2
refactoring/flappy-bird/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
2
refactoring/flappy-bird/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
|
14
refactoring/flappy-bird/README.md
Normal file
14
refactoring/flappy-bird/README.md
Normal file
@@ -0,0 +1,14 @@
|
||||
Flappy-Bird
|
||||
===========
|
||||
|
||||
A flappy bird clone written in Java, for the ICS4U Simple Game Assignment.
|
||||
|
||||
<img src="https://raw.githubusercontent.com/paulkr/Flappy-Bird/master/demo.png" width="500" />
|
||||
|
||||
Build & Run
|
||||
-----------
|
||||
|
||||
```shell
|
||||
$ cd lib
|
||||
$ javac FlappyBird.java && java FlappyBird
|
||||
```
|
BIN
refactoring/flappy-bird/demo.png
Normal file
BIN
refactoring/flappy-bird/demo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 168 KiB |
316
refactoring/flappy-bird/mvnw
vendored
Normal file
316
refactoring/flappy-bird/mvnw
vendored
Normal file
@@ -0,0 +1,316 @@
|
||||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you 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.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Maven Start Up Batch script
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# M2_HOME - location of maven2's installed home dir
|
||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
# e.g. to debug Maven itself, use
|
||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||
|
||||
if [ -f /usr/local/etc/mavenrc ] ; then
|
||||
. /usr/local/etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f /etc/mavenrc ] ; then
|
||||
. /etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.mavenrc" ] ; then
|
||||
. "$HOME/.mavenrc"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# OS specific support. $var _must_ be set to either true or false.
|
||||
cygwin=false;
|
||||
darwin=false;
|
||||
mingw=false
|
||||
case "`uname`" in
|
||||
CYGWIN*) cygwin=true ;;
|
||||
MINGW*) mingw=true;;
|
||||
Darwin*) darwin=true
|
||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if [ -x "/usr/libexec/java_home" ]; then
|
||||
export JAVA_HOME="`/usr/libexec/java_home`"
|
||||
else
|
||||
export JAVA_HOME="/Library/Java/Home"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=`java-config --jre-home`
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$M2_HOME" ] ; then
|
||||
## resolve links - $0 may be a link to maven's home
|
||||
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
|
||||
|
||||
saveddir=`pwd`
|
||||
|
||||
M2_HOME=`dirname "$PRG"`/..
|
||||
|
||||
# make it fully qualified
|
||||
M2_HOME=`cd "$M2_HOME" && pwd`
|
||||
|
||||
cd "$saveddir"
|
||||
# echo Using m2 at $M2_HOME
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --unix "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME="`(cd "$M2_HOME"; pwd)`"
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
javaExecutable="`which javac`"
|
||||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
|
||||
# readlink(1) is not available as standard on Solaris 10.
|
||||
readLink=`which readlink`
|
||||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
|
||||
if $darwin ; then
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
|
||||
else
|
||||
javaExecutable="`readlink -f \"$javaExecutable\"`"
|
||||
fi
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
|
||||
JAVA_HOME="$javaHome"
|
||||
export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$JAVACMD" ] ; then
|
||||
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
|
||||
else
|
||||
JAVACMD="`\\unset -f command; \\command -v java`"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||
echo " We cannot execute $JAVACMD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
echo "Warning: JAVA_HOME environment variable is not set."
|
||||
fi
|
||||
|
||||
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
|
||||
|
||||
# traverses directory structure from process work directory to filesystem root
|
||||
# first directory with .mvn subdirectory is considered project base directory
|
||||
find_maven_basedir() {
|
||||
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Path not specified to find_maven_basedir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
basedir="$1"
|
||||
wdir="$1"
|
||||
while [ "$wdir" != '/' ] ; do
|
||||
if [ -d "$wdir"/.mvn ] ; then
|
||||
basedir=$wdir
|
||||
break
|
||||
fi
|
||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||
if [ -d "${wdir}" ]; then
|
||||
wdir=`cd "$wdir/.."; pwd`
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
echo "${basedir}"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
echo "$(tr -s '\n' ' ' < "$1")"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=`find_maven_basedir "$(pwd)"`
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found .mvn/wrapper/maven-wrapper.jar"
|
||||
fi
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
|
||||
fi
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
else
|
||||
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
fi
|
||||
while IFS="=" read key value; do
|
||||
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
|
||||
esac
|
||||
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Downloading from: $jarUrl"
|
||||
fi
|
||||
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if $cygwin; then
|
||||
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found wget ... using wget"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
else
|
||||
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
elif command -v curl > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found curl ... using curl"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl -o "$wrapperJarPath" "$jarUrl" -f
|
||||
else
|
||||
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
|
||||
fi
|
||||
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Falling back to using Java to download"
|
||||
fi
|
||||
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaClass=`cygpath --path --windows "$javaClass"`
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Compiling MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
# Compiling the Java class
|
||||
("$JAVA_HOME/bin/javac" "$javaClass")
|
||||
fi
|
||||
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
# Running the downloader
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Running MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo $MAVEN_PROJECTBASEDIR
|
||||
fi
|
||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --path --windows "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
|
||||
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
|
||||
fi
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
$MAVEN_DEBUG_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.home=${M2_HOME}" \
|
||||
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
188
refactoring/flappy-bird/mvnw.cmd
vendored
Normal file
188
refactoring/flappy-bird/mvnw.cmd
vendored
Normal file
@@ -0,0 +1,188 @@
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. 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,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Maven Start Up Batch script
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM M2_HOME - location of maven2's installed home dir
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
|
||||
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
|
||||
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %DOWNLOAD_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% ^
|
||||
%JVM_CONFIG_MAVEN_PROPS% ^
|
||||
%MAVEN_OPTS% ^
|
||||
%MAVEN_DEBUG_OPTS% ^
|
||||
-classpath %WRAPPER_JAR% ^
|
||||
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
|
||||
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
|
||||
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%"=="on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
|
||||
|
||||
cmd /C exit /B %ERROR_CODE%
|
78
refactoring/flappy-bird/pom.xml
Normal file
78
refactoring/flappy-bird/pom.xml
Normal file
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.example</groupId>
|
||||
<artifactId>FlappyBirdRefactoring</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<name>FlappyBirdRefactoring</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<junit.version>5.9.2</junit.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-controls</artifactId>
|
||||
<version>21-ea+24</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-fxml</artifactId>
|
||||
<version>21-ea+24</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-engine</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.11.0</version>
|
||||
<configuration>
|
||||
<source>21</source>
|
||||
<target>21</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-maven-plugin</artifactId>
|
||||
<version>0.0.8</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<!-- Default configuration for running with: mvn clean javafx:run -->
|
||||
<id>default-cli</id>
|
||||
<configuration>
|
||||
<mainClass>
|
||||
com.example.flappybirdrefactoring/com.example.flappybird.HelloApplication
|
||||
</mainClass>
|
||||
<launcher>app</launcher>
|
||||
<jlinkZipName>app</jlinkZipName>
|
||||
<jlinkImageName>app</jlinkImageName>
|
||||
<noManPages>true</noManPages>
|
||||
<stripDebug>true</stripDebug>
|
||||
<noHeaderFiles>true</noHeaderFiles>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
@@ -0,0 +1,53 @@
|
||||
package com.example.flappybird; /**
|
||||
* Animation.java
|
||||
* Creates animation with array of sprites
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.geom.AffineTransform;
|
||||
|
||||
public class Animation {
|
||||
|
||||
// Start at first frame
|
||||
private static double currentFrame = 0;
|
||||
|
||||
/**
|
||||
* Creates an animation with an array of sprites
|
||||
*
|
||||
* @param sprites Array of BufferedImages
|
||||
* @param x x-coordinate
|
||||
* @param y y-coordinate
|
||||
* @param speed Speed of animation
|
||||
* @param angle Angle to rotate sprite
|
||||
*/
|
||||
public static void animate (Graphics g, BufferedImage[] sprites, int x, int y, double speed, double angle) {
|
||||
|
||||
Graphics2D g2d = (Graphics2D) g;
|
||||
AffineTransform trans = g2d.getTransform();
|
||||
AffineTransform at = new AffineTransform();
|
||||
|
||||
// Number of frames
|
||||
int count = sprites.length;
|
||||
|
||||
// Rotate the image
|
||||
at.rotate(angle, x + 25, y + 25);
|
||||
g2d.transform(at);
|
||||
|
||||
// Draw the current rotated frame
|
||||
g2d.drawImage(sprites[(int) (Math.round(currentFrame))], x, y, null);
|
||||
|
||||
g2d.setTransform(trans);
|
||||
|
||||
// Switch animation frames
|
||||
if (currentFrame >= count - 1) {
|
||||
currentFrame = 0;
|
||||
} else currentFrame += speed;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,56 @@
|
||||
package com.example.flappybird; /**
|
||||
* Audio.java
|
||||
* Plays all sound effects
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import javax.sound.sampled.AudioInputStream;
|
||||
import javax.sound.sampled.AudioSystem;
|
||||
import javax.sound.sampled.Clip;
|
||||
|
||||
public class Audio {
|
||||
|
||||
private AudioInputStream audioInputStream;
|
||||
private Clip clip;
|
||||
|
||||
private void playSound (String sound) {
|
||||
|
||||
// Path to sound file
|
||||
String soundURL = "/res/sound/" + sound + ".wav";
|
||||
|
||||
// Try to load and play sound
|
||||
try {
|
||||
audioInputStream = AudioSystem.getAudioInputStream(this.getClass().getResource(soundURL));
|
||||
clip = AudioSystem.getClip();
|
||||
clip.open(audioInputStream);
|
||||
clip.start();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.out.printf("Count not load %s.wav!\n", sound);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Public method for bird jump sound
|
||||
*/
|
||||
public void jump () {
|
||||
playSound("jump");
|
||||
}
|
||||
|
||||
/**
|
||||
* Public method for point sound
|
||||
*/
|
||||
public void point () {
|
||||
playSound("point");
|
||||
}
|
||||
|
||||
/**
|
||||
* Public method for collision/death sound
|
||||
*/
|
||||
public void hit () {
|
||||
playSound("hit");
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,164 @@
|
||||
package com.example.flappybird; /**
|
||||
* Bird.java
|
||||
* Handles bird's state and actions
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.Graphics;
|
||||
|
||||
public class Bird extends JPanel {
|
||||
|
||||
// Bird attributes
|
||||
public String color;
|
||||
private int x, y;
|
||||
private boolean isAlive = true;
|
||||
|
||||
// Bird constants
|
||||
private int FLOAT_MULTIPLIER = -1;
|
||||
public final int BIRD_WIDTH = 44;
|
||||
public final int BIRD_HEIGHT = 31;
|
||||
private final int BASE_COLLISION = 521 - BIRD_HEIGHT - 5;
|
||||
private final int SHIFT = 10;
|
||||
private final int STARTING_BIRD_X = 90;
|
||||
private final int STARTING_BIRD_Y = 343;
|
||||
|
||||
// Physics variables
|
||||
private double velocity = 0;
|
||||
private double gravity = .41;
|
||||
private double delay = 0;
|
||||
private double rotation = 0;
|
||||
|
||||
// Bird sprites
|
||||
private BufferedImage[] sprites;
|
||||
|
||||
|
||||
public Bird (String color, int x, int y, BufferedImage[] s) {
|
||||
this.color = color;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.sprites = s;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Bird's x-coordinate
|
||||
*/
|
||||
public int getX () {
|
||||
return x;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Bird's y-coordinate
|
||||
*/
|
||||
public int getY () {
|
||||
return y;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return If bird is alive
|
||||
*/
|
||||
public boolean isAlive () {
|
||||
return isAlive;
|
||||
}
|
||||
|
||||
/**
|
||||
* Kills bird
|
||||
*/
|
||||
public void kill () {
|
||||
isAlive = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set new coordinates when starting game
|
||||
*/
|
||||
public void setGameStartPos () {
|
||||
x = STARTING_BIRD_X;
|
||||
y = STARTING_BIRD_Y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Floating bird effect on menu screen
|
||||
*/
|
||||
public void menuFloat () {
|
||||
|
||||
y += FLOAT_MULTIPLIER;
|
||||
|
||||
// Change direction within floating range
|
||||
if (y < 220) {
|
||||
FLOAT_MULTIPLIER *= -1;
|
||||
} else if (y > 280) {
|
||||
FLOAT_MULTIPLIER *= -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Bird jump
|
||||
*/
|
||||
public void jump () {
|
||||
|
||||
if (delay < 1) {
|
||||
velocity = -SHIFT;
|
||||
delay = SHIFT;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Bird movement during the game
|
||||
*/
|
||||
public void inGame () {
|
||||
|
||||
// If the bird did not hit the base, lower it
|
||||
if (y < BASE_COLLISION) {
|
||||
|
||||
// Change and velocity
|
||||
velocity += gravity;
|
||||
|
||||
// Lower delay if possible
|
||||
if (delay > 0) { delay--; }
|
||||
|
||||
// Add rounded velocity to y-coordinate
|
||||
y += (int) velocity;
|
||||
|
||||
} else {
|
||||
|
||||
// Play audio and set state to dead
|
||||
GamePanel.audio.hit();
|
||||
isAlive = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders bird
|
||||
*/
|
||||
public void renderBird (Graphics g) {
|
||||
|
||||
// Calculate angle to rotate bird based on y-velocity
|
||||
rotation = ((90 * (velocity + 25) / 25) - 90) * Math.PI / 180;
|
||||
|
||||
// Divide for clean jump
|
||||
rotation /= 2;
|
||||
|
||||
// Handle rotation offset
|
||||
rotation = rotation > Math.PI / 2 ? Math.PI / 2 : rotation;
|
||||
|
||||
if (!isAlive()) {
|
||||
|
||||
// Drop bird on death
|
||||
if (y < BASE_COLLISION - 10) {
|
||||
velocity += gravity;
|
||||
y += (int) velocity;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Create bird animation and pass in rotation angle
|
||||
Animation.animate(g, sprites, x, y, .09, rotation);
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,59 @@
|
||||
package com.example.flappybird; /**
|
||||
* FlappyBird.java
|
||||
* Main game class
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.*;
|
||||
import java.awt.Toolkit;
|
||||
|
||||
public class FlappyBird extends JFrame implements ActionListener {
|
||||
|
||||
GamePanel game;
|
||||
Timer gameTimer;
|
||||
|
||||
// Game setup constants
|
||||
public static final int WIDTH = 375;
|
||||
public static final int HEIGHT = 667;
|
||||
private static final int DELAY = 12;
|
||||
|
||||
public FlappyBird () {
|
||||
|
||||
super("Flappy Bird");
|
||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
setSize(WIDTH, HEIGHT);
|
||||
|
||||
// Game timer
|
||||
gameTimer = new Timer(DELAY, this);
|
||||
gameTimer.start();
|
||||
|
||||
// Add Panel to Frame
|
||||
game = new GamePanel();
|
||||
add(game);
|
||||
|
||||
// Set game icon
|
||||
setIconImage(Toolkit.getDefaultToolkit().getImage("res/img/icons.png"));
|
||||
|
||||
setResizable(false);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
public void actionPerformed (ActionEvent e) {
|
||||
|
||||
if (game != null && game.ready) {
|
||||
game.repaint();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
FlappyBird game = new FlappyBird();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,616 @@
|
||||
package com.example.flappybird; /**
|
||||
* GamePanel.java
|
||||
* Main game panel
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
import java.util.Random;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.io.InputStream;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class GamePanel extends JPanel implements KeyListener, MouseListener {
|
||||
|
||||
private Random rand;
|
||||
private Calendar cal;
|
||||
|
||||
////////////////////
|
||||
// Game variables //
|
||||
////////////////////
|
||||
|
||||
// Fonts
|
||||
private Font flappyFontBase,
|
||||
flappyFontReal,
|
||||
flappyScoreFont,
|
||||
flappyMiniFont = null;
|
||||
|
||||
// Textures
|
||||
public static HashMap<String, Texture> textures = new Sprites().getGameTextures();
|
||||
|
||||
// Moving base effect
|
||||
private static int baseSpeed = 2;
|
||||
private static int[] baseCoords = { 0, 435 };
|
||||
|
||||
// Game states
|
||||
final static int MENU = 0;
|
||||
final static int GAME = 1;
|
||||
private int gameState = MENU;
|
||||
|
||||
private int score; // Player score
|
||||
private int pipeDistTracker; // Distance between pipes
|
||||
|
||||
public boolean ready = false; // If game has loaded
|
||||
private boolean inStartGameState = false; // To show instructions scren
|
||||
private Point clickedPoint = new Point(-1, -1); // Store point when player clicks
|
||||
private boolean scoreWasGreater; // If score was greater than previous highscore
|
||||
private boolean darkTheme; // Boolean to show dark or light screen
|
||||
private String randomBird; // Random bird color
|
||||
private String medal; // Medal to be awarded after each game
|
||||
public ArrayList<Pipe> pipes; // Arraylist of Pipe objects
|
||||
|
||||
private Bird gameBird;
|
||||
private Highscore highscore = new Highscore();
|
||||
public static Audio audio = new Audio();
|
||||
|
||||
|
||||
public GamePanel () {
|
||||
|
||||
rand = new Random();
|
||||
|
||||
// Try to load ttf file
|
||||
try {
|
||||
InputStream is = new BufferedInputStream(this.getClass().getResourceAsStream("/res/fonts/flappy-font.ttf"));
|
||||
flappyFontBase = Font.createFont(Font.TRUETYPE_FONT, is);
|
||||
|
||||
// Header and sub-header fonts
|
||||
flappyScoreFont = flappyFontBase.deriveFont(Font.PLAIN, 50);
|
||||
flappyFontReal = flappyFontBase.deriveFont(Font.PLAIN, 20);
|
||||
flappyMiniFont = flappyFontBase.deriveFont(Font.PLAIN, 15);
|
||||
|
||||
} catch (Exception ex) {
|
||||
|
||||
// Exit is font cannot be loaded
|
||||
ex.printStackTrace();
|
||||
System.err.println("Could not load Flappy Font!");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
restart(); // Reset game variables
|
||||
|
||||
// Input listeners
|
||||
addKeyListener(this);
|
||||
addMouseListener(this);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* To start game after everything has been loaded
|
||||
*/
|
||||
public void addNotify() {
|
||||
super.addNotify();
|
||||
requestFocus();
|
||||
ready = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restarts game by resetting game variables
|
||||
*/
|
||||
public void restart () {
|
||||
|
||||
// Reset game statistics
|
||||
score = 0;
|
||||
pipeDistTracker = 0;
|
||||
scoreWasGreater = false;
|
||||
|
||||
// Get current hour with Calendar
|
||||
// If it is past noon, use the dark theme
|
||||
cal = Calendar.getInstance();
|
||||
int currentHour = cal.get(Calendar.HOUR_OF_DAY);
|
||||
|
||||
// Array of bird colors
|
||||
String[] birds = new String[] {
|
||||
"yellow",
|
||||
"blue",
|
||||
"red"
|
||||
};
|
||||
|
||||
// Set random scene assets
|
||||
darkTheme = currentHour > 12; // If we should use the dark theme
|
||||
randomBird = birds[rand.nextInt(3)]; // Random bird color
|
||||
|
||||
// Game bird
|
||||
gameBird = new Bird(randomBird, 172, 250, new BufferedImage[] {
|
||||
textures.get(randomBird + "Bird1").getImage(),
|
||||
textures.get(randomBird + "Bird2").getImage(),
|
||||
textures.get(randomBird + "Bird3").getImage()
|
||||
});
|
||||
|
||||
// Remove old pipes
|
||||
pipes = new ArrayList<Pipe>();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if point is in rectangle
|
||||
*
|
||||
* @param r Rectangle
|
||||
* @return Boolean if point collides with rectangle
|
||||
*/
|
||||
private boolean isTouching (Rectangle r) {
|
||||
return r.contains(clickedPoint);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintComponent (Graphics g) {
|
||||
super.paintComponent(g);
|
||||
|
||||
// Set font and color
|
||||
g.setFont(flappyFontReal);
|
||||
g.setColor(Color.white);
|
||||
|
||||
// Only move screen if bird is alive
|
||||
if (gameBird.isAlive()) {
|
||||
|
||||
// Move base
|
||||
baseCoords[0] = baseCoords[0] - baseSpeed < -435 ? 435 : baseCoords[0] - baseSpeed;
|
||||
baseCoords[1] = baseCoords[1] - baseSpeed < -435 ? 435 : baseCoords[1] - baseSpeed;
|
||||
|
||||
}
|
||||
|
||||
// Background
|
||||
g.drawImage(darkTheme ? textures.get("background2").getImage() :
|
||||
textures.get("background1").getImage(), 0, 0, null);
|
||||
|
||||
// Draw bird
|
||||
gameBird.renderBird(g);
|
||||
|
||||
switch (gameState) {
|
||||
|
||||
case MENU:
|
||||
|
||||
drawBase(g);
|
||||
drawMenu(g);
|
||||
|
||||
gameBird.menuFloat();
|
||||
|
||||
break;
|
||||
|
||||
case GAME:
|
||||
|
||||
if (gameBird.isAlive()) {
|
||||
|
||||
// Start at instructions state
|
||||
if (inStartGameState) {
|
||||
startGameScreen(g);
|
||||
|
||||
} else {
|
||||
// Start game
|
||||
pipeHandler(g);
|
||||
gameBird.inGame();
|
||||
}
|
||||
|
||||
drawBase(g); // Draw base over pipes
|
||||
drawScore(g, score, false, 0, 0); // Draw player score
|
||||
|
||||
} else {
|
||||
|
||||
pipeHandler(g);
|
||||
drawBase(g);
|
||||
|
||||
// Draw game over assets
|
||||
gameOver(g);
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/////////////////////////
|
||||
// All drawing methods //
|
||||
/////////////////////////
|
||||
|
||||
/**
|
||||
* Draws a string centered based on given restrictions
|
||||
*
|
||||
* @param s String to be drawn
|
||||
* @param w Constraining width
|
||||
* @param h Constraining height
|
||||
* @param y Fixed y-coordiate
|
||||
*/
|
||||
public void drawCentered (String s, int w, int h, int y, Graphics g) {
|
||||
FontMetrics fm = g.getFontMetrics();
|
||||
|
||||
// Calculate x-coordinate based on string length and width
|
||||
int x = (w - fm.stringWidth(s)) / 2;
|
||||
g.drawString(s, x, y);
|
||||
}
|
||||
|
||||
/**
|
||||
* Needs to be called differently based on screen
|
||||
*/
|
||||
public void drawBase (Graphics g) {
|
||||
|
||||
// Moving base effect
|
||||
g.drawImage(textures.get("base").getImage(), baseCoords[0], textures.get("base").getY(), null);
|
||||
g.drawImage(textures.get("base").getImage(), baseCoords[1], textures.get("base").getY(), null);
|
||||
|
||||
}
|
||||
|
||||
////////////////
|
||||
// Menuscreen //
|
||||
////////////////
|
||||
|
||||
private void drawMenu (Graphics g) {
|
||||
|
||||
// Title
|
||||
g.drawImage(textures.get("titleText").getImage(),
|
||||
textures.get("titleText").getX(),
|
||||
textures.get("titleText").getY(), null);
|
||||
|
||||
// Buttons
|
||||
g.drawImage(textures.get("playButton").getImage(),
|
||||
textures.get("playButton").getX(),
|
||||
textures.get("playButton").getY(), null);
|
||||
g.drawImage(textures.get("leaderboard").getImage(),
|
||||
textures.get("leaderboard").getX(),
|
||||
textures.get("leaderboard").getY(), null);
|
||||
g.drawImage(textures.get("rateButton").getImage(),
|
||||
textures.get("rateButton").getX(),
|
||||
textures.get("rateButton").getY(), null);
|
||||
|
||||
// Credits :p
|
||||
drawCentered("Created by Paul Krishnamurthy", FlappyBird.WIDTH, FlappyBird.HEIGHT, 600, g);
|
||||
g.setFont(flappyMiniFont); // Change font
|
||||
drawCentered("www.PaulKr.com", FlappyBird.WIDTH, FlappyBird.HEIGHT, 630, g);
|
||||
|
||||
}
|
||||
|
||||
/////////////////
|
||||
// Game screen //
|
||||
/////////////////
|
||||
|
||||
public void startGameScreen (Graphics g) {
|
||||
|
||||
// Set bird's new position
|
||||
gameBird.setGameStartPos();
|
||||
|
||||
// Get ready text
|
||||
g.drawImage(textures.get("getReadyText").getImage(),
|
||||
textures.get("getReadyText").getX(),
|
||||
textures.get("getReadyText").getY(), null);
|
||||
|
||||
// Instructions image
|
||||
g.drawImage(textures.get("instructions").getImage(),
|
||||
textures.get("instructions").getX(),
|
||||
textures.get("instructions").getY(), null);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Aligns and draws score using image textures
|
||||
*
|
||||
* @param mini Boolean for drawing small or large numbers
|
||||
* @param x X-coordinate to draw for mini numbers
|
||||
*/
|
||||
public void drawScore (Graphics g, int drawNum, boolean mini, int x, int y) {
|
||||
|
||||
// Char array of digits
|
||||
char[] digits = ("" + drawNum).toCharArray();
|
||||
|
||||
int digitCount = digits.length;
|
||||
|
||||
// Calculate width for numeric textures
|
||||
int takeUp = 0;
|
||||
for (char digit : digits) {
|
||||
|
||||
// Size to add varies based on texture
|
||||
if (mini) {
|
||||
takeUp += 18;
|
||||
} else {
|
||||
takeUp += digit == '1' ? 25 : 35;
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate x-coordinate
|
||||
int drawScoreX = mini ? (x - takeUp) : (FlappyBird.WIDTH / 2 - takeUp / 2);
|
||||
|
||||
// Draw every digit
|
||||
for (int i = 0; i < digitCount; i++) {
|
||||
g.drawImage(textures.get((mini ? "mini-score-" : "score-") + digits[i]).getImage(), drawScoreX, (mini ? y : 60), null);
|
||||
|
||||
// Size to add varies based on texture
|
||||
if (mini) {
|
||||
drawScoreX += 18;
|
||||
} else {
|
||||
drawScoreX += digits[i] == '1' ? 25 : 35;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves and repositions pipes
|
||||
*/
|
||||
public void pipeHandler (Graphics g) {
|
||||
|
||||
// Decrease distance between pipes
|
||||
if (gameBird.isAlive()) {
|
||||
pipeDistTracker --;
|
||||
}
|
||||
|
||||
// Initialize pipes as null
|
||||
Pipe topPipe = null;
|
||||
Pipe bottomPipe = null;
|
||||
|
||||
// If there is no distance,
|
||||
// a new pipe is needed
|
||||
if (pipeDistTracker < 0) {
|
||||
|
||||
// Reset distance
|
||||
pipeDistTracker = Pipe.PIPE_DISTANCE;
|
||||
|
||||
for (Pipe p : pipes) {
|
||||
|
||||
// If pipe is out of screen
|
||||
if (p.getX() < 0) {
|
||||
if (topPipe == null) {
|
||||
topPipe = p;
|
||||
topPipe.canAwardPoint = true;
|
||||
}
|
||||
else if (bottomPipe == null) {
|
||||
bottomPipe = p;
|
||||
topPipe.canAwardPoint = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pipe currentPipe; // New pipe object for top and bottom pipes
|
||||
|
||||
// Move and handle initial creation of top and bottom pipes
|
||||
|
||||
if (topPipe == null) {
|
||||
currentPipe = new Pipe("top");
|
||||
topPipe = currentPipe;
|
||||
pipes.add(topPipe);
|
||||
} else {
|
||||
topPipe.reset();
|
||||
}
|
||||
|
||||
if (bottomPipe == null) {
|
||||
currentPipe = new Pipe("bottom");
|
||||
bottomPipe = currentPipe;
|
||||
pipes.add(bottomPipe);
|
||||
|
||||
// Avoid doubling points when passing initial pipes
|
||||
bottomPipe.canAwardPoint = false;
|
||||
} else {
|
||||
bottomPipe.reset();
|
||||
}
|
||||
|
||||
// Set y-coordinate of bottom pipe based on
|
||||
// y-coordinate of top pipe
|
||||
bottomPipe.setY(topPipe.getY() + Pipe.PIPE_SPACING);
|
||||
|
||||
}
|
||||
|
||||
// Move and draw each pipe
|
||||
|
||||
for (Pipe p : pipes) {
|
||||
|
||||
// Move the pipe
|
||||
if (gameBird.isAlive()) {
|
||||
p.move();
|
||||
}
|
||||
|
||||
// Draw the top and bottom pipes
|
||||
if (p.getY() <= 0) {
|
||||
g.drawImage(textures.get("pipe-top").getImage(), p.getX(), p.getY(), null);
|
||||
} else {
|
||||
g.drawImage(textures.get("pipe-bottom").getImage(), p.getX(), p.getY(), null);
|
||||
}
|
||||
|
||||
// Check if bird hits pipes
|
||||
if (gameBird.isAlive()) {
|
||||
if (p.collide(
|
||||
gameBird.getX(),
|
||||
gameBird.getY(),
|
||||
gameBird.BIRD_WIDTH,
|
||||
gameBird.BIRD_HEIGHT
|
||||
)) {
|
||||
// Kill bird and play sound
|
||||
gameBird.kill();
|
||||
audio.hit();
|
||||
} else {
|
||||
|
||||
// Checks if bird passes a pipe
|
||||
if (gameBird.getX() >= p.getX() + p.WIDTH / 2) {
|
||||
|
||||
// Increase score and play sound
|
||||
if (p.canAwardPoint) {
|
||||
audio.point();
|
||||
score ++;
|
||||
p.canAwardPoint = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void gameOver (Graphics g) {
|
||||
|
||||
// Game over text
|
||||
g.drawImage(textures.get("gameOverText").getImage(),
|
||||
textures.get("gameOverText").getX(),
|
||||
textures.get("gameOverText").getY(), null);
|
||||
|
||||
// Scorecard
|
||||
g.drawImage(textures.get("scoreCard").getImage(),
|
||||
textures.get("scoreCard").getX(),
|
||||
textures.get("scoreCard").getY(), null);
|
||||
|
||||
// New highscore image
|
||||
if (scoreWasGreater) {
|
||||
g.drawImage(textures.get("newHighscore").getImage(),
|
||||
textures.get("newHighscore").getX(),
|
||||
textures.get("newHighscore").getY(), null);
|
||||
}
|
||||
|
||||
// Draw mini fonts for current and best scores
|
||||
drawScore(g, score, true, 303, 276);
|
||||
drawScore(g, highscore.bestScore(), true, 303, 330);
|
||||
|
||||
// Handle highscore
|
||||
if (score > highscore.bestScore()) {
|
||||
|
||||
// New best score
|
||||
scoreWasGreater = true;
|
||||
highscore.setNewBest(score); // Set in data file
|
||||
}
|
||||
|
||||
// Medal
|
||||
if (score >= 10) { medal = "bronze"; }
|
||||
if (score >= 20) { medal = "silver"; }
|
||||
if (score >= 30) { medal = "gold"; }
|
||||
if (score >= 40) { medal = "platinum"; }
|
||||
|
||||
// Only award a medal if they deserve it
|
||||
if (score > 9) {
|
||||
g.drawImage(textures.get(medal).getImage(),
|
||||
textures.get(medal).getX(),
|
||||
textures.get(medal).getY(), null);
|
||||
}
|
||||
|
||||
// Buttons
|
||||
g.drawImage(textures.get("playButton").getImage(),
|
||||
textures.get("playButton").getX(),
|
||||
textures.get("playButton").getY(), null);
|
||||
g.drawImage(textures.get("leaderboard").getImage(),
|
||||
textures.get("leaderboard").getX(),
|
||||
textures.get("leaderboard").getY(), null);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//////////////////////
|
||||
// Keyboard actions //
|
||||
//////////////////////
|
||||
|
||||
public void keyTyped (KeyEvent e) {}
|
||||
public void keyReleased (KeyEvent e) {}
|
||||
|
||||
public void keyPressed (KeyEvent e) {
|
||||
|
||||
int keyCode = e.getKeyCode();
|
||||
|
||||
if (gameState == MENU) {
|
||||
|
||||
// Start game on 'enter' key
|
||||
if (keyCode == KeyEvent.VK_ENTER) {
|
||||
gameState = GAME;
|
||||
inStartGameState = true;
|
||||
}
|
||||
|
||||
} else if (gameState == GAME && gameBird.isAlive()) {
|
||||
|
||||
if (keyCode == KeyEvent.VK_SPACE) {
|
||||
|
||||
// Exit instructions state
|
||||
if (inStartGameState) {
|
||||
inStartGameState = false;
|
||||
}
|
||||
|
||||
// Jump and play audio even if in instructions state
|
||||
gameBird.jump();
|
||||
audio.jump();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////
|
||||
// Mouse actions //
|
||||
///////////////////
|
||||
|
||||
public void mouseExited (MouseEvent e) {}
|
||||
public void mouseEntered (MouseEvent e) {}
|
||||
public void mouseReleased (MouseEvent e) {}
|
||||
public void mouseClicked (MouseEvent e) {}
|
||||
|
||||
public void mousePressed (MouseEvent e) {
|
||||
|
||||
// Save clicked point
|
||||
clickedPoint = e.getPoint();
|
||||
|
||||
if (gameState == MENU) {
|
||||
|
||||
if (isTouching(textures.get("playButton").getRect())) {
|
||||
gameState = GAME;
|
||||
inStartGameState = true;
|
||||
|
||||
} else if (isTouching(textures.get("leaderboard").getRect())) {
|
||||
|
||||
// Dummy message
|
||||
JOptionPane.showMessageDialog(this,
|
||||
"We can't access the leaderboard right now!",
|
||||
"Oops!",
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
|
||||
if (gameBird.isAlive()) {
|
||||
|
||||
if (isTouching(textures.get("rateButton").getRect())) {
|
||||
Helper.openURL("http://paulkr.com"); // Open website
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else if (gameState == GAME) {
|
||||
|
||||
if (gameBird.isAlive()) {
|
||||
|
||||
// Allow jump with clicks
|
||||
if (inStartGameState) {
|
||||
inStartGameState = false;
|
||||
}
|
||||
|
||||
// Jump and play sound
|
||||
gameBird.jump();
|
||||
audio.jump();
|
||||
|
||||
} else {
|
||||
|
||||
// On game over screen, allow restart and leaderboard buttons
|
||||
if (isTouching(textures.get("playButton").getRect())) {
|
||||
inStartGameState = true;
|
||||
gameState = GAME;
|
||||
restart();
|
||||
gameBird.setGameStartPos();
|
||||
|
||||
} else if (isTouching(textures.get("leaderboard").getRect())) {
|
||||
|
||||
// Dummy message
|
||||
JOptionPane.showMessageDialog(this,
|
||||
"We can't access the leaderboard right now!",
|
||||
"Oops!",
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,31 @@
|
||||
package com.example.flappybird; /**
|
||||
* Helper.java
|
||||
* Helper class with various tools
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import java.awt.Desktop;
|
||||
import java.net.URI;
|
||||
|
||||
public class Helper {
|
||||
|
||||
/**
|
||||
* Tries to open url in default web browser
|
||||
*
|
||||
* @param url Destination URL
|
||||
*/
|
||||
public static void openURL (String url) {
|
||||
|
||||
try {
|
||||
if (Desktop.isDesktopSupported()) {
|
||||
Desktop.getDesktop().browse(new URI(url));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("Sorry could not open URL...");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,83 @@
|
||||
package com.example.flappybird; /**
|
||||
* Highscore.java
|
||||
* Handles setting and getting highscores
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Scanner;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
|
||||
public class Highscore {
|
||||
|
||||
// Read / Write to file setup
|
||||
private static final String FILE_PATH = "/res/data/highscore.dat";
|
||||
|
||||
private static URL dataURL = Highscore.class.getResource(FILE_PATH);
|
||||
private static File dataFile;
|
||||
|
||||
static {
|
||||
try {
|
||||
dataFile = Paths.get(dataURL.toURI()).toFile();
|
||||
} catch (URISyntaxException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static Scanner dataScanner = null;
|
||||
private static PrintWriter dataWriter = null;
|
||||
|
||||
// Highscore
|
||||
private int bestScore;
|
||||
|
||||
public Highscore () {
|
||||
|
||||
// Load scanner with data file
|
||||
try {
|
||||
dataScanner = new Scanner(dataFile);
|
||||
} catch (IOException e) {
|
||||
System.out.println("Cannot load highscore!");
|
||||
}
|
||||
|
||||
// Store highscore
|
||||
bestScore = Integer.parseInt(dataScanner.nextLine());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Player's highscore
|
||||
*/
|
||||
public int bestScore () {
|
||||
return bestScore;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets new highscore in the data file
|
||||
*
|
||||
* @param newBest New score update
|
||||
*/
|
||||
public void setNewBest (int newBest) {
|
||||
|
||||
// Set new best score
|
||||
bestScore = newBest;
|
||||
|
||||
try {
|
||||
// Write new highscore to data file
|
||||
dataWriter = new PrintWriter(FILE_PATH, "UTF-8");
|
||||
dataWriter.println(Integer.toString(newBest));
|
||||
dataWriter.close();
|
||||
} catch (FileNotFoundException | UnsupportedEncodingException e) {
|
||||
System.out.println("Could not set new highscore!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,99 @@
|
||||
package com.example.flappybird;
|
||||
|
||||
/**
|
||||
* Pipe.java
|
||||
* Handles collisions and rendering for pipes
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
public class Pipe {
|
||||
|
||||
// Pipe coordinates
|
||||
private int x = FlappyBird.WIDTH + 5;
|
||||
private int y;
|
||||
|
||||
// Placement (top or bottom) of pipe
|
||||
String location;
|
||||
|
||||
// Pipe constants
|
||||
public static final int WIDTH = 67;
|
||||
public static final int HEIGHT = 416;
|
||||
public static final int PIPE_DISTANCE = 150; // Horizontal distance between pipes
|
||||
public static final int PIPE_SPACING = HEIGHT + 170; // Vertical distance between pipes
|
||||
private static final int SPEED = -2;
|
||||
|
||||
// If the bird can get a point passing this pipe
|
||||
public boolean canAwardPoint = true;
|
||||
|
||||
public Pipe (String location) {
|
||||
this.location = location;
|
||||
reset();
|
||||
}
|
||||
|
||||
public void reset () {
|
||||
x = FlappyBird.WIDTH + 5; // Reset x-coordinate
|
||||
|
||||
// Set boundaries for top pipes
|
||||
// This y-coordinte + PIPE_SPACING will be for the bottom pipe
|
||||
if (location.equals("top")) {
|
||||
y = - Math.max((int) (Math.random() * 320) + 30, 140);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the pipe
|
||||
*/
|
||||
public void move () {
|
||||
x += SPEED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks for bird colliding with pipe
|
||||
*
|
||||
* @param nX Bird x-coordinate
|
||||
* @param nY Bird y-coordinate
|
||||
* @param nW Bird width
|
||||
* @param nH Bird height
|
||||
* @return If bird is colliding with the pipe
|
||||
*/
|
||||
public boolean collide (int nX, int nY, int nW, int nH) {
|
||||
|
||||
// Do not allow bird to jump over pipe
|
||||
if (nX > x && nY < 0 && canAwardPoint) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return nX < x + WIDTH &&
|
||||
nX + nW > x &&
|
||||
nY < y + HEIGHT &&
|
||||
nY + nH > y;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Pipe's x-coordinate
|
||||
*/
|
||||
public int getX () {
|
||||
return x;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Pipe's y-coordinate
|
||||
*/
|
||||
public int getY () {
|
||||
return y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set's pipe's y-coordinate (for bottom pipes)
|
||||
*
|
||||
* @param newY New y-coordinate
|
||||
*/
|
||||
public void setY (int newY) {
|
||||
y = newY;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,135 @@
|
||||
package com.example.flappybird; /**
|
||||
* Sprites.java
|
||||
* Cuts up the main sprite sheet
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.Graphics2D;
|
||||
import java.io.IOException;
|
||||
import java.io.File;
|
||||
import javax.imageio.ImageIO;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class Sprites {
|
||||
|
||||
// Resize factor to match frame size
|
||||
private static final double RESIZE_FACTOR = 2.605;
|
||||
|
||||
private static BufferedImage spriteSheet = null;
|
||||
|
||||
// HashMap of texture objects
|
||||
private static HashMap<String, Texture> textures = new HashMap<String, Texture>();
|
||||
|
||||
public Sprites () {
|
||||
|
||||
// Try to load sprite sheet, exit program if cannot
|
||||
|
||||
try {
|
||||
spriteSheet = ImageIO.read(this.getClass().getResource("/res/img/spriteSheet.png"));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("Could not load sprite sheet.");
|
||||
System.exit(-1); // Exit program if file could not be found
|
||||
return;
|
||||
}
|
||||
|
||||
// Backgrounds
|
||||
textures.put("background1", new Texture(resize(spriteSheet.getSubimage(0, 0, 144, 256)), 0, 0));
|
||||
textures.put("background2", new Texture(resize(spriteSheet.getSubimage(146, 0, 144, 256)), 0, 0));
|
||||
|
||||
// Pipes
|
||||
textures.put("pipe-top", new Texture(resize(spriteSheet.getSubimage(56, 323, 26, 160)), 0, 0));
|
||||
textures.put("pipe-bottom", new Texture(resize(spriteSheet.getSubimage(84, 323, 26, 160)), 0, 0));
|
||||
|
||||
// Birds
|
||||
textures.put("yellowBird1", new Texture(resize(spriteSheet.getSubimage(31, 491, 17, 12)), 172, 250));
|
||||
textures.put("yellowBird2", new Texture(resize(spriteSheet.getSubimage(59, 491, 17, 12)), 172, 250));
|
||||
textures.put("yellowBird3", new Texture(resize(spriteSheet.getSubimage(3, 491, 17, 12)), 172, 250));
|
||||
|
||||
textures.put("blueBird1", new Texture(resize(spriteSheet.getSubimage(115, 329, 17, 12)), 172, 250));
|
||||
textures.put("blueBird2", new Texture(resize(spriteSheet.getSubimage(115, 355, 17, 12)), 172, 250));
|
||||
textures.put("blueBird3", new Texture(resize(spriteSheet.getSubimage(87, 491, 17, 12)), 172, 250));
|
||||
|
||||
textures.put("redBird1", new Texture(resize(spriteSheet.getSubimage(115, 407, 17, 12)), 172, 250));
|
||||
textures.put("redBird2", new Texture(resize(spriteSheet.getSubimage(115, 433, 17, 12)), 172, 250));
|
||||
textures.put("redBird3", new Texture(resize(spriteSheet.getSubimage(115, 381, 17, 12)), 172, 250));
|
||||
|
||||
// Buttons
|
||||
textures.put("playButton", new Texture(resize(spriteSheet.getSubimage(354, 118, 52, 29)), 34, 448));
|
||||
textures.put("leaderboard", new Texture(resize(spriteSheet.getSubimage(414, 118, 52, 29)), 203, 448));
|
||||
textures.put("rateButton", new Texture(resize(spriteSheet.getSubimage(465, 1, 31, 18)), 147, 355));
|
||||
|
||||
// Helpful / Text
|
||||
textures.put("newHighscore", new Texture(resize(spriteSheet.getSubimage(112, 501, 16, 7)), 210, 305));
|
||||
textures.put("titleText", new Texture(resize(spriteSheet.getSubimage(351, 91, 89, 24)), 72, 100));
|
||||
textures.put("getReadyText", new Texture(resize(spriteSheet.getSubimage(295, 59, 92, 25)), 68, 180));
|
||||
textures.put("gameOverText", new Texture(resize(spriteSheet.getSubimage(395, 59, 96, 21)), 62, 100));
|
||||
textures.put("instructions", new Texture(resize(spriteSheet.getSubimage(292, 91, 57, 49)), 113, 300));
|
||||
|
||||
// SCORE IMAGES
|
||||
|
||||
// Large numbers
|
||||
textures.put("score-0", new Texture(resize(spriteSheet.getSubimage(496, 60, 12, 18)), 0, 0));
|
||||
textures.put("score-1", new Texture(resize(spriteSheet.getSubimage(136, 455, 8, 18)), 0, 0));
|
||||
|
||||
int score = 2;
|
||||
for (int i = 292; i < 335; i += 14) {
|
||||
textures.put("score-" + score, new Texture(resize(spriteSheet.getSubimage(i, 160, 12, 18)), 0, 0));
|
||||
textures.put("score-" + (score + 4), new Texture(resize(spriteSheet.getSubimage(i, 184, 12, 18)), 0, 0));
|
||||
score++;
|
||||
}
|
||||
|
||||
// Mini numbers
|
||||
score = 0;
|
||||
for (int i = 323; score < 10; i += 9) {
|
||||
textures.put("mini-score-" + score, new Texture(resize(spriteSheet.getSubimage(138, i, 10, 7)), 0, 0));
|
||||
score ++;
|
||||
if (score % 2 == 0) { i += 8; }
|
||||
}
|
||||
|
||||
// Medals
|
||||
textures.put("bronze", new Texture(resize(spriteSheet.getSubimage(112, 477, 22, 22)), 73, 285));
|
||||
textures.put("silver", new Texture(resize(spriteSheet.getSubimage(112, 453, 22, 22)), 73, 285));
|
||||
textures.put("gold", new Texture(resize(spriteSheet.getSubimage(121, 282, 22, 22)), 73, 285));
|
||||
textures.put("platinum", new Texture(resize(spriteSheet.getSubimage(121, 258, 22, 22)), 73, 285));
|
||||
|
||||
// Other assets
|
||||
textures.put("base", new Texture(resize(spriteSheet.getSubimage(292, 0, 168, 56)), 0, 521));
|
||||
textures.put("scoreCard", new Texture(resize(spriteSheet.getSubimage(3, 259, 113, 57)), 40, 230));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Resizes a BufferedImage
|
||||
*
|
||||
* @param image BufferedImage object
|
||||
* @return New resized image
|
||||
*/
|
||||
private static BufferedImage resize (BufferedImage image) {
|
||||
|
||||
// New width and height
|
||||
int newWidth = (int) (image.getWidth() * RESIZE_FACTOR);
|
||||
int newHeight = (int) (image.getHeight() * RESIZE_FACTOR);
|
||||
|
||||
// Create new BufferedImage with updated width and height
|
||||
BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g = resizedImage.createGraphics();
|
||||
g.drawImage(image, 0, 0, newWidth, newHeight, null);
|
||||
g.dispose();
|
||||
|
||||
return resizedImage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Public getter method for Textures HashMap
|
||||
*
|
||||
* @return Texture
|
||||
*/
|
||||
public HashMap<String, Texture> getGameTextures () {
|
||||
return textures;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,57 @@
|
||||
package com.example.flappybird; /**
|
||||
* Texture.java
|
||||
* Stores data for game textures
|
||||
*
|
||||
* @author Paul Krishnamurthy
|
||||
*/
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.Rectangle;
|
||||
|
||||
public class Texture {
|
||||
|
||||
// Image attributes
|
||||
private BufferedImage image;
|
||||
private int x, y, width, height;
|
||||
private Rectangle rect;
|
||||
|
||||
|
||||
public Texture (BufferedImage image, int x, int y) {
|
||||
this.image = image;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.width = image.getWidth();
|
||||
this.height = image.getHeight();
|
||||
this.rect = new Rectangle(x, y, width, height);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// Public getter methods for image attributes //
|
||||
////////////////////////////////////////////////
|
||||
|
||||
public BufferedImage getImage () {
|
||||
return image;
|
||||
}
|
||||
|
||||
public int getX () {
|
||||
return x;
|
||||
}
|
||||
|
||||
public int getY () {
|
||||
return y;
|
||||
}
|
||||
|
||||
public int getWidth () {
|
||||
return width;
|
||||
}
|
||||
|
||||
public int getHeight () {
|
||||
return height;
|
||||
}
|
||||
|
||||
public Rectangle getRect () {
|
||||
return rect;
|
||||
}
|
||||
|
||||
}
|
||||
|
3
refactoring/flappy-bird/src/main/java/module-info.java
Normal file
3
refactoring/flappy-bird/src/main/java/module-info.java
Normal file
@@ -0,0 +1,3 @@
|
||||
module com.example.flappybirdrefactoring {
|
||||
requires java.desktop;
|
||||
}
|
@@ -0,0 +1 @@
|
||||
2
|
Binary file not shown.
BIN
refactoring/flappy-bird/src/main/resources/res/img/icon.png
Normal file
BIN
refactoring/flappy-bird/src/main/resources/res/img/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
BIN
refactoring/flappy-bird/src/main/resources/res/sound/hit.wav
Normal file
BIN
refactoring/flappy-bird/src/main/resources/res/sound/hit.wav
Normal file
Binary file not shown.
BIN
refactoring/flappy-bird/src/main/resources/res/sound/jump.wav
Normal file
BIN
refactoring/flappy-bird/src/main/resources/res/sound/jump.wav
Normal file
Binary file not shown.
BIN
refactoring/flappy-bird/src/main/resources/res/sound/point.wav
Normal file
BIN
refactoring/flappy-bird/src/main/resources/res/sound/point.wav
Normal file
Binary file not shown.
Reference in New Issue
Block a user