Paddle Storm

Paddle Storm is a ball-and-paddle video game, with some special features:

- 25-level campaign.
– Spellcasting ability, replacing the traditional powerup system.
– Support for arbitrary angles for bricks and the paddle, providing an unsual experience.
– Support for custom made levels.
– 10 unlockable achievements.


The game is available on SourceForge. Currently only available for PC, a future Android OS version is planned (but not promised). The game is free software, released under the simplified BSD license. Full source code (in the Java programming language) is available with the game.

Hopefully, some extra levels will be available for download in the future. If you made an interesting level yourself, let me know!

A note about performance:

There have been suspicions about possible performance issues with the game. If you try the game and it does not run smoothly, please contact me with details about your system, and descriptions of how the game runs.

10 comments on “Paddle Storm

  1. Pingback: The Beauty of Noise « computationalwhatever

  2. Nothing happens when pressing start game (at 800×600, asus eeepc 1000h)

    $ java -jar paddleStorm.jar
    Exception in thread “AWT-EventQueue-0″ java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
    at java.awt.image.BufferedImage.(BufferedImage.java:338)
    at shai.paddle.ui.AchievementsPanel.createButtonImages(AchievementsPanel.java:193)
    at shai.paddle.ui.AchievementsPanel.updateSize(AchievementsPanel.java:46)
    at shai.paddle.ui.GameFrame.updateSize(GameFrame.java:222)
    at shai.paddle.Main.createAndShowGUI(Main.java:95)
    at shai.paddle.Main.access$0(Main.java:93)
    at shai.paddle.Main$1.run(Main.java:27)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:647)
    at java.awt.EventQueue.access$000(EventQueue.java:96)
    at java.awt.EventQueue$1.run(EventQueue.java:608)
    at java.awt.EventQueue$1.run(EventQueue.java:606)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:617)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

    ^[[AmouseClicked
    campaign\Level1.lvl (No such file or directory)
    Exception in thread “AWT-EventQueue-0″ java.lang.NullPointerException
    at shai.paddle.Engine.initialize(Engine.java:42)
    at shai.paddle.Engine.startNextLevel(Engine.java:93)
    at shai.paddle.Engine.startFirstLevel(Engine.java:78)
    at shai.paddle.ui.GameFrame.startGame(GameFrame.java:125)
    at shai.paddle.ui.GameFrame.optionChosen(GameFrame.java:97)
    at shai.paddle.ui.MainMenuPanel.chooseOption(MainMenuPanel.java:187)
    at shai.paddle.ui.MainMenuPanel.mousePressed(MainMenuPanel.java:175)
    at java.awt.Component.processMouseEvent(Component.java:6265)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6033)
    at java.awt.Container.processEvent(Container.java:2045)
    at java.awt.Component.dispatchEventImpl(Component.java:4629)
    at java.awt.Container.dispatchEventImpl(Container.java:2103)
    at java.awt.Component.dispatchEvent(Component.java:4455)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4633)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4294)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4227)
    at java.awt.Container.dispatchEventImpl(Container.java:2089)
    at java.awt.Window.dispatchEventImpl(Window.java:2517)
    at java.awt.Component.dispatchEvent(Component.java:4455)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649)
    at java.awt.EventQueue.access$000(EventQueue.java:96)
    at java.awt.EventQueue$1.run(EventQueue.java:608)
    at java.awt.EventQueue$1.run(EventQueue.java:606)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116)
    at java.awt.EventQueue$2.run(EventQueue.java:622)
    at java.awt.EventQueue$2.run(EventQueue.java:620)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:619)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

    • Interesting… It’s not finding campaign\Level1.lvl. Do you see it in the filesystem?

      Also, is it a Linux machine? Maybe it’s a slash / backslash thing. Unfortunately, I have no Linux machine to test on.

      • I see it in the fs. Yes, linux – forgot to say that :)

        It seems strange to me that Java might differ between / and \ inside code. But I took a look at Campaign.java and it apparently can.

        I thought it could be a cAse problem (Linux can have file and File and FiLe in the same directory). But this seems to match.

        Can you tell me how you generated the .jar file? I could then test whether it works after replacing \\ with /. :)

  3. I compiled it in Eclipse (just a simple compilation, no fancy flags or anything), but regenerating the JAR is a little overkill. If you want to test it, you can compile the java file with any Java compiler and manually insert it in the JAR (the JAR is an ordinary ZIP file, any archiving program can edit it).
    Otherwise, I’ll try to post an update tomorrow. Either way, thank you :-)

  4. After pressing any button in 1.01, I get

    $ java -jar paddleStorm.jar
    Exception in thread “AWT-EventQueue-0″ java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
    at java.awt.image.BufferedImage.(BufferedImage.java:338)
    at shai.paddle.ui.AchievementsPanel.createButtonImages(AchievementsPanel.java:193)
    at shai.paddle.ui.AchievementsPanel.updateSize(AchievementsPanel.java:46)
    at shai.paddle.ui.GameFrame.updateSize(GameFrame.java:222)
    at shai.paddle.Main.createAndShowGUI(Main.java:95)
    at shai.paddle.Main.access$0(Main.java:93)
    at shai.paddle.Main$1.run(Main.java:27)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:647)
    at java.awt.EventQueue.access$000(EventQueue.java:96)
    at java.awt.EventQueue$1.run(EventQueue.java:608)
    at java.awt.EventQueue$1.run(EventQueue.java:606)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:617)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

    I run openjdk with the following fix as I use the tiled window manager ‘awesome':

    # enable this for non-reparenting window managers
    set _JAVA_AWT_WM_NONREPARENTING=1

    I can use quit, help and about. anything else leads to a white screen that does not react.
    arch linux 32bit.

    Im confused :)

    • The good news: I finally set up my Linux testing environment, and I get the same thing. So I’ll work on it until I’ll finally be able to say it works on Linux.
      The bad news: I currently have no idea what’s causing the problem… I hope I’ll find something.

  5. Pingback: Paddle Storm now supports Linux « Shai Shapira

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s