Sunday, June 19, 2011

The Combat RPG - iPhone project - Dice class


I started working on my first Objective-C project this weekend. I spent most of the week watching videos on Lynda.com by Simon Allardice covering the basics of iPhone development. The goal is to eventually build VoidTrader on the iPhone/iPad. For now though, I'm going to build a small RPG fighting game. I have a few iterations planned, which I may put up in a different post. Below is an example of the Dice class I created. This initial iteration served a couple of goals. First, I built a main screen, about screen, and combat screen. This allowed me to get comfortable with adding different views. Next the Dice class itself allowed me to practice building and using a custom class.


Obviously, I intend on adding a lot more to that screen. I would like to do some custom graphics and perhaps animations. However, that will have to wait for several iterations.

The Dice class:

//
//  Dice.m
//  CombatRPG
//
//  Created by Mitchell Shelton on 6/18/11.
//  Copyright 2011 MitchellShelton.com. All rights reserved.
//
#import "Dice.h"

@implementation Dice

/*
 * A Dice simulator method
 * @numDie
 * The number of dice being rolled
 * @sides
 * The number of sides on the dice
 */
- (int)roll :(int)numDie d:(int)sides {
  
 // Handle incorrect dice or sides
 if (numDie == 0) { // Is the quantity zero?
  // There must be at least one die
  numDie = 1;
 } 
 if (sides == 0 || sides == 1) { // Are the sides zero or one?
  // Any die must have at least two sides
  sides = 2;
 }
 
 // Initialize our return value
 int result = 0;
 
 // Loop over the die rolls
 for (int i=0; i < numDie; i++) {  
  // Roll the die  
  int rollResult = (arc4random() % sides) + 1;
  
  // Add the die roll to our total result
  result = result + rollResult;  
 }
 
 // Return the result of our roll
 return result; 
}

@end

Calling the method:
Dice *die = [[Dice alloc]init];
int result = [die roll:2 d:8];
[die release];

So, why a dice class?

I'm basing the RPG "engine" on some modified Dungeons and Dragons rules for combat, encounters, and general mechanics. So there will be initiative rolls, weapons will do damage based on rolls, etc. I already wrote classes for the dice, players, armor, and weapons in PHP. I also have all of the stats for experience points, a few default weapons types, and miscellaneous other data that will be kept in a database.

So what is next?

I'm going to get that data from a remote MySQL database into my iPhone app. This will come via a web service eventually, but for now it will most likely come from flat xml files. That will allow me to focus on the iPhone end of programming, and not on figuring out the web service part. Eventually, I will need the web service to be writable though so I can allow users to upload profiles to a connected web site.

-Mitchell

Monday, April 25, 2011

Tilt Shift Photography

I have wanted to try the tilt shift trick in Photoshop for a while now. I took this photograph in San Francisco in 2010 and thought it would be a great candidate. I'm really happy with the results.



http://www.tiltshiftphotography.net/photoshop-tutorial.php

later,
-Mitchell

Sunday, April 24, 2011

NetBeans - Java Database Connection Tutorial

