diff --git a/MerchantRPGCSE2102/.classpath b/MerchantRPGCSE2102/.classpath index e1badea..964c4ef 100644 --- a/MerchantRPGCSE2102/.classpath +++ b/MerchantRPGCSE2102/.classpath @@ -1,8 +1,9 @@ - + + diff --git a/MerchantRPGCSE2102/.settings/org.eclipse.jdt.core.prefs b/MerchantRPGCSE2102/.settings/org.eclipse.jdt.core.prefs index 838bd9d..54e493c 100644 --- a/MerchantRPGCSE2102/.settings/org.eclipse.jdt.core.prefs +++ b/MerchantRPGCSE2102/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,11 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.compliance=1.6 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.7 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/MerchantRPGCSE2102/src/controller/RPGame.java b/MerchantRPGCSE2102/src/controller/RPGame.java index 0ca095d..9d18455 100644 --- a/MerchantRPGCSE2102/src/controller/RPGame.java +++ b/MerchantRPGCSE2102/src/controller/RPGame.java @@ -21,7 +21,7 @@ public class RPGame { private ArrayList playerInventoryList = new ArrayList(); // the player's inventory list private Player _player; private Merchant _merchant1, _merchant2, _merchant3; - private boolean _movement; + public boolean _movement; private int _currentDay; private int _transactionLimit; @@ -140,6 +140,7 @@ public void createTransaction(Player player, Merchant targetMerchant) } } + /** * Will refresh number of transactions the Player has available * @@ -277,48 +278,44 @@ public static void main(String[] args) throws InterruptedException playerInventory.addAll(_rpg.getMerchantInventoryList(3)); _rpg.buildPlayer("test", 500, playerInventory); - - // SETTING UP PLAYER AND MERCHANT - Player player = new Player("Player", 0, null); - Merchant merch1 = new Merchant("Bill", 0, null); - Merchant merch2 = new Merchant("Joe", 0, null); - Merchant merch3 = new Merchant("Sam", 0, null); - - // CREATING MAP AND INITIALIZE PLAYER AND MERCHANTS - Map map = new Map(30, 40); - map.initializePlayer(player, 15, 20); - map.initializeMerchant(merch1, 15, 0); - map.initializeMerchant(merch2, 29, 20); - map.initializeMerchant(merch3, 15, 39); - - // CREATING JFRAME WINDOW - JFrame frame = new JFrame("Merchant RPG"); - - // CREATING MAPUI AND SPRITES - MapUI mapui = new MapUI(map, _rpg); - mapui.createPlayerSprite(15, 20); - mapui.addMerchantSprite(15, 0); - mapui.addMerchantSprite(29, 20); - mapui.addMerchantSprite(15, 39); - - // ADDING MAPUI TO JFRAME - frame.add(mapui); - - // SETTING PROPERTIES OF JFRAME - frame.setSize(RPGame.WIDTH, RPGame.HEIGHT); - frame.setResizable(false); - frame.setVisible(true); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setLocationRelativeTo(null); - _rpg.getPlayer().getItem("WoodPlanks").increaseQuantity(15); - - - // MAIN GAME LOOP - while (true) { - mapui.move(); - mapui.repaint(); - Thread.sleep(100/12); // Controls the speed of the game (currently 120 frames/second) - } - + // SETTING UP PLAYER AND MERCHANT + Player player = new Player("Player", 0, null); + Merchant merch1 = new Merchant("Bill", 0, null); + Merchant merch2 = new Merchant("Joe", 0, null); + Merchant merch3 = new Merchant("Sam", 0, null); + + // CREATING MAP AND INITIALIZE PLAYER AND MERCHANTS + Map map = new Map(30, 40); + map.initializePlayer(player, 15, 20); + map.initializeMerchant(merch1, 15, 0); + map.initializeMerchant(merch2, 29, 20); + map.initializeMerchant(merch3, 15, 39); + + // CREATING JFRAME WINDOW + JFrame frame = new JFrame("Merchant RPG"); + + // CREATING MAPUI AND SPRITES + MapUI mapui = new MapUI(map,_rpg); + mapui.createPlayerSprite(15, 20); + mapui.addMerchantSprite(15, 0); + mapui.addMerchantSprite(29, 20); + mapui.addMerchantSprite(15, 39); + + // ADDING MAPUI TO JFRAME + frame.add(mapui); + + // SETTING PROPERTIES OF JFRAME + frame.setSize(RPGame.WIDTH, RPGame.HEIGHT); + frame.setResizable(false); + frame.setVisible(true); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setLocationRelativeTo(null); + + // MAIN GAME LOOP + while (true) { + mapui.move(); + mapui.repaint(); + Thread.sleep(100/12); // Controls the speed of the game (currently 120 frames/second) + } } } diff --git a/MerchantRPGCSE2102/src/images/testsprite.png b/MerchantRPGCSE2102/src/images/testsprite.png new file mode 100644 index 0000000..99d0222 Binary files /dev/null and b/MerchantRPGCSE2102/src/images/testsprite.png differ diff --git a/MerchantRPGCSE2102/src/sprites/Animation.java b/MerchantRPGCSE2102/src/sprites/Animation.java new file mode 100644 index 0000000..bc64c9d --- /dev/null +++ b/MerchantRPGCSE2102/src/sprites/Animation.java @@ -0,0 +1,104 @@ +package sprites; + +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; + + +public class Animation { + + private int frameCount; // Counts ticks for change + private int frameDelay; // frame delay 1-12 (You will have to play around with this) + private int currentFrame; // animations current frame + private int animationDirection; // animation direction (i.e counting forward or backward) + private int totalFrames; // total amount of frames for your animation + + private boolean stopped; // has animations stopped + + private List frames = new ArrayList(); // Arraylist of frames + + public Animation(BufferedImage[] frames, int frameDelay) { + this.frameDelay = frameDelay; + this.stopped = true; + + for (int i = 0; i < frames.length; i++) { + addFrame(frames[i], frameDelay); + } + + this.frameCount = 0; + this.frameDelay = frameDelay; + this.currentFrame = 0; + this.animationDirection = 1; + this.totalFrames = this.frames.size(); + + } + + public void start() { + if (!stopped) { + return; + } + + if (frames.size() == 0) { + return; + } + + stopped = false; + } + + public void stop() { + if (frames.size() == 0) { + return; + } + + stopped = true; + } + + public void restart() { + if (frames.size() == 0) { + return; + } + + stopped = false; + currentFrame = 0; + } + + public void reset() { + this.stopped = true; + this.frameCount = 0; + this.currentFrame = 0; + } + + private void addFrame(BufferedImage frame, int duration) { + if (duration <= 0) { + System.err.println("Invalid duration: " + duration); + throw new RuntimeException("Invalid duration: " + duration); + } + + frames.add(new Frame(frame, duration)); + currentFrame = 0; + } + + public BufferedImage getSprite() { + return frames.get(currentFrame).getFrame(); + } + + public void update() { + if (!stopped) { + frameCount++; + + if (frameCount > frameDelay) { + frameCount = 0; + currentFrame += animationDirection; + + if (currentFrame > totalFrames - 1) { + currentFrame = 0; + } + else if (currentFrame < 0) { + currentFrame = totalFrames - 1; + } + } + } + + } + +} \ No newline at end of file diff --git a/MerchantRPGCSE2102/src/sprites/Frame.java b/MerchantRPGCSE2102/src/sprites/Frame.java new file mode 100644 index 0000000..f74ac07 --- /dev/null +++ b/MerchantRPGCSE2102/src/sprites/Frame.java @@ -0,0 +1,31 @@ +package sprites; + +import java.awt.image.BufferedImage; + +public class Frame { + + private BufferedImage frame; + private int duration; + + public Frame(BufferedImage frame, int duration) { + this.frame = frame; + this.duration = duration; + } + + public BufferedImage getFrame() { + return frame; + } + + public void setFrame(BufferedImage frame) { + this.frame = frame; + } + + public int getDuration() { + return duration; + } + + public void setDuration(int duration) { + this.duration = duration; + } + +} \ No newline at end of file diff --git a/MerchantRPGCSE2102/src/sprites/PlayerSprite.java b/MerchantRPGCSE2102/src/sprites/PlayerSprite.java index 0bff0a8..081da07 100644 --- a/MerchantRPGCSE2102/src/sprites/PlayerSprite.java +++ b/MerchantRPGCSE2102/src/sprites/PlayerSprite.java @@ -4,6 +4,8 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; + import view.MapUI; public class PlayerSprite { @@ -23,6 +25,23 @@ public class PlayerSprite { private boolean rightBeingPressed = false; private boolean downBeingPressed = false; private boolean upBeingPressed = false; + + // Images for each animation + private BufferedImage[] walkingLeft = {Sprite.getSprite(0, 1), Sprite.getSprite(2, 1)}; // Gets the upper left images of my sprite sheet + private BufferedImage[] walkingRight = {Sprite.getSprite(0, 2), Sprite.getSprite(2, 1)}; + private BufferedImage[] walkingUp = {Sprite.getSprite(0, 1), Sprite.getSprite(2, 1)}; // Gets the upper left images of my sprite sheet + private BufferedImage[] walkingDown = {Sprite.getSprite(0, 2), Sprite.getSprite(2, 1)}; + private BufferedImage[] standing = {Sprite.getSprite(1, 0)}; + + // Animation states + private Animation walkLeft = new Animation(walkingLeft, 10); + private Animation walkRight = new Animation(walkingRight, 10); + private Animation walkUp = new Animation(walkingUp, 10); + private Animation walkDown = new Animation(walkingDown, 10); + private Animation standing1 = new Animation(standing, 10); + + // Actual animation + private Animation animation = standing1; public PlayerSprite(MapUI mapui, int row, int col) { this.x = col*WIDTH; @@ -39,19 +58,27 @@ public PlayerSprite(MapUI mapui, int row, int col) { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_LEFT) { dx = -1; + animation = walkLeft; + animation.start(); leftBeingPressed = true; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { dx = 1; + animation = walkRight; + animation.start(); rightBeingPressed = true; } if (e.getKeyCode() == KeyEvent.VK_UP) { dy = -1; + animation = walkUp; + animation.start(); upBeingPressed = true; } if (e.getKeyCode() == KeyEvent.VK_DOWN) { dy = 1; + animation = walkDown; + animation.start(); downBeingPressed = true; } } @@ -89,6 +116,14 @@ public void keyReleased(KeyEvent e) { if (upBeingPressed == false) // Sprite will stop only when the UP key is not being pressed dy = 0; } + if (e.getKeyCode() == KeyEvent.VK_F){ + if(collision()){ + mapui.game.createTransaction(null, null);//RPGame initialize Trade + } + else{ + return; + } + } // This fixes some bugs with holding three keys down at once and letting go of two (Basically ensures that dx and dy match which keys are currently being held) if(leftBeingPressed) @@ -187,8 +222,8 @@ public void resetLocation() { * @param g Graphics2D for painting */ public void paint(Graphics2D g) { - g.setColor(color); - g.fillOval(getX(), getY(), WIDTH, WIDTH); + + g.drawImage(animation.getSprite(), x, y, null); } /** diff --git a/MerchantRPGCSE2102/src/sprites/Sprite.java b/MerchantRPGCSE2102/src/sprites/Sprite.java new file mode 100644 index 0000000..81711fa --- /dev/null +++ b/MerchantRPGCSE2102/src/sprites/Sprite.java @@ -0,0 +1,36 @@ +package sprites; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; + +public class Sprite { + + private static BufferedImage spriteSheet; + private static final int TILE_SIZE = 32; + + public static BufferedImage loadSprite(String file) { + + BufferedImage sprite = null; + + try { + sprite = ImageIO.read(new File("src/images/testsprite.png")); + } catch (IOException e) { + e.printStackTrace(); + } + + return sprite; + } + + public static BufferedImage getSprite(int xGrid, int yGrid) { + + if (spriteSheet == null) { + spriteSheet = loadSprite("AnimationSpriteSheet"); + } + + return spriteSheet.getSubimage(xGrid * TILE_SIZE, yGrid * TILE_SIZE, TILE_SIZE, TILE_SIZE); + } + +} \ No newline at end of file diff --git a/MerchantRPGCSE2102/src/view/MapUI.java b/MerchantRPGCSE2102/src/view/MapUI.java index c4a9bd1..eae961f 100644 --- a/MerchantRPGCSE2102/src/view/MapUI.java +++ b/MerchantRPGCSE2102/src/view/MapUI.java @@ -11,6 +11,8 @@ import javax.swing.JPanel; +import controller.RPGame; + import model.Map; import sprites.MerchantSprite; import sprites.PlayerSprite; @@ -19,16 +21,17 @@ @SuppressWarnings("serial") public class MapUI extends JPanel { - private RPGame game; - private Map map; + public RPGame game; + public Map map; private PlayerSprite player; - private ArrayList merchants = new ArrayList(); - private boolean transactionAvailable = false; + private ArrayList merchants = new ArrayList(); + private boolean _tranState=game._movement; - public MapUI(Map map, RPGame game) { + public MapUI(Map map,RPGame Game) { this.map = map; - this.game = game; + this.game= Game; + addKeyListener(new KeyListener() { @Override @@ -74,7 +77,7 @@ public void paint(Graphics g) { for (MerchantSprite merchant : merchants) merchant.paint(g2d); - // For testing purposes. Showes the Player's current x and y position as well as the current Vertex + // For testing purposes. Shows the Player's current x and y position as well as the current Vertex g2d.setColor(Color.GRAY); g2d.setFont(new Font("Verdana", Font.BOLD, 20)); g2d.drawString("x: " + player.getX() + " y : " + player.getY(), 10, 20); @@ -92,7 +95,7 @@ public void addMerchantSprite(int row, int col) { MerchantSprite merchant = new MerchantSprite(row, col); merchants.add(merchant); } - + /** * Creates a player sprite to be painted on the canvas * @param row The row of the player @@ -101,11 +104,22 @@ public void addMerchantSprite(int row, int col) { public void createPlayerSprite(int row, int col) { player = new PlayerSprite(this, row, col); } + + public void changeState(){ + + } /** * Moves the PlayerSprite as well as the Map's instance of Player */ public void move() { + //check transaction + if (_tranState=false){ + + } + else{ + + player.move(); // Every 30 pixels, the player will move to a new Vertex @@ -129,6 +143,7 @@ public void move() { map.movePlayer("south"); player.setChangeInY(1); } + } } /**