Mostrando entradas con la etiqueta Chubby Buddy. Mostrar todas las entradas
Mostrando entradas con la etiqueta Chubby Buddy. Mostrar todas las entradas

sábado, 31 de diciembre de 2016

Becoming Indie Developer: A 2016 Retrospective

Hi buddies!

I still remember it as if it was yesterday when I started this blog. It was April 2013 and I was doing my Ph.D. stay in Rennes, France. By that time, I was a full-time researcher at the University of Malaga and my main goal was to finish my stay, write my last journal articles and defend my Ph.D. However, for a very long time I had had an itch for making games.

My experience with games development started surprisingly early, when I was around 14 years old. By that time, my grandfather, who knew how much I wanted to learn this stuff, gave me a Darkbasic pack as a birthday present. I still remember how, during high school classes, I would daydream about the amazing games I was about to make. I can perfectly remember thinking to myself about making a Matrix-style game where the main character would avoid bullets bending over himself, just like Neo, and I would naively think that it wouldn't take me long to reach such level of expertise. Of course, reality imposed itself, and there were so many new terms I had no clue about, that it took me a long time to just make a Pong clone (with some additional cool features like moving obstacles).

By that time and until finishing high school I made some very simple games, and when I started the Computer Science degree at the University, the demanding subjects drifted me away from my dream. Yet I still read about games programming and with the new knowledge acquired I could understand more and more about how a videogame is built from the ground-up. Life circumstances (which were really driven by luck and momentum, as they usually are) geared me to start working in the Computer Science department, where I would take a 4 years Ph.D. grant after finishing the degree. Over this period, I overlapped my Ph.D. with the creation of small video games: in 2014, I released Chubby Buddy on iOS, and in 2015, Limball on iOS and Android (both of them together with Manuela).

All that time was a great experience and I don't regret any of the choices I made, but the truth is that the moment of making games for real never seemed to come. And this is where, during the Ph.D. stay, I made my decision: I would finish my Ph.D., but right after doing so, I would quit research and become full-time game developer. And creating this blog was the first step towards convincing myself of walking down this risky and uncertain path...

And here I am now, after one year, I can really claim that I have become an indie game developer, doing justice to the name of the blog. I wish I could add that it's been a profitable decision, but I cannot claim that, not at least for now. I'm currently finishing Breaking Fast, which I've been developing (together with Manuela, as usual, but also with Oliver and David) for almost a year and which we've financed with the savings accumulated over the aforementioned years of working in the research area. During this time, I've observed some things I want to mention now.

Cool things or things that I think we've done alright

One of the typical problems of unexperienced game developers is delaying the marketing actions to the release date. I think I can clearly claim that we haven't made such mistake. From the very first moment we had a playable version of the game, we attended game events to show it and receive feedback from players. In our case, our first event was PAX East (not bad to be the first one, uh?), and from that event, which took place in April, we have attended more than 10 events over the year. As for marketing in social networks, we have populated our accounts with new contents nearly every day since we started. Believe us: all of this (events and social networks) is a huge amount of work. We estimate that around 50-60% of the time has been devoted to these activities, leaving the 40-50% remaining time to the actual development of the game. The conclusion we draw is the following: if you have the resources, hire someone to manage all this stuff (especially, your social networks).

Another thing we did alright was to establish and adhere to a work routine. This is especially important when you work from home, as we do. We would set weekly goals and monitor whether we fulfill those goals. The only setback is that sometimes we finished working too late, precisely because the border between our personal and professional lives became fuzzy as a consequence of working from home.

Difficulties

Now I want to mention some things that have been difficult for us. First, and as I mentioned before, PR and marketing are really time-consuming activities, especially because we had to learn on the go lots of stuff: how to write press releases, how to find our target audience, how to connect emotionally with such audience, etc.

Our initial plans was to keep this blog and our Youtube profile updated with fresh contents but it hasn't been possible. Maintaining a development blog is a tough work, especially if you're interested in writing about technical details of the development, which requires beforehand planning. In the end, I've basically written some posts about the events we have attended, but that is not what the blog was meant for initially. Something similar has happened to our Youtube profile: creating and editing videos is a harder activity than we had anticipated.

Things to improve

