Jump to content
  • Advertisement
  • 04/19/13 11:07 AM
    Sign in to follow this  

    Notes on GameDev: Jenova Chen



    Originally published on NotesonGameDev.net October 27, 2008

    Jenova Chen, creator behind the multi award-winning student game Cloud and flOw, co-founder of thatgamecompany, is dedicated to expanding the emotional spectrum of video games and making them available for a much wider audience. And how did Jenova "make it" as an independent developer? With a lot of support and a drive for innovation.

    Can you tell us a little bit about your interest in game development and where it all started?

    When I was 10 years old, my Dad, who worked in the software industry, took me to a special Computer Programming school for kids hoping I'd become Bill Gate's one day. However, I had no interest in learning programming; instead I got to play my very first computer game at the school. And from that point on, video games were pretty much my obsession.

    My first attempt in making video games happened when I was 12, and my enthusiasm quickly faded due to a bad 5 inch floppy disk which carried a week's worth of my work. When I went to college around 1999, I was pretty much bored with the math and programming, and I started to put all my spare time on digital animation and 3D graphics.

    At the time, there were no domestic video game development studios in China and video game education was also a vacuum. And by accident, I met some very enthusiastic students in the college who wanted to make video games. It seemed like a good place where I could put my digital art skill to use. Once the training started, the adventure and joy from game development has never stopped.

    Speaking of college... What was your role in Cloud and how did it come to be?

    My first big student team project in the grad school at USC Interactive Media Division was not Cloud but Dyadin (IGF 2005), where my role was lead artist. It was the first video game made by student team in our division. The big success brought a lot of attention to the school, therefore the school started a grant to encourage students to team up and make more innovative games. The grant was open to the entire university.

    As one of the applicants I came up the rough idea of making a game about clouds and rallied around students and faculties. Once the cloud game idea won the grant and got funded by the school, we put a team together. My role was team lead. As a result I worked with the team on many aspects of the game: gameplay prototyping, game design, story and all the visual arts.

    What do you think made Cloud the 2006 IGF Student Showcase Winner?

    Being one of a kind--a fresh emotional experience that's different from anything on the mainstream market.

    Following Cloud, you went right on to working on flOw. How did Cloud's success influence you?

    It's not the success part of Cloud influenced me but the failure of Cloud. So many people downloaded our game, including people who never played games. I guess they were lured to the childhood fantasy. As a result, their lack of game knowledge prevented them from enjoying the relaxing experience---instead, their frustration of learning how to control the game ruined the experience.

    I learned from Cloud that there is a huge market for games that evoke a different emotional experience. However, new markets mean new audience. In order to search for a design methodology that enables a game to satisfy both experienced gamers and not so experienced ones, I started the flOw project.

    Interesting concept to work with! How was flOw conceptualized and developed?

    As part of my master degree thesis at USC, flOw, the original web game, was made for the sole purpose of testing whether the design methodology I developed based on Flow theory works. In the academia, there was a lot of many research about how to use an A.I. to read player's performance and alter the gaming experience. However, through playing those games myself, I feel there are so many cases where the A.I. can't assess player's true feeling based on rigid formulas.

    As a side effect, the false reaction of the A.I. broke my "sense of control", a key condition to enter the Flow state. Therefore, through learning successful video games with mass appeal, I came up a different approach to adjust the difficulties of the game. I call it Active Dynamic Difficulty Adjustment, which uses player's choice to change the difficulty of the gaming experience.

    The trick is to embed the difficulty adjustment choices in the core gameplay mechanics so that when player makes those choices, he won't feel interrupted from the core gameplay. In flOw, player's only action is swimming and eating, and the way the player engages different content with different difficulties is also through swimming and eating. And the result of the testing was amazing

    flOw is now available on PS3, something that indie developers aspire to. How did you make the leap to console?

    My business partner Kellee Santiago and I were very lucky to have studied at the USC Interactive Media Division where we took a class called business of interactive entertainment. It's that class that opened our eyes that starting up a company and chasing your dream is not a fairy tale; instead it's something totally possible for normal people like us who had no money, but a passion.

    We had a sneak peek at the great potential and promising future of video games through Cloud. And we really hope the maturing of video games as an interactive medium could happen faster. We want to push the boundary of video games and allow more people around the world to see games like Cloud, to awaken the dormant market so that more people can join us to further expand video games' emotional range and meet various needs from the public. Not just things made for excitement and leisure but also things that are thought evoking and deeply emotional. With that goal, we started to pitch the grand idea of Cloud, the commercial version to almost all the publishers in North America.

    Quickly, we realized that based on the experience we had fresh out of school and the ridiculous budget we asked, there was simply no one who would take the risk with us. It had to be the timing and pure luck that we encountered the opportunity of making games for the digital distribution platform for next generation console like Wii and PS3. Both of Sony and Nintendo were going to launch their new gaming consoles, and they were both dying for new content on their digital distribution channel.

    The fact that flOw was a rather complete game concept made with two students in three months helped us to convince Sony that they could trust us for a much smaller game than Cloud. And then the leap was made.

    Well that's great! What are you working on now?

    We are finishing up our second title for Sony's Playstation Network, Flower. A game that is a sister piece after Cloud and flOw. Our version of a video game poem dealing with our inner desires towards the wild nature and urban life.

    What would you say is the biggest challenge you've faced so far as an indie?

    The biggest challenge is to grow up, to become experienced from inexperience. We made so many mistakes in running a startup company and in game development. Though we've overcome all the challenges, the taste is still yummy pain.

    Heh heh. What about your biggest triumph then?

    Thatgamecompany is still up and running. And we are making games that we believe will push the boundary of what video games can communicate.

    What advice do you have out there for those aspiring to join game industry as an indie?

    Really consider indie game developer within our industry. Just look around at what's happened in the past two years. How many of your favorite indie games have shown up on the commercial platforms? How many highly reviewed video games are from independent studios? This is the golden time of independent video games. We see so many talented new faces coming out of school and even veterans who left the big studios to form their company and chase their dreams. The renaissance of video games is already happening.

      Report Article
    Sign in to follow this  

    User Feedback

    There are no comments to display.

    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account


    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now

  • Advertisement
  • Game Developer Survey


    We are looking for qualified game developers to participate in a 10-minute online survey. Qualified participants will be offered a $15 incentive for your time and insights. Click here to start!

    Take me to the survey!

  • Advertisement
  • Latest Featured Articles

  • Featured Blogs

  • Advertisement
  • Popular Now

  • Similar Content

    • By Loosearmy
      Concept for Delayed Shots in a Fast Paced Shooter
      The base for this concept is that with each click or trigger pull there is a X-second delay before the gun would actually fire. This would make it alot more difficult to time shots and could create unique design elements that would cater to this delay. (i.e sharp corners and hallways where it would be hard to time when to click in such a tight enclosed space). Ive had this concept for a minute and i know we could code it to work but my main concern with this is, would it be a good design choice?
    • By mujina
      What could be a way of avoiding using inheritance and virtual methods when designing components for an entity-component-system?
      I'll be more specific about my design issue:
      I currently have different classes for different kinds of colliders (let's say, CircleCollider and LineCollider).
      My system that checks for collisions and updates the positions and/or velocities of my entities should be something like:
      for entity_i in alive_entities { collider_i = get_collider_of_entity(entity_i) // components of same kind are stored contiguously in separate arrays transform_i = get_transform_of_entity(entity_i) for entity_j in alive_entities { collider_j = get_collider_of_entity(entity_j) transform_j = get_transform_of_entity(entity_j) if check_collision(collider_i, collider_j) { update(transform_i) update(transform_j) } } } my problem is that I don't have a generic `get_collider_of_entity` function, but rather a function `get_circle_collider_of_entity` and a separate one `get_line_collider_of_entity`, and so on. (This happens because under the hood I am keeping a mapping (entity_id -> [transform_id, sprite_id, circle_collider_id, line_collider_id, ...]) that tells me whether an entity is using certain kinds of components and which are the indices of those components in the arrays containing the actual components instances. As you can see, each component class is corresponding to a unique index, namely the index position of the array of the mapping described above. For example, transforms are 0, sprites are 1, circle colliders are 2, line colliders are 3, and so on.)
      I am in need to write a system as the one in the snippet above. I can write several overloaded `check_collision` functions that implement the logic for collision detection between different kinds of geometric primitives, but my problem is that I am not sure how to obtain a generic `get_collider_of_entity` function. I would need something that would get me the collider of an entity, regardless of whether the entity has a circle collider, a line collider, a square collider, etc.
      One solution could be to write a function that checks whether in my internal entity_id -> [components_ids] mapping a certain entity has a collider at any of the indices that correspond to colliders. For example, say that the indices related to the collider classes are indices 10 to 20, then my function would do
      get_collider_of_entity (entity_id) { for comp_type_id in 10..20{ if mapping[entity_id][comp_type_id] not null { return components_arrays[comp_type_id][entity_id] } } return null } This could turn out to be pretty slow, since I have to do a small search for every collider of every entity. Also, it may not be straightforward to handle returned types here. (I'm working with C++, and the first solution - that is not involving inheritance in any way - would be returning a std::variant<CircleCollider, LineCollider, ... all kinds of components>, since I would need to return something that could be of different types).
      Another solution could be having some inheritance among components, e.g. all specific component classes inherit from a base Collider, and overrride some virtual `collide_with(const Collider& other)` method. Then I would redesign my mapping to probably reserve just one index for colliders, and then I would actual colliders in a polymorphic array of pointers to colliders, instead of having a separate array for CircleColliders, another for LineColliders, and so on. But this would destroy any attempt to be cache-friendly in my design, wouldn't it? That's why I am looking for alternatives.
      A third alternative would be to just have a single, only, Collider class. That would internally store the "actual type" ( aka what kind of collider it is ) with dynamic information (like an enum ColliderType). Then I would have all colliders have all members needed by any kind of colliders, and specific collision detection functions which I can dispatch dynamically that only use some of that data. (Practical example: a "Collider" would have a radius, and the coordinate for 2 points, and in case its type was "circle" it would only make use of the radius and of one of the 2 points - used as the center -, while if it was a "segment" it would only make use of the 2 points). My gut feeling is that this would bloat all colliders, and, even if the bloat could be reduced - using unions in some smart way for storing members? I wouldn't know how -, then still the design would be pretty brittle.
      I'm clueless and open for ideas and advice! How do you handle in general situations in which you have components that can be naturally modeled as subclasses of a more generic component class? Inheritance? Smart hacks with variants, templates, macros, custom indexing? Dynamic "internal" type?

Important Information



Sign me up!