We’re Back!

Recess Studios: the New Class is coming soon!

Wish is luck as we get to work on…

No comments

Recess Studios is Closed

The project is no longer active. However, the site will remain online, as I believe Recess Studios is an excellent example of subversively teaching middle schoolers critical thinking, game design, teamwork and collaboration. This is STEM in action.

Good teachers create, smart teacher steal.  It’s my hope that Recess Studios becomes a resource and inspiration for other innovators.

Also, if you want to see what it was really like managing a team of seventeen 11-year-olds, ask me for Visitor access to our behind-the-scenes Basecamp site.

-Evan (Mr.) Fuchs

evan (at) EvanMatthewFuchs.com

 

No comments

We’re Back! Scrum, StencylWorks, and More!

Scrum. Officially, Scrum is an “agile framework for for completing complex projects.” You can begin to learn more about it here. Like most aspects of our project, Scrum really wasn’t designed for 11-year-olds, so official ScrumMasters (yeah, that’s a real thing) may frown upon our implementation. Nonetheless, I like our Scrum Board, and I’m hoping everyone will start looking forward to our daily stand-up meetings.

iStencyl.  Perhaps the biggest change we made was the switch to iStencyl. The coding team has been hard at work learning the basics, but iStencyl’s color-coded Lego-like code blocks make it pretty easy to pick up. If you’re not familiar with iStencyl, it’s kind of like Scratch on steroids, without the training wheels. I’ve been using it a lot lately to try and stay a step ahead of our little code monkeys, and I’m really enjoying it. I’m in the middle of using it to make another math app to follow up Tribbs. Over the next few days, I’m going to show everyone on the team some of the basics of designing behaviors. We’re also all eagerly awaiting some the improvements expected in StencylWorks 2.0.

That’s all for now. If our posts seem sparse or infrequent, it’s probably because we’ve begun using Basecamp for most of our internal communication. We’ll still update the development blog, but probably not as often as we should. If you’re a friend of the project, or a random stranger who wants to offer some words of encouragement (or praise. we really like praise!), you can always reach us at evan (at) RecessStudios.com.

 

No comments

For the Coding Department

I love Corona. I think it makes sense and is easy to use, once you get used to it. However, I know some of you guys are having a hard time. It’s frustrating when things like capital letters and missing parentheses stop your code from working.

Would you like to make a switch? Someone recommended a SDK called iStencyl to me. It looks pretty cool, and perhaps a bit more 5th-grader friendly.

Check it out at: http://www.stencyl.com/stencylworks/overview/ and let me know what you think.

 

No comments

‘Homework’ Update

Yesterday, each department came up with some short-term assignments to focus on. Please use the comments of this post to give us an update about your individual progress.

Remember: we’re all learning together. I’m looking for effort and progress, not necessarily polished, app-ready work yet.

No comments

The beginnings of a game

After an excellent discussion today, we’ve settled on a rough idea for our first game: a 2D, side-scrolling, ancient Egypt themed platformer.

Our current thinking is the the game will have at least three different levels, possibly with a pseudo-level (afterlife) when you ‘die’.

Tonight’s assignment is to think of / draw out how the main game mechanic will work. Tap to jump? Tilt to move? etc.

No comments

Game Ideas

Today’s meeting was mostly about the different kids of games we’ve played. Some of the genres we came up with were:

  • Platformer (like Mario)
  • First Person Shooter [FPS]
  • Arcade/Action
  • Puzzler
  • Sims
  • Board Games
  • Roguelike
  • Dungeon Crawlers

Most of my games (Schmutz, Pico, Tribbs) have been puzzlers, but I think a platformer may work best for our project. The game I’m working on now, Ape Crazy, will be a platformer of sorts.

Sasha & Chris’s pyramid jumper, as well as Nicole’s pig adventure could both work as 2D, side-scrolling, platformers.

Also, I reminded everyone that our game must somehow, someway connect with our curriculum. However, if you think about what we study, from (super)heroes in English, to the ancient world in History, the possibilities are pretty endless. I’m looking forward to making a final decision tomorrow.

No comments

Now Hiring!

We’re not really hiring. This post is mostly for team members to start thinking about what they would like to specialize in.