We have identified some things that we should improve either in the next year or in future projects. First, we intend to choose events with more criteria in the future. Attending so many events as we have this year has been a great experience in many aspects, but they require money and time (preparing the material, booking the flights and hotel, etc). In relation to this, we also failed to make some time predictions correctly because we didn't factor in the time of these events appropriately. This is the reason why we first scheduled the release of Breaking Fast in the end of 2016, but we've had to put it off by the beginning of Spring 2017...

Also, although from the very beginning we had built a contact list, we didn't use it until very recently, which has been a wasted opportunity to engage with our potential customers sooner. Sending newsletters is an important activity that we should have started much earlier.

Although we can state that we are more or less well-known in Spain, with several articles in different specialized media, we fail to be known outside Spain. And this is a real problem because most of our sales are expected to be made abroad, especially in USA and Russia. Therefore, one of the goals for the beginning of the year is to contact these international media in order to raise a wide awareness of Breaking Fast.

Finally, I leave you with a video summary of our 2016:


Thanks for being there and reading these posts. We really wish you a happy 2017: the year of Breaking Fast! :D

sábado, 25 de abril de 2015

Technical Take-aways from Limball

Hi!

In this post I want to summarize some of the technical issues I had to face while developing Limball. 

The first thing to highlight is that it has been my first experience, at least in a complete game, with Cocos2d-x, the framework that I have used for the implementation. In my first game, Chubby Buddy, I had used Cocos2d (now renamed to Cocos2d-SpriteBuilder), which uses Objective-C and is targeted exclusively at iOS developers. Cocos2d-x is written in C++ and targets both iOS and Android developers. I must say that the learning curve has been very smooth. The API is practically the same, so if you know how to call a certain function from Objective-C, you know almost intuitively how to call it from C++. Of course, a previous background on C++ is fundamental in order to get the most out of it as fast as posible, but you can use also other languages (e.g. Lua).



Developing for multiple platforms is made really easy thanks to Cocos2d-x, which allows keeping the same C++ codebase. Nonetheless, at some points I needed to do something different in the two platforms. For example, when integrating with Game Center, the social platform for iOS gamers, I noticed that the achievements and leaderboard sections were well integrated under a common interface. However, Google Play Game Services, the Android counterpart, does not integrate the two services under the same interface. This means that two different buttons are required in Android (one for the leaderboards, another one for the achievements), while in iOS does just fine with one button. In order to avoid lots of code duplication, I resorted to preprocessor macros. Cocos2d-x defines the macro CC_TARGET_PLATFORM, which may be assigned a value according to the platform where the code is to be executed. As a consequence, there are several parts in the code with the following pattern:

 #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS  
  //do iOS-related stuff  
 #else  
  //do Android-related stuff  
 #endif  

Something else that I learnt is how to use the social platforms for gamers on iOS and Android. The integration with the former was smoother, also due to the easier integration between C++ and Objective-C. An example on how this C++/Objective-C integration can be painlessly achieved is discussed in an earlier post on localization.

As an example, consider the following code that unlocks an achievement on both platforms:

 #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS  
       GKHWrapperCpp gkh;  
       gkh.reportAchievement( "Triple_Chain", 100.0, false );  
 #elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID  
       GooglePlayHelper::UnlockAchievement( COMBO_KIDDIE );  
 #endif  

GKHWrapperCpp is a class that belongs to a open source library that you can find here and that simplifies the management of Game Center related stuff. GooglePlayHelper is a utility class that I made in order to manage interactions to Android-specific features through the Java Native Interface (JNI).

JNI is not difficult to use, provided you have the previous background on Java and C++, but it is easy to make some small mistakes that are almost impossible to debug. In my case, I was experiencing a game crash only on Nexus 5 running Android 5.0.1. I even tested on the same device running a lower version of Android and it worked perfectly. For some time, I had no clue on what was happening and I ended up blaming the OpenGL implementation on that device for that version of Android. In the end though, it turned out that I was making a memory management mistake: I wasn't removing a local reference that I had created:

 jbyteArray bArray = t.env -> NewByteArray( key.length() );  
 jbyte bytes[50];  
 for( int i = 0; i < key.length(); ++i )  
 {  
    bytes[i] = key[i];  
 }  
 t.env -> SetByteArrayRegion( bArray, 0, key.length(), bytes );  
 res = (jstring) t.env -> CallStaticObjectMethod( t.classID, t.methodID, bArray );  
 t.env -> DeleteLocalRef(t.classID);  
 t.env -> DeleteLocalRef( bArray );  

Adding the last line of the previous snippet did the trick, just one day before the intended release date..

Another example of system-specific feature is in-app purchases. In Limball, you can remove the ads banners and interstitials (full-screen ads) by buying a non-ads product from inside the app. Both iOS and Android offer a simple way to tackle this, so that was not a problem. In the case of Android, I used the In-app Billing v3 workflow, which basically comes down to the following snippet of code:

 buyIntentBundle = _appActivity.mService.  
           getBuyIntent( 3, _appActivity.getPackageName(), productId, "inapp", "noads" );  
           //If everything is fine, then proceed with the transaction  
           if ( buyIntentBundle.getInt( "RESPONSE_CODE" ) == 0 )  
           {  
             _appActivity.pauseGame();  
             PendingIntent pendingIntent = buyIntentBundle.getParcelable( "BUY_INTENT" );  
             _appActivity.startIntentSenderForResult( pendingIntent.getIntentSender(),   
                                  REQUEST_INAPP_CODE,  
                                  new Intent(),   
                                  Integer.valueOf( 0 ),   
                                  Integer.valueOf( 0 ),  
                                  Integer.valueOf( 0 ) );  
           }  

On iOS, the strategy (as usual) is to create a delegate that will manage the purchase with the following calls:

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct: productToBuy ];  
 [[SKPaymentQueue defaultQueue] addPayment: payment];  

It first create the payment with product id, and it introduces it in the queue. Then, the payment is processed by the payment queue delegate, typically as part of the AppController. This delegate is in charge of looking at the state of the transaction and to deliver the functionality once the transaction is in the SKPaymentTransactionStatePurchased state, as depicted in the following code:

 - (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions  
 {  
   for ( SKPaymentTransaction* transaction in transactions )  
   {  
     switch ( transaction.transactionState ) {  
       case SKPaymentTransactionStatePurchasing:  
         ConfigManager::GetInstance() -> PauseGame();  
         break;  
       case SKPaymentTransactionStatePurchased:  
         ConfigManager::GetInstance() -> EnableNoAds();  
         ConfigManager::GetInstance() -> ResumeGame();  
         [[SKPaymentQueue defaultQueue] finishTransaction: transaction];  
         break;  
      //...  

For the inclusion of advertisements, I have used the iAd network on iOS and Google's Admob. Actually, on iOS the strategy is to prioritize iAd, and only if it is unavailable, fall back to Admob.  Given that iAd does not provide interstitials for iPhones, I used the Admob feature for that purpose. Again, the integration was smooth, because the frameworks provide usable APIs. In this earlier post, I explained how you could integrate a Cocos2d-x project with iAD.

And these are the most important technical issues I have learnt about. Hope you found them useful.
See you!

Tweet: Technical take-aways from making #Limball. Take a look: http://ctt.ec/Nb893+ #gamedev #indiedev

sábado, 18 de abril de 2015

Our new Game: Challenge yourself and others with Limball

Hi!

After some time, I can finally introduce you the new jewel, future resounding success of the AppStore and Google Play. Yes, it is our new game: Limball!

Limball is a casual, free game that will challenge your speed, reflexes and tapping rythm. It is available from today on Android and iOS devices. Without further ado, this is the promotional video of the game, where you can get a grasp of its mechanics:


After seing this game and our previous one, Chubby Buddy, you might think: "Wow! These guys are obsessed with food!". But what can we say? It may be true after all :)

By the way, when I say "we", I refer to myself (obviously, right?) and to Manuela Ruiz, who again has been in charge of the fantastic art design of the game. 

If you have an iPhone or iPad, get it here.
If you have an Android device, get it here

In the next post, I will tell you about the development experience, including what I have learnt all along the process.

See you and hope you enjoy it!

Tweet: Hey, check #Limball, a free game for #ios and #android. It's challenging and it's free! Beat your friends' scores! #indiedev #gamedev

lunes, 28 de julio de 2014

Gamepolis 2014: An Overview

Hi all!

As promised, I'm eager to share with you my experience during Gamepolis 2014, the second edition of this videogames festival held in Malaga from last Friday to Sunday. 

As last year, I arrived on Friday afternoon due to work, so I missed some of the morning talks. As I set foot on the entrance, I saw some Disney Princesses around (ok, not so videogames oriented, but quite of a surprise anyway).


Disney princesses; probably colluding against their princes... or no 

Then I walked around the stands in order to cover myself with the spirit of the festival. Graphics cards brands were presenting their last products, people gathered around games, like FIFA 2014 and Mario Kart 8, and shops were showcasing some very interesting and geeky products. 


People walking around the place. The surface of the event was bigger and clearer than in the previous edition. This allowed for a a clearer space. 


Gigabyte and Nvidia presenting their last products.



People gathered to play FIFA 2014 and Mario Kart 8. 
Tournaments for these and other games were also organized.


Geeky T-Shirts and videogames products were sold in the shops.

The first afternoon session was about legal issues to take into account before and after developing a game, including raising funds and protecting the product. I couldn't attend this one though because I arrived later (thanks Oliver for your notes).

The first session I actually attended was about the importance of music in videogames, where the speaker pointed out that the audio must adapt itself to the player, and that it should know its place in the game as a whole, not wanting to show off over the rest of the game. 



 While the session about music in videogames started, Pong was exhibited

After this talk, I decided I would walk around a bit more, and that's when I found a magical corner where all wishes come true: the retro area. There, old tiles would bring joy to all types of players: from the oldest ones to the youngest kids. 




The retro area was fantastic, as in the previous edition. 
Do you recognize the games in this pictures?

Then, I went back to the auditorium to enjoy the talk "Indie: origins and revolution", where the speaker provided an overview of some of the most relevant games in the indie scenario. The author also pointed out the importance of addressing game reviews rigorously and with actual insight, as it is done in his high quality magazine Deus Ex Machina.  



As examples of relevant indie games we find World of Goo and The Binding of Isaac.

Saturday morning started with tons of people lining up to buy their tickets. Fortunately, I had already bought a 3-days pass by Internet. 


Long queue on Saturday morning. 

I also took advantage of this great audience to advertise Chubby Buddy. For this purpose, Manuela designed an eye-catching flyer and we handed them out.


Yeahh! Our dear chubby friend was also in the conference. Some people (including bloggers and press staff) were actually interested and asked us about it

People tried to get pictures with their favorite game characters, including Altair or the scary Slenderman. 





As in the previous edition, people have made a great effort to look like their games counterparts. 
Do you recognize them all?

The first session in the morning presented a game that is being developed by Brainside, a Spanish game company based in Sevilla. The game is Embrion, which was already in last year edition. Last year, the developers presented a sensor that could be attached to the player in order to measure heartbeat and change the gameplay accordingly. This idea by its own is fantastic, but now they also revealed that they're using Oculus Rift to gain a bigger immersion. I didn't have the chance to try it, but I presume that the experience must be really frightening (actually, as a curiosity, the team mentioned that one person who was trying the game didn't have the courage to go beyond the first room of the game). 



By the stand of Brainside, people would line up to try Oculus Rift in Embrion

The next talk was about the presentation of a book and a new publisher: "Ediciones Arcade", which promises to bring from abroad and translate the best books on videogames. As as first notice, they announced that they would publish "La Legende Final Fantasy VII", a special edition for collector book that was not available in Spanish. 


Presention of Embrion

Next session I attended was "From videogames to gamification", where the speakers discussed the foundations of gamification and how it can boost productivity in boring tasks and at the workplace. They showed how big companies such as Coca-cola have understood the importance of gamification  as as marketing strategy.


Speakers during the gamification talk

Next session was: "Hidden treasures of MSX". The speaker, Gaby López, who was also in the last edition, revealed lost of curious games for MSX and MSX2. A funny part of this talk covered some erotic games that, contrary to what one may think, had a great quality.







MSX had lots of curious titles, but the erotic ones deserve a special mention... 

The first talk of the last day (Sunday) was a presentation of Bitton, a game-making company. In addition to presenting their last products, the speaker also reflected on marketing issues important to gain some audience in a competitive market such as the mobile one. 




Bitton presentation. Note the second picture: we employ around 3000 millions of hours per week playing online games... Awesome!

The name of the next talk was: "Metal Gear Solid: When Hideo Kojima met the movie industry". The speaker showed some of the films that inspired Kojima while creating this super mega saga. The speaker also presented his book: "Metal Gear Solid: The Legacy of Big Boss", which of course I bought :)


Me in the possession of this amazing book. Preparing myself for MGS5...

Next talk was about artificial intelligence in videogames, and the speakers, researches at University of Malaga, provided an overview on procedural contents generation and on the need for "artificial stupidity". This last term refers to human-like (error-prone) behaviour for bots, which is necessary in order to provide a more engaging and realistic experience.


Researches from University of Malaga talking about artificial intelligence

The final presentation was actually very special, and probably the most original presentation I've ever seen, because the flow of the presentation was driven by a game itself. The speaker, Locomalito, was playing a side- and top-down perspective game he had developed (very much like the first 8-bit Zelda adventures), and the issues on game development that he was discussing were intertwined with events in the game. For example, typical stumbling blocks (like lack of skills at the beginning) were represented like final bosses. 


A game-based presentation. Yes... I'll have to do this at some point :)

As a conclusion, my experience in Gamepolis has been rewarding: not only the atmosphere was great, but I also met people with the same interests. Last year, I suggested some improvements that can still be implemented for next year, so I'll copy-paste them: 

"There should be some more technical workshops or meetings where developers and artists could interact in order to open the possibilities of forming potential development teams. [...]. Please, free WiFi! I would've loved to comment the talks on this blog with my laptop while being there, but I could only do it by Twitter using my data plan".

I would like to specially suggest the organization committee to make an effort and try to bring some important international celebrity in the area of indie game development. I think designers and developers would love to be able to talk to Jonathan Blow, Derek Yu, Edmund McMillen and the like.

That's all, see you soon!
FM

miércoles, 9 de julio de 2014

Chubby Buddy: Advanced Mechanics

Hi all!

In a previous post, I explained the basic mechanics of Chubby Buddy. It is time to present the last three main mechanics of the game, which can be enjoyed in its premium version.

Introducing the pastry chef

Figure 1 shows the pastry chef, which is subject to the same movement rules as the rest of cakes and as the grandma. The difference is that when our chubby buddy is right next to the chef (i.e. when the kid is on the right of, left of, on top of, or under the chef), you lose! (Don't worry, there are no lives, so you can happily restart the level). 


Figure 1. Nooo! A pastry chef is about to be moved next to the kid! Abort operation!

Double-leap cake

Figure 2 shows a double-leap cake, which is represented as a green cake with lots of tiny sweet shavings. As its name implies, these cakes allow our chubby friend (and any other element of the game) to reach one row higher than regular cakes. Their rules of movements are exactly the same as the rest of elements. 



Figure 2. Using the double-leap cake to reach the badly wanted fruit

Memory cakes (a.k.a. the copy-paste)

The last mechanic is a bit more complex, and it will make you suffer (in the good sense) and will make you think every movement through! 

Everything starts as a regular level, but you'll notice that there is a new button on the top center of the screen, right next to the level indicator, as illustrated in Figure 3. 



Figure 3. Memory cakes button

Tapping this button will take a picture of the screen, and the current layout of cakes will be "memorized". Just after tapping the button, you'll also see that the number of movements has decreased one unit and the button itself has changed, indicating that there is a "memory" stored. This is depicted in Figure 4. 



Figure 4. Button activated and ready to bring back the memory of the level

Now you can move as many cakes as you want, changing completely the layout of cakes in the level, as shown in Figure 5.



Figure 5. Before tapping the button again, we can change the cakes layout...

When you want to recover your memory, you just have to tap the button again, and the cakes of your memory will come back in black and white (because they are old... metaphor-wise...). This is illustrated in Figure 6.



Figure 6. ... and tapping the button will bring back the old cakes to their original positions, merging them with the current cakes.

Now, you can use these memory cakes to move to places that you wouldn't be able to reach otherwise. Cool! But be wary of the fact that you cannot move these cakes as they belong to your memories... 

And that's all (for now). In the premium version, you'll find 60 exciting and challenging levels... Will you be able to complete them all? 

See you!


martes, 13 de mayo de 2014

Multi-resolution Support in iOS with Cocos2d-x v3

EDIT: I updated this post to include new iPhone models, and to target Android devices. You can check it here.

Hi all!

Cocos2d-x is a branch of Cocos2d, one of the most used frameworks for developing iOS games, and the one I myself used to develop Chubby Buddy. Cocos2d-x was released to target cross-platform development, including iOS, Android and Windows Phone. It's powerful and widely used, but recently version 3 came out and brought some drastic changes with respect to versions 2.x.x.

Cocos2d-x offers a C++ front-end (also a Lua, a Javascript and HTML5 ones, but we'll let those aside in this post) as opposed to the Objective-C front-end provided by its cousin Cocos2d. 

In addition to the language, one of the first changes that a developer may find is the scheme to support multi-resolution support. In Cocos2d, you simply used a scheme based on suffixing assets according to their resolution. Therefore, if you had a bitmap called Player.png and you wanted to support all resolutions in iOS, you had to create four versions of it and name them like this:

Player.png (iPhone low resolution)
Player-hd.png (iPhone retina)
Player-ipad.png (iPad low resolution)
Player-ipadhd.png (iPad retina)

During application launch, you could specify different suffixes, but the above were the default choices.

This scheme is no longer used by Cocos2d-x. Instead, you must specify different directories where you can find the assets for each resolution. This is done in the applicationDidFinishLaunching() method in AppDelegate.cpp file, which is automatically called by the iOS framework during initialization. The resulting code is shown next:

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("My Game");
        director->setOpenGLView(glview);
    }
    

    // turn off display FPS
    director->setDisplayStats(false);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    auto screenSize = glview->getFrameSize();
    
    auto fileUtils = FileUtils::getInstance();
    std::vector<std::string> searchPaths;
    
    if (screenSize.width == 2048 || screenSize.height == 2048)
    {
        glview -> setDesignResolutionSize(1536, 2048, ResolutionPolicy::NO_BORDER);
        searchPaths.push_back("ipadhd");
        searchPaths.push_back("ipadsd");
        searchPaths.push_back("iphone5");
        searchPaths.push_back("iphonehd");
        searchPaths.push_back("iphonesd");
    }
    else if (screenSize.width == 1024 || screenSize.height == 1024)
    {
        glview -> setDesignResolutionSize(768, 1024, ResolutionPolicy::NO_BORDER);
        searchPaths.push_back("ipadsd");
        searchPaths.push_back("iphone5");
        searchPaths.push_back("iphonehd");
        searchPaths.push_back("iphonesd");
        
    }
    else if (screenSize.width == 1136 || screenSize.height == 1136)
    {
        glview -> setDesignResolutionSize(640, 1136, ResolutionPolicy::NO_BORDER);
        searchPaths.push_back("iphone5");
        searchPaths.push_back("iphonehd");
        searchPaths.push_back("iphonesd");
        
    }
    else if (screenSize.width == 960 || screenSize.height == 960)
    {
        glview -> setDesignResolutionSize(640, 960, ResolutionPolicy::NO_BORDER);
        searchPaths.push_back("iphonehd");
        searchPaths.push_back("iphonesd");
    }
    else
    {
        searchPaths.push_back("iphonesd");
        glview -> setDesignResolutionSize(320, 480, ResolutionPolicy::NO_BORDER);
    }
    
    fileUtils->setSearchPaths(searchPaths);
    
    //Load your first scene
    auto scene = GameManager::createScene();
    director->runWithScene(scene);

    return true;
}

If we look into the setSearchPaths method, we see that the search path is suffixed to a base search path that is platform-dependent. In the case of Xcode, the base search path is the Resources folder. Therefore, according to previous code, we would need the following directory structure:

Resources/
*ipadhd/  (assets for iPad retina)
*ipadsd/  (assets for iPad non-retina)
*iphone5/ (assets for iPhone5)
*iphonehd/ (assets for iPhone retina)
*iphonesd/ (assets for iPhone)

Note in the code that for each resolution, we also include directories for lower resolutions. We simply want to ensure that if an asset is not found for the targeted resolution, at least we try to find the next one with the best resolution. Also, note that I want to present the game in portrait mode, but it would be better to use screenSize.width and screenSize.height as parameters of setDesignResolutionSize(), just to ensure that everything will work in landscape mode as well. 

Once you have the directory structure, you can drag all the folders in Xcode. In this step, Xcode will ask how you want to deal with these folders. According to some problems found by other people, I suggest you to uncheck "Copy items into destination group's folder (if needed)" and to check "Create folder references for any added folders". You can read more information on this options here

That's all, tell me if you have any problems and we'll try to solve it.
FM

miércoles, 7 de mayo de 2014

Chubby Buddy: basic mechanics

Hi all!

As I mentioned in my last post, Chubby Buddy is finally a reality that you can find in the App Store. Also, if you're unsure about buying the game (it costs 0,89€ or 0,99$), you can also try the free version, which includes fewer and not so challenging levels, but which can give you an overall idea about the basic game mechanics. 

In this post I will discuss these basic mechanics that you first encounter when playing the free version of the game. I'll lay aside more advanced mechanics that are included in the paid version, and which I'll discuss in future posts. 

Figure 1 shows a sample level of the free version of the game. In the first levels there are only three types of elements in the game: the chubby kid (i.e. our chubby buddy), the cakes, and the fruit. The goal is to place the kid at the same position where the fruit is in at most the number of movements indicated in the top-right corner of the screen. You can move any of the elements, except for the fruit, which will remain in the same place all along the level. 


Figure 1. A sample level

The following rules apply to all the elements except for the fruit. So in this case, when I refer to 'element', I actually mean either the 'kid' or a 'cake':

(1) You can only move the element one position to the right or one position to the left.
(2) If there is one element on your right, and you move to the right, you will end up above the element; likewise, if there is one element on your left and you move to the left, you will end up above the element. 
(3) Probably the most important rule to remember (specially in the most advanced levels of the paid version): you CANNOT move if there is an element on top of you. 
(4) If there is more than one element on your right (e.g. two cakes, one on top of the other), you cannot move to the right; similarly, i there is more than one element on your left, you cannot move to the left. 

Each movement will decrease the movement counter (in the top-right corner of the screen) by one. 

Introducing the grandma

Figure 2 shows the last element that appears in the free version of the game: the grandma. Grandma is  subject to the aforementioned movement rules. The only difference is this: when the kid is right next to the grandma (i.e. when the kid is on the right of, left of, on top of, or under the grandma), the movement counter decreases by 3 for each movement.


Figure 2. Be aware of the grandmas!

This is it for now! If you have an iPhone or iPad, give it a try!

See you buddies!
FM

miércoles, 30 de abril de 2014

Chubby Buddy is out!

Hi friends!

It's my pleasure to announce that Chubby Buddy is now in the App Store (https://itunes.apple.com/ES/app/id823823086?mt=8).

In order to find out what this fantastic iOS game can offer you, we prepared an epic trailer. Check it out! (The Spanish version of the trailer is further down).



The Spanish version of the trailer is the following.



jueves, 17 de abril de 2014

After Beta Testing... Marketing!

Hi all!

It's been quite a long time again since the last post, but several reasons have prevented me from writing for a while, including some health issues, work and lots of other issues that I don't mean to use to excuse myself... 

Anyway, after beta testing was completed (thanks a lot to those beta testers who read this), and  after receiving very positive and constructive feedback, we are almost done. 

What have we been working on this last week? Mainly on two aspects: more challenging levels and... marketing! Wait, what? How do you work on marketing? Well, for now, I've been working on a seductive and catchy trailer that will be on youtube quite soon and about which I feel very proud. I'm actually looking forward to showing to everyone, but I want the game to be available in the store before doing so. "Patience, patience", I have to repeat to myself very often...

Me :) working on the game trailer... Mmm that tomato looks familiar... 

On the other hand and as already mentioned, we are working on and polishing the last levels. Concretely, we want to design 18 more levels, which we estimate it will take us around three days. 

So that's it! We're almost ready to close the first chapter: finishing a game and making it available so others can enjoy it. Nevertheless, we expect this not to be an end, but just the beginning of a fascinating new world: the world of Chubby Buddy!

Stay tuned!!
FM

lunes, 17 de febrero de 2014

Chubby Buddy: Ready for Beta Testing

I'm happy to announce that Chubby Buddy is one step closer to its release!

Concretely, the game is ready for beta testing, which I expect to finish by next week. During that time, the game will be tested by some colleagues from which I expect to receive the feedback to completely remove uncomfortable bugs.

As a bonus, it's my pleasure to introduce you to Chubby Buddy-style avatars of the creators of the game: Manuela and I. When the game is out, look for them and click them if you dare!



See you very soon!
FM



On Delays

Wow! It's been very (too) long since the last post. I must admit that I'm a bit ashamed. Not only did it take me too long to update the blog, but Chubby Buddy has also taken me longer than expected!

Precisely, the last-hour rush in the development of Chubby Buddy has been the primary cause for the hiatus of the blog. If in this previous entry I reflected on the importance of setting deadlines, in this entry I want to put the stress on the importance and difficulties in making an accurate scheduling.

A good strategy when you've gone off schedule is to analyze the reasons that led you astray. In my case, the reasons have been the following, listed from more to less relevance in my opinion:
  1. Underestimated effort for universal app.
  2. Few experience with the framework.
  3. Underestimated effort for additional features support.
  4. Not so much commitment during Christmas.
  5. Few experience with the language.
We wanted to achieve an universal app that worked under different versions of iPhones and iPads, but this involved re-doing all the art in the game to adjust to different screen resolutions, and also make some adjustments at the code level to support these different versions. This entails a good amount of work and I definitely underestimated the required effort.

Even when Cocos2D is enjoyable and usable, it is a new framework that imposes certain rules and it is not always obvious how to accomplish some functionality. After a bunch of lines of code, I needed to check Stackoverflow or the Cocos2d forums to figure out how to achieve something new. 

In the last minute, Manuela and I thought about adding a couple of new features that supposedly wouldn't entail lots of effort; we were wrong. However, we think that the final result makes up for this extra-effort.

For several reasons, our dedication to the game during Christmas holidays was not as high as I had expected. Had we worked as initially planned, the game would have been released much earlier.

Finally, even when Objective-C is a really easy to grasp language, it presents a couple of differences with Java or C/C++, languages which I'm much more used to work with. 

It only remains to try the best in order to keep up the pace!

FM

miércoles, 4 de diciembre de 2013

The Deadline-Driven Being

No, sorry, this is not the name of a horror game. This post intends to be a reflection about the nature of human beings. Actually, in the heading I'm using "Deadline-Driven" as a synonym of "Human". The goal of this post is to insist on the importance of setting hard deadlines for your projects. Don't underestimate this piece of advice, because psychology and project management theory have proven what I'm claiming here. 

Just remember when you were in school or in college. When were you more productive? When did you study the most? I'm sure that the answers to both questions are the same: the day before the exam. Yes, you had four months to prepare the exam. Of course you could have been studying all along the semester. Sure you could have prepared the exam two or three weeks before the day of the exam. But you didn't, I didn't and almost no one did it (of course there might be rare exceptions over there). 

It's sad but we can't fight our nature. As the name of an interesting film that I recently saw stated, we are what we are. And humans are deadline-driven. 

Figure 1.- The deadline, even when it seems scary, it is a necessary and natural 
part of the productivity life cycle (image taken from
 http://varela1.blogspot.com.es/2013/10/deadline-american-excitement.html)

I'm currently doing my PhD, and I know how the research area works. When would you say that I'm more productive? Yes, you're right, when a deadline for the submission to a conference is coming in a few days. Probably I could have prepared a nice work and then, a posteriori, check to which conference send the work. But things usually work in the other way around: you won't have anything substantial until you know where you want to send it, and until you see the deadline so close that you have no choice other than paying all your attention to that work.

And why making a game would be any different? You usually have many nifty ideas, you prototype new mechanics, cool!! But then procrastination dwells in your heart, and you figure out a new way to improve your original idea, and then a new even better idea replaces the previous one, until you're fed up with the original idea because you think of something completely different that is going to shake the market up with top-notch mechanics never seen before…Yes, yes, we all went through that road until we found an important stumbling block in the form of logical implications: no deadline -> no pressure -> no game.

This is also the reason why we (Manuela and me) decided to set up a deadline for the release of the game announced in the previous post: Chubby Buddy. We still have lots of work ahead, and we won't be able to address some cool ideas that we originally had. But otherwise I know that we would run the risk of never releasing the game, because we have so many other ideas, that it would be very tempting to blow this one off and to pursue a new one.

Game jams and reputable venues like the Independent Game Festival are excellent options to put a bit of pressure on yourself. Even telling your friends or your family that you're showing them something on a given day will probably give your productivity the required boost!

See you! (by next week hopefully… yes, I'm of course as deadline-driven as anyone else)