2 November 2015

Comment ordonner des lignes ou colonnes dans Excel sans TCD ?

Une fois n'est pas coutume, voici un article en français, et pas de la part du propriétaire des lieux.

L'objectif ici est d'ordonner dynamiquement un tableau Excel en fonction d'une donnée spécifique.
Dynamiquement, cela signifie pas de tableaux croisé dynamique et pas de fonction de tri d'Excel. Le but est bien d'avoir l’ordre des éléments qui change en fonction des données source.

Prenons un exemple : Je propose un sondage sur ce blog.
Noter les éléments suivant selon 5 critères : Très intéressant, Intéressant, Neutre, Inintéressant, Très inintéressant.

Voici les résultats des sondages :



Si je fais un graphique, sur base de ces données, j'ai ceci :


Pas très lisible...
Je souhaite alors avoir la même chose, mais ordonné. Je souhaite ordonner par celui qui à le plus de "Très intéressant". En cas d’égalité, celui qui à le plus de "Intéressant", etc.

Je vais donc construire une note globale pour chacun des sujets, qui me permettra d’ordonner le tableau sur base de cette seule note. Pour cela, je vais écrire le résultat dans une base numérique à définir. Il faut que la base soit supérieure au maximum du nombre de réponses dans chacune des cases. Je prend donc 40 ici.

Le problème, c'est que j'ai deux notes identiques. Ainsi, je ne pourrai pas ordonner par la suite (croyez moi, vous allez galérer).
Pour éviter les égalités, je vais ajouter un nombre aléatoire à toutes les notes, trop petit pour changer réellement l'ordre (donc <1), mais assez pour éviter les égalités parfaites (sauf gros coup de malchance).
Il me manque donc un petit "+ALEA()" en fin de formule.

Maintenant, j'utilise la fonction RANG.POURCENTAGE.INCLURE pour obtenir l’ordre. Petit conseil : fixez la précision.

Ensuite, je reprend les même valeur mais je les places dans l’ordre dans lequel je veux les afficher. Pour cela je recalcule les pourcentages, et je les tronques car la fonction de rang tronque les valeurs. Avec la même précision que précédemment naturellement.

Ensuite, je fais un RECHERCHEH sur le nouvel ordre que je viens de définir, afin de retrouver le sujet qui lui correspond. A noter que pour cela, et comme RECHERCHEH  ne fonctionne que du haut vers le bas, je dois reporter le sujet dans une nouvelle ligne en dessous.

Ensuite, avec un RECHERCHEH  bien senti je récupère les résultats.

Au final, voici le tableau :


Le même avec les formules (pour les copieurs !) (désolé pour la mise en forme :



Et le graphique qui va avec :




Le tout garanti 100% dynamique !







4 April 2014

Top-down soldiers heavy inkscaping !



I finally managed to finish the top-down assets for my super cool new Android game called WWII : Market Garden.

Here are the US and german soldiers sprites with shooting, hiding, death, and moving positions.

It took me 3 hours to get it done using Inkscape, inspired by this awesome blog post :

The moving animation is very simple but it does the job in game !



22 March 2014

Your lonely Island in HTML 5



Have you ever dreamt of having a private Island on your own ? 

Now dreams come true with this fun Web project in HTML5 / three.js / WebGL : walk on your own peaceful lonely island and have an ultra zen rest listening to the ocean.


28 January 2014

Whaaaaat ? A complete Warcraft-like playable in a Web Browser ?




Warnode.com is a 3D Multiplayer Real-Time Strategy Game in HTML5 / WebGL, a kind of tribute to Warcraft 3, Age Of Empires and Starcraft.

IMAO, 3D Gaming in the browser is going to be huge in the following years. 
Advantages are numerous : let's imagine you have a 20 minutes break at work, you just have to open a new tab in your browser to start playing against your neighbors; no more need to install stuff, check versions, update clients, etc... It can also attract many casual players, bored by poor farm and candy games.

Recently, I restarted to work on Warnode : I have added some animations (finally !), cool-looking heightmaps, more stability and better visuals. 

It is still under development but one day... it will look awesome !



9 October 2013

How to implement a cool falling letter effect on Android ?


Hey bros and sistas !

Here I'll describe how to create a super animation of letters falling one after the other, which can be used in a splashscreen for example ...

WWII Splashscreen

Let's start with the a simple horizontal LinearLayout.

[...]

<LinearLayout
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="horizontal" >
</LinearLayout>

[...]

The two animations we will use : the title's general bounce effect and the individual letters' animation.

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="50"
    android:fromYDelta="0%"
    android:repeatCount="2"
    android:repeatMode="reverse"
    android:toYDelta="1%" />




<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fillAfter="true"
    android:fromYDelta="-100%p"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:startOffset="100"
    android:toYDelta="0%p" />


Then, in the UI setup, add one text view for each letter of the word displayed.

[...]

String appPublisher = getString(R.string.app_publisher);
for (int n = 0; n < appPublisher.length(); n++) {
    char c = appPublisher.charAt(n);
    TextView letterTV = new TextView(this);
    letterTV.setText("" + c);
    letterTV.setVisibility(View.GONE);
    mTitleLayout.addView(letterTV);
}

[...]

Now, initialize the animations !

[...]

mBounceAnimation = AnimationUtils.loadAnimation(this, R.anim.bounce_effect);

mLetterAnimation = AnimationUtils.loadAnimation(this, R.anim.falling_letter);
mLetterAnimation.setAnimationListener(new AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // start next letter animation and the general bounce effect
        startNextFallingLetterAnimation();
        mTitleLayout.startAnimation(mBounceAnimation);
    }
});

[...]

As you can see, when one letter animation is over, it runs the method "startNextFallingLetterAnimation". Let's implement this method now !

private int mCurrentAnimationPlaying = 0;

[...]

private void startNextFallingLetterAnimation() {
    if (mCurrentAnimationPlaying < mTitleLayout.getChildCount()) {
      // reset previous view's animation
      if (mCurrentAnimationPlaying > 0) {
        mTitleLayout.getChildAt(mCurrentAnimationPlaying - 1).setAnimation(null);
      }
      // play next animation
      View nextLetter = mTitleLayout.getChildAt(mCurrentAnimationPlaying);
      nextLetter.setVisibility(View.VISIBLE);
      nextLetter.startAnimation(mLetterAnimation);
      mCurrentAnimationPlaying++;
    }
}

Aaaaannnnnd that's it ! Each letter will fall one after the other and each time a bounce effect on the overall title view will be visible. And it really looks cool !

See you for a next article through WWII project's advancement !

Cheers

7 October 2013

How to implement an awesome fullscreen video background on Android ?


Hey folks !

I'll describe here how I managed to get this awesome fullscreen video background for my next Android Game Project : WWII.

The screenshot is in a quite low quality I am afraid !

So, first in the layout, let's add a simple VideoView into a RelativeLayout :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black" >

    <VideoView
        android:id="@+id/backgroundVideo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

[...]

</RelativeLayout>

In order to stretch the video to make it fullscreen, the dirty hack resides in the four "layout_align..." values.

Ok now, let's have a look at the code :

[...]

// setup background video
mBackgroundVideoView = (VideoView) findViewById(R.id.backgroundVideo);
Uri videoUri = Uri.parse("android.resource://" + getPackageName() + "/"
    + R.raw.video_bg_home);
mBackgroundVideoView.setVideoURI(videoUri);

[...]


Now let's start and pause the video according to the Activity's lifecycle :

private int mVideoStopPosition = 0;


[...]

@Override
protected void onStart() {
 super.onStart();
 mBackgroundVideoView.seekTo(mVideoStopPosition);
 mBackgroundVideoView.start();
}

@Override
protected void onPause() {
 super.onPause();
 // store the stop position to restart the video at the correct position
 mVideoStopPosition = mBackgroundVideoView.getCurrentPosition();
 mBackgroundVideoView.pause();
 if (mAboutDialog != null) {
  mAboutDialog.dismiss();
 }
}


If you want to disable the sound of the video and make it repeat when it ends, here is how I did it :

[...]
mBackgroundVideoView.setOnPreparedListener(mPreparedListener);

[...]
// remove background video sound - enable video looping
MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {
 @Override
 public void onPrepared(MediaPlayer m) {
   try {
    if (m.isPlaying()) {
     m.stop();
     m.release();
     m = new MediaPlayer();
    }
    // disable sound
    m.setVolume(0f, 0f);
    // repeat video
    m.setLooping(true);
    m.start();
   } catch (Exception e) {
    e.printStackTrace();
   }
 }
};


That's it for now ! Watch out this blog for further cool tips through WWII advancement.
Tchuss !