View this PageEdit this PageUploads to this PageHistory of this PageTop of the SwikiRecent ChangesSearch the SwikiHelp Guide

KeepyUppy

Home   How To   Code Pool   Public Library   Theory   Events
A simple game played entirely in audio. For best effect, play with headphones on and eyes shut :)


/*
* KEEPY-UPPY
*
* To run this game, select all the text and press the SuperCollider key for execute-code (on Mac it's Enter).
*
* An AUDIO game written in SuperCollider by Dan Stowell (C) 2005
* Released under the GNU Public Licence
* See http://www.gnu.org/copyleft/gpl.html for licence details
*
* This game is based on being told about the work of "One Switch"
* http://www.oneswitch.org.uk/ - developing games and controllers
* to accommodate various types of disability, including...
* audio-only games.
*
* RULES:
*  You are kicking a football into the air. You can hear it fly 
*  up into the air and down again, and when it comes down you 
*  must press SPACE to kick it up again.
*
*  The ball may move slightly towards the left or right so you
*  may need to move left or right using the cursor keys to 
*  keep within range of the ball (wear headphones for best 
*  control!)
*
*  The aim is to kick it up as many times as you can.
*
*
*/

(
s.waitForBoot{
Task{

// Then send it the SynthDefs we need
(
SynthDef(\kuball, { |amp=0.5, pan=0, freq=100|
  Out.ar(0, Pan2.ar(amp * 2 *(BPF.ar(WhiteNoise.ar, freq, 0.1)*10).clip2 * SinOsc.ar(4.5), pan))
}).send(s);

SynthDef(\gameover, { Out.ar(0, SinOsc.ar(
				Line.kr(200, 100, 1.0, doneAction:0),
				0,
				EnvGen.kr(Env([0.3, 0.2, 0.2, 0], [0.1, 0.8, 0.1]), 1, doneAction:2)
				).dup(2))}).send(s);

SynthDef(\whackit, {Out.ar(0, SinOsc.ar(74, 0.5pi, 
		EnvGen.kr(Env.perc(0, 0.05), doneAction:2)).dup(2))}).send(s);

);
0.1.wait;
s.sync;

// Now define the game
(
~announce = Platform.case(
	\osx, {{|msg| msg.speak}},
	\linux, {{|msg| msg.speak}},
	\windows, {{|msg| msg.postln}}
	);

~game = {

var whacks, xpos, ypos, xvel, yvel, whack, dogravity, framedur, doc, whackdisabled, whackspacing;


whacks = 0;
xpos   = 0;
ypos   = 0;
xvel   = 0;
yvel   = 10;
framedur = 0.1; // The amount of time between two "frames" of calculation
whackdisabled = false;
whackspacing = 0.3; // The amount of time you must wait between whacks 

whack = {
  if(ypos < 20,
  {
    if(xpos.abs < 1,
    {
      if((yvel < 0) && (whackdisabled==false),
      {
        yvel = rrand(6.0, 14.0);
        ypos = max(0.1, ypos);
        xvel = 0.1.bilinrand;
        Synth(\whackit);
        whackdisabled = true;
        Task({whackspacing.wait; whackdisabled = false}).play;
        whacks = whacks + 1;
        //doc.string="WHACK!";
      });
    },
    {
      //doc.string="Missed!";
    });
  }, 
  {
    //doc.string="The ball is too high to hit";
  });
}; // End of whack function

dogravity = {
  yvel = yvel - 1.0;
  ypos = ypos + yvel;
  xpos = xpos + xvel;
};

Task({
  var kuball;
  
  kuball = Synth(\kuball);
  
  // Set up keyboard handlers
  AppClock.sched(0.0, {
  	//doc = Document.new("Use LEFT and RIGHT arrows and SPACEBAR", "");
  	doc = GUI.window.new("Use LEFT and RIGHT arrows and SPACEBAR");
  	doc.front;
  		});
  0.1.wait;
  doc.view.keyDownAction_({arg ...args;
    switch(args[3],
      32   , {whack.value}, // space
      63234, {xpos = xpos + 0.1}, // left arrow
      63235, {xpos = xpos - 0.1} // right arrow
    );
  });

  // This is the loop which runs the game
  while({ypos >= 0},
  {
    dogravity.value;
    kuball.set(\amp, 0.5 * (1.0/max(1.0, ypos)), 
               \pan, max(-1.0, min(1.0, xpos)), 
               \freq, 200 + max(0, ypos * 10));
    framedur.wait;
  });
  
  // Destroy keyboard handlers
  doc.view.keyDownAction_(nil);
  kuball.free;
  
  // Run the end-of-game feedback etc
  Synth(\gameover);
  1.5.wait;
  AppClock.sched(0.0, {doc.close;});
  switch(whacks,
     0, {~announce.("You didn't hit the ball - sorry");}, 
     1, {~announce.("You hit the ball once");},
     2, {~announce.("You hit the ball twice");},
     3, {~announce.("You hit the ball 3 times");},
     4, {~announce.("You hit the ball 4 times - well done");},
     5, {~announce.("You hit the ball 5 times - well done");},
      {~announce.("You hit the ball "+whacks+" times - well done indeed!");}
  );

}).play;
 
 
}
);
~game.value; // Press Enter to play!
}.play
}
)


Link to this Page