/*
 * This console application demonstrates a basic database connection.
 *
 * NetBeans Database Connection Tutorial
 *
 *       - Completed with NetBeans 6.9.1 on Microsoft Windows 7
 *
 *       - When you see a -> in this tutorial it is typically instructing
 *       you to open a menu/submenu
 *
 *       - I try not to assume too much about the reader, but you should
 *       already be comfortable with some Java basics and maybe even SQL.
 *       I reference several tutorial resources throughout this tutorial
 *       that can get you started.
 *
 *
 * Finding a tutorial that simply explained connecting to a database
 * was beginning to seem impossible. In the end I never did find a
 * rock solid tutorial. This is a collection of the bits and pieces I
 * was able to piece together from around the web. Hopefully it will help
 * others who are trying to accomplish a seemingly simple task.
 *
 * A little background about me and this tutorial. I would like to point out
 * that this is simple, dead simple. It might not be useful to many. A vast
 * majority of the tutorials that I felt "blocked my way" were full on CRUD
 * interfaces. So the connection took backseat to creating that interface. I
 * suspect that creating the CRUD interface is what more people really want
 * to do. So demand has dictated that those tutorials dominate search results.
 * This is the 2nd thing I have written in Java outside of one college class
 * on Java about 10 years ago and the video tutorials on
 * http://www.javavideotutes.com/. The first thing I wrote, more like clicked
 * buttons, was just a silly swing calculator tutorial on the NetBeans site
 * (http://netbeans.org/kb/docs/java/gui-functionality.html). So, why this?
 * Why not move onto a CRUD interface? Because I'm a web developer. I think
 * in databases. I think of that as the centerpiece of any web application. So,
 * I attacked that problem first. This tutorial is the result.
 *
 * Open up NetBeans and let's get started.
 *
 * Step One: Create the project
 *
 * File -> New Project -> Categories: Java | Projects: Java Application
 *
 * Click "Next"
 *
 * Enter the name of your project and where you would like to save it. I left
 * the other fields untouched. On my system all of the checkboxes were checked
 * by default.
 *
 * You now have a very simple Java Application ready to go.
 *
 * Step Two: Add the database
 *
 * What follows are a few quick and dirty steps to creating a database, tables,
 * and data in Netbeans. If you would like to explore this topic further I
 * recommend you visit the NetBeans tutorial on database interaction here:
 * http://netbeans.org/kb/docs/ide/java-db.html
 *
 * If you don't have a sidebar with a services tab you can go to
 * Window -> Services
 *
 * You should now see the Services window. We are after the Service called
 * Java DB under Databases. So go to Databases -> Java DB, now right click and
 * select "Create Database..."
 *
 * Enter a name for your database, the username and password to access your
 * database. Go to properties and take note of the Java DB Installation path.
 * Mine was:
 *
 * "C:\Program Files\glassfish-3.0.1\javadb"
 *
 * Now click "Cancel" to go back to the database setup dialog and double
 * check the info you entered for your database. Don't forget your password,
 * I'm not sure if there is an easy way to recover it. Now click "Ok". If you
 * already clicked okay before getting the path you can just right click on the
 * Java DB icon and go to properties to see the path again.
 *
 * Below Java DB you should now see the database you created. It will look
 * something like this:
 *
 * jdbc:derby://localhost:1527/your_database_name [your_name on your_name]
 *
 * Right click on that icon and select "Connect..."
 *
 * If you encounter connection errors in your code double check this. I
 * restarted NetBeans in the middle of writing this code and discovered that
 * I had to manually reconnect.
 *
 * Step Three: Create the Tables
 *
 * If you expand the tree for your new database you should multiple entries.
 *
 * We are only concerned about the "APP" entry. Expand "APP", you should now
 * see three folders labeled "Tables", "Views", and "Procedures", we will be
 * focusing on the Tables folder.
 *
 * Note: If you can not expand the database
 * information you are most likely not connected. This should be indicated by
 * a "broken" icon next to your database name.
 *
 * Right click on the "Tables" folder and select "Create Table..."
 *
 * This should bring up a dialog box where you can create your table. Do so by
 * giving it a name. I called mine "users". If you change the name of the table
 * you will need to change the code to reflect that change.
 *
 * Now add some columns. I created two columns. One called "id" and another
 * called "name". They were configured as follows:
 *
 * id:
 *
 * Name: id
 * Type: NUMERIC
 * Size: 16
 * Checked "Primary Key"
 * Checked "Index"
 *
 * name:
 *
 * Name: name
 * Type: VARCHAR
 * Size: 255
 *
 * Once our Table and Columns are created we need to add data to them.
 *
 * Right click on our new table and select "View Data..."
 *
 * Two things happen here. One, you have just automatically created the query
 * you are going to use in your app. Two, you should have a table with a
 * "Insert Records" icon on it.
 *
 * First, the query:
 *
 * If you named your table users then it should be as follows:
 *
 * select * from APP.USERS
 *
 * You will notice that in the code mine is this:
 *
 * SELECT name FROM app.users
 *
 * In web development using the "*" selector is considered bad practice. I
 * imagine this is the same for Java development. So I replaced it with the
 * column I wanted to display ("name"). I also changed the case to reflect
 * what I commonly see in SQL queries. All SQL commands are all caps, while
 * other content is in lower case. It will work either way, these are more my
 * personal preferences.
 *
 * If you are not comfortable with SQL this is a decent way to generate your
 * query until you get up to speed. If you changed the table name or create
 * different columns you will want to keep this method in mind.
 *
 * Second, the table:
 *
 * There are lots of options here, but all we are concerned with is adding a
 * record or two. So click the "Insert Records" icon.
 *
 * This will bring up a dialog where we can start entering in some data. I
 * created two records. You will need to manually number your records here. SQL
 * GUI's I have dealt with in the past have always auto-incremented your
 * primary key for you. This one does not do this via the GUI.
 *
 * I entered the following:
 *
 * id: 1
 * name: bob
 *
 * id: 2
 * name: fred
 *
 * Step Four: Adding the database to your project
 *
 * This was tricky to figure out. Your database will not work without it.
 * What you are doing here is giving your project access to the database
 * drivers.
 *
 * Go to your "Projects" tab or click Window -> Projects
 *
 * Right click on your project and select "Properties"
 *
 * A dialog box will pop up. Go to Categories: Libraries. Now under the
 * "Compile" tab click the "Add JAR/Folder" button. Remember that "Java DB
 * Installation path" we talked about earlier? Navigate to there from the file
 * browser that pops up.
 *
 * go into the "lib" folder and select the file called "derbyclient.jar"
 *
 * Step 5: The code (finally!)
 *
 * Everything you need is below. I have commented the code as best as my
 * limited knowledge of Java will allow me.
 *
 * There are a few things about this code that I would like to cover.
 *
 * The driver name: I am getting the driver name through some most likely
 * unnecessary code -
 *
 * Driver driverClass = (Driver) DriverManager.getDriver(db_loc);
 * String db_driver = driverClass.getClass().getName();
 *
 * You could alternative manually assign the value to the db_driver String.
 *
 * for example:
 *
 * String db_driver = "org.apache.derby.jdbc.ClientDriver";
 *
 * What my complex code is doing is grabbing the name of the driver based on
 * the URL of our database. I thought it was some handy code for trouble
 * shooting. It led me to realize that my project did not have access to the
 * database. So I left it in.
 *
 * Imports:
 *
 * I saw a lot of tutorials that listed the SQL import as:
 *
 * import java.sql.*;
 *
 * I applied the SQL "*" SELECT opinions here. Why import all of that code if
 * you aren't going to use it? Granted, this could cause problems while
 * learning. You may attempt to use some code from another tutorial and not
 * understand why it isn't working. A lack of an imported class might be the
 * reason!
 *
 * Displaying results:
 *
 * This is the next challenge for myself. The method I'm using here is pretty
 * simple. It loops over the result set and displays results from a particular
 * column. My challenge now is to learn all of the ways that you can deal with
 * that result set in Java. My instinct is to get it all into an array so I can
 * just manipulate that. We will see where that leads me.
 *
 * Conclusion:
 *
 * I hope you have enjoyed this tutorial and found it useful.
 *
 * If you are new to Java or any language, please, write Tutorials! You may
 * think you don't know enough or don't have anything to contribute, but keep
 * in mind, you are bringing a fresh perspective to even the veteran users. My
 * opinion, especially in the case of this tutorial, is that if no one else is
 * doing it, you should. So, even if my way, or your way, is the "wrong" way,
 * at least it works.
 *
 * A note to all tutorial writers out there: This is a "Working Tutorial"
 * Please, don't write non-working tutorials. When your tutorial has the words
 * "You can figure out that part", you are missing the point. No, we can't, or
 * we wouldn't be reading your tutorial!
 *
 * I apologize for any grammar mistakes, spelling errors, coding nightmares, or
 * Java good practices that I have violated during the course of this tutorial.
 * Please leave comments if this tutorial is in a blog/forum or email me at
 * info@mitchellshelton.com if you have questions or suggestions.
 *
 * Thank you,
 * -Mitchell
 *
 */

