Friday, April 25, 2014

Eclipse: Screen Class & Rendering Pixels

Today we worked through two more video tutorials by The Cherno.  We created a new Screen class and then began work on rendering pixels.

We watched Tutorial 8: https://www.youtube.com/watch?v=e61rMGZi8V4&list=ELshNxV9QFUOo

And then moved on to Tutorial 9:

I'm not going to be sharing code throughout this tutorial, but since we are just getting our foundations built at this point, I'm going to post the current state of our programs:

The Game class:  (Remember that package names may be different for you)
package com.version001.rain;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

import javax.swing.JFrame;

import com.version001.rain.graphics.Screen;

public class Game extends Canvas implements Runnable {
 private static final long serialVersionUID = 1L;

 public static int width = 300;
 public static int height = width / 16 * 9;
 public static int scale = 3;

 private Thread thread;
 private JFrame frame;
 private boolean running = false;

 private Screen screen;

 private BufferedImage image = new BufferedImage(width, height,
   BufferedImage.TYPE_INT_RGB);
 private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer())
   .getData();

 public Game() {
  Dimension size = new Dimension(width * scale, height * scale);
  setPreferredSize(size);

  screen = new Screen(width, height);

  frame = new JFrame();

 }

 public synchronized void start() {
  running = true;
  thread = new Thread(this, "Display");
  thread.start();
 }

 public synchronized void stop() {
  running = false;
  try {
   thread.join();
  } catch (final InterruptedException e) {
   e.printStackTrace();
  }
 }

 @Override
 public void run() {
  while (running) {
   // System.out.println("Running...");
   update();
   render();
  }
 }

 public void update() {
 }

 public void render() {
  BufferStrategy bs = getBufferStrategy();
  if (bs == null) {
   createBufferStrategy(3); // Triple Buffering
   return;
  }

  screen.render();

  for (int i = 0; i < pixels.length; i++) {

   pixels[i] = screen.pixels[i];

  }

  Graphics g = bs.getDrawGraphics(); // graphics = buffer strategy :
  // linking two together

  // All graphics displayed between here and g.dispose();
  // g.setColor(new Color(0, 0, 0)); // Sets the color with RGB ** removed
  // for updated code
  // g.fillRect(0, 0, getWidth(), getHeight()); // Fills a rectangle the
  // size of the screen ** removed for updated code
  g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
  g.dispose(); // Removes graphics at end of each frame
  bs.show(); // Display buffers available to release memory or it will
  // crash
 }

 public static void main(String[] args) {
  Game game = new Game();
  game.frame.setResizable(false); // Do not allow user to resize window
  game.frame.setTitle("Rain");
  game.frame.add(game);
  game.frame.pack();
  game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Close when you hit X button
  game.frame.setLocationRelativeTo(null); // Centers our window
  game.frame.setVisible(true); // Makes window visible.

  game.start(); // Starts the game
 }
}
The Screen class:
package com.version001.rain.graphics;

public class Screen {

 private int width, height;
 public int[] pixels;

 public Screen(int width, int height) {
  this.width = width;
  this.height = height;
  pixels = new int[width * height];
 }

 public void render() {
  // This loop draws a pixel across every column (X) and the continues down for every row (y)
  for (int y = 0; y < height; y++) { 
   for (int x = 0; x < width; x++) {
    pixels[x + y * width] = 0xff00ff;
   }
  }
 }

}

Tuesday, April 22, 2014

Eclipse: Graphics Initialization, Buffered Images & Rasters

1.
2.

He goes through some discussion of color and uses this web site: www.colorpicker.com

He also goes through some setup in Preferences  Just know that these computers will probably not remember changes to the Preferences, but here's the screen he goes to:

Finally, he is explaining what a "raster" image is -- even though it sounds like he's saying Rasta.  :)  Just know that a raster image is made up of a bunch of different colored squares (called pixels):
When you look at a raster graphic close up, you will see the pixelization much more clearly.  Some graphics [called vectors] are drawn mathematically with lines/curves, but it's really the difference between a photo and a cartoon at this point.


Monday, April 21, 2014

Friday, April 18, 2014

Guest Speaker: Academy of Art University

As we have discussed, we have a guest speaker from Academy of Art University with us today.  I expect everybody to be respectful, polite, and attentive during the presentation.

Thursday, April 17, 2014

Soldiering on with Eclipse...

Today we continued with Eclipse by watching video #4 of The Cherno's game tutorial. I have to say that I'm more than a bit humbled by the amount of Java I don't know because I have been relying on programs like BlueJ and GreenFoot to set up the windows and manage the workspace for me. That being said, I'm trying to push through it, but please understand that I'm struggling with some of this new material as well.

I believe that once we get past the initial "set up the game" process, we'll be back into regular programming with loops and variables and math. :) Let's keep pushing in hopes that we get it.

Our code [after today] looked like this:
package com.version001.rain;

import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable {
 private static final long serialVersionUID = 1L;

 public static int width = 300;
 public static int height = width / 16 * 9;
 public static int scale = 3;

 private Thread thread;
 private JFrame frame;
 private boolean running = false;
 
 public Game() {
  Dimension size = new Dimension(width * scale, height * scale);
  setPreferredSize(size);  
  
  frame = new JFrame();
 }

 public synchronized void start() {
  running = true;
  thread = new Thread(this, "Display");
  thread.start();
 }

 public synchronized void stop() {
  running = false;
  try {
   thread.join();
  } catch (final InterruptedException e) {
   e.printStackTrace();
  }
 }

 public void run() {
  while (running) {
   System.out.println("Running...");
  }
 }
 
 public static void main(String[] args) {
  Game game = new Game();
  game.frame.setResizable(false); // Do not allow user to resize window
  game.frame.setTitle("Rain");
  game.frame.add(game);
  game.frame.pack();
  game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Close when you hit X button
  game.frame.setLocationRelativeTo(null); // Centers our window
  game.frame.setVisible(true); // Makes window visible.
  
  game.start(); // Starts the game
 }
}

Wednesday, April 16, 2014

Where We Are in Eclipse

So far we have just begun to scratch the surface of the Eclipse IDE.  Even though we just have a few lines of code, we've started exploring some new methods and new techniques.  As I mentioned, I am new to Eclipse as well, but with practice and trusting the process, we will do just fine.

Here's the code we have so far:

package com.version001.griff;

public class Game implements Runnable {

 public static int width = 300;
 public static int height = width / 16 * 9;
 public static int scale = 3;

 private Thread thread;
 private boolean running = false;

 public synchronized void start() {
  running = false;
  thread = new Thread(this, "Display");
  thread.start();
 }

 public synchronized void stop() {
  running = false;
  try {
   thread.join();
  } catch (final InterruptedException e) {
   e.printStackTrace();
  }
 }

 public void run() {
  while (running) {
  }
 }
}

Tuesday, April 15, 2014

Continuing with Eclipse: New Territory Explored

First, work through the first video (from yesterday) and listen to his explanations and instruction.

Next, follow the instruction in video #2. There will be some new terms and functions here, so pay attention to those.

Finally, follow through Video #3.

Monday, April 14, 2014

Beginning with the Eclipse IDE

Today we began working with Eclipse.  We started with the standard "Hello World" just to get the feel for the interface and, although we had a few little hiccups, things went pretty smoothly.
public class HelloWorld {
 
public static void main(String[] args) {
 System.out.println("Hello World!");
}

}

Next we will begin looking at some decent Eclipse tutorials.  I'll start with a couple I have explored, but if you find others that you really like, let me know and I'll review them for the class.

One example of a tutorial follows: