Dev Blog #1

So to start the day I am going to share with you guys how I use touch controls and touch “joysticks” in Dystopian Lights (previously Neon Android) to control movement and crosshair aim. Initially I had a floating joystick system where you would tap and hold in a certain area but the response to that system has been heavily negative, so I have redone the code running the joysticks and with refactoring I have made them static as well as extremely reusable. This code is tested in monogame for android and should work for iOS as well if you are using the mono and the monogame framework. What I wasn’t aware of when I wrote my first joysticks, is that monogame has a cool feature for touchlocation IDs that allows for greater control without having to worry about which touch is which, we already know if we assign it an ID on touch. You can view the code and use however you want if you decide you like it.

If you have ever used monogame and you look at the scaling in the draw method, you will notice that I multiply the scale by 0.001f. This is because the texture has a radius of 500. There may be some other oddities in the code, if you do use it and have any questions, don’t hesitate to ask. The code is at the end of the blog.

So this is one of the updates for the game, as well as a proper title. I have been developing the game under a working title “Neon Android” for quite some time but I have always known that this isn’t going to fly as the actual title of the game. Dystopian Lights rang a good bell for me when thinking about how I want the game portrayed. For now it sits as a very similar, almost clone of, Geometry Wars. This is intended for art and play style to some degree, but with many varying factors I think the two games will stand far apart from one another once Dystopian Lights is a finished product.

One of the other upcoming changes for the game is the change in the GUI. It has been heavily improved on mobile platforms. Previously the GUI was tiny and fit for a computer, but now it looks okay on Android and you can actually navigate the menus when upgrading your weapons. Also I have changed the buttons for weapon selection to be highlighted when selected so you actually know what’s firing without having to pay attention to your projectile.


So from here, the plan is to release an update on my website by this Friday, which will include the changes I have showcased here as well as a few other minor changes. Right now the game is only available on Android and is available for download from my website, so please head there if you want to check it out. I will have more Dev Blogs in the future and hope to do a minimum of one a week until the end of the year, when I will release it on the Android app market and then see about working for a PC release. The largest problem I have encountered so far while developing this game is the spawning pattern. If anyone has any recommendations for setting up a spawner that gets infinitely more difficult, please feel free to give your input. I have a system right now that works, but its scaling is terrible and it feels like end game within about 5 minutes. There is some obvious tweaking and balancing that I still need to work out as well, so if anyone trys the game and would enjoy something being different, feel free to let me know what I should change.

Some of the ideas I have for the future of the game will be to include a story mode. My thoughts keep going around to scripted spawns, and then some animations with full screen-width chat boxes that show an avatar of the character speaking. There will be at least a few boss fights and some over the top story that would make this game seem like a space opera straight out of the cheesiest movie you have ever seen on the Sci-Fi network. I have also been working out this idea where your player has a capacitor that can only sustain so many weapons for so long. If I do add it, the shot weapon will probably always be available, when you use your missile and laser in tandem with something else, depending on your capacitor recharge rate and max capacitor, you will run out of energy which will cause your capacitor to short and then the only weapon available until it fully recharges will be the shot weapon. Health packs are coming as well. They will be random drops from enemies and they will heal different amounts based on the enemy killed.

So far I am happy to see that I have about 40 downloads of the game just from my website alone. I have not received any feedback from any users of the software that I don’t know, so please if you are downloading it, speak up with any critique or recommendations. I would love to hear, the good, the bad, and the ugly.

    public class Joystick
        private Vector2 outerLocation;
        private Vector2 innerLocation;
        private Vector2 direction;
        private Color innerColor = new Color(0.2f, 0.2f, 0.2f, .5f);
        private Color outerColor = new Color(.5f, .5f, .5f, .5f);
        private float innerRadiusRatio;
        private float outerRadius;
        private int touchId;

        public Joystick(Vector2 location, int radius)
            outerLocation = location;
            innerLocation = location;
            outerRadius = radius;
            innerRadiusRatio = 0.3f;

        public Vector2 Direction
            get { return direction; }

        public void Update(TouchCollection touchCollection)
            foreach (TouchLocation tl in touchCollection)
                if (tl.State == TouchLocationState.Pressed)
                    if (AOneMath.Distance(outerLocation.X, tl.Position.X, outerLocation.Y, tl.Position.Y) <= outerRadius)
                        touchId = tl.Id;

                if (touchId != tl.Id)

                if (tl.State == TouchLocationState.Moved)
                    float dirX = tl.Position.X - outerLocation.X;
                    float dirY = tl.Position.Y - outerLocation.Y;

                    direction.X = dirX;
                    direction.Y = dirY;

                    float length = AOneMath.Distance(tl.Position.X, outerLocation.X, tl.Position.Y, outerLocation.Y);

                    if (length > outerRadius - outerRadius * 0.5f)
                        length = outerRadius - outerRadius * 0.5f;

                    innerLocation.X = outerLocation.X + direction.X * length;
                    innerLocation.Y = outerLocation.Y + direction.Y * length;

                if (tl.State == TouchLocationState.Released)
                    innerLocation = outerLocation;
                    direction.X = 0;
                    direction.Y = 0;

        public void Draw(SpriteBatch spriteBatch)
            spriteBatch.Draw(, position: Vector2.Subtract(outerLocation, new Vector2(outerRadius / 2, outerRadius / 2)), 
                             scale: new Vector2(outerRadius * 0.001f, outerRadius * 0.001f), 
                             color: innerColor);
                             position: Vector2.Subtract(innerLocation, new Vector2(outerRadius * innerRadiusRatio / 2, outerRadius * innerRadiusRatio / 2)), 
                             scale: new Vector2(outerRadius * innerRadiusRatio * 0.001f, outerRadius * innerRadiusRatio * 0.001f), 
                             color: outerColor);


Leave a Reply

Your email address will not be published. Required fields are marked *