Not logged in, Join Here! or Log In Below:  
 
News Articles Search    
 


Submitted by Will McGugan, posted on January 31, 2005




Image Description, by Will McGugan



After Chess Commander (http://www.chesscommander.com), which took me 2 years to develop, I wanted to work on a game that could be completed within a year with just spare-time work. The game idea I settled on is inspired by an old Spectrum game called ĎA Whole New Ball Gameí by Pete Cooke. Its been authentically remade a few times, but as far as I know the idea hasnít been taken any further Ė something very rare in computer games!

Itís a beautifully simple idea for a game, IMHO. You have a little ball on the screen that can move left, right, up or down. You canít alter the balls direction directly, but you can drop angled mirrors in the balls path to deflect it by 90 degrees. The object of the game is to collect all the energy pills on the screen by colliding a ball with them. There are a variety of tile types (its completely grid based) that have different effects on the ball, and must be navigated to get to all the pills on a level and complete the game.

Ping Ball was created with SDL, which is a very nice API Ė I highly recommend it. I didnít use SDLs blitters to do the rendering since I already had a library of blitting routines I wanted to use. The sprites are run-length encoded (RLE), so my blitters ignore transparent parts of images and can distinguish between translucent and opaque pixels, which is a great optimisation since most pixels in a sprite are opaque and the image data can be simply copied. SDL does support RLE surfaces, but I like the extra control that doing it from scratch gives me, and I wanted to use additive sprites which I donít think SDL supports. The sprite engine supports 32 bit alpha channel images and 8 bit alpha images which I use for text and glow effects.

The sprites were created with POVRay (http://www.povray.org) and Moray (http://www.stmuc.com/moray/). Iím not very adept at using 3D editors, but I was familiar with these tools from years ago. POVRay outputs 32bit alpha channel PNGs - which very conveniently is exactly the format needed for my sprite engine. Iím no artist, but the sprites turned out well enough since they are quite small (just 20x20 pixels) and mostly composed of primitives! And being so small I can afford a large number of frames of animation, around 50 per second. Any of the images not rendered by myself came from a royalty free stock image site (http://www.istockphoto.com). The sound effects I got from Sounddogs (http://www.sounddogs.com), and the music from various royalty free music sites. In total I spend around £300 for resources.

I also created a level editor (http://www.pingball.com/editor.htm) in order to produce the 30 levels in the game. Itís remarkably simple and came together in a single weekend. I polished it a bit in order to bundle it with the full version of the game, so players can create and distribute their own levels. The level editor was build with wxWidgets (http://www.wxwidgets.com).

I kept a rudimentary blog for a while that shows progress in the game from the first screenshot, it is still available at http://www.pingball.com/blog.htm. The shareware version of the game can be downloaded from http://www.pingball.com/. It doesnít have any trial period because I think it puts people off if they are just downloading an advert. There are a few nag screens though, but I hope even these are entertaining!


[prev]
Image of the Day Gallery
www.flipcode.com

[next]

 
Message Center / Reader Comments: ( To Participate in the Discussion, Join the Community )
 
Archive Notice: This thread is old and no longer active. It is here for reference purposes. This thread was created on an older version of the flipcode forums, before the site closed in 2005. Please keep that in mind as you view this thread, as many of the topics and opinions may be outdated.
 
Volker Schoenefeld

January 31, 2005, 12:08 PM

Looks really nice, but I can't play it. The installer gives me an access violation when started with cedega (linux).
Maybe its only the installer, is it possible just downloading a zipped archive containing all files needed?

 
Will McGugan

January 31, 2005, 12:31 PM

Ok. Give this a try...
http://www.willmcgugan.com/pingballsw.zip
Should run from there, but be sure to run 'settings.exe' first.

 
Roman Weinberger

January 31, 2005, 12:39 PM

Speaking of Linux, how about compiling a native version, as you already use SDL, most part should be straight forward anyway...
If you need help feel free to contact me..

 
Volker Schoenefeld

January 31, 2005, 01:45 PM

or me :)

 
Volker Schoenefeld

January 31, 2005, 01:54 PM

settings.exe does not work with cedega 4.0.1-1, but with Wine 20041019.

pingball.exe does not work with Wine 20041019, but starts with Cedega 4.0.1-1. Does, however, crash after going to fullscreen mode.

It works with Wine, without SSE/MMX/DirectX. There is no sound ;-(

Very nice! Successfully done the first tutorial level, nice particle effects! :)

 
Will McGugan

February 01, 2005, 04:58 AM

It may happen. I do try to be as platform agnostic as possible.

 
Will McGugan

February 01, 2005, 05:01 AM

Well Im glad you liked it, albiet with the limitiations of running it emulated!

 
Volker Schoenefeld

February 01, 2005, 06:39 AM

It's really an enjoyable game. Too bad the sound is missing here, other than that it works great.
Very good job ;-)

 
Roel

February 01, 2005, 08:05 AM

the "ping ball" logo and the cursor aren't reflecting in the spheres in the top image :(

well, the game looks really nice :)

 
Ola Frid

