Kenneth van Ewijk 10 жил өмнө
parent
commit
a98e35ce53

+ 38 - 0
src/control/GameControl.java

@@ -0,0 +1,38 @@
+package control;
+
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+
+import model.GameModel;
+import model.GameStateManager;
+import view.GameView;
+
+public class GameControl implements KeyListener {
+
+	private GameView view;
+	private GameModel model;
+	
+	private GameStateManager gsm;
+
+	public GameControl(GameView view, GameModel model, GameStateManager gsm)
+	{
+		this.view = view;
+		this.model = model;
+		this.gsm = gsm;
+	}
+
+	@Override
+	public void keyPressed(KeyEvent e) {
+		gsm.keyPressed(e);
+	}
+
+	@Override
+	public void keyReleased(KeyEvent e) {
+		gsm.keyReleased(e);
+	}
+
+	public void keyTyped(KeyEvent e) {
+		gsm.keyTyped(e);
+	}
+	
+}

+ 9 - 0
src/main/Main.java

@@ -0,0 +1,9 @@
+package main;
+
+public class Main {
+
+	public static void main(String[] args) {
+		new Window();
+	}
+
+}

+ 35 - 0
src/main/Window.java

@@ -0,0 +1,35 @@
+package main;
+
+import javax.swing.JFrame;
+
+import model.GameModel;
+import model.GameStateManager;
+import view.GameView;
+import control.GameControl;
+
+public class Window extends JFrame {
+	
+	public static final int WIDTH = 800;
+	public static final int HEIGHT = 700;
+	
+	public static final int UPDATES_PER_SECOND = 30;
+	public static final int FRAMES_PER_SECOND = 30;
+	
+	public Window()
+	{
+		super("Bubble Trouble");
+		setSize(WIDTH, HEIGHT);
+		setDefaultCloseOperation(3);
+		
+		GameStateManager gsm = new GameStateManager();
+		GameModel model = new GameModel(gsm);
+		GameView view = new GameView(model, gsm);
+		GameControl control = new GameControl(view, model, gsm);
+		
+		addKeyListener(control);
+		
+		setContentPane(view);
+		
+		setVisible(true);
+	}
+}

+ 26 - 0
src/model/GameModel.java

@@ -0,0 +1,26 @@
+package model;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.Timer;
+
+import main.Window;
+
+public class GameModel implements ActionListener {
+	
+	Timer t;
+	GameStateManager gsm;
+	
+	public GameModel(GameStateManager gsm)
+	{
+		this.gsm = gsm;
+		
+		t = new Timer(1000/Window.UPDATES_PER_SECOND, this);
+		t.start();
+	}
+
+	public void actionPerformed(ActionEvent e) {
+		gsm.update();
+	}
+}

+ 69 - 0
src/model/GameStateManager.java

@@ -0,0 +1,69 @@
+package model;
+
+import java.awt.Graphics2D;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+import model.state.MenuState;
+import model.state.PlayState;
+import model.state.State;
+
+public class GameStateManager {
+
+	private List<State> gamestates;
+	private State currentState;
+	
+	public GameStateManager(){
+		gamestates = new ArrayList<State>();
+		
+		gamestates.add(new MenuState(this));
+		gamestates.add(new PlayState(this));
+		
+		currentState = gamestates.get(0);
+	}
+	
+	public void setState(String name)
+	{
+		for(State s : gamestates)
+		{
+			if(s.getName() == name)
+			{
+				changeState(s);
+				return;
+			}
+		}
+	}
+	
+	private void changeState(State st)
+	{
+		if(! currentState.equals(st))
+		{
+			currentState.exit();
+			currentState = st;
+			currentState.init();
+		}
+	}
+	
+	public void update(){		
+		currentState.update();
+	}
+	
+	public void paint(Graphics2D g2d)
+	{
+		currentState.paint(g2d);
+	}
+	
+	public void keyPressed(KeyEvent e)
+	{
+		currentState.keyPressed(e);
+	}
+	public void keyReleased(KeyEvent e)
+	{
+		currentState.keyReleased(e);
+	}
+	public void keyTyped(KeyEvent e)
+	{
+		currentState.keyTyped(e);
+	}
+}

