extends SpaceInvadersLevel with a ZigZack move of the enemies in
+ Level3.createSingleEnemy(String, double, double, double, double, ObjectController, double) and
+ sets a different Level3.getStartupMessage().
Main class starting any game, contains main(). Apart from that, this class manages all
+ non-logical functionalities which should be hidden from a game designer like:
+
+
Setting up windows, panels, buttons, action callbacks, ...
+
Reading keyboard inputs
+
Redrawing game window if necessary
+
managing the game time and calling the appropriate GameObject or Playground
+ methods periodically, at every time step of the game.
+
+ There will normally never be a need to modify this file, a designer/game programmer should always
+ redefine the GameObject and Playground classes and implement new functionality
+ there. To make a long story short
main to start the whole application.
+ initializes the levels ArrayList of Playground instances (levels) to be played with one level SpaceInvadersLevel in constructor of GameLoop().
+
+
Parameters:
+
args - Java default command line args, forwarded to runGame(String[])
+
Throws:
+
IOException - in case highscore.txt cannot be written.
public class CollisionAwareEgoController
+extends EgoController
+
An EgoController which cannot move through obstacle objects (is collission aware). Only respects
+ GameObjects that have the String 'obstacle' in their name.
Is called once every game time step by the game itself. NEVER call this directly, not
+ necessary!
+ The method can do whatever it likes, including nothing. The attribute ObjectController.gameObject
+ contains a reference to the controlled object, which allows access to the Playground the object
+ belongs to (useful for getting the pixel size in x and y of the playing field.
+ Recommended: when implementing this method, call at the end
+ ObjectController.applySpeedVector() method. This is a helper method that sets the new x,y coordinates
+ for the ObjectController.gameObject correctly.
Is called once every game time step by the game itself. NEVER call this directly, not
+ necessary!
+ The method can do whatever it likes, including nothing. The attribute ObjectController.gameObject
+ contains a reference to the controlled object, which allows access to the Playground the object
+ belongs to (useful for getting the pixel size in x and y of the playing field.
+ Recommended: when implementing this method, call at the end
+ ObjectController.applySpeedVector() method. This is a helper method that sets the new x,y coordinates
+ for the ObjectController.gameObject correctly.
Is called once every game time step by the game itself. NEVER call this directly, not
+ necessary!
+ The method can do whatever it likes, including nothing. The attribute ObjectController.gameObject
+ contains a reference to the controlled object, which allows access to the Playground the object
+ belongs to (useful for getting the pixel size in x and y of the playing field.
+ Recommended: when implementing this method, call at the end
+ ObjectController.applySpeedVector() method. This is a helper method that sets the new x,y coordinates
+ for the ObjectController.gameObject correctly.
Is called once every game time step by the game itself. NEVER call this directly, not
+ necessary!
+ The method can do whatever it likes, including nothing. The attribute ObjectController.gameObject
+ contains a reference to the controlled object, which allows access to the Playground the object
+ belongs to (useful for getting the pixel size in x and y of the playing field.
+ Recommended: when implementing this method, call at the end
+ ObjectController.applySpeedVector() method. This is a helper method that sets the new x,y coordinates
+ for the ObjectController.gameObject correctly.
public abstract class ObjectController
+extends Object
+
Class that controls the LOGICAL behavior of an object independently of how it is displayed or
+ drawn. The most important method here is updateObject(): this method is, by various
+ indirections, called exactly once per game time step for every object that is on the playground.
+ It has, by virtue of the member variables gameObject full access to
+
+
the object it is controlling
+
the playground this object belongs to
+
+ Typically, updateObject would check whether an object leaves the screen to react appropriately.
+ In that case the object can be marked for deletion (by adding it to the flag "deleted" that is
+ always defined for any playground), but of course other reactions are possible like rebounding,
+ emerging on the other side, ...
Is called once every game time step by the game itself. NEVER call this directly, not
+ necessary!
+ The method can do whatever it likes, including nothing. The attribute gameObject
+ contains a reference to the controlled object, which allows access to the Playground the object
+ belongs to (useful for getting the pixel size in x and y of the playing field.
+ Recommended: when implementing this method, call at the end
+ applySpeedVector() method. This is a helper method that sets the new x,y coordinates
+ for the gameObject correctly.
+
+
+
+
+
applySpeedVector
+
publicvoidapplySpeedVector()
+
Convenience method: simply moves the object forward one step from its present position, using
+ its present speed.
Is called once every game time step by the game itself. NEVER call this directly, not
+ necessary!
+ The method can do whatever it likes, including nothing. The attribute ObjectController.gameObject
+ contains a reference to the controlled object, which allows access to the Playground the object
+ belongs to (useful for getting the pixel size in x and y of the playing field.
+ Recommended: when implementing this method, call at the end
+ ObjectController.applySpeedVector() method. This is a helper method that sets the new x,y coordinates
+ for the ObjectController.gameObject correctly.
Is called once every game time step by the game itself. NEVER call this directly, not
+ necessary!
+ The method can do whatever it likes, including nothing. The attribute ObjectController.gameObject
+ contains a reference to the controlled object, which allows access to the Playground the object
+ belongs to (useful for getting the pixel size in x and y of the playing field.
+ Recommended: when implementing this method, call at the end
+ ObjectController.applySpeedVector() method. This is a helper method that sets the new x,y coordinates
+ for the ObjectController.gameObject correctly.
The controller package contains Object controllers that govern an objects behavior, without being
+ involved in its collision or drawing properties. Object controllers react to user actions/inputs
+ and govern for example the movement of GameObject instances. They can access
+ their parent objects' properties and, by indirection, the properties and methods of the
+ associated level.
+ Controllers should be designed in such a way that they implement behavior that is
+ level-independent. All level-dependent behavior should be implemented in
+ Playground.applyGameLogic().
The class GameObject represents a (possibly animated) object appearing in a level of the
+ game. It is therefore attached to an instance of the class Playground. A GameObject has
+ at least the following properties:
+
+
2D screen position
+
2D speed
+
a name that is unique within a certain Playground
+
a reference to the Playground object it belongs to
+
a reference to an instance of ObjectController that handles the movement
+ logic of the object
+
a (circular) radius for simple collision checking. This may be handled differently in
+ subclasses
+
+ The main task of GameObject, or its subclasses, is to draw the object on the screen, which is
+ handles by the draw(Graphics2D) method. It is this method that must be redefined if a
+ new appearance should be realized. For introducing new behavior, it is sufficient to supply a
+ different ObjectController instance when constructing a GameObject.
Collision detection implemented by iteration through the own list of Collider
+ and calling their Collider.collidesWith(Collider) method to check collision
+ with the given parameter instance of other GameObject.
Collision detection implemented by iteration through the own list of Collider
+ and calling their Collider.collidesWith(Collider) method to check collision
+ with the given parameter instance of other GameObject.
+
+
Parameters:
+
other - instance of the other GameObject to check collision with
+
Returns:
+
true if collision is detected, false otherwise
+
+
+
+
+
+
updateObject
+
publicvoidupdateObject()
+
triggers this GameObjects own controller (if set) to update the object.
A rectangle object.
+ If generateColliders() is called, it generates a RectCollider with id-prefix
+ "shotcollider_" and registers it for this RectObject.
+
+
+
+
+
+
+
Field Summary
+
+
Fields inherited from class gameobjects.GameObject
generates a new RectCollider with id-prefix "shotcollider_" and registers it for 'this'
+ [@link RectObject}. The RectCollider uses the same dimensions (width and height) as this RectObject.
Convenience Class subclassing GameObject, directly instanciating TextArtist a
+ subclass of Artist that draws a text. The controller is left undefined, the collider as
+ well. However, a single call to the overwritten method generateColliders() will in fact
+ generate a RectCollider of just the right size for the text.
+
+
+
+
+
+
+
Field Summary
+
+
Fields inherited from class gameobjects.GameObject
Collision detection implemented by iteration through the own list of Collider
+ and calling their Collider.collidesWith(Collider) method to check collision
+ with the given parameter instance of other GameObject.
+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces
+
+
Search
+
You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API, using some or all of the name, optionally using "camelCase" abbreviations. For example:
+
+
j.l.obj will match "java.lang.Object"
+
InpStr will match "java.io.InputStream"
+
HM.cK will match "java.util.HashMap.containsKey(Object)"
+The following sections describe the different kinds of pages in this collection.
+
+
Overview
+
The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.
+
+
+
Package
+
Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:
+
+
Interfaces
+
Classes
+
Enums
+
Exceptions
+
Errors
+
Annotation Types
+
+
+
+
Class or Interface
+
Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.
+
+
Class Inheritance Diagram
+
Direct Subclasses
+
All Known Subinterfaces
+
All Known Implementing Classes
+
Class or Interface Declaration
+
Class or Interface Description
+
+
+
+
Nested Class Summary
+
Enum Constant Summary
+
Field Summary
+
Property Summary
+
Constructor Summary
+
Method Summary
+
Required Element Summary
+
Optional Element Summary
+
+
+
+
Enum Constant Details
+
Field Details
+
Property Details
+
Constructor Details
+
Method Details
+
Element Details
+
+
Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.
+
The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+
+
+
Other Files
+
Packages and modules may contain pages with additional information related to the declarations nearby.
+
+
+
Use
+
Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the USE link in the navigation bar.
+
+
+
Tree (Class Hierarchy)
+
There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.
+
+
When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
+
When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
The All Packages page contains an alphabetic index of all packages contained in the documentation.
+
+
+
All Classes and Interfaces
+
The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.
+
+
+
Index
+
The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.
+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
applies the logic of the level: For now, this is just about deleting shots that are leaving the
+ screen and calling methods 'actionIf..' in case objects collide.
extends SpaceInvadersLevel with a ZigZack move of the enemies in
+ Level3.createSingleEnemy(String, double, double, double, double, ObjectController, double) and
+ sets a different Level3.getStartupMessage().
Collision detection implemented by iteration through the own list of Collider
+ and calling their Collider.collidesWith(Collider) method to check collision
+ with the given parameter instance of other GameObject.
+
+
diff --git a/doc/jquery-ui.overrides.css b/doc/jquery-ui.overrides.css
new file mode 100644
index 0000000..f89acb6
--- /dev/null
+++ b/doc/jquery-ui.overrides.css
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active,
+a.ui-button:active,
+.ui-button:active,
+.ui-button.ui-state-active:hover {
+ /* Overrides the color of selection used in jQuery UI */
+ background: #F8981D;
+}
diff --git a/doc/legal/ADDITIONAL_LICENSE_INFO b/doc/legal/ADDITIONAL_LICENSE_INFO
new file mode 100644
index 0000000..b62cc3e
--- /dev/null
+++ b/doc/legal/ADDITIONAL_LICENSE_INFO
@@ -0,0 +1 @@
+Please see ..\java.base\ADDITIONAL_LICENSE_INFO
diff --git a/doc/legal/ASSEMBLY_EXCEPTION b/doc/legal/ASSEMBLY_EXCEPTION
new file mode 100644
index 0000000..0d4cfb4
--- /dev/null
+++ b/doc/legal/ASSEMBLY_EXCEPTION
@@ -0,0 +1 @@
+Please see ..\java.base\ASSEMBLY_EXCEPTION
diff --git a/doc/legal/LICENSE b/doc/legal/LICENSE
new file mode 100644
index 0000000..4ad9fe4
--- /dev/null
+++ b/doc/legal/LICENSE
@@ -0,0 +1 @@
+Please see ..\java.base\LICENSE
diff --git a/doc/legal/jquery.md b/doc/legal/jquery.md
new file mode 100644
index 0000000..8054a34
--- /dev/null
+++ b/doc/legal/jquery.md
@@ -0,0 +1,72 @@
+## jQuery v3.5.1
+
+### jQuery License
+```
+jQuery v 3.5.1
+Copyright JS Foundation and other contributors, https://js.foundation/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************
+
+The jQuery JavaScript Library v3.5.1 also includes Sizzle.js
+
+Sizzle.js includes the following license:
+
+Copyright JS Foundation and other contributors, https://js.foundation/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/sizzle
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+*********************
+
+```
diff --git a/doc/legal/jqueryUI.md b/doc/legal/jqueryUI.md
new file mode 100644
index 0000000..8031bdb
--- /dev/null
+++ b/doc/legal/jqueryUI.md
@@ -0,0 +1,49 @@
+## jQuery UI v1.12.1
+
+### jQuery UI License
+```
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-ui
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code contained within the demos directory.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+```
diff --git a/doc/member-search-index.js b/doc/member-search-index.js
new file mode 100644
index 0000000..c04a9e7
--- /dev/null
+++ b/doc/member-search-index.js
@@ -0,0 +1 @@
+memberSearchIndex = [{"p":"ui","c":"GameUI","l":"ACTION_ABOUT"},{"p":"ui","c":"GameUI","l":"ACTION_BUTTON"},{"p":"ui","c":"GameUI","l":"ACTION_LOAD"},{"p":"ui","c":"GameUI","l":"ACTION_NEW"},{"p":"ui","c":"GameUI","l":"ACTION_PAUSE"},{"p":"ui","c":"GameUI","l":"ACTION_QUIT"},{"p":"ui","c":"GameUI","l":"ACTION_RESET"},{"p":"ui","c":"GameUI","l":"ACTION_SAVE"},{"p":"ui","c":"GameUI","l":"actionPerformed(ActionEvent)","u":"actionPerformed(java.awt.event.ActionEvent)"},{"p":"gameobjects","c":"GameObject","l":"addArtist(Artist)","u":"addArtist(rendering.Artist)"},{"p":"gameobjects","c":"GameObject","l":"addCollider(Collider)","u":"addCollider(collider.Collider)"},{"p":"gameobjects","c":"GameObject","l":"addController(ObjectController)","u":"addController(controller.ObjectController)"},{"p":"playground","c":"Playground","l":"addObject(GameObject)","u":"addObject(gameobjects.GameObject)"},{"p":"playground","c":"Playground","l":"addObjectNow(GameObject)","u":"addObjectNow(gameobjects.GameObject)"},{"p":"gameobjects","c":"AnimatedGameobject","l":"AnimatedGameobject(String, Playground, double, double, double, double, double, Animation, double, String)","u":"%3Cinit%3E(java.lang.String,playground.Playground,double,double,double,double,double,playground.Animation,double,java.lang.String)"},{"p":"playground","c":"Animation","l":"Animation(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"rendering","c":"AnimationArtist","l":"AnimationArtist(GameObject, Animation, double, String, double)","u":"%3Cinit%3E(gameobjects.GameObject,playground.Animation,double,java.lang.String,double)"},{"p":"playground","c":"Playground","l":"applyGameLogic()"},{"p":"playground","c":"SpaceInvadersLevel","l":"applyGameLogic()"},{"p":"controller","c":"ObjectController","l":"applySpeedVector()"},{"p":"collider","c":"CircleCollider","l":"checkCollisionCircCirc(Collider)","u":"checkCollisionCircCirc(collider.Collider)"},{"p":"collider","c":"RectCollider","l":"checkCollisionRectCirc(Collider)","u":"checkCollisionRectCirc(collider.Collider)"},{"p":"collider","c":"RectCollider","l":"checkCollisionRectRect(Collider)","u":"checkCollisionRectRect(collider.Collider)"},{"p":"rendering","c":"CircleArtist","l":"CircleArtist(GameObject)","u":"%3Cinit%3E(gameobjects.GameObject)"},{"p":"rendering","c":"CircleArtist","l":"CircleArtist(GameObject, double, Color)","u":"%3Cinit%3E(gameobjects.GameObject,double,java.awt.Color)"},{"p":"collider","c":"CircleCollider","l":"CircleCollider(String, GameObject, double)","u":"%3Cinit%3E(java.lang.String,gameobjects.GameObject,double)"},{"p":"playground","c":"HighscoreManager","l":"closeFile()"},{"p":"playground","c":"Playground","l":"collectObjects(String, boolean)","u":"collectObjects(java.lang.String,boolean)"},{"p":"collider","c":"Collider","l":"Collider(String, GameObject)","u":"%3Cinit%3E(java.lang.String,gameobjects.GameObject)"},{"p":"collider","c":"CircleCollider","l":"collidesWith(Collider)","u":"collidesWith(collider.Collider)"},{"p":"collider","c":"Collider","l":"collidesWith(Collider)","u":"collidesWith(collider.Collider)"},{"p":"collider","c":"RectCollider","l":"collidesWith(Collider)","u":"collidesWith(collider.Collider)"},{"p":"controller","c":"CollisionAwareEgoController","l":"CollisionAwareEgoController(double)","u":"%3Cinit%3E(double)"},{"p":"controller","c":"CollisionAwareEgoController","l":"CollisionAwareEgoController(double, File)","u":"%3Cinit%3E(double,java.io.File)"},{"p":"gameobjects","c":"GameObject","l":"collisionDetection(GameObject)","u":"collisionDetection(gameobjects.GameObject)"},{"p":"playground","c":"Playground","l":"deleteObject(String)","u":"deleteObject(java.lang.String)"},{"p":"playground","c":"Playground","l":"deleteObjectNow(String)","u":"deleteObjectNow(java.lang.String)"},{"p":"gameobjects","c":"GameObject","l":"draw(Graphics2D)","u":"draw(java.awt.Graphics2D)"},{"p":"rendering","c":"AnimationArtist","l":"draw(Graphics2D)","u":"draw(java.awt.Graphics2D)"},{"p":"rendering","c":"Artist","l":"draw(Graphics2D)","u":"draw(java.awt.Graphics2D)"},{"p":"rendering","c":"CircleArtist","l":"draw(Graphics2D)","u":"draw(java.awt.Graphics2D)"},{"p":"rendering","c":"RectArtist","l":"draw(Graphics2D)","u":"draw(java.awt.Graphics2D)"},{"p":"rendering","c":"TextArtist","l":"draw(Graphics2D)","u":"draw(java.awt.Graphics2D)"},{"p":"controller","c":"EgoController","l":"EgoController(double)","u":"%3Cinit%3E(double)"},{"p":"controller","c":"EgoController","l":"EgoController(double, double)","u":"%3Cinit%3E(double,double)"},{"p":"gameobjects","c":"EgoObject","l":"EgoObject(String, Playground, double, double, double, double, double)","u":"%3Cinit%3E(java.lang.String,playground.Playground,double,double,double,double,double)"},{"p":"playground","c":"SpaceInvadersLevel","l":"EGOSPEED"},{"p":"controller","c":"EnemyController","l":"EnemyController()","u":"%3Cinit%3E()"},{"p":"gameobjects","c":"FallingStar","l":"FallingStar(String, Playground, double, double, double, double, Color, double)","u":"%3Cinit%3E(java.lang.String,playground.Playground,double,double,double,double,java.awt.Color,double)"},{"p":"controller","c":"FallingStarController","l":"FallingStarController()","u":"%3Cinit%3E()"},{"p":"playground","c":"Animation","l":"fileList"},{"p":"playground","c":"Playground","l":"FLAGS_ALL"},{"p":"playground","c":"Playground","l":"FLAGS_GLOBAL"},{"p":"playground","c":"Playground","l":"FLAGS_LEVEL"},{"p":"base","c":"GameLoop","l":"GameLoop()","u":"%3Cinit%3E()"},{"p":"gameobjects","c":"GameObject","l":"GameObject(String, Playground, double, double, double, double)","u":"%3Cinit%3E(java.lang.String,playground.Playground,double,double,double,double)"},{"p":"gameobjects","c":"GameObject","l":"GameObject(String, Playground, ObjectController, double, double, double, double)","u":"%3Cinit%3E(java.lang.String,playground.Playground,controller.ObjectController,double,double,double,double)"},{"p":"playground","c":"Playground","l":"gameOver()"},{"p":"playground","c":"SpaceInvadersLevel","l":"gameOver()"},{"p":"ui","c":"GameUI","l":"GameUI(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"gameobjects","c":"AnimatedGameobject","l":"generateColliders()"},{"p":"gameobjects","c":"EgoObject","l":"generateColliders()"},{"p":"gameobjects","c":"GameObject","l":"generateColliders()"},{"p":"gameobjects","c":"RectObject","l":"generateColliders()"},{"p":"gameobjects","c":"TextObject","l":"generateColliders()"},{"p":"ui","c":"GameUI","l":"getCurrentKey()"},{"p":"playground","c":"Animation","l":"getFileList()"},{"p":"gameobjects","c":"GameObject","l":"getGameTime()"},{"p":"playground","c":"Playground","l":"getGameTime()"},{"p":"rendering","c":"Artist","l":"getGameTime()"},{"p":"playground","c":"Playground","l":"getGlobalFlag(String)","u":"getGlobalFlag(java.lang.String)"},{"p":"rendering","c":"AnimationArtist","l":"getH()"},{"p":"gameobjects","c":"RectObject","l":"getHeight()"},{"p":"collider","c":"Collider","l":"getId()"},{"p":"gameobjects","c":"GameObject","l":"getId()"},{"p":"playground","c":"Animation","l":"getImageList()"},{"p":"playground","c":"Playground","l":"getKeyEvents()"},{"p":"ui","c":"GameUI","l":"getKeyEvents()"},{"p":"playground","c":"Playground","l":"getLevelFlag(String)","u":"getLevelFlag(java.lang.String)"},{"p":"playground","c":"Playground","l":"getMouseEvents()"},{"p":"ui","c":"GameUI","l":"getMouseEvents()"},{"p":"ui","c":"GameUI","l":"getNewAction()"},{"p":"playground","c":"Playground","l":"getObject(String)","u":"getObject(java.lang.String)"},{"p":"gameobjects","c":"GameObject","l":"getObjectController()"},{"p":"gameobjects","c":"GameObject","l":"getObjectFlag(String)","u":"getObjectFlag(java.lang.String)"},{"p":"playground","c":"Playground","l":"getOrCreateGlobalFlag(String, Object)","u":"getOrCreateGlobalFlag(java.lang.String,java.lang.Object)"},{"p":"playground","c":"Playground","l":"getOrCreateLevelFlag(String, Object)","u":"getOrCreateLevelFlag(java.lang.String,java.lang.Object)"},{"p":"gameobjects","c":"GameObject","l":"getOrCreateObjectFlag(String, Object)","u":"getOrCreateObjectFlag(java.lang.String,java.lang.Object)"},{"p":"controller","c":"ObjectController","l":"getPlayground()"},{"p":"gameobjects","c":"GameObject","l":"getPlayground()"},{"p":"playground","c":"Animation","l":"getShowtimeList()"},{"p":"playground","c":"Playground","l":"getSizeX()"},{"p":"playground","c":"Playground","l":"getSizeY()"},{"p":"gameobjects","c":"TextObject","l":"getText()"},{"p":"rendering","c":"TextArtist","l":"getText()"},{"p":"rendering","c":"TextArtist","l":"getTextHeight()"},{"p":"rendering","c":"TextArtist","l":"getTextWidth()"},{"p":"controller","c":"ObjectController","l":"getTimestep()"},{"p":"playground","c":"Playground","l":"getTimestep()"},{"p":"controller","c":"ObjectController","l":"getVX()"},{"p":"gameobjects","c":"GameObject","l":"getVX()"},{"p":"rendering","c":"Artist","l":"getVX()"},{"p":"controller","c":"ObjectController","l":"getVY()"},{"p":"gameobjects","c":"GameObject","l":"getVY()"},{"p":"rendering","c":"Artist","l":"getVY()"},{"p":"rendering","c":"AnimationArtist","l":"getW()"},{"p":"gameobjects","c":"RectObject","l":"getWidth()"},{"p":"collider","c":"Collider","l":"getX()"},{"p":"controller","c":"ObjectController","l":"getX()"},{"p":"gameobjects","c":"GameObject","l":"getX()"},{"p":"rendering","c":"Artist","l":"getX()"},{"p":"collider","c":"Collider","l":"getY()"},{"p":"controller","c":"ObjectController","l":"getY()"},{"p":"gameobjects","c":"GameObject","l":"getY()"},{"p":"rendering","c":"Artist","l":"getY()"},{"p":"ui","c":"GameUI","l":"grabFocus()"},{"p":"playground","c":"HighscoreManager","l":"HighscoreManager()","u":"%3Cinit%3E()"},{"p":"collider","c":"Collider","l":"id"},{"p":"gameobjects","c":"GameObject","l":"id"},{"p":"playground","c":"Animation","l":"imageList"},{"p":"gameobjects","c":"GameObject","l":"isActive()"},{"p":"ui","c":"GameUI","l":"isPainting()"},{"p":"playground","c":"Playground","l":"isPaused()"},{"p":"playground","c":"Level1","l":"Level1()","u":"%3Cinit%3E()"},{"p":"playground","c":"Level2","l":"Level2()","u":"%3Cinit%3E()"},{"p":"playground","c":"Level3","l":"Level3()","u":"%3Cinit%3E()"},{"p":"playground","c":"Level4","l":"Level4()","u":"%3Cinit%3E()"},{"p":"playground","c":"Level5","l":"Level5()","u":"%3Cinit%3E()"},{"p":"playground","c":"Level6","l":"Level6()","u":"%3Cinit%3E()"},{"p":"playground","c":"Level7","l":"Level7()","u":"%3Cinit%3E()"},{"p":"playground","c":"LevelBoss","l":"LevelBoss()","u":"%3Cinit%3E()"},{"p":"playground","c":"Playground","l":"levelFinished()"},{"p":"playground","c":"SpaceInvadersLevel","l":"levelFinished()"},{"p":"playground","c":"LevelHitTwice","l":"LevelHitTwice()","u":"%3Cinit%3E()"},{"p":"playground","c":"LevelWithBox","l":"LevelWithBox()","u":"%3Cinit%3E()"},{"p":"controller","c":"LimitedTimeController","l":"LimitedTimeController(double, double)","u":"%3Cinit%3E(double,double)"},{"p":"base","c":"GameLoop","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"base","c":"MultiLevelGame","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"gameobjects","c":"GameObject","l":"MASK"},{"p":"playground","c":"Level4","l":"MAX_HITS"},{"p":"playground","c":"LevelHitTwice","l":"MAX_HITS"},{"p":"controller","c":"MineController","l":"MineController(double)","u":"%3Cinit%3E(double)"},{"p":"base","c":"MultiLevelGame","l":"MultiLevelGame()","u":"%3Cinit%3E()"},{"p":"playground","c":"Music","l":"Music()","u":"%3Cinit%3E()"},{"p":"playground","c":"Music","l":"music(File)","u":"music(java.io.File)"},{"p":"controller","c":"ObjectController","l":"ObjectController()","u":"%3Cinit%3E()"},{"p":"controller","c":"EgoController","l":"onDown(KeyEvent, GameObject)","u":"onDown(java.awt.event.KeyEvent,gameobjects.GameObject)"},{"p":"controller","c":"EgoController","l":"onLeft(KeyEvent, GameObject)","u":"onLeft(java.awt.event.KeyEvent,gameobjects.GameObject)"},{"p":"controller","c":"EgoController","l":"onRight(KeyEvent, GameObject)","u":"onRight(java.awt.event.KeyEvent,gameobjects.GameObject)"},{"p":"controller","c":"CollisionAwareEgoController","l":"onSpace(KeyEvent, GameObject)","u":"onSpace(java.awt.event.KeyEvent,gameobjects.GameObject)"},{"p":"controller","c":"EgoController","l":"onSpace(KeyEvent, GameObject)","u":"onSpace(java.awt.event.KeyEvent,gameobjects.GameObject)"},{"p":"controller","c":"EgoController","l":"onStop(KeyEvent, GameObject)","u":"onStop(java.awt.event.KeyEvent,gameobjects.GameObject)"},{"p":"controller","c":"EgoController","l":"onUp(KeyEvent, GameObject)","u":"onUp(java.awt.event.KeyEvent,gameobjects.GameObject)"},{"p":"playground","c":"Playground","l":"Playground()","u":"%3Cinit%3E()"},{"p":"playground","c":"Playground","l":"preferredSizeX()"},{"p":"playground","c":"SpaceInvadersLevel","l":"preferredSizeX()"},{"p":"playground","c":"Playground","l":"preferredSizeY()"},{"p":"playground","c":"SpaceInvadersLevel","l":"preferredSizeY()"},{"p":"playground","c":"LevelWithBox","l":"prepareLevel(String)","u":"prepareLevel(java.lang.String)"},{"p":"playground","c":"Playground","l":"prepareLevel(String)","u":"prepareLevel(java.lang.String)"},{"p":"playground","c":"SpaceInvadersLevel","l":"prepareLevel(String)","u":"prepareLevel(java.lang.String)"},{"p":"playground","c":"Playground","l":"processKeyEvents(Stack)","u":"processKeyEvents(java.util.Stack)"},{"p":"playground","c":"Playground","l":"processMouseEvents(Stack)","u":"processMouseEvents(java.util.Stack)"},{"p":"gameobjects","c":"GameObject","l":"RADIUS"},{"p":"playground","c":"HighscoreManager","l":"readHSFromFile()"},{"p":"gameobjects","c":"GameObject","l":"RECTANGLE"},{"p":"rendering","c":"RectArtist","l":"RectArtist(GameObject, double, double, Color)","u":"%3Cinit%3E(gameobjects.GameObject,double,double,java.awt.Color)"},{"p":"collider","c":"RectCollider","l":"RectCollider(String, GameObject, double, double)","u":"%3Cinit%3E(java.lang.String,gameobjects.GameObject,double,double)"},{"p":"gameobjects","c":"RectObject","l":"RectObject(String, Playground, double, double, double, double, double, double, Color)","u":"%3Cinit%3E(java.lang.String,playground.Playground,double,double,double,double,double,double,java.awt.Color)"},{"p":"playground","c":"Playground","l":"redraw(Graphics2D)","u":"redraw(java.awt.Graphics2D)"},{"p":"playground","c":"Playground","l":"redrawLevel(Graphics2D)","u":"redrawLevel(java.awt.Graphics2D)"},{"p":"playground","c":"SpaceInvadersLevel","l":"redrawLevel(Graphics2D)","u":"redrawLevel(java.awt.Graphics2D)"},{"p":"ui","c":"GameUI","l":"repaint()"},{"p":"playground","c":"Playground","l":"reset()"},{"p":"ui","c":"GameUI","l":"resetAction()"},{"p":"playground","c":"Playground","l":"resetFlags(int)"},{"p":"controller","c":"CollisionAwareEgoController","l":"restoreDynamicState()"},{"p":"base","c":"GameLoop","l":"runGame(String[])","u":"runGame(java.lang.String[])"},{"p":"playground","c":"SaveGame","l":"save()"},{"p":"controller","c":"CollisionAwareEgoController","l":"saveDynamicState()"},{"p":"playground","c":"SaveGame","l":"SaveGame()","u":"%3Cinit%3E()"},{"p":"gameobjects","c":"GameObject","l":"scol"},{"p":"gameobjects","c":"GameObject","l":"setActive(boolean)"},{"p":"gameobjects","c":"GameObject","l":"setColliders(LinkedList)","u":"setColliders(java.util.LinkedList)"},{"p":"gameobjects","c":"GameObject","l":"setComponentProperty(String, String, Object)","u":"setComponentProperty(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"collider","c":"Collider","l":"setController(ObjectController)","u":"setController(controller.ObjectController)"},{"p":"controller","c":"ObjectController","l":"setDummy(String)","u":"setDummy(java.lang.String)"},{"p":"playground","c":"Playground","l":"setGameTime(double)"},{"p":"playground","c":"Playground","l":"setGlobalFlag(String, Object)","u":"setGlobalFlag(java.lang.String,java.lang.Object)"},{"p":"playground","c":"Playground","l":"setLevelFlag(String, Object)","u":"setLevelFlag(java.lang.String,java.lang.Object)"},{"p":"collider","c":"Collider","l":"setObject(GameObject)","u":"setObject(gameobjects.GameObject)"},{"p":"controller","c":"ObjectController","l":"setObject(GameObject)","u":"setObject(gameobjects.GameObject)"},{"p":"gameobjects","c":"GameObject","l":"setObjectController(ObjectController)","u":"setObjectController(controller.ObjectController)"},{"p":"gameobjects","c":"GameObject","l":"setObjectFlag(String, Object)","u":"setObjectFlag(java.lang.String,java.lang.Object)"},{"p":"collider","c":"Collider","l":"setOffsets(double, double)","u":"setOffsets(double,double)"},{"p":"ui","c":"GameUI","l":"setPainting()"},{"p":"playground","c":"Playground","l":"setPaused(boolean)"},{"p":"collider","c":"Collider","l":"setPlayground(Playground)","u":"setPlayground(playground.Playground)"},{"p":"controller","c":"ObjectController","l":"setPlayground(Playground)","u":"setPlayground(playground.Playground)"},{"p":"gameobjects","c":"GameObject","l":"setPlayground(Playground)","u":"setPlayground(playground.Playground)"},{"p":"ui","c":"GameUI","l":"setPlayground(Playground)","u":"setPlayground(playground.Playground)"},{"p":"gameobjects","c":"TextObject","l":"setText(String)","u":"setText(java.lang.String)"},{"p":"rendering","c":"TextArtist","l":"setText(String)","u":"setText(java.lang.String)"},{"p":"rendering","c":"TextArtist","l":"setTextHeight(double)"},{"p":"rendering","c":"TextArtist","l":"setTextWidth(double)"},{"p":"playground","c":"Playground","l":"setTimestep(double)"},{"p":"controller","c":"ObjectController","l":"setVX(double)"},{"p":"gameobjects","c":"GameObject","l":"setVX(double)"},{"p":"controller","c":"ObjectController","l":"setVY(double)"},{"p":"gameobjects","c":"GameObject","l":"setVY(double)"},{"p":"controller","c":"ObjectController","l":"setX(double)"},{"p":"gameobjects","c":"GameObject","l":"setX(double)"},{"p":"controller","c":"ObjectController","l":"setY(double)"},{"p":"gameobjects","c":"GameObject","l":"setY(double)"},{"p":"playground","c":"SpaceInvadersLevel","l":"SHOTSPEED"},{"p":"playground","c":"Animation","l":"showtimeList"},{"p":"controller","c":"SimpleShotController","l":"SimpleShotController()","u":"%3Cinit%3E()"},{"p":"base","c":"GameLoop","l":"SIZEX"},{"p":"base","c":"GameLoop","l":"SIZEY"},{"p":"playground","c":"SpaceInvadersLevel","l":"SpaceInvadersLevel()","u":"%3Cinit%3E()"},{"p":"playground","c":"SpaceInvadersLevelAua","l":"SpaceInvadersLevelAua()","u":"%3Cinit%3E()"},{"p":"controller","c":"CollisionAwareEgoController","l":"stopObject()"},{"p":"controller","c":"EgoController","l":"stopObject()"},{"p":"rendering","c":"TextArtist","l":"TextArtist(GameObject, String, int, Color)","u":"%3Cinit%3E(gameobjects.GameObject,java.lang.String,int,java.awt.Color)"},{"p":"gameobjects","c":"TextObject","l":"TextObject(String, Playground, double, double, double, double, String, int, Color)","u":"%3Cinit%3E(java.lang.String,playground.Playground,double,double,double,double,java.lang.String,int,java.awt.Color)"},{"p":"playground","c":"Playground","l":"togglePause()"},{"p":"collider","c":"CircleCollider","l":"toString()"},{"p":"collider","c":"Collider","l":"toString()"},{"p":"collider","c":"RectCollider","l":"toString()"},{"p":"controller","c":"EgoController","l":"updateObject()"},{"p":"controller","c":"EnemyController","l":"updateObject()"},{"p":"controller","c":"FallingStarController","l":"updateObject()"},{"p":"controller","c":"LimitedTimeController","l":"updateObject()"},{"p":"controller","c":"MineController","l":"updateObject()"},{"p":"controller","c":"ObjectController","l":"updateObject()"},{"p":"controller","c":"SimpleShotController","l":"updateObject()"},{"p":"controller","c":"ZickZackController","l":"updateObject()"},{"p":"gameobjects","c":"GameObject","l":"updateObject()"},{"p":"playground","c":"Playground","l":"updateObjects()"},{"p":"ui","c":"GameUI","l":"waitWhilePainting()"},{"p":"playground","c":"HighscoreManager","l":"writeHSToFile(Integer, Integer)","u":"writeHSToFile(java.lang.Integer,java.lang.Integer)"},{"p":"controller","c":"ZickZackController","l":"ZickZackController(double, double)","u":"%3Cinit%3E(double,double)"}];updateSearchResults();
\ No newline at end of file
diff --git a/doc/module-search-index.js b/doc/module-search-index.js
new file mode 100644
index 0000000..0d59754
--- /dev/null
+++ b/doc/module-search-index.js
@@ -0,0 +1 @@
+moduleSearchIndex = [];updateSearchResults();
\ No newline at end of file
diff --git a/doc/overview-summary.html b/doc/overview-summary.html
new file mode 100644
index 0000000..1dde6c2
--- /dev/null
+++ b/doc/overview-summary.html
@@ -0,0 +1,26 @@
+
+
+
+
+Generated Documentation (Untitled)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
extends SpaceInvadersLevel with a ZigZack move of the enemies in
+ createSingleEnemy(String, double, double, double, double, ObjectController, double) and
+ sets a different getStartupMessage().
Class that realizes all the game logic of a very simple game level. The level contains for now
+ only two objects that are GameObject subclasses: FallingStar and
+ EgoObject. Functions performed by this class are:
+
define basic object movement rules for all objects in the level in the various
+ ObjectController subclasses: EgoController and FallingStarController.
+
Playground represents a level of the game, focusing on the game LOGIC, i.e., not so much on the
+ graphical representation. In particular, an instance of Playground
+
represents the state of a level represented by flags. Each flag has a name (a String)
+ and an arbitrary value of any type. Methods: setLevelFlag(String, Object),
+ getLevelFlag(String). As an example, the current score is a flag usually named "points",
+ with an Integer as a value. This value can be retrieved and manipulated using the above mentioned
+ methods.
+
checks for existence and if not creates the new global flag with the given initial value. Returns
+ the value. afterwards it is guaranteed that no priorly existing value is overridden and that it
+ definitely exists (created if not present before).
+
+
Parameters:
+
flag - String name for the global flag (created if not present)
+
value - Object value to be stored (used only if flag was not present)
+
Returns:
+
the current value of the flag (maybe the initial one in case flag was not there before)
public class SpaceInvadersLevel
+extends Playground
+
Class that realizes all the game logic of a very simple game level. The level contains for now
+ only two objects that are GameObject subclasses: FallingStar and
+ EgoObject. Functions performed by this class are:
+
React to game events in actionIfEgoCollidesWithCollect(GameObject, GameObject) ,
+ actionIfEgoCollidesWithEnemy(GameObject, GameObject), etc.
+
define basic object movement rules for all objects in the level in the various
+ ObjectController subclasses: EgoController and FallingStarController.
+
applies the logic of the level: For now, this is just about deleting shots that are leaving the
+ screen and calling methods 'actionIf..' in case objects collide.
initially sets up the level. Not called by user interaction, but called every time a layer is
+ restarted from scratch. So make sure that this is possible. Here, resources are loaded only once
+ even if method is called several times.
(re)draws the level but NOT the objects, they draw themselves. Called by the main game loop. This
+ method mainly draws the background and the scoreboard.
g2 - Graphics2D object that can, and should be, draw on.
+
+
+
+
+
+
applyGameLogic
+
publicvoidapplyGameLogic()
+
applies the logic of the level: For now, this is just about deleting shots that are leaving the
+ screen and calling methods 'actionIf..' in case objects collide.
Class that realizes all the game logic of a very simple game level. The level contains for now
+ only two objects that are GameObject subclasses: FallingStar and
+ EgoObject. Functions performed by this class are:
+
React to game events in SpaceInvadersLevel.actionIfEgoCollidesWithCollect(GameObject, GameObject) ,
+ SpaceInvadersLevel.actionIfEgoCollidesWithEnemy(GameObject, GameObject), etc.
+
define basic object movement rules for all objects in the level in the various
+ ObjectController subclasses: EgoController and FallingStarController.
+
extends SpaceInvadersLevel with a ZigZack move of the enemies in
+ Level3.createSingleEnemy(String, double, double, double, double, ObjectController, double) and
+ sets a different Level3.getStartupMessage().
extends SpaceInvadersLevel with a ZigZack move of the enemies in
+ Level3.createSingleEnemy(String, double, double, double, double, ObjectController, double) and
+ sets a different Level3.getStartupMessage().
extends SpaceInvadersLevel with a ZigZack move of the enemies in
+ Level3.createSingleEnemy(String, double, double, double, double, ObjectController, double) and
+ sets a different Level3.getStartupMessage().
").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("
").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete});
\ No newline at end of file
diff --git a/doc/script-dir/jquery-ui.structure.min.css b/doc/script-dir/jquery-ui.structure.min.css
new file mode 100644
index 0000000..e880892
--- /dev/null
+++ b/doc/script-dir/jquery-ui.structure.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.12.1 - 2018-12-06
+* http://jqueryui.com
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}
\ No newline at end of file
diff --git a/doc/script.js b/doc/script.js
new file mode 100644
index 0000000..864989c
--- /dev/null
+++ b/doc/script.js
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+var moduleSearchIndex;
+var packageSearchIndex;
+var typeSearchIndex;
+var memberSearchIndex;
+var tagSearchIndex;
+function loadScripts(doc, tag) {
+ createElem(doc, tag, 'search.js');
+
+ createElem(doc, tag, 'module-search-index.js');
+ createElem(doc, tag, 'package-search-index.js');
+ createElem(doc, tag, 'type-search-index.js');
+ createElem(doc, tag, 'member-search-index.js');
+ createElem(doc, tag, 'tag-search-index.js');
+}
+
+function createElem(doc, tag, path) {
+ var script = doc.createElement(tag);
+ var scriptElement = doc.getElementsByTagName(tag)[0];
+ script.src = pathtoroot + path;
+ scriptElement.parentNode.insertBefore(script, scriptElement);
+}
+
+function show(tableId, selected, columns) {
+ if (tableId !== selected) {
+ document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')')
+ .forEach(function(elem) {
+ elem.style.display = 'none';
+ });
+ }
+ document.querySelectorAll('div.' + selected)
+ .forEach(function(elem, index) {
+ elem.style.display = '';
+ var isEvenRow = index % (columns * 2) < columns;
+ elem.classList.remove(isEvenRow ? oddRowColor : evenRowColor);
+ elem.classList.add(isEvenRow ? evenRowColor : oddRowColor);
+ });
+ updateTabs(tableId, selected);
+}
+
+function updateTabs(tableId, selected) {
+ document.querySelector('div#' + tableId +' .summary-table')
+ .setAttribute('aria-labelledby', selected);
+ document.querySelectorAll('button[id^="' + tableId + '"]')
+ .forEach(function(tab, index) {
+ if (selected === tab.id || (tableId === selected && index === 0)) {
+ tab.className = activeTableTab;
+ tab.setAttribute('aria-selected', true);
+ tab.setAttribute('tabindex',0);
+ } else {
+ tab.className = tableTab;
+ tab.setAttribute('aria-selected', false);
+ tab.setAttribute('tabindex',-1);
+ }
+ });
+}
+
+function switchTab(e) {
+ var selected = document.querySelector('[aria-selected=true]');
+ if (selected) {
+ if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) {
+ // left or up arrow key pressed: move focus to previous tab
+ selected.previousSibling.click();
+ selected.previousSibling.focus();
+ e.preventDefault();
+ } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) {
+ // right or down arrow key pressed: move focus to next tab
+ selected.nextSibling.click();
+ selected.nextSibling.focus();
+ e.preventDefault();
+ }
+ }
+}
+
+var updateSearchResults = function() {};
+
+function indexFilesLoaded() {
+ return moduleSearchIndex
+ && packageSearchIndex
+ && typeSearchIndex
+ && memberSearchIndex
+ && tagSearchIndex;
+}
+
+// Workaround for scroll position not being included in browser history (8249133)
+document.addEventListener("DOMContentLoaded", function(e) {
+ var contentDiv = document.querySelector("div.flex-content");
+ window.addEventListener("popstate", function(e) {
+ if (e.state !== null) {
+ contentDiv.scrollTop = e.state;
+ }
+ });
+ window.addEventListener("hashchange", function(e) {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ });
+ contentDiv.addEventListener("scroll", function(e) {
+ var timeoutID;
+ if (!timeoutID) {
+ timeoutID = setTimeout(function() {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ timeoutID = null;
+ }, 100);
+ }
+ });
+ if (!location.hash) {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ }
+});
diff --git a/doc/search.js b/doc/search.js
new file mode 100644
index 0000000..2246cdd
--- /dev/null
+++ b/doc/search.js
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+var noResult = {l: "No results found"};
+var loading = {l: "Loading search index..."};
+var catModules = "Modules";
+var catPackages = "Packages";
+var catTypes = "Types";
+var catMembers = "Members";
+var catSearchTags = "Search Tags";
+var highlight = "$&";
+var searchPattern = "";
+var fallbackPattern = "";
+var RANKING_THRESHOLD = 2;
+var NO_MATCH = 0xffff;
+var MIN_RESULTS = 3;
+var MAX_RESULTS = 500;
+var UNNAMED = "";
+function escapeHtml(str) {
+ return str.replace(//g, ">");
+}
+function getHighlightedText(item, matcher, fallbackMatcher) {
+ var escapedItem = escapeHtml(item);
+ var highlighted = escapedItem.replace(matcher, highlight);
+ if (highlighted === escapedItem) {
+ highlighted = escapedItem.replace(fallbackMatcher, highlight)
+ }
+ return highlighted;
+}
+function getURLPrefix(ui) {
+ var urlPrefix="";
+ var slash = "/";
+ if (ui.item.category === catModules) {
+ return ui.item.l + slash;
+ } else if (ui.item.category === catPackages && ui.item.m) {
+ return ui.item.m + slash;
+ } else if (ui.item.category === catTypes || ui.item.category === catMembers) {
+ if (ui.item.m) {
+ urlPrefix = ui.item.m + slash;
+ } else {
+ $.each(packageSearchIndex, function(index, item) {
+ if (item.m && ui.item.p === item.l) {
+ urlPrefix = item.m + slash;
+ }
+ });
+ }
+ }
+ return urlPrefix;
+}
+function createSearchPattern(term) {
+ var pattern = "";
+ var isWordToken = false;
+ term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) {
+ if (index > 0) {
+ // whitespace between identifiers is significant
+ pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*";
+ }
+ var tokens = w.split(/(?=[A-Z,.()<>[\/])/);
+ for (var i = 0; i < tokens.length; i++) {
+ var s = tokens[i];
+ if (s === "") {
+ continue;
+ }
+ pattern += $.ui.autocomplete.escapeRegex(s);
+ isWordToken = /\w$/.test(s);
+ if (isWordToken) {
+ pattern += "([a-z0-9_$<>\\[\\]]*?)";
+ }
+ }
+ });
+ return pattern;
+}
+function createMatcher(pattern, flags) {
+ var isCamelCase = /[A-Z]/.test(pattern);
+ return new RegExp(pattern, flags + (isCamelCase ? "" : "i"));
+}
+var watermark = 'Search';
+$(function() {
+ var search = $("#search-input");
+ var reset = $("#reset-button");
+ search.val('');
+ search.prop("disabled", false);
+ reset.prop("disabled", false);
+ search.val(watermark).addClass('watermark');
+ search.blur(function() {
+ if ($(this).val().length === 0) {
+ $(this).val(watermark).addClass('watermark');
+ }
+ });
+ search.on('click keydown paste', function() {
+ if ($(this).val() === watermark) {
+ $(this).val('').removeClass('watermark');
+ }
+ });
+ reset.click(function() {
+ search.val('').focus();
+ });
+ search.focus()[0].setSelectionRange(0, 0);
+});
+$.widget("custom.catcomplete", $.ui.autocomplete, {
+ _create: function() {
+ this._super();
+ this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
+ },
+ _renderMenu: function(ul, items) {
+ var rMenu = this;
+ var currentCategory = "";
+ rMenu.menu.bindings = $();
+ $.each(items, function(index, item) {
+ var li;
+ if (item.category && item.category !== currentCategory) {
+ ul.append("
creates the game UI JFrame containing a canvas (see class GamePanel)) for the levels to
+ paint the games. Has a menu for loading, saving games and an about menu item. two buttons allow
+ restarting the game or exit.
as typical for GUI classes this constructor creates all the components and adds them to the
+ frame. It adds this instance as ActionListener for all components. See
+ actionPerformed(ActionEvent) for details. It directly sets the frame visible as a
+ final step.
+
+
+ If you want to extend this GUI, create a subclass and add new elements in constructor. It is
+ necessary to call Component.revalidate() on frame attribute after changing/adding
+ components to panel or canvas, because the constructor here already sets
+ visibility to true and renders the IFrame.
+
interface implementation of ActionListener to respond to GUI element actions. It sets the
+ attribute of newAction which is read by GameLoop.runGame to check for GUI actions.