// Define our package
package databasetest;

// Import libraries
import java.io.IOException;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.ResultSet;

/**
 * @author Mitchell Shelton
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // Display a message to wrap around our test
        System.out.println("Testing some SQL!");

        // Set variables to hold our database information
        /*
         * db_loc: The URL that points to our database. In NetBeans (6.9.1)
         * this can be found by going to services -> right click on database ->
         * properties
         *
         * db_user & db_pass: credentials to access the database that would have
         * been entered when the database was created
         *
         * db_query: The SQL query we are testing
         *
         */
        String db_loc = "jdbc:derby://localhost:1527/testdatabase";
        String db_user = "test";
        String db_pass = "test";
        String db_query = "SELECT name FROM app.users";

        // The database connection must be in a catch/try
        try {
            // Find the driver based on the database URL
            Driver driverClass = (Driver) DriverManager.getDriver(db_loc);
            String db_driver = driverClass.getClass().getName();

            // Connect to the database
            Class.forName(db_driver).newInstance();
            Connection c = DriverManager.getConnection(db_loc, db_user, db_pass);

            // Run our SQL query
            Statement sql = c.createStatement();
            ResultSet rs = sql.executeQuery(db_query);

            // Display our results
            while (rs.next()) {
                String lastName = rs.getString("name");
                System.out.println(lastName + "\n");
            }

            // Display a confirmation message that our test worked,
            // catch should trigger before this is displayed if there
            // is a problem.
            System.out.println("Connection Successful");
        } catch(Exception e) {
            // Display our error message
            System.out.println("The following exception occurred:");
            System.out.println(e.getMessage());
        }

        // Close our output wrapper message
        System.out.println("Done Testing SQL!.");
    } // end public static void main

} // end public class Main