Raster Blaster Pinball in progress

edited January 2015 in Projects - Tools
The next pinball game is underway. Been working the table layout during the Christmas holidays.

This one is a remake (more of a re-theme) of Raster Blaster on the Apple II from 1981. Does anyone remember this one?

Should be out a lot quicker than Bean Farmer. Only a few new elements to create.

Screenshot of the original:

http://upload.wikimedia.org/wikipedia/en/4/46/Rasterblaster.png

Comments

  • edited January 2015
    Nope, I'm afraid I've never played that one, I remember playing a pinball game long before Pinball Dreams & Pinball Fantasies, but I can't remember its name.

    Sorry, didn't really spend any time on the laptop during my vacations, I'll try to look more into Bean Farmer when back home.
  • edited January 2015
    That's ok on Bean Farmer. I need to modularise the codebase anyway so that multiple tables can be in the same code. Right now it's fairly fixed. Won't take long to get that cleaned up.

    Maybe the game you are thinking of could be Night Mission Pinball or David's Midnight Magic.
  • edited January 2015
    Mmh, the names don't ring a bell, but I'll ask google if he can help me with this. :)
  • edited January 2015
    A sneak peek of the graphics in progress:

    rb_table.jpg
    rb_table 113.4K
  • edited January 2015
    This is the original from 1981:

    original_layout_shot.png
  • edited January 2015
    Very cool.

    This gave me the idea that I could add a "capsule" collision type on the editor (using 2 spheres + one box). I wonder if it would work.
  • edited January 2015
    Hmm I suppose it is possible. Are you thinking this from the small capsule shaped bumpers at the top?

    You could use a sphere at the top and bottom and a box in between but then you'd have intersecting parts. Not sure what the side effect of that would be.

    For those little guys I'm just using a polygon part using all 8 points. It's enough for them.
  • edited January 2015
    Nice work, I really like the design of that re-themed table! Can't wait to see it live.
  • edited June 2018
    All excited, just had to share... got the spinner working this evening. A spinner is like a flap that spins when a pinball rolls through it. The faster you hit it, the faster it spins - both directions.

    Pretty pleased with the effect.

    And if anyone is interested in following the project on bitbucket, you can find it here: https://gitlab.com/sausagejohnson/rasterblaster
  • edited February 2015
    Nice, I wish I could see it but I'm currently not setuped for Android at the moment.
    Do you have an .apk I could download somewhere, maybe? :)
  • edited February 2015
    Oh yep I haven't done a beta build as yet. There's projects for all platforms in there. I'll release a windows binary shortly when I get a few more things cleaned up.
  • edited February 2015
    No worries, I can just compile the windows version myself, for some reason I forgot it was there. ^^
  • edited February 2015
    I better quickly fix up the flippers tonight before you do. I've left a lot of junk around :)
  • edited April 2015
    I haven't given an update in quite a while but the game has been in constant development and is nearing completion.

    I'll put the video & downloadable beta out next week after I complete the work on the sound effects.
  • edited April 2015
    Beta 1 is ready for download and testing (windows):

    https://bitbucket.org/sausage/rasterblaster/downloads/raster-blaster-reloaded-beta.zip

    If you get a moment, download it and give it a try. Any problem or crashes, feedback, I'd love to know.
  • edited April 2015
    The beta 1 video has been posted on vimeo:

  • edited April 2015
    Really nice work, Sausage!

    I particularly like the sound effects!

    May I suggest to use left click/right click on the computer version instead of left clicking on left/right side of the table?
  • edited April 2015
    Thanks Iarwain.

    The sounds effects were done using a C64 SID VST soft synth. I recorded the effects from the original game, slowed them down to 10% (to maintain pitch) so I could pick out the individual notes. Then recreate the sounds again using the soft synth.

    Good idea on the mouse buttons. The click areas aren't really for clicking, they're touch areas for mobile. I suppose I could turn off the mouse with the config? And map to left/right clicks as well.
  • edited April 2015
    Yes, you can have a computer-only config file you you load if you're not on android/ios and in which you override the relevant config values, including inputs.

    I also had a crash (assert) at the end of a round in orxObject_GetLastAddedSound(), but I didn't investigate it.
    Lastly the right flipper stays stuck sometimes, whereas it never happens with the left one.
  • edited April 2015
    Ah right, so orxObject_GetLastAddedSound() was used to try and stop that assert. I thought it was the adding of two sounds to an object and removing one or more.

    So this happened as the ball was lost?

    I need to upgrade to 1.6, so will check again. It could be my usage.

    How did you manage the stick the right flipper? Does it stay up or not respond? I've never seen that.
  • edited April 2015
    I only got the assert once, it looked like the orxOBJECT was invalid.

    As for the flipper, it happens actually quite often but I don't have repro steps. The flipper stays up and the visual circle is drawn but no mouse button is being pressed. Activating the flipper again resets it and everything goes back to normal.
  • edited April 2015
    Actually, nevermind, I found a way to repro the flipper issue and it happens with both of them.

    The simplest repro step I found is to start clicking on the left side of the table, move the mouse to the right side, and then release the click there. The left flipper will remain stuck up. That also work if you click, drag outside the window boundaries, and release the click there.
  • edited April 2015
    Last mini bug, if I keep the ball with the left flipper up for a while, till it completely stabilizes, releasing the flipper won't release the ball: it'll stay where it is, precariously balanced.
  • edited April 2015
    Here's a quick screenshot showing the stuck ball, with physics debug on.

    Stuck_ball.png
  • edited April 2015
    As a quick side note, you do not need the DLLs for libsndfile/openal, they haven't been used for a few years now, they're both statically linked inside orx.dll. =)
  • edited April 2015
    iarwain wrote:
    The simplest repro step I found is to start clicking on the left side of the table, move the mouse to the right side, and then release the click there. The left flipper will remain stuck up. That also work if you click, drag outside the window boundaries, and release the click there.

    Ah yep right. That's not actually a control. For PC you're meant to use the control or shift keys. This will go when I disable the mouse for PC.

    But it is a problem for touch. I need to figure out how to solve this with the touch start/end/move event combinations.
  • edited April 2015
    iarwain wrote:
    Last mini bug, if I keep the ball with the left flipper up for a while, till it completely stabilizes, releasing the flipper won't release the ball: it'll stay where it is, precariously balanced.

    True yes, I am going to fix the polygons to address this. Thanks!
  • edited April 2015
    Ah I see, good to know. And yes, I'm afraid that might happen as well on phones then. You can simply store the object on the start and send it the end when the time comes. If you store it in config, you can handle this through tracks if need be.
  • edited April 2015
    iarwain wrote:
    I only got the assert once, it looked like the orxOBJECT was invalid.

    Ah ok, I'll check my functions are working on a valid object.

    Question: is it possible to test for an invalid orxObject? I usually set objects to orxNULL before loading them or creating them.

    But sometimes if they are not assigned to a valid value, they will have the type of orxObject, but are not initialised. Anyway to test for this? Like testing an internal int within the object for null?
  • edited April 2015
    You can't test an object directly per se as, even if you were testing it for deletion, a newer and completely different object could have been reallocated in the same place.

    The way to do it is by storing its GUID (orxStructure_GetGUID()). This 64bit value will be unique for an object during this execution of orx. If you want to retrieve an object from a GUID, you can call orxStructure_Get(). If the object isn't valid anymore or if it's not the same one, it'll return orxNULL. It works with any kind of orxSTRUCTUREs, not only orxOBJECTs.
  • edited April 2015
    Yep that's perfect!
  • edited April 2015
    I don't need to keep track of the object, just want to make sure it's valid before I add or remove a sound. I came up with this general purpose method:
    orxBOOL IsObjectValid(orxOBJECT *object){
        if (object == orxNULL){
            return orxFALSE;
        }
    
        orxU64 guid = orxStructure_GetGUID(object);
    	
        if (guid == orxNULL){
            return orxFALSE;
        }
    	
        return orxTRUE;
    }
    

    I can't trigger the assert again. I'll try the executable on a few different machines.
  • edited April 2015
    I'm surprised this actually works. :)

    A GUID will never be orxNULL. It can be orxU64_UNDEFINED or orxSTRUCTURE_GUID_MAGIC_TAG_DELETED.

    If you want to check if an object is deleted, you can do:
    if(orxSTRUCTURE(object)->u64GUID == orxSTRUCTURE_GUID_MAGIC_TAG_DELETED)
    

    Don't call orxStructure_GetGUID() as it's going to mask a part of the value and it won't work. This won't tell you if this object has been deleted and another one recreated in the same spot though.

    If you want to retrieve or check if one of your object is still alive, for example to remove a sound you added on it.
    orxU64 guid = orxStructure_GetGUID(object);
    orxObject_AddSound(object, ...);
    
    // Later on
    // Retrieve the object on which we added a sound
    object = orxOBJECT(orxStructure_Get(guid));
    if(object != orxNULL)
    {
      // Still the same object and still alive
    }
    else
    {
      // Not alive anymore or has been replaced by another object in the same memory location
    }
    
  • edited April 2015
    Ah ok, I'll rework it.

    Confused though, you said not to use orxStructure_GetGUID() but then used it in the listing.

    I also want to test against a fresh object, one that started with a class definition.

    Anyway, I'll see how I go.
  • edited April 2015
    Actually yeah it doesn't work, you're quite right.

    What I really want to achieve is something like this:

    orxOBJECT *object;
    orxU64 guid = orxStructure_GetGUID(object);

    or

    orxOBJECT *object;
    orxU64 guid = orxSTRUCTURE(object)->u64GUID;

    But of course in both examples, the object is only declared as a type and not initialised.

    I want to catch all orxNULLs, uninitialised, and the other two states you mentioned above.
  • edited April 2015
    Sorry, the part about when to use orxStructure_GetGUID() wasn't very clear:

    You should use it most all the time, with one exception: when you want to compare its value with orxSTRUCTURE_GUID_MAGIC_TAG_DELETED to know if an object is deleted. But usually you don't want to do that.

    I guess I can change the value of orxSTRUCTURE_GUID_MAGIC_TAG_DELETED in the future to removed that limitation.

    What you should be doing is never store the pointer to your object. You variable should be the GUID, not a pointer.
    When you need to use the object with the orxObject_* API, you should locally retrieve it with orxStructure_Get(), then you can use it but you still should not store it.
Sign In or Register to comment.