rotation
Marcus Gosselin 2016-02-15 17:52:56 -05:00
parent bf9e74169d
commit 0cc8babc19
8 changed files with 405 additions and 0 deletions

6
.classpath 100644
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="output" path="bin"/>
</classpath>

17
.project 100644
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Dive Engine 2D</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8

View File

@ -0,0 +1,31 @@
package diveengine2d;
import java.awt.Graphics2D;
public abstract class DiveScript {
public boolean enabled = true;
public String name;
public Entity entity;
/**
* called every frame
*/
public void update() {}
/**
* when initialized in the scene. <br />
* SCENE WILL BE INCOMPLETE HERE.
*/
public void create() {}
/**
* called after the scene has been initialized
*/
public void awake() {}
/**
* render method beeboop
* @param g
*/
public void render(Graphics2D g) {}
}

View File

@ -0,0 +1,150 @@
package diveengine2d;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import javax.swing.JFrame;
public class Engine extends Canvas {
public static String gameFolder = null;
public static int WIDTH, HEIGHT;
public static String startScene = null;
public static String name = null;
public static BufferStrategy bs;
public Engine(String gameFolder) {
// setup the folder
this.gameFolder = gameFolder;
System.out.println("Engine started with folder " + gameFolder + " ...");
boolean configFile = false;
try {
// get the config values from the config file
loadConfig();
configFile = true;
} catch (Exception e) {
e.printStackTrace();
}
// if we failed, screw this.
if (!configFile)
return;
// now, lets make our window.
System.out.println("start scene: " + startScene);
System.out.println("resolution: " + WIDTH + " X " + HEIGHT);
SceneManager.loadScene(startScene);
SceneManager.entityDump();
JFrame frame = new JFrame(name);
frame.add(this);
this.setPreferredSize(new Dimension(WIDTH, HEIGHT));
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
createBufferStrategy(2);
bs = getBufferStrategy();
while(true) {
repaint();
try{
Thread.sleep(17);
}catch(Exception e) {
}
}
}
private void loadConfig() throws Exception {
File configFile = null;
try {
configFile = new File(gameFolder + "\\build.config");
} catch (Exception e) {
throw new Exception("Configuration File not found");
}
List<String> lines = Files.readAllLines(Paths.get(gameFolder, "build.config"));
for (String line : lines) {
if (line.startsWith("#"))
continue;
String[] parts = line.split("=");
if (parts.length != 2) {
System.out.println("line has incorrect parts length: '" + line + "'");
System.out.println("ignoring...");
continue;
}
parts[0] = parts[0].trim();
parts[1] = parts[1].trim();
if (parts[0].equals("StartScene")) {
this.startScene = parts[1];
} else if (parts[0].equals("Resolution")) {
String[] resparts = parts[1].split("x");
if (resparts.length != 2) {
System.out.println("line has incorrect parts length: '" + resparts + "'");
System.out.println("ignoring...");
continue;
}
resparts[0] = resparts[0].trim();
resparts[1] = resparts[1].trim();
try {
WIDTH = Integer.parseInt(resparts[0]);
HEIGHT = Integer.parseInt(resparts[1]);
} catch (NumberFormatException e) {
System.out.println("line has incorrect resolution: '" + parts[1] + "'");
System.out.println("ignoring...");
continue;
}
} else if (parts[0].equals("name")) {
name = parts[1].trim();
}
}
System.out.println("Loaded Config File...");
}
public void update(Graphics g) {
Graphics2D g2 = null;
try {
g2 = (Graphics2D) bs.getDrawGraphics();
render(g2);
} finally {
g2.dispose();
}
bs.show();
}
private void render(Graphics2D g) {
SceneManager.render(g);
g.setColor(Color.BLACK);
}
}

View File

@ -0,0 +1,30 @@
package diveengine2d;
import java.util.ArrayList;
import java.util.List;
public class Entity {
public float x = 0, y = 0, rotation = 0;
public boolean enabled = true;
public String GUID = null;
public String name = null;
public List<DiveScript> components = new ArrayList<DiveScript>();
public String toString() {
return "name: " + name + "\n" +
"GUID: " + GUID +
componentsToString();
}
private String componentsToString() {
String _return = "";
for(DiveScript c : components) {
_return += "\nComponent " + c.name;
}
return _return;
}
public void addComponent(DiveScript component) {
components.add(component);
}
}

View File

