Luomu's Forum Posts

  • Downloading Now..

    I got this when i tried to open the zip file.

    ownload it again? The file should be 260 kilobytes. Added a mirror in any case, I know my webhost is not the best.

  • At last released the first official version of the plugin in here and the demo game here. It was a bumpy journey.

  • To demonstrate the use of the new BulletML plugin we have created this one-level shoot'em up in which you fight three bosses and numerous smaller enemies. Collecting powerups can give you more firepower or firing patterns that range from useful to slightly weird.

    BulletML, in short, is a XML-based way of controlling bullet patterns in shooting games. Read the full introduction and get the plugin in this thread

    Since it's a tech-ish demo, BML was used for more than just enemy firing patterns: enemy movements and player fire modes also use the same system.

    Download the demo (contains exe and .cap) (11 MB)

    <img src="http://paahdin.com/projects/bulletml/images/relprom01.jpg">

    I must say that making even this bite-sized snack game took unbelievably long

    Feel free to re-use any parts of this demo.

  • <img src="http://paahdin.com/projects/bulletml/images/logo.png">

    Download plugin (260 KB):

    http://paahdin.com/projects/bulletml/BulletML-1.02.zip

    Mirror: http://github.com/downloads/Luomu/BulletML/BulletML-1.02.zip

    Source code:

    http://github.com/Luomu/BulletML

    Very simple example .cap:

    Download

    Demo game:

    Download | Separate thread

    * What is BulletML?

    Bullet Markup Language is an XML-based system for describing bullet barrages in shoot 'em up games. It is designed by the prolific shooting game author Kenta Cho.

    The BulletML page can be found at http://www.asahi-net.or.jp/~cs8k-cyu/bu ... dex_e.html.

    Here's an example:

    <?xml version="1.0" ?>
    <!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd">
    <bulletml xmlns="http://www.asahi-net.or.jp/~cs8k-cyu/bulletml">
        <action label="top">
            <fire>
                <bullet>
                    <direction type="absolute">90</direction>
                </bullet>
            </fire>
        </action>
    </bulletml>
    [/code:1z4lqy6h]
    
    This script fires one bullet at angle 90, default speed. Not terribly useful yet. Here's a more complex example:
    
    [code:1z4lqy6h]
    <?xml version="1.0" ?>
    <!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd">
    <bulletml xmlns="http://www.asahi-net.or.jp/~cs8k-cyu/bulletml">
        <action label="top">
            <fire>
                <direction type="aim">0</direction>
                <speed>150</speed>
                <bulletRef label="seed" />
            </fire>
        </action>
    
        <bullet label="seed">
            <action>
                <repeat>
                    <times>100</times>
                    <action>
                        <fire>
                            <direction type="absolute">$rand * 360</direction>
                            <speed>200 + $rank * 200</speed>
                            <bullet />
                        </fire>
                    </action>
                    <wait>50</wait>
                </repeat>
            </action>
        </bullet>
    </bulletml>
    [/code:1z4lqy6h]
    
    This script fires a slow-moving bullet that in turn spawns 100 other bullets at 50ms intervals, in random directions. The speed of these bullets depends on the difficulty level (rank).
    
    Check the demo game for a variety of patterns.
    
    [b]* About this plugin[/b]
    
    This plugins adds a BulletML object that can read and play BulletML files. It is a bit like the existing particle system object; you can have multiple emitters and each object manages its own bullets.
    
    While any bullet pattern could be created with events, describing them with external files is more reusable and they can be modified without changing the .cap, including after the game is published.
    
    [b]* Appearance[/b]
    
    You can either let the emitter render the bullets (just like a particle system) by setting a texture or you can replace the bullets with Sprite objects.
    
    [b]* Collisions[/b]
    
    If you are not using Sprites as bullets this object has its own collision condition. All collisions are bullet point against object bounding box. Arcade shoot 'em up games usually use hidden hitboxes that are smaller than the player craft.
    
    Bullets are destroyed when they collide with an object.
    
    [b]* Lifetime[/b]
    
    Bullets are destroyed when they collide, exit the screen (toggleable), their associated Sprite is destroyed or a set number of milliseconds is exceeded.
    
    If you Destroy the emitter, all its associated bullets vanish. This is a technical limitation, but not too tricky to work around.
    
    [b]* Units[/b]
    
    Speeds are pixels per second, time units are milliseconds. The BML spec treats time values as frames for some reason but this wouldn't be very useful when frame rate can be anything from tens to hundreds.
    
    Separate multiplier values are provided for speeds and time values.
    
    [b]* Directions, targeting[/b]
    
    (absolute directions) When script type is "vertical" 0 is right and 90 down. With "horizontal" 0 is up and 90 right.
    
    If you want the bullets to fly in the direction the emitter is pointing, use "relative" direction and angle 0.
    
    When no direction is specified, BulletML spec assumes "aim" is assumed; bullet flies to the x,y coordinate set by "Set target position" action.
    
    [b]* Learning BulletML[/b]
    
    Reading just the reference is not very good for learning the capabilities of this system. Check out the demo game, this [url=http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml_applet_e.html]Java-based demo applet[/url] or download some of Kenta Cho's games - many of them contain BulletML files you can take apart.
  • Lua? Neat

    except David is not really working on it

  • Using scripts in edit time (Python I assume) would be neat.

  • Is v1.03 the final version then?

    ry 1.03 first and if you have connection troubles only then 1.02. They are identical in features but the latest Wiiyourself library has problems with some BT adapters (or computers, or phases of the moon, it's unclear).

  • Poor Stanford Bunny

  • So, uh, are you going to release that one? I really couldn't use this unless it supports per-pixel collisions.

    Oh yeah, have a look: BulletML-1.01.zip. Still not an official release though.

    For this week I'm on a machine with no dev tools so I can't quickly fix any bugs. Been working on the demo game instead.

  • Notable things I've added lately:

    * Ability to use construct objects as bullets, allows for example per-bullet effects like trails and using the existing collision detection

    * Easy "play file name.xml x times with delay y milliseconds" action

    <img src="http://paahdin.com/projects/bulletml/images/mutants.png">

    Little green mutants with trails

  • (back from the greek sun)

    I will post this somewhere more visible when it's less rough around the edges. Things I still need to do:

    • Fix bugs!
    • Create a cool demo game (just one level)
    • Look again into using Construct objects as bullets, earlier I deemed it too tricky
  • It doesn't use Construct Sprites but handles its own rendering (technically: textured quads in the case of rotated bullets, point sprites when there's no rotation).

    Haven't ran very scientific benchmarks, but it's pretty fast. Here's a test I did just now:

    Over 20000 bullets on screen (a bit of a challenge for the player ), colliding with one object (player ship), still pushing over 60 FPS. (2.8ghz dual core, GF 9800 GT).

    <img src="http://paahdin.com/projects/bulletml/images/lotsa.jpg">

    stare at this long enough and your screen will begin to wave

    I can probably optimize it further, but there's still features to be added first. Anyway, performance is not the main catch here (Construct could easily push a few thousand Sprites -- more than enough for games) but the ability to script the patterns.

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • First release! Give input!

    Download plugin 1.01 (preview) .zip updated link 19.07.

    Download example (exe & .cap), you can modify the xml files to

    change the patterns.

    Source code

    <img src="http://paahdin.com/projects/bulletml/images/select.png">

    Shot from example app - aircraft sprites by Mark Simpson

    * What is BulletML?

    Bullet Markup Language is an XML-based system for describing bullet

    barrages in shoot 'em up games. It is designed by the prolific

    shooting game author Kenta Cho.

    The BulletML page with the manual can be found at

    http://www.asahi-net.or.jp/~cs8k-cyu/bu ... dex_e.html.

    Here's an example:

    <?xml version="1.0" ?>
    <!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd">
    <bulletml xmlns="http://www.asahi-net.or.jp/~cs8k-cyu/bulletml">
        <action label="top">
            <fire>
                <bullet>
                    <direction type="absolute">90</direction>
                </bullet>
            </fire>
        </action>
    </bulletml>[/code:313wpgtq]
    This script fires one bullet at angle 90, default speed. Not terribly 
    useful yet. Here's a more complex example:
    
    [code:313wpgtq]<?xml version="1.0" ?>
    <!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd">
    <bulletml xmlns="http://www.asahi-net.or.jp/~cs8k-cyu/bulletml">
        <action label="top">
            <fire>
                <direction type="aim">0</direction>
                <speed>150</speed>
                <bulletRef label="seed" />
            </fire>
        </action>
    
        <bullet label="seed">
            <action>
                <repeat>
                    <times>100</times>
                    <action>
                        <fire>
                            <direction type="absolute">$rand * 360</direction>
                            <speed>200 + $rank * 200</speed>
                            <bullet />
                        </fire>
                    </action>
                    <wait>50</wait>
                </repeat>
            </action>
        </bullet>
    </bulletml>[/code:313wpgtq]
    This script fires a slow-moving bullet, aimed at the player, that in turn spawns 100 other 
    bullets at 50ms intervals, in random directions. The speed of these 
    bullets depends on the difficulty level (rank).
    
    [b]* About this plugin[/b]
    
    This plugins adds a BulletML object that can read and play BulletML 
    files. It is a bit like the existing particle system object; you can 
    have multiple emitters and each object renders its own bullets. On the other hand, individual bullets are not individual Construct objects.
    
    While any bullet pattern could be created with events, describing them 
    with external files is more reusable and they can be modified without 
    changing the .cap.
    
    [b]* Appearance[/b]
    
    You can change the bullet texture and size. Standard colour filter, 
    opacity and effects are also available. Bullets can be oriented to the direction they are travelling.
    
    [b]* Collisions[/b]
    
    This object has its own collision condition. All collisions are bullet 
    point against object bounding box. Arcade shoot 'em up games usually 
    use hidden hitboxes that are smaller than the player craft.
    
    Bullets are destroyed when they collide with an object.
    
    [b]* Lifetime[/b]
    
    Bullets are destroyed when they collide, exit the screen (toggleable) 
    or a number of milliseconds is exceeded (configurable).
    
    [b]* Units[/b]
    
    Speeds are pixels per second, time units are milliseconds. The BML spec 
    treats time values as frames for some reason but this wouldn't be very 
    useful when frame rate can be anything from tens to hundreds.
    
    Separate multiplier values are provided for speeds and time values.
    
    [b]* Directions, targeting[/b]
    
    (absolute directions) When script type is "vertical" 0 is right and 90 
    down. With "horizontal" 0 is up and 90 right.
    
    If you want the bullets to fly in the direction the emitter is 
    pointing, use "relative" direction and angle 0.
    
    When no direction is specified, "aim" is assumed; bullet flies to the 
    x,y coordinate set by "Set target position" action.
    
    [b]* Error reporting[/b]
    
    This object has a "On error occurred" condition and "Last error 
    string" expression. Useful for spotting XML errors.
    
    [b]* Limitations, known issues[/b]
    [ul]
    	[li]BulletML does not define a bullet's appearance. Maybe it could be[/li]
    [/ul]added (but it would break compatibility).
    [ul]
    	[li]If you destroy a BulletML object all its bullets are destroyed as[/li]
    [/ul]well. You might want to wait until the bullet count is zero. I can 
    probably add a smarter Destroy action.
    [ul]
    	[li]changing the filter color affects the currently existing bullets as[/li]
    [/ul]well. While consistent with Construct, it might be more useful to have 
    a separate color property and Set Color action.
    [ul]
    	[li]bug: if a script contains "vanish" action, Finished condition does[/li]
    [/ul]not always trigger.
  • Seems like VEditTime does not even have a CreateObject functionality so this is not possible as it is. I wanted to do a sort of a "prefab" functionality.

    For runtime I've had xml export/import working for a while. It doesn't support every situation but saving the basic properties (name, position, size, angle, filter...) goes a long way.

  • Is there a some way to access the currently selected objects from a plugin? I was thinking if it was possible to make a "Export selected objects to XML" style feature.

    I guess it's doable by hacking LayoutEditor, but it would be easier to demonstrate a proof of concept as a plugin.