<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Janne Mattila's blog : Excel</title><link>http://blogs.msdn.com/jannemattila/archive/tags/Excel/default.aspx</link><description>Tags: Excel</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Creating Excel Game (or something similar for fun)</title><link>http://blogs.msdn.com/jannemattila/archive/2009/01/29/creating-excel-game-or-something-similar-for-fun.aspx</link><pubDate>Thu, 29 Jan 2009 22:47:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9383568</guid><dc:creator>jannemattila</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/9383568.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=9383568</wfw:commentRss><description>&lt;p&gt;Awhile back I saw really interesting article: &lt;a href=" http://www.gamasutra.com/view/feature/3563/microsoft_excel_revolutionary_3d_.php" target="_blank"&gt;Microsoft Excel: Revolutionary 3D Game Engine?&lt;/a&gt;     &lt;br /&gt;After that I was forced to do small test on that and that of course resulted to this post &lt;strong&gt;:-)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I just grabbed the idea and made small “car game” (but in reality it just vaguely reminds of car game) on top of Excel. And here is the result: &lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CreatingExcelGame_1378A/image_11.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Car Game example" border="0" alt="Car Game example" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CreatingExcelGame_1378A/image_thumb_3.png" width="639" height="480" /&gt;&lt;/a&gt;     &lt;br /&gt;My car (or just blue box if you wish) can be controlled with mouse. If you press left mouse button it increases the speed of the car (a.k.a. gas pedal). I was too lazy to “invent” brake so car just slowly slows down if user isn’t pressing the left mouse button. User can control the “car” by moving mouse from left to right. Right mouse button quits the game.&lt;/p&gt;  &lt;h4&gt;Click here for the &lt;a href="http://cid-64286c13c6bd5d77.skydrive.live.com/self.aspx/Julkinen/Blog%20files/ExcelCarGame.wmv" target="_blank"&gt;video&lt;/a&gt;.&lt;/h4&gt; Since I just wanted to test basic input and drawing mechanisms I didn’t even bother to think of creating any physics. I’ll leave that to you! But here’s the source code for my example:   &lt;table cellspacing="10"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" align="right"&gt;         &lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115&lt;/font&gt;&lt;/pre&gt;
      &lt;/td&gt;

      &lt;td valign="top"&gt;
        &lt;pre&gt;&lt;font color="#008000"&gt;' WinAPI stuff:
&lt;/font&gt;&lt;font color="#0000ff"&gt;Declare&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;/font&gt; Sleep &lt;font color="#0000ff"&gt;Lib&lt;/font&gt; &lt;font color="#a31515"&gt;&amp;quot;kernel32&amp;quot;&lt;/font&gt; (&lt;font color="#0000ff"&gt;ByVal&lt;/font&gt; dwMilliseconds &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Long&lt;/font&gt;)
&lt;font color="#0000ff"&gt;Declare&lt;/font&gt; &lt;font color="#0000ff"&gt;Function&lt;/font&gt; GetAsyncKeyState &lt;font color="#0000ff"&gt;Lib&lt;/font&gt; &lt;font color="#a31515"&gt;&amp;quot;user32&amp;quot;&lt;/font&gt; (&lt;font color="#0000ff"&gt;ByVal&lt;/font&gt; vKey &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Long&lt;/font&gt;) &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Integer
Declare&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;/font&gt; GetCursorPos &lt;font color="#0000ff"&gt;Lib&lt;/font&gt; &lt;font color="#a31515"&gt;&amp;quot;user32&amp;quot;&lt;/font&gt; (&lt;font color="#0000ff"&gt;ByRef&lt;/font&gt; lpoint &lt;font color="#0000ff"&gt;As&lt;/font&gt; POINTAPI)
&lt;font color="#0000ff"&gt;Declare&lt;/font&gt; &lt;font color="#0000ff"&gt;Function&lt;/font&gt; ShowCursor &lt;font color="#0000ff"&gt;Lib&lt;/font&gt; &lt;font color="#a31515"&gt;&amp;quot;user32&amp;quot;&lt;/font&gt; (&lt;font color="#0000ff"&gt;ByVal&lt;/font&gt; bShow &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Long&lt;/font&gt;) &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Long

Type&lt;/font&gt; POINTAPI
  x &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Long
&lt;/font&gt;  y &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Long
End&lt;/font&gt; &lt;font color="#0000ff"&gt;Type&lt;/font&gt; 

&lt;font color="#0000ff"&gt;Sub&lt;/font&gt; GameLoop()

  &lt;font color="#008000"&gt;' Input related variables:
&lt;/font&gt;  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; mouseLocation &lt;font color="#0000ff"&gt;As&lt;/font&gt; POINTAPI
  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; mouseLocationPrevious &lt;font color="#0000ff"&gt;As&lt;/font&gt; POINTAPI

  &lt;font color="#008000"&gt;' Get &amp;amp; Set original mouse position:
&lt;/font&gt;  GetCursorPos mouseLocation
  mouseLocationPrevious = mouseLocation

  &lt;font color="#008000"&gt;' Initialize the system:
&lt;/font&gt;  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Xdiff&amp;quot;&lt;/font&gt;).Value = 0
  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Ydiff&amp;quot;&lt;/font&gt;).Value = 0
  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;SteeringWheel&amp;quot;&lt;/font&gt;).Value = 90
  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value = 0
  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarX&amp;quot;&lt;/font&gt;).Value = 250
  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarY&amp;quot;&lt;/font&gt;).Value = 250

  &lt;font color="#008000"&gt;' Hide mouse cursor:
&lt;/font&gt;  ShowCursor 0

  &lt;font color="#008000"&gt;' We're going to loop until mouse click:
&lt;/font&gt;  &lt;font color="#0000ff"&gt;While&lt;/font&gt; GetAsyncKeyState(vbKeyRButton) = 0

    &lt;font color="#008000"&gt;' Magic:
&lt;/font&gt;    Sheets(&lt;font color="#a31515"&gt;&amp;quot;GameBoard&amp;quot;&lt;/font&gt;).Range(&lt;font color="#a31515"&gt;&amp;quot;Z_SortArea&amp;quot;&lt;/font&gt;).Sort _
      Sheets(&lt;font color="#a31515"&gt;&amp;quot;GameBoard&amp;quot;&lt;/font&gt;).Range(&lt;font color="#a31515"&gt;&amp;quot;NormalZ&amp;quot;&lt;/font&gt;), xlAscending

    GetCursorPos mouseLocation
    DrawCar &lt;font color="#a31515"&gt;&amp;quot;car1&amp;quot;&lt;/font&gt;, mouseLocation, mouseLocationPrevious

    ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarX&amp;quot;&lt;/font&gt;).Value = _
      ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarX&amp;quot;&lt;/font&gt;).Value - ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;SpeedY&amp;quot;&lt;/font&gt;).Value
    ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarY&amp;quot;&lt;/font&gt;).Value = _
      ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarY&amp;quot;&lt;/font&gt;).Value - ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;SpeedX&amp;quot;&lt;/font&gt;).Value
    mouseLocationPrevious = mouseLocation

    &lt;font color="#008000"&gt;' Let’s take a nap:
&lt;/font&gt;    Sleep(10)

    &lt;font color="#0000ff"&gt;If&lt;/font&gt; GetAsyncKeyState(vbKeyLButton) &amp;lt;&amp;gt; 0 &lt;font color="#0000ff"&gt;Then
&lt;/font&gt;      &lt;font color="#008000"&gt;' User is pressing the gas pedal =&amp;gt; More speed:
&lt;/font&gt;      ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value = _
        ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value + ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Accelerate&amp;quot;&lt;/font&gt;).Value
      &lt;font color="#0000ff"&gt;If&lt;/font&gt; ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value &amp;gt; ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;MaxPedal&amp;quot;&lt;/font&gt;).Value &lt;font color="#0000ff"&gt;Then
&lt;/font&gt;        ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value = ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;MaxPedal&amp;quot;&lt;/font&gt;).Value
      &lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;If
&lt;/font&gt;    &lt;font color="#0000ff"&gt;Else
&lt;/font&gt;      &lt;font color="#008000"&gt;' User isn't pressing the gas pedal =&amp;gt; Take of some speed (if moving):
&lt;/font&gt;      ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value = _
        ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value - ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Brake&amp;quot;&lt;/font&gt;).Value
      &lt;font color="#0000ff"&gt;If&lt;/font&gt; ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value &amp;lt; 0 &lt;font color="#0000ff"&gt;Then
&lt;/font&gt;        ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Pedal&amp;quot;&lt;/font&gt;).Value = 0
      &lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;If
&lt;/font&gt;    &lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;If
&lt;/font&gt;  &lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;While

&lt;/font&gt;  &lt;font color="#008000"&gt;' Bring back the mouse cursor:
&lt;/font&gt;  ShowCursor 1
&lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub

Sub&lt;/font&gt; DrawCar(carID &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;String&lt;/font&gt;, _
  mouseLocation &lt;font color="#0000ff"&gt;As&lt;/font&gt; POINTAPI, _
  mouseLocationPrevious &lt;font color="#0000ff"&gt;As&lt;/font&gt; POINTAPI)

  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; diffX &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Double
&lt;/font&gt;  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; diffY &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Double
&lt;/font&gt;  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; Points(1 &lt;font color="#0000ff"&gt;To&lt;/font&gt; 5, 1 &lt;font color="#0000ff"&gt;To&lt;/font&gt; 2) &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Single