@ -0,0 +1,16 @@
package diveengine2d;
import java.awt.Color;
import java.awt.Graphics2D;
public class RectRenderer extends DiveScript{
public Color color = null;
public int width, height;
public void render(Graphics2D g) {
g.setColor(color);
g.fillRect((int)entity.x, (int)entity.y, width, height);
}
}

View File

@ -0,0 +1,144 @@
package diveengine2d;
import java.awt.Color;
import java.awt.Graphics2D;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class SceneManager {
private static ArrayList<Entity> entities = new ArrayList<Entity>();
/**
* load scene by filename without the .scene extension.
* @param scene
* @return
*/
public static boolean loadScene(String scene) {
synchronized(entities) {
try{
List<String> lines = Files.readAllLines(Paths.get(Engine.gameFolder, scene + ".scene"));
Stack<Object> scopeObject = new Stack<Object>();
for (String line : lines) {
//System.out.println(line);
line = line.trim();
if(line.startsWith("#")) continue;
if(line.startsWith("[") && line.endsWith("]")){
String newLine = line.substring(1, line.length() - 1);
Class<?> entityClass = null;
try{
entityClass = Class.forName(newLine);
}catch(ClassNotFoundException e) {
System.out.println(newLine + " class not found!");
continue;
}
Object object = entityClass.newInstance();
if(!(object instanceof Entity)) {
System.out.println(entityClass + " is not an entity");
continue;
}
entities.add((Entity)object);
scopeObject.push((Entity)object);
}else if(line.startsWith("$")) {
//scope variable
String[] parts = line.substring(1).split("=");
if(parts.length != 2) {
System.out.println("line: " + line + " is incorrect.\nignoring...");
continue;
}
parts[0] = parts[0].trim();
parts[1] = parts[1].trim();
String key = parts[0], value = parts[1];
if(scopeObject.isEmpty()) {
System.out.println("no object in scope to bind " + key + " to");
continue;
}
if(value.startsWith("\"") && value.endsWith("\"")) {
value = value.substring(1, value.length() - 1);
scopeObject.peek().getClass().getField(key).set(scopeObject.peek(), value);
}else if(value.startsWith("#")) {
value = value.substring(1, value.length());
//TODO CHECK IF 6 characters
int r = Integer.parseInt(value.substring(0, 2), 16);
int g = Integer.parseInt(value.substring(2, 4), 16);
int b = Integer.parseInt(value.substring(4, 6), 16);
Color color = new Color(r, g, b);
scopeObject.peek().getClass().getField(key).set(scopeObject.peek(), color);
}else if(value.endsWith("F") || value.endsWith("f")) {
value = value.substring(0, value.length() - 1);
int intValue;
try{
intValue = Integer.parseInt(value);
}catch(Exception e) {
System.out.println(value + " is not an int");
continue;
}
scopeObject.peek().getClass().getField(key).set(scopeObject.peek(), intValue);
}
}else if(line.startsWith("Component")) {
//component
if(!(scopeObject.peek() instanceof Entity)) {
System.out.println("Con not apply a component to " + scopeObject.peek());
continue;
}
String[] parts = line.substring(1).split(" ");
if(parts.length != 2) {
System.out.println("line: " + line + " is incorrect.\nignoring...");
continue;
}
//we really only care about this part anyways so...
String componentClass = parts[1].trim();
DiveScript component = null;
try {
Object maybeComponent = Class.forName(componentClass).newInstance();
if(maybeComponent instanceof DiveScript) {
component = (DiveScript)maybeComponent;
}else {
System.out.println("" + componentClass + " is not of type component!");
continue;
}
} catch( ClassNotFoundException e ) {
System.out.println("Component " + componentClass + " not found!");
continue;
}
component.entity = (Entity) scopeObject.peek();
((Entity)scopeObject.peek()).addComponent(component);
scopeObject.push(component);
}else if (line.equals("End Component")) {
scopeObject.pop();
}
}
}catch(Exception e) {
System.out.println(e.getMessage());
return false;
}
System.out.println("Loaded Scene File...");
return true;
}
}
public static void entityDump() {
synchronized(entities) {
System.out.println("--------------------ENTITY DUMP--------------------\n");
for(Entity entity : entities) {
System.out.println("" + entity + "\n");
}
}
}
public static void render(Graphics2D g) {
for(Entity e : entities) {
for(DiveScript script : e.components) {
script.render(g);
}
}
}
}