Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!






Game Jolt C# API and News Service

Posted by Programmer16, 16 February 2013 · 735 views

One of the things I've been wanting is an easy way to handle users, store saves in the cloud, and handle achievements...enter Game Jolt. There was already a C# API partially written, but I wasn't a big fan of the design and it doesn't seem to have gotten very far; so I'm currently working on implementing a 2 tier library - a core Game Jolt C# API (all functionality documented on Game Jolt's API page is implemented and testing) and a "services" tier.

The upper tier is going to be the core once I figure out some meat to add. There have been a few ideas - in-game messaging, in-game mailing, in-game trading, etc, but I'm having issues with implementing some of them due to limitations; I can't send a data item from one person to another for instance. Current layouts include using a global data store, but that can be dangerous and inefficient; I'll continue working on it though. The entire library will be open source shortly; I've created the CodePlex page, I just haven't published it yet (need to verify that I've removed all pertinent info from the source code, pick a decent license, and get some more meat in it.)

Currently the only service working is the news service. This is a simple game-news service; the typical "A new update is available" whatnot. I've created a tool that allows you to log in and the library provides what facilities to access the news (note that it isn't designed for a large number of items, but it works off of a single data store so you could theoretically store up to 16MB of news entries.)

Here are some screenshots:
[The News Manager]
Attached Image Attached Image
Items are managed via a context menu on the tree view on the left.

[In Game Example]
Attached Image Attached Image
A loading message is displayed while the items are retrieved asynchronously (though all request have synchronous versions) and then they display on screen marquee-style.

[Android]
Attached Image Attached Image
All libraries involved are dual built against Android.

Here is the necessary source code for the example:
// How to instantiate the services manager
 
var GameJoltServicesManager = new GameJoltServices.ServicesManager("GAMEID", "PRIVATEKEY");
 
// The news item control used in Young Minds Memory Game

namespace Mnemosyne
{
	public sealed class NewsItemControl : Control
	{
		private enum FeedState
		{
			Active = 0,
			Paused = 1,
			Finished = 2,
		};
 
		#region Variables
		private bool itemsAreLoading = false;
 
		private List<NewsItem> newsItems = null;
		private System.Collections.IEnumerator currentItem = null;
 
		private float marqueeX = 0.0f;
		private float minMarqueeX = 0.0f;
		private FeedState state = FeedState.Active;
		#endregion
 
		#region Properties
		public NewsItem[] NewsItems
		{
			get
			{
				return newsItems.ToArray();
			}
			set
			{
				newsItems.Clear();
				newsItems.AddRange(value);
				currentItem = newsItems.GetEnumerator();
				MoveToNextItem();
			}
		}
		#endregion
 
		#region Constructors
		public NewsItemControl()
		{
			newsItems = new List<NewsItem>();
			currentItem = newsItems.GetEnumerator();
		}
		#endregion
 
		#region Methods
		private void MoveToNextItem()
		{
			if(!currentItem.MoveNext())
			{
				currentItem.Reset();
				state = FeedState.Finished;
				return;
			}
 
			var itemText = string.Format("{0} - {1}", ((NewsItem)currentItem.Current).Title, ((NewsItem)currentItem.Current).Content);
			var textSize = Font.MeasureString(itemText);
			minMarqueeX = -textSize.X;
			this.Width = (int)Math.Ceiling(textSize.X);
			marqueeX = this.Width;
		}
 
		protected override void OnDrawText(Lust.Renderer renderer, string overrideText = null)
		{
			if(state == FeedState.Finished)
				overrideText = string.Empty;
			else if(itemsAreLoading)
			{
				overrideText = "Loading news items...";
				marqueeX = 0.0f;
			}
			else if(currentItem.Current != null)
				overrideText = string.Format("{0} - {1}", ((NewsItem)currentItem.Current).Title, ((NewsItem)currentItem.Current).Content);
 
			FlatStyle style = null;
			if(Styles.TryGetValue(this.State, out style))
				FlatControlRenderer.DrawText(renderer, Font, overrideText, new Microsoft.Xna.Framework.Rectangle((int)marqueeX, Y, Width, Height), style, this.TextFormatFlags, null);
		}
 
		protected override void OnClick(Microsoft.Xna.Framework.Point position)
		{
			if(state == FeedState.Paused)
				state = FeedState.Active;
			else if(state == FeedState.Active)
				state = FeedState.Paused;
			base.OnClick(position);
		}
 
		public override void Update(float delta)
		{
			if(IsEnabled && !itemsAreLoading && state == FeedState.Active)
			{
				marqueeX -= 128.0f * delta;
				if(marqueeX < minMarqueeX)
					MoveToNextItem();
			}
			base.Update(delta);
		}
 
		public void LoadItems(ServicesManager servicesManager)
		{
			newsItems.Clear();
			itemsAreLoading = true;
 
			var newsService = new NewsService(servicesManager);
			newsService.GetNews((storedNewsItems) =>
			{
				this.NewsItems = storedNewsItems;
				itemsAreLoading = false;
			});
		}
		#endregion
	}
 
	public enum NewsItemDisplayStyle
	{
		Marquee,
	}
}
 
// You would then simply call newsItemControlInstance.LoadItems(GameJoltServicesManager)


Alrighty, that's enough work for tonight; I'm off to bed.

[edit]
Some (planned) key features:
  • Multi-user login tracking (up to 4 characters)
  • Guest log in
  • Simple UI elements (notification, user login pop up, etc)
There are others, but I'm drawing a blank at the moment; not enough sleep I guess lol.




This seems like it would be a lot of fun to play with and I bet there are a few people out there that have been hunting for something just like this.

This seems like it would be a lot of fun to play with and I bet there are a few people out there that have been hunting for something just like this.

Indeed, I know I was. Their API is still somewhat limited, but it is brand new so that is to be expected. I'm probably going to be requesting some features in the near future, but I need to determine the good/bad ones and whether or not they are attainable.

 

I'm hoping to have my CodePlex project published with in the next few days.

 

Thanks for the comment!

There is currently a huge shift to cloud storage and operation that being near the front of the pack should give you a fair amount of attention.

Please post a link to the CodePlex page when you publish it.

There is currently a huge shift to cloud storage and operation that being near the front of the pack should give you a fair amount of attention.

Please post a link to the CodePlex page when you publish it.

The project has been published now: http://gamejolt.codeplex.com/

 

I just want to clarify that the Game Jolt website and the service are not mine; my library is just a C# implementation of their web API and then a library encapsulating some of the more complex or common mechanisms and such.

PARTNERS