After Friday’s discussion, here’s what we came up with:

First of all, we broke the whole studio up into 5 major departments, each with several roles:

  • Management – responsible for keeping the project moving forward
    • Producer: That’s me. Job’s taken, sorry.
    • Assistant Producer: Help keep everyone focused. Should be comfortable working with people in all of the other departments. We’re not sure if we’re going to have one or not. If you’d like to be the Assistant Producer, convince me.
  • Coding – they, um, write the code that makes the game work. Duh.
    • Lead Programmer: makes sure everything works. Troubleshoot when things go wrong
    • Gameplay Programmer: makes sure the various game mechanics (jumping, scrolling, etc.) all work. Most likely more than one person.
    • Art Programmer: works with the Art Department to make sure everything is being displayed as it should. Should be comfortable with sprites as well.
    • Level Programmer: codes the various different levels
    • UI Programmer: gets all the User Interface (menus, score, controls, etc.) things to work
  • Design – develop the idea of our game.
    • Lead Designer: Makes sure the game is fun!
    • Level Designer: comes up with interesting levels
    • Mechanics Designer: designs how the game works. How high can we jump? What do red shells do?, etc
    • UI Designer: figures out how the user should interact with the game
    • Lead QA: Quality Assurance. In charge of testing the game to figure out what works (and what doesn’t)
  • Art – make our game pretty!
    • Art Director: make sure everything looks great and stays true to our desired overall style
    • Background Artist: creates the jaw-dropping backgrounds and environments
    • Character Artist: games need characters!
    • Object Artist: design and draw all the objects, shells, mushrooms, starts, etc
    • Animator: convert drawings to sprites when necessary. Works with Coders as well.
  • Sound – ever watch a movie with the sound off? Meh.
    • Lead Sound Designer: creates the audio environment for our game
    • FX Designer: brinks the game events to life

There are probably other roles we haven’t thought about yet, and several roles will be filled by more than one person. If you think you’re the best person for a particular job, all you have to do is convince me.

No comments

More on Corona

This post is for the coders on the team. I’m going to break down some of the parts of our sample app and explain what they do. If you haven’t checked out the tools section yet, you should. It has some suggestions and links for getting started.

Here’s the stuff we’re almost always going to have at the top of our lua file. I’ve annotated it so you can see what’s what. (‘Annotated’ means ‘added comments’. In Corona, if you use two dashes, whatever comes after will be ignored by the compiler.)

1
2
3
4
5
6
7
8
9
display.setStatusBar( display.HiddenStatusBar ) -- turns off the device's status bar (signal strength, time, etc)
physics = require("physics") -- tells Corona we're going to be using physics in our game
physics.start( true ) -- turns on the physics engine
physics.setGravity(0, 0) -- sets up gravity. Just like graphing, it goes X,Y. X goes side to side, Y is up and down. (0,9.8) is normal earth gravity
middleX = display.contentWidth/2 -- these lines just make it easy to find the middle of the screen. middleX and middleY are variables that equal half of the screen size
middleY = display.contentHeight/2
math.randomseed(os.time()) -- these two lines are needed if you're going to be using random numbers.
math.random() -- Without them, your numbers might not be too random.
--physics.setDrawMode( "hybrid" ) --take away the two dashes at the very beginning of this line to see your physics bodies.

Next, we set up our walls. Lines 1-4 draw the rectangles, lines 6-9 add physics to the walls (otherwise they’d just be pictures; things would pass right through them).

1
2
3
4
5
6
7
8
9
leftWall = display.newRect( 0, 0, 10, 480 ) --"leftWall" is a variable. I could have named it anything, but "leftWall" seemed to make more sense than "Frankenstein"
rightWall = display.newRect( 310, 0, 10, 480 ) -- The four numbers each are properties of the wall.
topWall = display.newRect( 0, 0, 320, 10 ) -- (x of top left corner, y of top left corner, width, height)
bottomWall = display.newRect( 0, 470, 480, 10 )