February 01, 2005, 08:52 AM

Your binary does not work with windows versions earlier then WinME/2000, meaning I can't run this on Win98SE. The program uses SHELL32.DLL:SHGetFolderPath, which previously to WinMe didn't exist in shell32.dll. Here's MSDN's info on this:

"This function [SHGetFolderPath] is a superset of SHGetSpecialFolderPath, included with earlier versions of the Shell. On systems preceeding those including Shell32.dll version 5.0 (Windows Millennium Edition (Windows Me) and Windows 2000), SHGetFolderPath was obtained through SHFolder.dll, distributed with Microsoft Internet Explorer 4.0 and later versions. SHFolder.dll always calls the current platform's version of this function. If that fails, it will try to simulate the appropriate behavior. SHFolder.dll continues to be included for backward compatibility, though the function is now implemented in Shell32.dll.

Note: On older systems that require the redistributable SHFolder.dll, you must explicitly link to SHFolder.lib before you link to Shell32.lib."

 
Will McGugan

February 01, 2005, 09:04 AM

SHFolder.dll should have been included with the installer, and placed in the system folder.. Although, its possible that its not linked as per the footnote. I'll check that out. Thanks.

 
Ola Frid

February 01, 2005, 01:55 PM

You're welcome.

And, yes I've got Shfolder.dll, so it's not that the file is missing.

 
Will McGugan

February 01, 2005, 02:13 PM

Would you mind trying the following exes, they should be linked with shfolder.lib in the correct order. Cheers.

http://www.willmcgugan.com/pbexes.zip

 
Chris

February 01, 2005, 03:35 PM

Will, this is an exceptionally cool game. I enjoyed it very much.
Maybe you know Oxyd and its many variants, it reminded me of these. And Oxyd is one of my all-time favourites.

I played till level 8, then I got slightly annoyed by the fact that I know how to solve it but triggered the teleporters by accident so many times that I gave up. Yet the game is addicting, and I'm bound to retry :-)

 
Will McGugan

February 02, 2005, 04:04 AM


Chris wrote: Will, this is an exceptionally cool game. I enjoyed it very much. Maybe you know Oxyd and its many variants, it reminded me of these. And Oxyd is one of my all-time favourites.


Glad you like it!

Never played Oxyd, but I googled for screenshots and Im sure Ive played a clone of it.

I played till level 8, then I got slightly annoyed by the fact that I know how to solve it but triggered the teleporters by accident so many times that I gave up. Yet the game is addicting, and I'm bound to retry :-)


I'm curious how it will be recieved. My main market will be kids, but do kids today have the same patience as we did? Maybe I'm just getting old. *sigh*

 
Chris

February 02, 2005, 05:15 AM

Well, I suppose the game features no brutality, no blood, no guns, no scary monsters, so you'll be out of the market in no time ;-)
Kids' parents will love it, that's sure. It's a puzzle, it's peaceful, looks pretty and polished, has that "it could be educating" touch, so I'm sure it'll sell. Whenever I see a puzzle screenshot similar to your game's one, I click. I'm fascinated by such games.

 
Rui Martins

February 02, 2005, 05:27 AM

Most kids are more of the Shoot-them-up or FPS kind of games, but there are other niches in game play too, like they have always been.

The only real difference nowdays is that these kids are a lot more demanding on the game visuals (especially). Some won't even consider playing a game, if it isn't flashy.
In the 70s and 80s any game was good for a try, because game play was key and there wasn't much chance of doing stunning graphics.

I'm not really sure if you are targetting the right audience.
I think your audience might be more on the ones with age 25 and above.

Women are more likelly to like puzzle games in general, they are usually more pacient, less wild hormones in their system 8).

 
Rui Martins

February 02, 2005, 05:30 AM

... Whenever I see a puzzle screenshot similar to your game's one, I click. I'm fascinated by such games.


I already noticed that you are specially fond of puzzle like games !
Your comments on these give you away ! 8)

 
Ola Frid

February 02, 2005, 06:45 AM

Yep, works without any problems.

 
Rui Martins

February 02, 2005, 10:30 AM

I would like to make a suggestion for a change in game control.

You defined the control as:
# Left Mouse button - Deploy/place a mirror
# Right Mouse button - Rotate you current mirror setup (2 possible choices, "back slash" or "forward slash" orientation).
# Middle Mouse button - Remove/erase a mirror from game.


The first problem is that there still are many 2 button mouses around.
The second problem is that the game play makes you toogle the type of mirror orientation (forward and back slash) on almost every move, this is intrinsic to the gameplay. So to place a single mirror on average the player as to make on average 2 clicks (a little less actually).

