/usr/share/psychtoolbox-3/PsychDemos/SpriteDemo.m is in psychtoolbox-3-common 3.0.9+svn2579.dfsg1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 116 117 118 119 | function SpriteDemo
% SpriteDemo
%
% Animates a sprite across the screen. The image
% follows the mouse, like a huge cursor.
%
% There are many ways to create animations. The simplest is to show a
% movie, computing all the frames in advance, as in MovieDemo. Sprites may
% be a better approach when you want to show a relatively small object
% moving unpredictably. Here we generate one offscreen window holding the
% sprite image and copy it to the screen for each frame of the animation,
% specifying the screen location by using the destination rect argument of
% Screen 'CopyWindow'.
%
% See also MovieDemo.
%
% Thanks to tj <thomasjerde@hotmail.com> for asking how.
% web http://groups.yahoo.com/group/psychtoolbox/message/1101 ;
%
% 6/20/02 awi Wrote it as TargetDemo.
% 6/20/02 dgp Cosmetic. Renamed SpriteDemo.
% 8/25/06 rhh Added noise to the sprite. Expanded comments.
% 10/14/06 dhb Save and restore altered prefs, more extensive comments for them
% 09/20/09 mk Improve screenNumber selection as per suggestion of Peter April.
% ------ Parameters ------
spriteSize = 100; % The height and width of the sprite in pixels (the sprite is square)
numberOfSpriteFrames = 25; % The number of animation frames for our sprite
try
% ------ Screen and Color Setup ------
% Choose a screen
screenNumber = max(Screen('Screens'));
% Get colors
backgroundColor = BlackIndex(screenNumber);
foregroundColor = WhiteIndex(screenNumber);
foregroundMinusBackground = abs(foregroundColor - backgroundColor);
% Screen is able to do a lot of configuration and performance checks on
% open, and will print out a fair amount of detailed information when
% it does. These commands supress that checking behavior and just let
% the demo go straight into action. See ScreenTest for an example of
% how to do detailed checking.
oldVisualDebugLevel = Screen('Preference', 'VisualDebugLevel', 3);
oldSupressAllWarnings = Screen('Preference', 'SuppressAllWarnings', 1);
% Open a window and paint the background white
window = Screen('OpenWindow', screenNumber, foregroundColor);
% Hide the mouse cursor.
HideCursor;
% ------ Animation Setup ------
for i = 1 : numberOfSpriteFrames
% Create the frames for the animated sprite. Here the animation
% consists of noise.
spriteFrame(i) = Screen('MakeTexture', window, backgroundColor + foregroundMinusBackground * rand(spriteSize));
end
% ------ Bookkeeping Variables ------
spriteRect = [0 0 spriteSize spriteSize]; % The bounding box for our animated sprite
spriteFrameIndex = 1; % Which frame of the animation should we show?
buttons = 0; % When the user clicks the mouse, 'buttons' becomes nonzero.
mX = 0; % The x-coordinate of the mouse cursor
mY = 0; % The y-coordinate of the mouse cursor
% Exit the demo as soon as the user presses a mouse button.
while ~any(buttons)
% We need to redraw the text or else it will disappear after a
% subsequent call to Screen('Flip').
Screen('DrawText', window, 'Move the mouse. Click to exit', 0, 0, backgroundColor);
% Get the location and click state of the mouse.
previousX = mX;
previousY = mY;
[mX, mY, buttons] = GetMouse;
% Draw the sprite at the new location.
Screen('DrawTexture', window, spriteFrame(spriteFrameIndex), spriteRect, CenterRectOnPoint(spriteRect, mX, mY));
% Call Screen('Flip') to update the screen. Note that calling
% 'Flip' after we have both erased and redrawn the sprite prevents
% the sprite from flickering.
Screen('Flip', window);
% Animate the sprite only when the mouse is moving.
if (previousX ~= mX) | (previousY ~= mY)
spriteFrameIndex = spriteFrameIndex + 1;
if spriteFrameIndex > numberOfSpriteFrames
spriteFrameIndex = 1;
end
end
end
% Revive the mouse cursor.
ShowCursor;
% Close screen
Screen('CloseAll');
% Restore preferences
Screen('Preference', 'VisualDebugLevel', oldVisualDebugLevel);
Screen('Preference', 'SuppressAllWarnings', oldSupressAllWarnings);
catch
% If there is an error in our try block, let's
% return the user to the familiar MATLAB prompt.
ShowCursor;
Screen('CloseAll');
Screen('Preference', 'VisualDebugLevel', oldVisualDebugLevel);
Screen('Preference', 'SuppressAllWarnings', oldSupressAllWarnings);
psychrethrow(psychlasterror);
end
|