diff --git a/JavaGameEngineDocumentation b/JavaGameEngineDocumentation
index d6014e0..6233d67 160000
--- a/JavaGameEngineDocumentation
+++ b/JavaGameEngineDocumentation
@@ -1 +1 @@
-Subproject commit d6014e015c5c34e2ea69fadc9cc09f729efd5628
+Subproject commit 6233d677e3b182548ab8527fc38e5a6cd3c85480
diff --git a/README.md b/README.md
index e29f7dc..c2ff879 100644
--- a/README.md
+++ b/README.md
@@ -167,17 +167,12 @@ A example on how to use it
```
package example;
-import com.javagamemaker.javagameengine.backend.ComponentHandler;
-import com.javagamemaker.javagameengine.backend.UpdateThread;
-import com.javagamemaker.javagameengine.components.GameObject;
-import com.javagamemaker.javagameengine.com.javagamemaker.javagameengine;
-import com.javagamemaker.javagameengine.msc.Vector2;
import javax.swing.*;
import java.awt.*;
-public class Main extends com.javagamemaker.javagameengine{
+public class Main extends JavaGameEngine{
public static Ob parent;
public static Ob child;
@@ -185,19 +180,18 @@ public class Main extends com.javagamemaker.javagameengine{
public static void main(String[] args)
{
- init();
+ Scene scene = new Scene();
- JFrame frame = new JFrame();
- frame.setTitle("JEL");
- UpdateThread.camera.setPosition(new Vector2(0,0));
Ob ob1 = new Ob(new Vector2(100,100));
Ob ob2 = new Ob(new Vector2(200,400));
Ob ob3 = new Ob(new Vector2(400,400));
- ComponentHandler.addObject(ob1);
- ComponentHandler.addObject(ob2);
- ComponentHandler.addObject(ob3);
-
+ scene.add(ob1);
+ scene.add(ob2);
+ scene.add(ob3);
+
+ //set the selected scene
+ setSelectecScene(scene);
start();
}
@@ -229,8 +223,8 @@ public class Main extends com.javagamemaker.javagameengine{
setScale(getScale().devide(1.1f));
}
@Override
- public void draw(Graphics g) {
- super.draw(g);
+ public void render(Graphics g) {
+ super.render(g);
if(con!=null){
g.drawLine((int) getPosition().getX(), (int) getPosition().getY(), (int) con.getPosition().getX(), (int) con.getPosition().getY());
}
@@ -244,13 +238,6 @@ public class Main extends com.javagamemaker.javagameengine{
-
-## Roadmap
-
-- [ ] V1
-- [ ] Relase
-- [ ]
-
See the [open issues](https://github.com/Java-Game-Maker/JavaGameEngine/issues) for a full list of proposed features (and known issues).
@@ -303,8 +290,6 @@ Thanks to every on who has helped with this project. I want to special thanks to
* [One Lone Coder (olc)](https://www.youtube.com/c/javidx9/)
* [SharkooMaster](https://github.com/SharkooMaster)
-* [othneildrew](https://github.com/othneildrew/Best-README-Template)
-
(back to top)
diff --git a/Test/Main.java b/Test/Main.java
new file mode 100644
index 0000000..2c4bd0d
--- /dev/null
+++ b/Test/Main.java
@@ -0,0 +1,76 @@
+import com.javagamemaker.javagameengine.GameWorld;
+import com.javagamemaker.javagameengine.JavaGameEngine;
+import com.javagamemaker.javagameengine.Scene;
+import com.javagamemaker.javagameengine.components.GameObject;
+import com.javagamemaker.javagameengine.components.gamecompnents.CollidingBox;
+import com.javagamemaker.javagameengine.components.gamecompnents.Grabber;
+import com.javagamemaker.javagameengine.components.gamecompnents.PlatformPlayerController;
+import com.javagamemaker.javagameengine.input.Input;
+import com.javagamemaker.javagameengine.input.InputComponent;
+import com.javagamemaker.javagameengine.input.InputManager;
+import com.javagamemaker.javagameengine.input.Keys;
+import com.javagamemaker.javagameengine.msc.Debug;
+import com.javagamemaker.javagameengine.msc.Vector2;
+
+import java.awt.*;
+
+public class Main extends JavaGameEngine {
+
+ public static void main(String[] args){
+ Scene scene = new Scene();
+
+ scene.add(new Player("Player 1"));
+ scene.add(new Player("Player 2"){
+ @Override
+ public void start() {
+ setPosition(new Vector2(0,-150));
+ super.start();
+ }
+ });
+
+ Input.addContext("Player 1");
+ //Input.addContext("Player 2");
+ Input.addContext("All");
+
+ scene.add(new CollidingBox(new Vector2(200,200)){
+ @Override
+ public void start() {
+ setScale(new Vector2(1500,100));
+ super.start();
+ }
+ });
+
+ setSelectedScene(scene);
+ start();
+
+ }
+
+ static class Player extends GameObject {
+
+ public Player(String context) {
+ add(new PlatformPlayerController(new InputComponent(context)));
+ add(new Grabber(this));
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ if(Input.isKeyPressed(Keys.E)){
+ if(Input.getActiveContext().contains("Player 1")){
+ Input.addContext("Player 2");
+ Input.removeContext("Player 1");
+ }
+ else{
+
+ Input.addContext("Player 1");
+ Input.removeContext("Player 2");
+ }
+ }
+ if(Input.isKeyPressed(Keys.P)){
+ Input.addContext("Player 1");
+ Input.addContext("Player 2");
+ }
+ }
+ }
+
+}
diff --git a/images/2023-02-06 17-55-17.mkv b/images/2023-02-06 17-55-17.mkv
new file mode 100644
index 0000000..b494b1e
Binary files /dev/null and b/images/2023-02-06 17-55-17.mkv differ
diff --git a/images/2023-02-06 17-55-40.mkv b/images/2023-02-06 17-55-40.mkv
new file mode 100644
index 0000000..73402c1
Binary files /dev/null and b/images/2023-02-06 17-55-40.mkv differ
diff --git a/src/com/javagamemaker/javagameengine/GameWorld.java b/src/com/javagamemaker/javagameengine/GameWorld.java
index 891975c..1fafca8 100644
--- a/src/com/javagamemaker/javagameengine/GameWorld.java
+++ b/src/com/javagamemaker/javagameengine/GameWorld.java
@@ -1,7 +1,6 @@
package com.javagamemaker.javagameengine;
import com.javagamemaker.javagameengine.input.Input;
-import com.javagamemaker.javagameengine.msc.Debug;
import com.javagamemaker.javagameengine.msc.Vector2;
import javax.swing.*;
diff --git a/src/com/javagamemaker/javagameengine/JavaGameEngine.java b/src/com/javagamemaker/javagameengine/JavaGameEngine.java
index 088a7b0..2af1408 100644
--- a/src/com/javagamemaker/javagameengine/JavaGameEngine.java
+++ b/src/com/javagamemaker/javagameengine/JavaGameEngine.java
@@ -7,7 +7,6 @@
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import java.rmi.server.ExportException;
/**
* This is the main class in the JavaGameEngine gameengine
@@ -49,7 +48,7 @@ public static Scene getSelectedScene() {
return selectedScene;
}
//so the scene does not start twice at the start
- private static boolean firstFrame = true;
+ public static boolean firstFrame = true;
/**
* Changes the active scene
* @param selectedScene new scene to
@@ -144,12 +143,14 @@ public static void update() {
}
firstFrame = false;
}
+ public static boolean started = false;
/**
* Starts the game
* call this last in your main function
*/
public static void start() {
+ started = true;
//Set som basic properties
gameWorld.setLayout(null);
gameWindow.setSize((int) size.getX(), (int) size.getY());
diff --git a/src/com/javagamemaker/javagameengine/Scene.java b/src/com/javagamemaker/javagameengine/Scene.java
index d3f7718..fa7949b 100644
--- a/src/com/javagamemaker/javagameengine/Scene.java
+++ b/src/com/javagamemaker/javagameengine/Scene.java
@@ -8,12 +8,11 @@
import com.javagamemaker.javagameengine.msc.Debug;
import com.javagamemaker.javagameengine.msc.Vector2;
-
import javax.swing.*;
import java.awt.*;
import java.io.*;
+
import java.util.*;
-import java.util.List;
/**
* Scene is the level where the game is playing out. Scenes can be changed by calling JavaGameEngine.setSelectedScene(new Scene())
@@ -174,14 +173,22 @@ public void update(){
component.updateMili();
}
}
- for(Component component : components){
- if(inside(component)) {
- if(!debugMode) {
- component.update();
- }else{
- component.debugUpdate();
- }
+
+ int lsize = components.size();
+ for(int i = 0; i < lsize;i++){
+
+ Component c = components.get(i);
+ for(Component component : c.addedChildren) {
+ component.setParent(c);
+ component.setPosition(c.getPosition());
+ c.getChildren().add(component);
}
+ c.addedChildren.clear();
+ if(!debugMode)
+ c.update();
+ else
+ component.debugUpdate();
+
}
camera.update();
@@ -199,6 +206,10 @@ public void update(){
}
+
+ public boolean inside(Component component) {
+ return true;//screen.contains(component.getShape().getBounds()) || component.getShape().contains(screen);
+}
public void debugUpdate(){
if(Input.isMousePressed(Keys.RIGHTCLICK)){
GameObject g = new GameObject();
@@ -240,7 +251,7 @@ public void debugUpdate(){
c.setPosition(Input.getMousePosition());
components.add(c);
}
- }
+}
private Component copyComp = null;
public void destroy(Component c){
remove.add(c);
@@ -281,12 +292,26 @@ public int compare(Component o1, Component o2){
});
try{
+ //center graphics
+ if(camera.parallax) graphics2D.translate(JavaGameEngine.getWindowSize().getX()/2, JavaGameEngine.getWindowSize().getY()/2);
+
int lsize = components.size();
for(int i = 0; i < lsize;i++){
Component c = renderList.get(i);
if(inside(c) || true) {
- int layer = c.getLayer()==0?1:c.getLayer();
+ //int layer = c.getLayer()==0?1:c.getLayer();
+ float layer = c.getPosition().getZ()==0?1:c.getPosition().getZ();
+ Camera camera = JavaGameEngine.getSelectedScene().getCamera();
+ if(camera.parallax){
+ Debug.log(camera.getPosition().getY());
+ float parx = camera.getPosition().getX()*layer/100;
+ float pary = camera.getPosition().getY()*layer/100;
+ graphics2D.translate(parx,pary);
+ }
(c).render(graphics2D);
+ if(camera.parallax){
+ graphics2D.translate(-camera.getPosition().getX()*layer/100,-camera.getPosition().getY()*layer/100);
+ }
//if(!c.isVisible()){
// c.setVisible(true);
// c.onCameraEnter();
diff --git a/src/com/javagamemaker/javagameengine/components/Camera.java b/src/com/javagamemaker/javagameengine/components/Camera.java
index be0ff9f..d2c7572 100644
--- a/src/com/javagamemaker/javagameengine/components/Camera.java
+++ b/src/com/javagamemaker/javagameengine/components/Camera.java
@@ -12,6 +12,8 @@
* and its position controls the graphics position
*/
public class Camera extends Component {
+
+ public boolean parallax = false;
@Override
public void start() {
super.start();
diff --git a/src/com/javagamemaker/javagameengine/components/Collider.java b/src/com/javagamemaker/javagameengine/components/Collider.java
index e0be31e..ef4ed60 100755
--- a/src/com/javagamemaker/javagameengine/components/Collider.java
+++ b/src/com/javagamemaker/javagameengine/components/Collider.java
@@ -70,12 +70,20 @@ public Point collision(Collider c){
for (Vector2 vertex : vertices){
Point p = new Point((int) vertex.getX(), (int) vertex.getY());
if(c.getShape().contains(p)){
+ try{
+ //parent.setPosition(parent.getPosition().subtract(new Vector2(0,1)));
+ }
+ catch (Exception e){}
return p;
}
}
for (Vector2 vertex : c.vertices){
Point p = new Point((int) vertex.getX(), (int) vertex.getY());
if(getShape().contains(p)){
+ try{
+ //parent.setPosition(parent.getPosition().subtract(new Vector2(0,1)));
+ }
+ catch (Exception e){}
return p;
}
}
diff --git a/src/com/javagamemaker/javagameengine/components/Component.java b/src/com/javagamemaker/javagameengine/components/Component.java
index 9545f45..00dd6f1 100644
--- a/src/com/javagamemaker/javagameengine/components/Component.java
+++ b/src/com/javagamemaker/javagameengine/components/Component.java
@@ -2,19 +2,20 @@
import com.javagamemaker.javagameengine.CollisionEvent;
import com.javagamemaker.javagameengine.JavaGameEngine;
-import com.javagamemaker.javagameengine.components.lights.Light;
import com.javagamemaker.javagameengine.components.shapes.Rect;
import com.javagamemaker.javagameengine.input.Input;
-import com.javagamemaker.javagameengine.msc.Debug;
+import com.javagamemaker.javagameengine.input.InputComponent;
import com.javagamemaker.javagameengine.msc.Vector2;
import java.awt.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedList;
+
import java.util.List;
import java.util.Objects;
+
/**
* This is the first element in the JavaGameEngine
* it has a lot of functions as update, render positions scale shape
@@ -24,7 +25,7 @@
*/
public class Component implements Serializable {
- protected int layer = 100;
+ protected int layer = 0;
protected String tag = "";
protected float angle = 0;
protected boolean visible = true;
@@ -39,7 +40,7 @@ public class Component implements Serializable {
protected boolean mouseInside = false;
protected boolean freezeRotation = false;
protected boolean colliding = false;
-
+ public ArrayList addedChildren = new ArrayList<>();
protected Vector2 lastPosition;
public Component(ArrayList localVertices){
@@ -192,6 +193,69 @@ public void translate(Vector2 towards){
Vector2 newPos = new Vector2(towards.getX(),towards.getY());
boolean temp = colliding;
+ colliding = false;
+ if(collider!=null){
+ Collider addedX = new Collider();
+ addedX.localVertices = collider.getLocalVertices();
+ addedX.setPosition(collider.getPosition().add(towards.removeY()));
+ addedX.setScale(addedX.getScale().subtract(1));
+ addedX.updateVertices();
+
+ Collider addedY = new Collider();
+ addedY.localVertices = collider.getLocalVertices();
+ addedY.setPosition(collider.getPosition().add(towards.removeX()));
+ addedY.setScale(addedY.getScale().subtract(1));
+ addedY.updateVertices();
+
+ // all components in the scene
+ for ( Component c : JavaGameEngine.getSelectedScene().getComponents1() ){
+ if(c.getPosition().getZ() != getPosition().getZ()) continue;
+
+ if(c != this && JavaGameEngine.getSelectedScene().inside(c)){ // don't check us
+ for ( Component cc : c.getChildren(new Collider()) ){
+ Collider otherCollider = (Collider) cc;
+ Rectangle rec1 = collider.getShape().getBounds();
+ Rectangle rec2 = otherCollider.getShape().getBounds();
+
+ rec1.width += rec1.width;
+ rec1.height += rec1.height;
+
+ rec2.width += rec2.width;
+ rec2.height += rec2.height;
+
+ if( rec1.getBounds().intersects (rec2.getBounds()) ||
+ rec1.getBounds().intersects(rec1.getBounds()) ){
+
+ if((addedX.collision(otherCollider)) != null ){
+ if(collider.isTrigger()){
+ onTriggerEnter(new CollisionEvent(collider,otherCollider,null));
+ otherCollider.onTriggerEnter(new CollisionEvent(otherCollider,collider,null));
+ }
+ else if(otherCollider.isTrigger()){
+ onTriggerEnter(new CollisionEvent(otherCollider,collider,null));
+ otherCollider.onTriggerEnter(new CollisionEvent(otherCollider,collider,null));
+ }
+ else{
+ newPos.setX(0);
+
+ // Create collision event
+ CollisionEvent event = new CollisionEvent(collider,otherCollider,null);
+ //onCollisionEnter(event);
+ onCollisionDown(event);
+ onCollisionUp(event);
+ colliding = true;
+ try{
+ Vector2 vel = ((PhysicsBody) getChild(new PhysicsBody())).velocity;
+ ((PhysicsBody) getChild(new PhysicsBody())).response(event);
+ if(this.getChild(new PhysicsBody()).velocity.getX() == vel.getX()){
+ //Debug.log("zeor");
+ this.getChild(new PhysicsBody()).velocity.setX(0);
+ }
+ }catch (Exception e){}
+ }
+ }
+
+
for(Collider collider : this.getChildrenT()){
colliding = false;
if(collider!=null){
@@ -251,6 +315,23 @@ else if(otherCollider.isTrigger()){
}
}
+ else{
+ newPos.setY(0);
+ CollisionEvent event = new CollisionEvent(collider,otherCollider,null);
+ //onCollisionEnter(event);
+ onCollisionDown(event);
+ onCollisionUp(event);
+
+ colliding = true;
+ try{
+ Vector2 vel = ((PhysicsBody) getChild(new PhysicsBody())).velocity;
+ ((PhysicsBody) getChild(new PhysicsBody())).response(event);
+ if(((PhysicsBody) getChild(new PhysicsBody())).velocity.getY() == vel.getY()){
+ ((PhysicsBody) getChild(new PhysicsBody())).velocity.setY(0);
+ }
+ }catch (Exception e){}
+
+
if((addedY.collision(otherCollider)) !=null ){
if(collider.isTrigger()){
onTriggerEnter(new CollisionEvent(collider,otherCollider,null));
@@ -273,6 +354,7 @@ else if(otherCollider.isTrigger()){
}
}catch (Exception e){}
}
+
}
}
}
@@ -296,7 +378,7 @@ else if(otherCollider.isTrigger()){
public void setPosition(Vector2 position) {
//this.lastPosition = this.position;
- if(getParent()!=null){
+ if(getParent() != null){
this.position = position.add(parentOffset).add(rotOffset);
}else{
@@ -366,10 +448,13 @@ public void updateVertices(){
* @param component the new children
*/
public void add(Component component){
-
- component.setParent(this);
- component.setPosition(getPosition());
- children.add(component);
+ if(!JavaGameEngine.started){
+ component.setParent(this);
+ component.setPosition(getPosition());
+ children.add(component);
+ }else{
+ addedChildren.add(component);
+ }
}
/**
@@ -392,6 +477,7 @@ public void updateMili(){
* This method updates all the values to the component
*/
public void update(){
+
Point p = new Point((int) Input.getMousePosition().getX(), (int) Input.getMousePosition().getY());
/*
if mouse is inside, and we have not been we call mouse entered and we say it is entered
@@ -414,7 +500,15 @@ public void update(){
}
for(Component child : children){
child.update();
+ // add all the new children before the new update
+ for(Component component : child.addedChildren) {
+ component.setParent(child);
+ component.setPosition(child.getPosition());
+ child.children.add(component);
+ }
+ child.addedChildren.clear();
}
+
}
/**
* @return polygon based on components vertices
@@ -488,6 +582,7 @@ public LinkedList getAllChildren(Component type){
return children;
}
+
public T getChild(){
for (Component child : this.children){
try{
@@ -523,14 +618,16 @@ public ArrayList getAllColliders(){
return colliders;
}
/**
+ *
* @param type the specified type of the children to be returned
* @return if type is (new PhysicsBody()) it will return the first child that is a physicsBody as Component
+ * @param the type that will be returned (use this instead of casting)
*/
- public Component getChild(Component type) {
+ public T getChild(Component type) {
for (Component child : this.children){
if(child.getClass() == type.getClass()){
- return child;
+ return (T) child;
}
}
return null;
@@ -538,13 +635,22 @@ public Component getChild(Component type) {
public Vector2 getBodyPosition(){
return new Vector2(getShape().getBounds().x, getShape().getBounds().y);
}
+ private void onCollisionUp(CollisionEvent collisionEvent){
+ if(getParent()!=null) getParent().onCollisionUp(collisionEvent);
+
+ onCollisionEnter(collisionEvent);
+ }
+ private void onCollisionDown(CollisionEvent collisionEvent){
+ for(Component c : children) c.onCollisionDown(collisionEvent);
+ onCollisionEnter(collisionEvent);
+ }
+
/**
* class when a collision from a collider is triggered
* @param collisionEvent information about the collision
*/
public void onCollisionEnter(CollisionEvent collisionEvent){
colliding = true;
- if(getParent()!=null) getParent().onCollisionEnter(collisionEvent);
}
@@ -839,9 +945,7 @@ public Component clone() {
@Override
public String toString() {
- return "{position : "+position.toString()+",\n" +
- "scale:"+getScale().toString()+",\n" +
- "children: ["+getChildren()+"]}";
+ return this.getClass().getSimpleName();
}
public void onCameraEnter() {
diff --git a/src/com/javagamemaker/javagameengine/components/GameObject.java b/src/com/javagamemaker/javagameengine/components/GameObject.java
index 9b1139a..8d0eb54 100644
--- a/src/com/javagamemaker/javagameengine/components/GameObject.java
+++ b/src/com/javagamemaker/javagameengine/components/GameObject.java
@@ -50,8 +50,13 @@ public void update() {
@Override
public void render(Graphics2D g) {
+ if(visible){
+ Camera camera = JavaGameEngine.getSelectedScene().getCamera();
+
+
if(JavaGameEngine.getSelectedScene().isDebugMode()){
super.render(g);
+
Color prev = g.getColor();
if(getChild(new Sprite())==null){
@@ -63,10 +68,16 @@ public void render(Graphics2D g) {
}
g.setColor(prev);
}
+
+ renderChildren(g);
+ //g.translate(camera.getPosition().getX()*layer/100,camera.getPosition().getY()*layer/100);
+ //g.translate(-camera.getPosition().getX()*layer/100,-camera.getPosition().getY()*layer/100);
+
g.setColor(color);
g.fill(getShape());
g.setColor(prev);
+
}
else if(visible){
Color prev = g.getColor();
diff --git a/src/com/javagamemaker/javagameengine/components/PhysicsBody.java b/src/com/javagamemaker/javagameengine/components/PhysicsBody.java
index 9f79463..1b93f87 100644
--- a/src/com/javagamemaker/javagameengine/components/PhysicsBody.java
+++ b/src/com/javagamemaker/javagameengine/components/PhysicsBody.java
@@ -70,6 +70,21 @@ public void setPosition(Vector2 position) {
super.setPosition(position);
}
+ /**
+ * @return true if the body gets effected by gravity
+ */
+ public boolean isUseGravity() {
+ return useGravity;
+ }
+
+ /**
+ * Sets if the physicsbody should be effected by gravity
+ * @param useGravity
+ */
+ public void setUseGravity(boolean useGravity) {
+ this.useGravity = useGravity;
+ }
+
/**
* add force to the body in form of a vector ((10,0) fo to the right)
* @param force to be added
diff --git a/src/com/javagamemaker/javagameengine/components/PlayerCharacter.java b/src/com/javagamemaker/javagameengine/components/PlayerCharacter.java
deleted file mode 100644
index 5aec070..0000000
--- a/src/com/javagamemaker/javagameengine/components/PlayerCharacter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.javagamemaker.javagameengine.components;
-
-import com.javagamemaker.javagameengine.JavaGameEngine;
-import com.javagamemaker.javagameengine.input.Input;
-import com.javagamemaker.javagameengine.input.Keys;
-import com.javagamemaker.javagameengine.msc.Vector2;
-
-public class PlayerCharacter extends Component{
- PhysicsBody body = new PhysicsBody();
-
- public PlayerCharacter(PhysicsBody body){
- this.body = body;
- }
-
- @Override
- public void update() {
- super.update();
- if(Input.isKeyDown(Keys.A)){
- getFirstParent().rotate(-1); //body.setRotationalPoint(new Vector2(0,0));
- }
- if(Input.isKeyDown(Keys.D)){
- //body.setRotationalForce(0.9f);
- getFirstParent().rotate(1);
- // body.setRotationalPoint(new Vector2(0,0));
- }
-
- if(Input.isKeyDown(Keys.SPACE)){
- body.addForce(Vector2.getDirection(angle).multiply(5/2));
-
- }
- if(Input.isKeyDown(Keys.SHIFT)){
- body.addForce(Vector2.getDirection(angle).multiply(-5/2));
- }
- JavaGameEngine.getSelectedScene().getCamera().setPosition(getFirstParent().getPosition().multiply(-1).add(JavaGameEngine.getWindowSize().divide(2)));
-
- }
-}
diff --git a/src/com/javagamemaker/javagameengine/components/gamecompnents/CollidingBox.java b/src/com/javagamemaker/javagameengine/components/gamecompnents/CollidingBox.java
new file mode 100644
index 0000000..0aca95a
--- /dev/null
+++ b/src/com/javagamemaker/javagameengine/components/gamecompnents/CollidingBox.java
@@ -0,0 +1,29 @@
+package com.javagamemaker.javagameengine.components.gamecompnents;
+
+import com.javagamemaker.javagameengine.components.Collider;
+import com.javagamemaker.javagameengine.components.GameObject;
+import com.javagamemaker.javagameengine.msc.Vector2;
+
+import java.util.ArrayList;
+
+public class CollidingBox extends GameObject {
+ Vector2 newPost = new Vector2(0,0);
+ public CollidingBox(ArrayList localVertices) {
+ super(localVertices);
+ }
+
+ public CollidingBox() {
+ }
+
+ public CollidingBox(Vector2 vector2) {
+ newPost = vector2;
+ }
+
+ @Override
+ public void start() {
+ super.start();
+ setTag("Ground");
+ add(new Collider(localVertices));
+ setPosition(newPost);
+ }
+}
diff --git a/src/com/javagamemaker/javagameengine/components/Grabber.java b/src/com/javagamemaker/javagameengine/components/gamecompnents/Grabber.java
similarity index 72%
rename from src/com/javagamemaker/javagameengine/components/Grabber.java
rename to src/com/javagamemaker/javagameengine/components/gamecompnents/Grabber.java
index b8d7c7c..1684802 100644
--- a/src/com/javagamemaker/javagameengine/components/Grabber.java
+++ b/src/com/javagamemaker/javagameengine/components/gamecompnents/Grabber.java
@@ -1,14 +1,21 @@
-package com.javagamemaker.javagameengine.components;
+package com.javagamemaker.javagameengine.components.gamecompnents;
+import com.javagamemaker.javagameengine.components.Component;
+import com.javagamemaker.javagameengine.components.PhysicsBody;
import com.javagamemaker.javagameengine.input.Input;
-import com.javagamemaker.javagameengine.msc.Debug;
import com.javagamemaker.javagameengine.msc.Vector2;
-public class Grabber extends Component{
+/**
+ * Grabber is a component that will let the mouse controll the object by "Grabbing" it
+ */
+public class Grabber extends Component {
Component parent;
private Vector2 offset;
+ /**
+ * Grabber is a component that will let the mouse controll the object by "Grabbing" it
+ */
public Grabber(Component parent){
this.parent = parent;
}
@@ -17,7 +24,10 @@ public Grabber(Component parent){
public void update() {
super.update();
if (Input.isMouseDown(1) && parent.isMouseInside()) {
- Debug.log("asd");
+ PhysicsBody b;
+ if ((b = ((PhysicsBody)parent.getChild(new PhysicsBody()))) != null){
+ b.velocity = Vector2.zero;
+ }
if (this.offset == null) {
this.offset = parent.getPosition().subtract(Input.getMousePosition());
}
diff --git a/src/com/javagamemaker/javagameengine/components/gamecompnents/PlatformPlayerController.java b/src/com/javagamemaker/javagameengine/components/gamecompnents/PlatformPlayerController.java
new file mode 100644
index 0000000..0b36518
--- /dev/null
+++ b/src/com/javagamemaker/javagameengine/components/gamecompnents/PlatformPlayerController.java
@@ -0,0 +1,169 @@
+package com.javagamemaker.javagameengine.components.gamecompnents;
+
+import com.javagamemaker.javagameengine.CollisionEvent;
+import com.javagamemaker.javagameengine.components.Collider;
+import com.javagamemaker.javagameengine.components.Component;
+import com.javagamemaker.javagameengine.components.PhysicsBody;
+import com.javagamemaker.javagameengine.input.Input;
+import com.javagamemaker.javagameengine.input.InputComponent;
+import com.javagamemaker.javagameengine.input.Keys;
+import com.javagamemaker.javagameengine.msc.Debug;
+import com.javagamemaker.javagameengine.msc.Vector2;
+
+/**
+ * Generic component that will make a object move right to left with the specifed keys
+ *
+ */
+public class PlatformPlayerController extends Component {
+
+ private float maxSpeed = 3;
+ private float friction = 0.4f;
+
+ private int right = Keys.D;
+ private int left = Keys.A;
+ private int space = Keys.SPACE;
+ private float jumpForce = 30;
+ private String groundTag = "Ground";
+
+
+ private InputComponent input;
+
+
+ public PlatformPlayerController(float maxSpeed, float friction) {
+ this.maxSpeed = maxSpeed;
+ this.friction = friction;
+ }
+
+ public PlatformPlayerController(int right, int left, int space) {
+ this.right = right;
+ this.left = left;
+ this.space = space;
+ }
+ public PlatformPlayerController(float maxSpeed, float friction, int right, int left, int space, float jumpForce) {
+ this.maxSpeed = maxSpeed;
+ this.friction = friction;
+ this.right = right;
+ this.left = left;
+ this.space = space;
+ this.jumpForce = jumpForce;
+ }
+
+ public float getJumpForce() {
+ return jumpForce;
+ }
+
+ public void setJumpForce(float jumpForce) {
+ this.jumpForce = jumpForce;
+ }
+
+ public float getMaxSpeed() {
+ return maxSpeed;
+ }
+
+ public void setMaxSpeed(float maxSpeed) {
+ this.maxSpeed = maxSpeed;
+ }
+
+ public float getFriction() {
+ return friction;
+ }
+
+ public void setFriction(float friction) {
+ this.friction = friction;
+ }
+
+ public int getRight() {
+ return right;
+ }
+
+ public void setRight(int right) {
+ this.right = right;
+ }
+
+ public int getLeft() {
+ return left;
+ }
+
+ public void setLeft(int left) {
+ this.left = left;
+ }
+
+ public int getSpace() {
+ return space;
+ }
+
+ public String getGroundTag() {
+ return groundTag;
+ }
+
+ public void setGroundTag(String groundTag) {
+ this.groundTag = groundTag;
+ }
+
+ public void setSpace(int space) {
+ this.space = space;
+ }
+ private boolean grounded = true;
+
+ public PlatformPlayerController() {
+ }
+
+ public PlatformPlayerController(InputComponent input) {
+ this.input = input;
+ }
+
+ @Override
+ public void start() {
+ super.start();
+ Component parent = getParent();
+ //if physics body does not exist add it
+ if(parent.getChild(new Collider()) == null)
+ parent.add(new Collider(true));
+
+ if(parent.getChild(new InputComponent("")) == null){
+ if(input == null)
+ input = new InputComponent("");
+ add(input);
+ }
+
+ if(parent.getChild(new PhysicsBody()) == null)
+ parent.add(new PhysicsBody(true));
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ Component parent = getParent();
+ // Debug.log(parent.getChildren().toString());
+ PhysicsBody physicsBody = parent.getChild(new PhysicsBody());
+ if(physicsBody!= null){
+
+ if(input.isKeyDown(right)){
+ if(physicsBody.velocity.getX() < maxSpeed){
+ physicsBody.addForce(Vector2.right);
+ }
+ }
+ if(input.isKeyDown(left)){
+ if(physicsBody.velocity.getX() > -maxSpeed){
+ physicsBody.addForce(Vector2.left);
+ }
+ }
+
+ if(input.isKeyPressed(space) && grounded){
+ physicsBody.addForce(Vector2.up.multiply(jumpForce));
+ }
+
+ physicsBody.addForce(physicsBody.velocity.getNormalized().multiply(-friction).removeY());
+ grounded = false;
+ }
+ }
+
+ @Override
+ public void onCollisionEnter(CollisionEvent collisionEvent) {
+ super.onCollisionEnter(collisionEvent);
+ if(collisionEvent.getCollider2().getFirstParent().getTag() == "Ground"){
+ grounded = true;
+ }
+ }
+
+}
diff --git a/src/com/javagamemaker/javagameengine/input/Input.java b/src/com/javagamemaker/javagameengine/input/Input.java
index 7f77ad2..2c307da 100644
--- a/src/com/javagamemaker/javagameengine/input/Input.java
+++ b/src/com/javagamemaker/javagameengine/input/Input.java
@@ -4,10 +4,12 @@
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
+import java.util.ArrayList;
import java.util.LinkedList;
public class Input {
- private static final LinkedList keyDowns = new LinkedList<>();
+
+ private static LinkedList keyDowns = new LinkedList<>();
private static boolean isPressed = false;
private static int mouseIsPressed = 1000;
private static final LinkedList mouseButtonDowns = new LinkedList<>();
@@ -16,6 +18,17 @@ public class Input {
private static Vector2 mousePositionOnCanvas = new Vector2(0, 0);
private static MouseEvent mouseEvent = null;
+ /**
+ * this is a list which says which InputComponents should give InputEvent
+ */
+ private static ArrayList activeContext = new ArrayList<>();
+
+ private Input() {
+ }
+
+ public static LinkedList getKeyDowns() {
+ return keyDowns;
+ }
/**
*
@@ -25,6 +38,21 @@ public static Vector2 getMousePosition() {
return mousePosition;
}
+ public static void addContext(String context){
+ activeContext.add(context);
+ }
+ public static void removeContext(String context){
+ activeContext.remove(context);
+ }
+
+ public static ArrayList getActiveContext() {
+ return activeContext;
+ }
+
+ public static void setActiveContext(ArrayList activeContext_) {
+ activeContext = activeContext_;
+ }
+
public static MouseEvent getMouseEvent() {
return mouseEvent;
}
@@ -50,9 +78,9 @@ public static void addMouseButton(MouseEvent e) {
}
/**
- *
- * @return mouse position of panel so top right = 0,0
- */
+ *
+ * @return mouse position of panel so top right = 0,0
+ */
public static Vector2 getMousePositionOnCanvas() {
return mousePositionOnCanvas;
}
diff --git a/src/com/javagamemaker/javagameengine/input/InputComponent.java b/src/com/javagamemaker/javagameengine/input/InputComponent.java
new file mode 100644
index 0000000..e185171
--- /dev/null
+++ b/src/com/javagamemaker/javagameengine/input/InputComponent.java
@@ -0,0 +1,68 @@
+package com.javagamemaker.javagameengine.input;
+
+import com.javagamemaker.javagameengine.components.Component;
+import com.javagamemaker.javagameengine.msc.Debug;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+/**
+ * The InputComponent is used to get input
+ * In the component we can set the chanel to listen to
+ * and we can then set which chanel the Input class
+ * should send to
+ */
+public class InputComponent extends Component {
+ /**
+ * The chanel name which
+ */
+ private String context = "";
+ private LinkedList leftKeys = new LinkedList<>();
+
+ public String getContext() {
+ return context;
+ }
+
+ public void setContext(String context) {
+ this.context = context;
+ }
+
+ public InputComponent(String context) {
+ this.context = context;
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ /*
+ If the left key does not exist in the down remove it
+ */
+ LinkedList keyBuffer = new LinkedList<>();
+ for(int key : leftKeys){
+ if(!Input.isKeyDown(key)){
+ keyBuffer.add(key);
+ }
+ }
+ leftKeys.removeAll(keyBuffer);
+
+ }
+
+ public boolean isKeyPressed(int keycode){
+ boolean pressed = Input.getKeyDowns().contains(keycode) &&
+ !leftKeys.contains(keycode) &&
+ Input.getActiveContext().contains(context);
+ if(pressed)
+ leftKeys.add(keycode);
+ return pressed;
+ }
+
+ public boolean isMousePressed(int mouseCode){
+ return Input.isMousePressed() && Input.getActiveContext().contains(context);
+ }
+
+ public boolean isKeyDown(int keycode){
+ return Input.getKeyDowns().contains(keycode) &&
+ Input.getActiveContext().contains(context);
+ }
+
+}
diff --git a/src/com/javagamemaker/javagameengine/input/InputManager.java b/src/com/javagamemaker/javagameengine/input/InputManager.java
new file mode 100644
index 0000000..81a483c
--- /dev/null
+++ b/src/com/javagamemaker/javagameengine/input/InputManager.java
@@ -0,0 +1,15 @@
+package com.javagamemaker.javagameengine.input;
+
+public class InputManager {
+
+ private String contextName = "";
+
+
+ public InputManager() {
+
+ }
+
+ public InputManager(String contextName) {
+ this.contextName = contextName;
+ }
+}
diff --git a/src/com/javagamemaker/javagameengine/msc/Vector2.java b/src/com/javagamemaker/javagameengine/msc/Vector2.java
index 8001742..6462b02 100644
--- a/src/com/javagamemaker/javagameengine/msc/Vector2.java
+++ b/src/com/javagamemaker/javagameengine/msc/Vector2.java
@@ -10,15 +10,22 @@ public class Vector2 implements Serializable {
public static Vector2 right = new Vector2(1,0);
public static Vector2 left = new Vector2(-1,0);
public static Vector2 zero = new Vector2(0,0);
- private float x,y;
+ private float x,y,z;
+ public Vector2(float x, float y, float z) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
public Vector2(float x, float y) {
this.x = x;
this.y = y;
+ this.z = 0;
}
public Vector2(Vector2 vector2) {
this.x = vector2.x;
this.y = vector2.y;
+ this.z = vector2.z;
}
public float getX() {
return x;
@@ -36,6 +43,14 @@ public void setY(float y) {
this.y = y;
}
+ public float getZ() {
+ return z;
+ }
+
+ public void setZ(float z) {
+ this.z = z;
+ }
+
public String toString()
{
return ("{x:{"+x+"} y:{"+y+"}}");
@@ -45,10 +60,10 @@ public Vector2 multiply(float multiple) {
return new Vector2(x*multiple,y*multiple);
}
public Vector2 multiply(double multiple) {
- return new Vector2((float) (x*multiple), (float) (y*multiple));
+ return new Vector2((float) (x*multiple), (float) (y*multiple),(float) (z*multiple));
}
public Vector2 multiply(Vector2 vector2) {
- return new Vector2(x*vector2.x,y*vector2.y);
+ return new Vector2(x*vector2.x,y*vector2.y,z*vector2.z);
}
public float getMagnitude (){
@@ -64,10 +79,10 @@ public Vector2 getOpposite(){
}
public Vector2 divide(float a){
- return new Vector2(x/a,y/a);
+ return new Vector2(x/a,y/a, z/a);
}
public Vector2 divide(Vector2 a){
- return new Vector2(x/a.getX(),y/a.getY());
+ return new Vector2(x/a.getX(),y/a.getY(), z/a.getZ());
}
public Vector2 add(Vector2 vector2) {
return new Vector2(x+ vector2.x,y+ vector2.y);