Updated date and version
[sdlgit/SDL-Site.git] / pages / blog-0008.html-inc
index 2e202e7..74be239 100644 (file)
@@ -1,81 +1,8 @@
 <div class="blog">
 <h1 id="NAME">
-Providing direct memory access to SDL_Surface's pixels
+SDL Perl Game Contest - week 2 roundup
 </h1>
 <div class="CONTENT">
-<p>In an attempt to make pixel access easier on SDL_Surface pixels. I have started work on <a href="http://github.com/kthakore/SDL_perl/commit/7ee1a1a7f162080a6fa5274e95b80961486e21e5">SDLx::Surface</a>. So far I have only start on the 32 bpp surfaces.</p><br />
-<p>The general idea is to make Pointer Values (PV) of each pixel in the surface and place them into a 2D matrix. First I make pointer values like this: </p><br />
-<pre style='color:#d1d1d1;background:#000000;'>SV <span style='color:#d2cd86; '>*</span> get_pixel32 <span style='color:#d2cd86; '>(</span>SDL_Surface <span style='color:#d2cd86; '>*</span>surface<span style='color:#d2cd86; '>,</span> <span style='color:#e66170; font-weight:bold; '>int</span> x<span style='color:#d2cd86; '>,</span> <span style='color:#e66170; font-weight:bold; '>int</span> y<span style='color:#d2cd86; '>)</span>
-<span style='color:#b060b0; '>{</span>
- <span style='color:#9999a9; '>//Convert the pixels to 32 bit </span>
- Uint32 <span style='color:#d2cd86; '>*</span>pixels <span style='color:#d2cd86; '>=</span> <span style='color:#d2cd86; '>(</span>Uint32 <span style='color:#d2cd86; '>*</span><span style='color:#d2cd86; '>)</span>surface<span style='color:#d2cd86; '>-</span><span style='color:#d2cd86; '>></span>pixels<span style='color:#b060b0; '>;</span> 
-
- <span style='color:#9999a9; '>//Get the requested pixel  </span>
- Uint32<span style='color:#d2cd86; '>*</span> u_ptr <span style='color:#d2cd86; '>=</span>  pixels <span style='color:#d2cd86; '>+</span> <span style='color:#d2cd86; '>(</span> y <span style='color:#d2cd86; '>*</span> surface<span style='color:#d2cd86; '>-</span><span style='color:#d2cd86; '>></span>w <span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>+</span> x <span style='color:#b060b0; '>;</span> 
-
-        SV<span style='color:#d2cd86; '>*</span> sv <span style='color:#d2cd86; '>=</span> newSVpv<span style='color:#d2cd86; '>(</span><span style='color:#02d045; '>"</span><span style='color:#00c4c4; '>a</span><span style='color:#02d045; '>"</span><span style='color:#d2cd86; '>,</span><span style='color:#008c00; '>1</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>//Make a temp SV* value on the go</span>
-        SvCUR_set<span style='color:#d2cd86; '>(</span>sv<span style='color:#d2cd86; '>,</span> <span style='color:#e66170; font-weight:bold; '>sizeof</span><span style='color:#d2cd86; '>(</span>Uint32<span style='color:#d2cd86; '>)</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>//Specify the new CUR length</span>
- SvLEN_set<span style='color:#d2cd86; '>(</span>sv<span style='color:#d2cd86; '>,</span> <span style='color:#e66170; font-weight:bold; '>sizeof</span><span style='color:#d2cd86; '>(</span>Uint32<span style='color:#d2cd86; '>)</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>//Specify the LEN length</span>
-        SvPV_set<span style='color:#d2cd86; '>(</span>sv<span style='color:#d2cd86; '>,</span><span style='color:#d2cd86; '>(</span><span style='color:#e66170; font-weight:bold; '>char</span><span style='color:#d2cd86; '>*</span><span style='color:#d2cd86; '>)</span>u_ptr<span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>// set the actual pixel's pointer as the memory space to use</span>
-
- <span style='color:#e66170; font-weight:bold; '>return</span> sv<span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>//make a modifiable reference using u_ptr's place as the memory :)</span>
-
-<span style='color:#b060b0; '>}</span>
-</pre><br />
-<p>Next I loop through all the pixels and put them in a 2D array format, shown below: </p><pre style='color:#d1d1d1;background:#000000;'>AV <span style='color:#d2cd86; '>*</span> construct_p_matrix <span style='color:#d2cd86; '>(</span> SDL_Surface <span style='color:#d2cd86; '>*</span>surface <span style='color:#d2cd86; '>)</span>
-<span style='color:#b060b0; '>{</span>
-    AV <span style='color:#d2cd86; '>*</span> matrix <span style='color:#d2cd86; '>=</span> newAV<span style='color:#d2cd86; '>(</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
-     <span style='color:#e66170; font-weight:bold; '>int</span> i<span style='color:#d2cd86; '>,</span> j<span style='color:#b060b0; '>;</span>
-     <span style='color:#e66170; font-weight:bold; '>for</span><span style='color:#d2cd86; '>(</span>  i <span style='color:#d2cd86; '>=</span><span style='color:#008c00; '>0</span> <span style='color:#b060b0; '>;</span> i <span style='color:#d2cd86; '>&lt;</span> surface<span style='color:#d2cd86; '>-</span><span style='color:#d2cd86; '>></span>w<span style='color:#b060b0; '>;</span> i<span style='color:#d2cd86; '>+</span><span style='color:#d2cd86; '>+</span><span style='color:#d2cd86; '>)</span>
-      <span style='color:#b060b0; '>{</span>
-        AV <span style='color:#d2cd86; '>*</span> matrix_row <span style='color:#d2cd86; '>=</span> newAV<span style='color:#d2cd86; '>(</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
-        <span style='color:#e66170; font-weight:bold; '>for</span><span style='color:#d2cd86; '>(</span> j <span style='color:#d2cd86; '>=</span><span style='color:#008c00; '>0</span> <span style='color:#b060b0; '>;</span> j <span style='color:#d2cd86; '>&lt;</span> surface<span style='color:#d2cd86; '>-</span><span style='color:#d2cd86; '>></span>h<span style='color:#b060b0; '>;</span> j<span style='color:#d2cd86; '>+</span><span style='color:#d2cd86; '>+</span><span style='color:#d2cd86; '>)</span>
-        <span style='color:#b060b0; '>{</span>
-           av_push<span style='color:#d2cd86; '>(</span>matrix_row<span style='color:#d2cd86; '>,</span> get_pixel32<span style='color:#d2cd86; '>(</span>surface<span style='color:#d2cd86; '>,</span> i<span style='color:#d2cd86; '>,</span>j<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
-        <span style='color:#b060b0; '>}</span>
-        av_push<span style='color:#d2cd86; '>(</span>matrix<span style='color:#d2cd86; '>,</span> newRV_noinc<span style='color:#d2cd86; '>(</span><span style='color:#d2cd86; '>(</span>SV<span style='color:#d2cd86; '>*</span><span style='color:#d2cd86; '>)</span> matrix_row<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
-      <span style='color:#b060b0; '>}</span>
-
- <span style='color:#e66170; font-weight:bold; '>return</span> matrix<span style='color:#b060b0; '>;</span>
-<span style='color:#b060b0; '>}</span>
-</pre><br />
-<p>You can see the complete <a href="http://github.com/kthakore/SDL_perl/blob/7ee1a1a7f162080a6fa5274e95b80961486e21e5/src/SDLx/Surface.xs">here</a>.</p><br />
-<p>In Perl I can do a get access on this pixel using: </p><br />
-<br />
-<pre style='color:#d1d1d1;background:#000000;'><span style='color:#e66170; font-weight:bold; '>my</span> $surf32_matrix <span style='color:#d2cd86; '>=</span> <span style='color:#904050; '>SDLx</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Surface</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>pixel_array<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
-   <span style='color:#e66170; font-weight:bold; '>print</span> <span style='color:#e66170; font-weight:bold; '>unpack</span> <span style='color:#00c4c4; '>'b*'</span><span style='color:#d2cd86; '>,</span> $surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '># pixel value at x = 0 and y =0</span>
-<span style='color:#9999a9; '>#OUTPUT:</span>
-<span style='color:#9999a9; '># 11111111000000000000000000000000</span>
-</pre><br />
-<p>The structure of the PV is using Devel::Peek is : </p><br />
-<pre style='color:#d1d1d1;background:#000000;'><span style='color:#e66170; font-weight:bold; '>print</span> Dump $surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#b060b0; '>;</span>
-<span style='color:#9999a9; '>#OUTPUT:</span>
-<span style='color:#9999a9; '>#SV = PV(0xed0dbc) at 0xeb5344</span>
-<span style='color:#9999a9; '>#  REFCNT = 1</span>
-<span style='color:#9999a9; '>#  FLAGS = (POK,pPOK)</span>
-<span style='color:#9999a9; '>#  PV = 0x9e04ac "\0\0\377\0"</span>
-<span style='color:#9999a9; '>#  CUR = 4</span>
-<span style='color:#9999a9; '>#  LEN = 4</span>
-</pre><br />
-<p>The problem is in setting the value of this pointer value. I have tried the following things with no success:</p><br />
-<pre style='color:#d1d1d1;background:#000000;'><span style='color:#e66170; font-weight:bold; '>if</span> <span style='color:#d2cd86; '>(</span> <span style='color:#904050; '>SDL</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Video</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>MUSTLOCK<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>)</span> <span style='color:#b060b0; '>{</span>
-    <span style='color:#e66170; font-weight:bold; '>return</span> <span style='color:#e66170; font-weight:bold; '>if</span> <span style='color:#d2cd86; '>(</span> <span style='color:#904050; '>SDL</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Video</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>lock_surface<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>&lt;</span> <span style='color:#00a800; '>0</span> <span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>#required for pixel operations</span>
-<span style='color:#b060b0; '>}</span>
-
-<span style='color:#9999a9; '>#USING pack</span>
-
-<span style='color:#e66170; font-weight:bold; '>my</span> $green <span style='color:#d2cd86; '>=</span> <span style='color:#e66170; font-weight:bold; '>pack</span> <span style='color:#00c4c4; '>'b*'</span><span style='color:#d2cd86; '>,</span> <span style='color:#00c4c4; '>'11111111000000000000000000000000'</span><span style='color:#b060b0; '>;</span>
-<span style='color:#e66170; font-weight:bold; '>substr</span><span style='color:#d2cd86; '>(</span> $surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>8</span> <span style='color:#d2cd86; '>*</span> <span style='color:#00a800; '>4</span><span style='color:#d2cd86; '>,</span> $green<span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>#no change</span>
-<span style='color:#9999a9; '>#substr( $surf32_matrix->[0][0], 0, 8 * 4, 0xFF000000); segfault</span>
-<span style='color:#e66170; font-weight:bold; '>substr</span><span style='color:#d2cd86; '>(</span> ${$surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span>}<span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>8</span> <span style='color:#d2cd86; '>*</span> <span style='color:#00a800; '>4</span><span style='color:#d2cd86; '>,</span> <span style='color:#00a800; '>0xFF000000</span><span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>#no change</span>
-<span style='color:#9999a9; '>#$surf32_matrix->[0][0] = $green; SEGFAULT's cannot write to memory</span>
-${$surf32_matrix<span style='color:#d2cd86; '>-></span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span><span style='color:#d2cd86; '>[</span><span style='color:#00a800; '>0</span><span style='color:#d2cd86; '>]</span>} <span style='color:#d2cd86; '>=</span> $green<span style='color:#b060b0; '>;</span> <span style='color:#9999a9; '>#no change</span>
-
-
-<span style='color:#904050; '>SDL</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Video</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>unlock_surface<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span>
-  <span style='color:#e66170; font-weight:bold; '>if</span> <span style='color:#d2cd86; '>(</span> <span style='color:#904050; '>SDL</span><span style='color:#d2cd86; '>::</span><span style='color:#904050; '>Video</span><span style='color:#d2cd86; '>:</span><span style='color:#d2cd86; '>:</span>MUSTLOCK<span style='color:#d2cd86; '>(</span>$screen_surface<span style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; '>)</span><span style='color:#b060b0; '>;</span>
-</pre><br />
-<p>You can see an example <a href="http://paste.scsys.co.uk/45111">here</a>.</p><br />
-<p>Any help will be greatly appreciated. </p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3102167581424744259-1929043568015240773?l=yapgh.blogspot.com' alt='' /></div>
-<p><a href="http://feedads.g.doubleclick.net/~a/1Rx7lBLzyC2ksXyZwl9Q_nlI6iE/0/da"><img src="http://feedads.g.doubleclick.net/~a/1Rx7lBLzyC2ksXyZwl9Q_nlI6iE/0/di" border="0" ismap="true"></img></a><br/>
-<a href="http://feedads.g.doubleclick.net/~a/1Rx7lBLzyC2ksXyZwl9Q_nlI6iE/1/da"><img src="http://feedads.g.doubleclick.net/~a/1Rx7lBLzyC2ksXyZwl9Q_nlI6iE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/YetAnotherPerlGameHackeryapgh/~4/q5F5dgfg5Fg" height="1" width="1"/></div></div>
\ No newline at end of file
+Yes, I know it's already wednesday, sorry for the delay! The <a href="http://yapgh.blogspot.com/2011/02/sdl-perl-game-contest.html">SDL Perl Game Contest</a> continues - I should know, I'm about halfway through my third game now! - and last week we had some real nice entries. Check 'em out!<br /><br /><br /><a href="https://github.com/FROGGS/Games-WheelOfFortune">Wheel of Fortune</a>, by Tobias Leich (FROGGS)<br /><br /><a href="http://3.bp.blogspot.com/-chf_zVmlu-k/TYEhNEfL_4I/AAAAAAAAALA/J0Q8OHHPTAw/s1600/wheel_of_fortune.png"><img style="cursor: pointer; width: 400px; height: 231px;" src="http://3.bp.blogspot.com/-chf_zVmlu-k/TYEhNEfL_4I/AAAAAAAAALA/J0Q8OHHPTAw/s400/wheel_of_fortune.png" alt="" id="BLOGGER_PHOTO_ID_5584781521342693250" border="0" /></a><br /><br />Who never yelled madly in front of the TV watching contestants make a fool out of themselves for not knowing the words in Wheel of Fortune? Well, now you can show them how it's done in this Hangman style classic! One note though: to play it, you must install the latest experimental version of SDL Perl, that includes rects with alpha blending and other goodies.<br /><br /><br /><a href="https://github.com/jtpalmer/sdl-contest/tree/master/week2">Snake</a>, by JT Palmer (jtpalmer)<br /><br /><a href="http://4.bp.blogspot.com/-PtigRvQdJFo/TYEhXed7WHI/AAAAAAAAALI/SwHeKIJdGyo/s1600/snake.png"><img style="cursor: pointer; width: 400px; height: 312px;" src="http://4.bp.blogspot.com/-PtigRvQdJFo/TYEhXed7WHI/AAAAAAAAALI/SwHeKIJdGyo/s400/snake.png" alt="" id="BLOGGER_PHOTO_ID_5584781700115421298" border="0" /></a><br /><br /><br />Another classic remake beautifully done by jtpalmer. This "nibbles" clone actually comes with a nice twist: a full-blown network version that lets you enjoy the game with a friend anywhere in the world. Sweet!<br /><br /><br /><a href="https://github.com/zpmorgan/march_sdl_madness/tree/master/first">CyberHack</a>, by Zach Morgan (zpmorgan)<br /><br /><a href="http://1.bp.blogspot.com/-gD_eGGjtJlM/TYE_7iaPbSI/AAAAAAAAALg/0BDAFCMutpE/s1600/cyberhack.png"><img style="cursor: pointer; width: 400px; height: 315px;" src="http://1.bp.blogspot.com/-gD_eGGjtJlM/TYE_7iaPbSI/AAAAAAAAALg/0BDAFCMutpE/s400/cyberhack.png" alt="" id="BLOGGER_PHOTO_ID_5584815304997825826" border="0" /></a><br /><br />CyberHack is a quick platformer demo by zpmorgan, our newest participant in the Challenge! In this game, you control a green creature that falls through a deep underground maze. It still has some minor quirks in the image blitting, but it's nevertheless really fun to play!<br /><br /><br /><a href="https://github.com/kthakore/SDL_Contest/tree/master/second">Synthesia Kinda</a>, by Kartik Thakore (kthakore)<br /><br /><a href="http://3.bp.blogspot.com/-LK_ztBA-aOw/TYEhktRtpMI/AAAAAAAAALQ/d-NivmUQ1Cs/s1600/synthesia_kinda.png"><img style="cursor: pointer; width: 400px; height: 177px;" src="http://3.bp.blogspot.com/-LK_ztBA-aOw/TYEhktRtpMI/AAAAAAAAALQ/d-NivmUQ1Cs/s400/synthesia_kinda.png" alt="" id="BLOGGER_PHOTO_ID_5584781927429022914" border="0" /></a><br /><br />The Mad Canadian strikes again, in a dazzling... thing. It was originally supposed to be based in <a href="http://www.synthesiagame.com/">Synthesia</a>, but kthakore envisioned a game that plays <span style="font-weight: bold;">any</span> image! Of course, as FROGGS put it, <span style="font-style: italic;">"you can't play a random image and expect that it sounds like mozart"</span>, but kthakore is determined to work on it even more, letting it flow until it find its course in game art history.<br /><br /><br /><a href="https://github.com/PerlGameDev/Games-Reflex">Reflex</a>, by... me (garu)<br /><br /><a href="http://2.bp.blogspot.com/-XXybYwheg88/TYEh0_lLrmI/AAAAAAAAALY/t-vQnkkzVGw/s1600/reflex.png"><img style="cursor: pointer; width: 400px; height: 312px;" src="http://2.bp.blogspot.com/-XXybYwheg88/TYEh0_lLrmI/AAAAAAAAALY/t-vQnkkzVGw/s400/reflex.png" alt="" id="BLOGGER_PHOTO_ID_5584782207220428386" border="0" /></a><br /><br />This is a very simple game in which you test your reflexes by pressing any key on your keyboard whenever the big red button lights up. Your Top 20 times appear on the right. According to <a href="http://humanbenchmark.com/">HumanBenchmark</a>, the average reaction time for visual stimuli in a humans is 215 miliseconds. Are you faster??<br /><br />This week's roundup of games showed some pretty interesting stuff, and we saw a lot of ideas come to life in a very short period of time. I can't wait to see the next entries!<br /><br />See you next week =)<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3102167581424744259-1170164316359856576?l=yapgh.blogspot.com' alt='' /></div>
+<p><a href="http://feedads.g.doubleclick.net/~a/5tsWcgX8Z-ZfrSaCg3n_lfOb4oU/0/da"><img src="http://feedads.g.doubleclick.net/~a/5tsWcgX8Z-ZfrSaCg3n_lfOb4oU/0/di" border="0" ismap="true"></img></a><br/>
+<a href="http://feedads.g.doubleclick.net/~a/5tsWcgX8Z-ZfrSaCg3n_lfOb4oU/1/da"><img src="http://feedads.g.doubleclick.net/~a/5tsWcgX8Z-ZfrSaCg3n_lfOb4oU/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/YetAnotherPerlGameHackeryapgh/~4/mmA2tOBq6h8" height="1" width="1"/></div></div>
\ No newline at end of file