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);