+ 88 - 0
src/model/objects/DrawObject.java

@@ -0,0 +1,88 @@
+package model.objects;
+
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.image.BufferedImage;
+
+public class DrawObject {
+	
+	protected Point2D position;
+	protected double scale;
+	protected double rotation;
+	
+	BufferedImage image;
+	
+	public DrawObject(BufferedImage image)
+	{
+		this.image = image;
+		
+		position = new Point2D.Double(0,0);
+		scale = 1;
+		rotation = 0;
+	}
+	
+	public void paint(Graphics2D g2d)
+	{
+		g2d.drawImage(image, getTransform(), null);
+	}
+	
+	private AffineTransform getTransform()
+	{
+		AffineTransform tx = new AffineTransform();
+		tx.translate(position.getX(), position.getY());
+		tx.scale(scale, scale);
+		tx.rotate(rotation, image.getWidth()/2, image.getHeight()/2);
+		return tx;
+	}
+	
+	/* HELPER FUNCTIONS */
+	public void setX(double x)
+	{
+		position.setLocation(x, position.getY());
+	}
+	public void setY(double y)
+	{
+		position.setLocation(position.getX(), y);
+	}
+	public void setPosition(Point2D p)
+	{
+		position.setLocation(p);
+	}
+	public void setPosition(double x, double y)
+	{
+		position.setLocation(x, y);
+	}
+	
+	public void setRotation(double r)
+	{
+		this.rotation = r;
+	}
+	public void setScale(double s)
+	{
+		this.scale = s;
+	}
+	
+	
+	public double getX()
+	{
+		return position.getX();
+	}
+	public double getY()
+	{
+		return position.getY();
+	}
+	public Point2D getPosition()
+	{
+		return position;
+	}
+	
+	public double getRotation()
+	{
+		return rotation;
+	}
+	public double getScale()
+	{
+		return scale;
+	}
+}

+ 55 - 0
src/model/state/MenuState.java

@@ -0,0 +1,55 @@
+package model.state;
+
+import java.awt.Graphics2D;
+import java.awt.event.KeyEvent;
+
+import main.Window;
+import model.GameStateManager;
+
+public class MenuState extends State {
+
+	public MenuState(GameStateManager gsm) {
+		super("menu", gsm);
+	}
+	
+	
+	/* INIT AND EXIT */
+	@Override
+	public void init() {
+		System.out.println("Starting menu state");
+	}
+	
+	@Override 
+	public void exit()
+	{
+		System.out.println("Stopping menu state");
+	}
+	
+	
+	/* UPDATE */
+	@Override
+	public void update() {
+		
+	}
+
+	@Override
+	public void paint(Graphics2D g2) {
+		g2.drawString("Press ENTER to start the game", Window.WIDTH/2, Window.HEIGHT/2);
+	}
+	
+	
+	/* EVENTS */
+	@Override
+	public void keyPressed(KeyEvent e) {
+		if(e.getKeyCode() == KeyEvent.VK_ENTER)
+		{
+			gsm.setState("play");
+		}
+	}
+	@Override
+	public void keyReleased(KeyEvent e) {
+		
+	}
+	@Override
+	public void keyTyped(KeyEvent e) {}
+}

+ 64 - 0
src/model/state/PlayState.java