physics.addBody(leftWall, "static", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false}) --static bodies stay put
physics.addBody(rightWall, "static", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false}) --dynamic bodies react to each other and to gravity
physics.addBody(topWall, "static", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false}) --kinematic bodies react to each other, but not to gravity
physics.addBody(bottomWall, "static", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false})

The next line adds our background image. Besides display.newImage, there is also display.newRect, display.newCircle, and display.newText.

1
background = display.newImage( "bkg_clouds.png" ) -- for games, we use png files more than jpgs

Next come the functions. Remember, functions are like recipes: they have the instructions for what to do, but they won’t run unless you tell them to. Having a recipe for pizza doesn’t magically make a pizza appear on my plate.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function changeColor(event) -- this one says 'event' because it's linked to the 'tap' listener. It will only run when that event happens.
if event.phase == "began" then
randomRed = math.random(0,255)
randomBlue = math.random(0,255)
randomGreen = math.random(0,255)
event.target:setFillColor(randomRed,randomBlue,randomGreen, 255)
event.target:applyForce(math.random(-1000,1000),math.random(-1000,1000),0,0)
end
end

function makeBall()
ball = display.newCircle( math.random(100,300), math.random(100,400), 30 )
physics.addBody(ball, "dynamic", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false, radius=30})
ball:applyForce(math.random(-1000,1000),math.random(-1000,1000),0,0)
ball:addEventListener("collision", changeColor) -- this is a listener. Listeners are VERY important. Without them, you get art instead of a game.
end

function makeLotsOfBalls(howMany)
for i=1,howMany do -- this counts from 1 to howMany (10, in our case) and does something each time.
makeBall()
end
end

Finally, this line gets things going. It tells the makeLotsOfBalls function to run 10 times. Each time it runs, it starts the makeBall() function. Phew.

1
makeLotsOfBalls(10) -- if you change the number, you are sending a different value to howMany. makeLotsOfBalls(3) would make 3 balls.

If you have any questions, ask in the comments of this post.

No comments

Baby Steps: Checking Out Corona

After some discussion about what a game is and what makes them fun, we rolled up our sleeves and took a look at our SDK (software development kit), Corona.

Why Corona? Well, mostly, it’s what I know. I’ve used xCode and GameSalad, and I can’t imagine either working very well for our needs. Lua (the language that Corona uses) isn’t super difficult, and, after you get the hang of it, it just seems to make sense. Although I know I’ll end up spending a lot of time proofreading and correcting code, I’m hoping we’ll have one or two naturals to do the bulk of the coding (I’m looking at you, Katie).

For those of you playing along at home, here’s the code from the sample app we made together:

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
display.setStatusBar( display.HiddenStatusBar )
physics = require("physics")
physics.start( true )
physics.setGravity(0, 0)
middleX = display.contentWidth/2
middleY = display.contentHeight/2
math.randomseed(os.time())
math.random()
--physics.setDrawMode( "hybrid" )

leftWall = display.newRect( 0, 0, 10, 480 )
rightWall = display.newRect( 310, 0, 10, 480 )
topWall = display.newRect( 0, 0, 320, 10 )
bottomWall = display.newRect( 0, 470, 480, 10 )

physics.addBody(leftWall, "static", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false})
physics.addBody(rightWall, "static", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false})
physics.addBody(topWall, "static", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false})
physics.addBody(bottomWall, "static", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false})

background = display.newImage( "bkg_clouds.png" )

function changeColor(event)
if event.phase == "began" then
randomRed = math.random(0,255)
randomBlue = math.random(0,255)
randomGreen = math.random(0,255)
event.target:setFillColor(randomRed,randomBlue,randomGreen, 255)
event.target:applyForce(math.random(-1000,1000),math.random(-1000,1000),0,0)

end
end

function makeBall()
ball = display.newCircle( math.random(100,300), math.random(100,400), 30 )
physics.addBody(ball, "dynamic", {density = 1.0, friction = 0.3, bounce = 0.2, isSensor = false, radius=30})
ball:applyForce(math.random(-1000,1000),math.random(-1000,1000),0,0)
ball:addEventListener("collision", changeColor)
end

function makeLotsOfBalls(howMany)
for i=1,howMany do
makeBall()
end
end

makeLotsOfBalls(10)
No comments