&lt;/font&gt;  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; carX &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Double
&lt;/font&gt;  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; carY &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Double
&lt;/font&gt;  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; carWidth &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Double
&lt;/font&gt;  &lt;font color="#0000ff"&gt;Dim&lt;/font&gt; carHeight &lt;font color="#0000ff"&gt;As&lt;/font&gt; &lt;font color="#0000ff"&gt;Double

&lt;/font&gt;  carX = ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarX&amp;quot;&lt;/font&gt;).Value
  carY = ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarY&amp;quot;&lt;/font&gt;).Value
  carHeight = ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarSize1&amp;quot;&lt;/font&gt;).Value
  carWidth = ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;CarSize2&amp;quot;&lt;/font&gt;).Value

  &lt;font color="#008000"&gt;' Get input and store current values to sheet:
&lt;/font&gt;  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Xdiff&amp;quot;&lt;/font&gt;).Value = mouseLocationPrevious.x - mouseLocation.x
  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Ydiff&amp;quot;&lt;/font&gt;).Value = mouseLocationPrevious.y - mouseLocation.y

  ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;SteeringWheel&amp;quot;&lt;/font&gt;).Value = _
    ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;SteeringWheel&amp;quot;&lt;/font&gt;).Value + ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;Xdiff2&amp;quot;&lt;/font&gt;).Value

  Points(1, 1) = carX - carWidth
  Points(1, 2) = carY + carHeight
  Points(2, 1) = carX + carWidth
  Points(2, 2) = carY + carHeight
  Points(3, 1) = carX + carWidth
  Points(3, 2) = carY - carHeight
  Points(4, 1) = carX - carWidth
  Points(4, 2) = carY - carHeight
  Points(5, 1) = Points(1, 1)
  Points(5, 2) = Points(1, 2)

  &lt;font color="#008000"&gt;' Draw this car:
&lt;/font&gt;  &lt;font color="#0000ff"&gt;On&lt;/font&gt; &lt;font color="#0000ff"&gt;Error&lt;/font&gt; &lt;font color="#0000ff"&gt;Resume&lt;/font&gt; &lt;font color="#0000ff"&gt;Next
&lt;/font&gt;  ActiveSheet.Shapes(carID).Delete
  Err.Clear &lt;font color="#008000"&gt;' Deleting Shape that doesn't exist =&amp;gt; Error
&lt;/font&gt;  ActiveSheet.Shapes.AddPolyline(Points).Name = carID
  ActiveSheet.Shapes(carID).Rotation = ActiveSheet.Range(&lt;font color="#a31515"&gt;&amp;quot;SteeringWheel&amp;quot;&lt;/font&gt;).Value
&lt;font color="#0000ff"&gt;End&lt;/font&gt; &lt;font color="#0000ff"&gt;Sub&lt;/font&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;I did my tests on Excel 2007 and I used &lt;em&gt;.xlsm&lt;/em&gt; format (Macro enabled). You can grab my file from &lt;a href="http://cid-64286c13c6bd5d77.skydrive.live.com/self.aspx/Julkinen/Blog%20files/Car%20Game.xlsm" target="_blank"&gt;here&lt;/a&gt;. 

  &lt;br /&gt;

  &lt;br /&gt;So if you want to open that example it gives you this security warning: 

  &lt;br /&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Security warning" border="0" alt="Security warning" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CreatingExcelGame_1378A/image_6.png" width="390" height="80" /&gt; 

  &lt;br /&gt;

  &lt;br /&gt;You need to click &lt;em&gt;Options...&lt;/em&gt; button just below ribbon. And then check &lt;em&gt;Enable this content&lt;/em&gt; and click &lt;em&gt;OK&lt;/em&gt;: 

  &lt;br /&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Security Alert - Macro" border="0" alt="Security Alert - Macro" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CreatingExcelGame_1378A/image_5.png" width="485" height="429" /&gt; 

  &lt;br /&gt;

  &lt;br /&gt;And if you want to run the game you can just press &lt;em&gt;Alt-F8&lt;/em&gt; and then hit enter (or click &lt;em&gt;Run&lt;/em&gt;): 

  &lt;br /&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Macro" border="0" alt="Macro" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CreatingExcelGame_1378A/image_9.png" width="375" height="358" /&gt;&lt;/p&gt;

&lt;p&gt;Well I have to say that I enjoyed playing with Excel. Maybe some day I’m going to use this for some serious thing or not &lt;strong&gt;:-)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anyways... Happy hacking! 
  &lt;br /&gt;

  &lt;br /&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9383568" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Fun/default.aspx">Fun</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Excel/default.aspx">Excel</category></item></channel></rss>