So I would suggest the following:
# Left Mouse button - Deploy/place Back slash Mirror (/)
# Right Mouse Button - Deploy/place Forward Slash Mirror ()
# Middle mouse button - Remove/erase a mirror from game

This last action should also be supported with another key or group of keys, like for example: SHIFT, CTRL or ALT and one of the mouse buttons, or a specific key like " " (space) or "tab" key, the larger the key the better.

With this setup, the user only does a click (average is also one) per mirror deployment instead of the almost 2 on average.

Another possibility is to let the user configure it, which is not always the best ideia, since he may select a bad config, making him have a bad game experience.

Just remember the problems with the keyboard controler, when more than one key is pressed simultaneously, which depends highly on which keys and which keyboard Controler/Manufacturer is in use.

Final Note: You should also make a research about mouse keys ( Left : Right ) usage should be assigned like ( / : ) or ( : / ), this is crucial to match the (most) users expectations.
My guess is that the first is better (my vote).

 
Will McGugan

February 02, 2005, 11:39 AM


Rui Martins wrote: I would like to make a suggestion for a change in game control. You defined the control as: # Left Mouse button - Deploy/place a mirror # Right Mouse button - Rotate you current mirror setup (2 possible choices, "back slash" or "forward slash" orientation). # Middle Mouse button - Remove/erase a mirror from game. The first problem is that there still are many 2 button mouses around. The second problem is that the game play makes you toogle the type of mirror orientation (forward and back slash) on almost every move, this is intrinsic to the gameplay. So to place a single mirror on average the player as to make on average 2 clicks (a little less actually). So I would suggest the following: # Left Mouse button - Deploy/place Back slash Mirror (/) # Right Mouse Button - Deploy/place Forward Slash Mirror () # Middle mouse button - Remove/erase a mirror from game This last action should also be supported with another key or group of keys, like for example: SHIFT, CTRL or ALT and one of the mouse buttons, or a specific key like " " (space) or "tab" key, the larger the key the better. With this setup, the user only does a click (average is also one) per mirror deployment instead of the almost 2 on average. Another possibility is to let the user configure it, which is not always the best ideia, since he may select a bad config, making him have a bad game experience. Just remember the problems with the keyboard controler, when more than one key is pressed simultaneously, which depends highly on which keys and which keyboard Controler/Manufacturer is in use. Final Note: You should also make a research about mouse keys ( Left : Right ) usage should be assigned like ( / : ) or ( : / ), this is crucial to match the (most) users expectations. My guess is that the first is better (my vote).


Thanks for the suggestion. Actualy, they way you describe is how I first implemented it - as it does seem to be the most intuitive control method. But I found it tricky to use (as did others that tested it) because it was difficult to make the connection as to which button dropped which mirror.

I found the current method easier to grasp, since it removes any doubt about what mirror will be dropped. Granted, its more clicks - but I tend to find you drop groups of each mirror rather than alternate between then.

The Space key also clears the mirrors, which would be certainly essential for people with two button mice. Its in tutorial 2, and the help file.

The Spectrum game that inspired this had an even tricker control method. There were 3 icons at the top of the screen for the 2 mirrors, and a clear mirror action. To play the game you had to use the cursor keys to select one of the icons then place it on the screen. Each time, going up and down!

 
Rui Martins

February 02, 2005, 12:12 PM

I'm curious to what changes didi you had to do to to your main game engine to support a realtime tutorial ?

I'm in the process of eventually trying that on my game so any insight would be great.

 
Will McGugan

February 02, 2005, 12:54 PM

I use a fixed time step loop, so the game logic runs at 100 fps no matter what the real frame-rate is. The mouse position & button presses are sampled at the beginning of each logic loop. That way when I play back the stream I can be sure that everything will behave predictably. There is also the consideration that I have to store the seed value for the random number generator, because I need the same random numbers as when the input is recorded.

 
Rui Martins

February 03, 2005, 10:25 AM

So basicly what you did is a replay system.
You first save the level being played out, and later you just play it back.

However, how did you embed the Text, and pauses, user play turn etc... ?

Did you extend the save format to allow those extra features, which you post edited manually ?
Or is that hardcoded somewhere ? 8)

 
Will McGugan

February 04, 2005, 03:49 AM

Most of it is done just by replaying the input. The system is aware that it is playing the tutorial so it displays the appopriate text, and jumps back to the start for the player to take over.

I also have another format for demo recording that stores the level description and the input together, so you dont need to find the level file in order to play the demo.

eg.
http://www.pingball.com/files/billowy12.pbdemo

 
This thread contains 25 messages.
 
 
Hosting by Solid Eight Studios, maker of PhotoTangler Collage Maker.