@@ -0,0 +1,64 @@
+package model.state;
+
+import java.awt.Graphics2D;
+import java.awt.event.KeyEvent;
+
+import resources.image.Images;
+import resources.image.Images.ImageType;
+import main.Window;
+import model.GameStateManager;
+import model.objects.DrawObject;
+
+public class PlayState extends State{
+	
+	DrawObject player;
+	
+	public PlayState(GameStateManager gsm) {
+		super("play", gsm);
+		
+		player = new DrawObject(Images.getImage(ImageType.PLAYER));
+	}
+
+	/* INIT AND EXIT */
+	@Override
+	public void init() {
+		System.out.println("Starting play state");
+		player.setPosition(0, 0);
+	}
+	
+	@Override 
+	public void exit()
+	{
+		System.out.println("Stopping play state");
+	}
+
+	
+	/* UPDATE */
+	@Override
+	public void update() {		
+			player.setPosition(player.getX() + 1, player.getY()+1);
+	}
+
+	@Override
+	public void paint(Graphics2D g2d) {	
+		g2d.drawString("Press ESC to stop the game", Window.WIDTH/2, Window.HEIGHT/2);
+		
+		player.paint(g2d);
+	}
+
+	
+	/* EVENTS */
+	@Override
+	public void keyPressed(KeyEvent e) {
+		if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
+		{
+			gsm.setState("menu");
+		}
+	}
+	@Override
+	public void keyReleased(KeyEvent e) {
+		
+	}
+	@Override
+	public void keyTyped(KeyEvent e) {}
+}

+ 46 - 0
src/model/state/State.java

@@ -0,0 +1,46 @@
+package model.state;
+
+import java.awt.Graphics2D;
+import java.awt.event.KeyEvent;
+
+import model.GameStateManager;
+
+public abstract class State  {
+
+	protected GameStateManager gsm;
+	
+	protected String name;
+
+	public State(String name, GameStateManager gsm) {
+		this.name = name;
+		this.gsm = gsm;
+	}
+	
+	public String getName(){
+		return name;
+	}
+	
+	public boolean equals(Object o)
+	{
+		if(! (o instanceof State))
+			return false;
+		
+		State tempstate = (State) o;
+		
+		if(tempstate.getName() == this.name)
+			return true;
+		else
+			return false;
+	}
+	
+	public abstract void init();
+	public abstract void exit();
+	
+	public abstract void update();
+	public abstract void paint(Graphics2D g2);	
+	
+	public abstract void keyPressed(KeyEvent e);
+	public abstract void keyReleased(KeyEvent e);
+	public abstract void keyTyped(KeyEvent e);
+	
+}

+ 37 - 0
src/resources/image/Images.java

@@ -0,0 +1,37 @@
+package resources.image;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.imageio.ImageIO;
+
+import main.Main;
+
+public class Images {
+
+	private static ArrayList<BufferedImage> images = new ArrayList<BufferedImage>();
+
+	public Images(){}
+
+	static{
+		try{
+			images.add(ImageIO.read(Main.class.getResource("/resources/image/player.png"))); 
+			images.add(ImageIO.read(Main.class.getResource("/resources/image/player2.png"))); 
+		  
+		}catch(IOException e){
+			e.printStackTrace();
+		}
+	 }
+
+	 public static BufferedImage getImage(ImageType img)
+	 {
+		 return images.get(img.ordinal());
+	 }
+
+	 public static enum ImageType
+	 {
+		 PLAYER,
+		 PLAYER2
+	 }
+}

BIN
src/resources/image/player.png


BIN
src/resources/image/player2.png


+ 53 - 0
src/view/GameView.java

@@ -0,0 +1,53 @@
+package view;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JPanel;
+import javax.swing.Timer;
+
+import main.Window;
+import model.GameModel;
+import model.GameStateManager;
+
+public class GameView extends JPanel implements ActionListener{
+	
+	private GameModel model;
+	private GameStateManager gsm;
+	private Timer t;
+	
+	public GameView(GameModel model, GameStateManager gsm)
+	{
+		super();
+		this.model = model;
+		this.gsm = gsm;
+		
+		setBackground(Color.WHITE);
+		
+		t = new Timer(1000/Window.FRAMES_PER_SECOND, this);	
+		t.start();
+	}
+	
+	@Override
+	public void paintComponent(Graphics g)
+	{
+		super.paintComponent(g);
+		Graphics2D g2d = (Graphics2D) g;
+		
+		RenderingHints rh = new RenderingHints(
+	             RenderingHints.KEY_ANTIALIASING,
+	             RenderingHints.VALUE_ANTIALIAS_ON);
+	    g2d.setRenderingHints(rh);
+		
+		gsm.paint(g2d);
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent e) {
+		repaint();
+	}
+}