Introduction
This is a simple game in WPF that gives you some information about working with XAML and C#. I also use a little LINQ for reading the XML files.
Background
There are some Flash games like this project here, I actually got the idea from there.
Using the code
First, I created Middle East's map. For that, I used a Pen
of Expression Blend 2 . I put the original map image in the back of my layout space, and then I drew the lines according to the country borders with the Pen
. At last, I had a Path
code in XAML like this:
<Path Fill="#FF3DAB0F" Stretch="Fill" Stroke="#FF000000"
HorizontalAlignment="Right" Margin="0,39.687,0,192.468"
x:Name="Iran" Width="243.538"
Data="M151.72299,176.838 L154.42299,177.93799 151.82297,180.43799
149.823,181.53798 146.62303, ..." />
After creating the map, I created four Storyboards for my game:
<!---->
<Storyboard x:Key="StoryboardMouseEnter">...</storyboard>
<!---->
<Storyboard x:Key="StoryboardMouseLeave">...</storyboard>
<!---->
<Storyboard x:Key="StoryboardInfo1">...</storyboard><!---->
<Storyboard x:Key="StoryboardInfo2">...</storyboard><!---->
OK, now I have tocontrol them (Storyboards) with C#:
void country_MouseEnter(object sender, MouseEventArgs e)
{
try
{
Path senderPath = (Path)sender;
changeColorValue(senderPath.Name);
StoryboardMouseEnter.Begin();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK);
}
}
void country_MouseLeave(object sender, MouseEventArgs e)
{
try
{
StoryboardMouseLeave.Begin();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK);
}
}
void updateCountryInfo(string countryName)
{
try
{
var countryNode = from c in xmlFile.Descendants(countryName)
select c;
var Area = (from q in countryNode.Descendants("Area")
select q).First().Value;
var Population = (from q in countryNode.Descendants("Population")
select q).First().Value;
var Capital = (from q in countryNode.Descendants("Capital")
select q).First().Value;
var OfficialLanguage = (from q in countryNode.Descendants("OfficialLanguage")
select q).First().Value;
var flagName = (from q in countryNode.Descendants("flagName")
select q).First().Value;
this.NameOfCountry.Text = countryName;
this.Flag.Source = new
BitmapImage(new Uri("Flags\\" + flagName, UriKind.Relative));
this.area.Text = Area + " KM2";
this.population.Text = Population;
this.capital.Text = Capital;
this.languages.Text = OfficialLanguage;
}
catch { }
}
After that, I check whether the user answers the question correctly or not:
void changeColorValue(string countryName)
{
try
{
Color newColor = (Color)ColorConverter.ConvertFromString(this.enterColorString);
ColorAnimationUsingKeyFrames colorAnimationUsingKeyFrames
= (from c in StoryboardMouseEnter.Children
where (Storyboard.GetTargetName(c) == countryName)
select c).First() as ColorAnimationUsingKeyFrames;
colorAnimationUsingKeyFrames.KeyFrames[0].Value = newColor;
Color grayColor = (Color)ColorConverter.ConvertFromString(this.leaveColorString);
var othersColorAnimationUsingKeyFrames = from c in StoryboardMouseEnter.Children
where (Storyboard.GetTargetName(c) != countryName)
select c;
foreach (ColorAnimationUsingKeyFrames tmp in othersColorAnimationUsingKeyFrames)
tmp.KeyFrames[0].Value = grayColor;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK);
}
}
void changeQuestion()
{
try
{
string[] countries = new string[] { "Iran", "Turkey",
"Iraq", "Kuwait", "Bahrain", "Oman",
"Qatar", "SaudiArabia", "UAE",
"Yemen", "Israel", "Jordan",
"Lebanon", "Syria", "Egypt",
"Palestine" };
Random rand = new Random(DateTime.Now.Second.GetHashCode());
this.answer = countries[rand.Next(0, countries.Count() - 1)];
StoryboardInfo1.Begin();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK);
}
}
void StoryboardInfo1_Completed(object sender, EventArgs e)
{
try
{
updateCountryInfo(this.answer);
StoryboardInfo2.Begin();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK);
}
}
History
- 03 December, 2008: First post.