A new Project is started
I’ve always wanted to develop a game, though the lack of time, art skill and game ideas always stopped me. Recently i made up my mind and decided to get it started. I settled for making a small rpg dungeon crawler, though i have yet to define the fine detail specifics.
I started this project as a hobby, a way to have some fun doing something i like and as a learning instrument. Through out this project i will make many mistakes and end up refactoring the code base, i have already done a lot of that and i have yet to scratch the surface of the game.
Currently this is what i have
Ignore the game name, i just felt the whole path would be filled with trials and tribulations. As of this time i have managed to generate the dungeon, a simple 60×30 array of floor, water and wall tiles. I also have player movement and wall collision setup.
The art you see above is a placeholder for something i intend to make further down the road (as i said no art skill) and can be found here.
Framework
It took me more time than it should’ve to decide what language and framework to use for this little hobby. I looked at python and pygame, ruby, xna, c++, java. Ended up choosing java, because it allows me to avoid relearning the other languages. For framework i chose Slick2D, which is set of tools wrapped around the LWJGL OpenGL binding for Java.
Dungeon Generation
I decided early on that the dungeons needed to be procedurally generated so I set out to learn how to do just that. I found the Procedural Content Generation Wiki and thanks to them i ended up settling on a Cellular Automata method that would allow me to generate cave like levels.
During generation i just place tiles that end up living or dying during the 3 generations i allow them. I place two types of tile, wall and water. All the other tiles are automatically considered to be floor. This is a simplistic approach that i will need to refine, for instance you will easily find isolated water tiles inside walls or even situations like you see on the screen above where there are just a couple of tiles that bring nothing to the dungeon.
Rendering Art
After generating the tiles its time to draw them. My first attempt slowed down my screen to a crawl. The reason was twofold: rendering all the map and using the wrong api from Slick2D.
At first i was simply iterating all the map and drawing images to the screen with SpriteSheet.getSprite(x, y).
SpriteSheet is a wrapper for an image that contains all your tiles. when you do getSprite it creates an Image object with the appropriate tile. A good explanation taken from StackOverflow:
There is a SpriteSheet class in Slick that does exactly this.
SpriteSheets, in Slick, are large images made up of a series of uniformly sized tiles. Each tile is typically an animation frame in a Sprite. In the
SpriteSheetconstructor you specify the image (which has all the tiles), and the width/height of the tiles in the sheet, along with any spacing and margin, if you have/need that.Finally, the
getSprite(x, y)method allows you to retrieve the specified tile, as if it were an element in a 2D array. In other words, if you have aSpriteSheetof 16 tiles, that are arranged in a 4×4 grid of tiles, then to get the tile in column 3, row 2, you would callgetSprite(3, 2);I believe the indexes in
getSprite(x, y)are zero-based, just like arrays in Java.
Unfortunately this solution has really bad performance when you are rendering a tile map iteratively. The best option is to use the renderInUse method of the spritesheet, you can see a simple example bellow.
Also in the code bellow you can see that i fixed the my other problem (rendering all the map), initially i was rendering the whole 60×30 array independently of whether or not the map could be seen on the screen. The trick was to determine the view area of the map and only render those tiles.
sh.startUse();
for (int i = startingY; i < endingY; i++) {
String[] columns = map[i];
for (int j = startingX; j < endingX; j++) {
int xp = (int) x + ((j - startingX) * 32);
int yp = (int) y + ((i - startingY) * 32);
if (columns[j].equals("#")) {
sh.renderInUse(xp, yp, 8, 3);
} else if (columns[j].equals("$")) {
sh.renderInUse(xp, yp, 1, 2);
} else {
sh.renderInUse(xp, yp, 4, 3);
}
}
}
sh.endUse();
A little warning, this method of drawing does not play well if you try and do other things in between (GL calls, drawing other images not in this sprite).
That is it for now, i will probably put player movement and collision in it’s own post. For now i will say it gave me much more trouble i ever expected it to.
Since this is a pet project and i’m using it to learn i don’t really have a pre defined path of what i will code next. I go with what i feel like doing, as of now i figure the next steps will be:
- Fog of War
- New Art
- Mob Spawning
Unknown Runtime Error in Internet Explorer while using innerHTML
This is one of those awesome “features” of the Microsoft browser. One which can send web developers of the deep end.
Seems this error may happen due to several reasons:
- You are trying to put a block-level element inside an inline element like a div element inside a p element (see source 1)
- You are trying to set a table’s innerHTML (see source 2)
- You are trying to put a form element inside an element that is itself inside another form
In my case i chose to replace the original form completely or avoid using the form tag in these situations. All together this seems like a design problem as situations like this should not occur in the first place.
Note that if you run into trouble with the prototype Ajax functions you might want to set the onException option in order to see what is really happening. Though in this case the exceptions isn’t particularly helpful since it only states : Unknown Runtime Error
Sources:
Extreme Exception Programming – Catch Every Exception and Work Around It
try{list = (ArrayList<MyObject1>)session.getAttribute(TEMPORARY_LIST);}catch (ClassCastException e){if(add.getMyObjectCurrentItem()) != -1)try{list = add.getOtherList().get(add.getMyObjectList()).getMyObjectList();} catch(IndexOutOfBoundsException e2){try{list = add.getOtherList().get(add.getMyObjectList()-1).getMyObjectList();<} catch(IndexOutOfBoundsException e3){//Move On}}}
Cygwin with Tabs using Console(and still portable)
I recently found a way to use tabs with cygwin wich reduces the clutter in your taskbar. You can easily use Console to achieve this, unfortunally the instructions around the web assume your cygwin is installed in the default manner (not portable, not using rxvt as an emulator) so those of you using my instructions to set up a portable cygwin instalation will have a hard time getting Console to work with cygwin.
To use Console just make sure to set up the shell execution path to call /bin/bash and not rxvt.
In the spirit of keeping things portable you need to do the following:
- just edit your bat file and edit the last line:
%WD%\bin\run %WD%\bin\rxvt.exe -geometry 140×40 -sl 1500 -fn “Courier New” -bg black -fg grey -sr -e %WD%\bin\bash –login -i
to
%WD%\bin\bash –login -i
- move all Console files to the cygwin folder (same folder as CygwinPortable.exe)
- make sure the path defined in the Console settings is relative(If you have trouble doing this just edit the console.xml file by hand):
Shell: “\App\Cygwin\cygwin.bat”
Startup Dir: “.”
Console changes some of the window behavior but you can work around that by changing the settings:
- Mark Settings>Behavior>copy on select
- Mark Settings>Behavior>Clear selection on copy
- Settings>Hotkeys>Select Rename Tab on the list > hit the clear button (this will make sure you can use the bash history)
- There might be some mouse configurations i forgot that you can change.
Links :
No GTK# version when creating new project in MonoDevelop
I’ve recently had to do a full reinstall of my development environment and ran into to some issues with monodevelop.One of these issues appeared when i tried to create a new gtk# application solution. MonoDevelop didn’t detect any gtk# versions on my system.
I had this same issue on the first time i installed mono develop on my fedora box so this time i knew what i was looking for.
Installing monodevelop with yum from fedora repositories isn’t enough to get you started on developing gtk# 2.0 apps. You are going to need to install one other package : gtk# 2.0 development. Just run : yum install gtk-sharp2-devel and this will solve your problem.
Cygwin Portable – (some) Linux power on a USB for Windows
The Cygwin tools are ports of the popular GNU development tools for Microsoft Windows. They run thanks to the Cygwin library which provides the POSIX system calls and environment these programs expect.
With these tools installed, it is possible to write Windows console or GUI applications that make use of significant parts of the POSIX API. As a result, it is possible to easily port many Unix programs without the need for extensive changes to the source code. This includes configuring and building most of the available GNU software (including the packages included with the Cygwin development tools themselves) as well as lots of BSD tools and packages (including OpenSSH). Even if the development tools are of little to no use to you, you may have interest in the many standard POSIX utilities provided with the package. They can be used from one of the provided Unix shells like bash, tcsh or zsh, as well as from the standard Windows command shell if you have to for some sad reason.
From Cygwin FAQ
If you google Cygwin Portable you will find several solutions:
- Cygwin on portable storage devices (Devin Sezer)
- Cygwin Portable Project
- A Guide to Building a Portable Cygwin « fuzzix
The one that actually worked for me came from the SourceForge project called CygwinPortable. This version is designed to work with the software bundle PortableApps, but you could use it yourself outside the bundle (see bellow).
To install this software under the bundle just extract the zip file into your PortableAps folder, and on the gui launcher click on Options->Refresh App Icons. You will see two icons appear : one launches cygwin the other launches the setup.
I had some issues getting it to work as i wanted:
Subversion information
it seems the project mantainer packaged the software with svn files, you will need to remove all .svn folders from the exploded contents. I used SVN Cleaner for that.
Outdated setup.exe
The project seems to be unmaintained for some time now. Since that time a new version of cygwin came out which changed how setup.exe and setup.ini work. If you want to update or install new Cygwin packages you will need to download setup.exe from the cygwin page (see bellow for links) and replace the file cygwinsetup.exe in CygwinPortable\App\Cygwin\setup\ with the download one, i would advise you to replace it with a renamed version of the one download if you are using Portable Apps since the portable Apps link runs the original exe file. After doing this you can update and install new cygwin software without a hinch.
Cygwin is locked to the drive you updated it on
After i updated some packages on my cygwin my shell window changed into a normal cmd dos windows, which besides being ugly had the huge disadvantage of not allowing me to copy and paste with a single click. I set out to find a solution and it came in the form of rxvt. %Explain rxvt%. The problem was in my cygwin.bat file.
If you go into CygwinPortable\App\Cygwin you will find a file named cygwin.bat. This batch file is responsible for starting up cygwin. For some reason this file will be changed when you update your cygwin version and (after the setup) it will look something like bellow:
@echo off F: chdir F:\Software\Bin\PortableApps\CygwinPortable\App\Cygwin\bin bash --login -i
the above just runs bash.exe from your cygwin bin dir. And worse it just locked your instalation of cygwin back to the current computer (see the two lines bellow @echo off).
In order to solve this all you have to do is open the cygwin portable zip file you downloaded and replace your cygwin.bat with the one provided in there. This will be able to determine the folder you are running CygwinPortable.exe from and open up your rxvt window.
For those of you wanting to use cygwin outside the PortableApps bundle all the above steps apply, but unfortunally there is some other work you need to do:
- All you need to work with cygwin is the folder “CygwinPortable\App\Cygwin” so pull that out
- To run cygwin you will need to execute the cygwin.bat file inside that folder. But this file is configured to be run by the CygwinPortable.exe file and not on its own. So to get it to run on is own you will need to change the first line of the script to
for /F %%A in ('cd') do set WD=%%A
Notice i only removed the last part of the line which was telling the batch file where the cygwin base folder was. Since with Portable Apps we run CygwinPortable.exe the base folder would be the file execution folder (\CygwinPortable\) plus “App\Cygwin”. But when running the batch file directly the base folder becomes the batch file execution folder. Ok this part was confusing, if you have any doubts let me know and i’ll revise this part
Enjoy your new powers.
External Links:
