Jump to content

TUTO EXPRESS: bille qui "roule" avec l'accéléromètre.


Profete162

Recommended Posts

Bonjour le monde,

J'avais posé il y a quelques minutes des questions pour fabriquer un objet qui bouge avec l'accéléromètre.

Comme j'ai trouvé ma réponse, je poste un "Tuto Express" sur comment réaliser cette application.

En fait, j'ai mixé 2 tutos de anddev.org, tout le mérite revient à leurs posteurs respectifs.

Le programme pourrait être améliorer pour créer une "bille" qui roule dans votre téléphone.

Ze tuto:

Il faut donc créer 2 classes java: BounceView et Move dont voici le code:

Move.Java

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Window;

public class Move extends Activity implements SensorEventListener {
//public class Move extends Activity  {
   /** Called when the activity is first created. */
    // Just a RANDOM ID to recognize a Message later 
   protected static final int GUIUPDATEIDENTIFIER = 0x101; 
   SensorManager sensorManager; 
   Thread myRefreshThread = null; 

   /* Our 'ball' is located within this View */ 
   BounceView myBounceView = null; 

   Handler myGUIUpdateHandler = new Handler() { 

        // @Override 
        public void handleMessage(Message msg) { 
             switch (msg.what) { 
                  case Move.GUIUPDATEIDENTIFIER: 
                       /* Repaint the BounceView 
                        * (where the ball is in) */ 
                      myBounceView.invalidate(); 
                       break; 
             } 
             super.handleMessage(msg); 
        } 
   }; 

   /** Called when the activity is first created. */ 
   @Override 
   public void onCreate(Bundle icicle) { 
        super.onCreate(icicle); 
        // Set fullscreen 
        this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

        // Create a 
        this.myBounceView = new BounceView(this); 
        this.setContentView(this.myBounceView); 
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 
        //updateOrientation(0, 0, 0);
        /* create a Thread that will 
         * periodically send messages 
         * to our Handler */ 
        new Thread(new RefreshRunner()).start(); 
   } 

   class RefreshRunner implements Runnable { 
        // @Override 
        public void run() { 
             while (!Thread.currentThread().isInterrupted()) { 
                  // Send Message to the Handler which will call the invalidate() method of the BOucneView 
                  Message message = new Message(); 
                  message.what = Move.GUIUPDATEIDENTIFIER; 
                  Move.this.myGUIUpdateHandler.sendMessage(message); 

                  try { 
                       Thread.sleep(100); // a 10th of a second 
                  } catch (InterruptedException e) { 
                       Thread.currentThread().interrupt(); 
                  } 
             } 
        } 
   } 


   protected void onResume() 
   { 
     super.onResume(); 
     sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST); 
   } 

   protected void onStop() 
   { 
       sensorManager.unregisterListener(this); 
     super.onStop(); 
   } 


    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    } 

   public void onSensorChanged(SensorEvent event) { 
       myBounceView.mPitch=event.values[sensorManager.DATA_Z];
       myBounceView.mHeading=event.values[sensorManager.DATA_Y];

        //updateOrientation(event.values[sensorManager.DATA_X], event.values[sensorManager.DATA_Y], event.values[sensorManager.DATA_Z]); 

   } 



}

BounceView.java

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Point; 
import android.graphics.drawable.Drawable; 
import android.view.View; 

public class BounceView extends View { 

    /* Our Ball together with the location it will be painted*/ 
    protected Drawable mySprite; 
    protected Point mySpritePos = new Point(0,0); 

    /* Working with a Enum is 10000% 
     * safer than working with int's 
     * to 'remember' the direction. */ 
    static float mRoll, mPitch, mHeading;
    protected enum HorizontalDirection {LEFT, RIGHT} 
    protected enum VerticalDirection {UP, DOWN} 
    protected HorizontalDirection myXDirection = HorizontalDirection.RIGHT; 
    protected VerticalDirection myYDirection = VerticalDirection.UP; 


    public BounceView(Context context) { 
         super(context); 
         // Set the background 
         this.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.icon)); 
         // Load our "Ball" 
         this.mySprite = this.getResources().getDrawable(R.drawable.icon); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
         /* Check if the Ball started to leave 
          * the screen on left or right side */ 

        this.mySpritePos.x -= mPitch; 

         if (mySpritePos.x >= this.getWidth() - mySprite.getBounds().width()) { 
             mySpritePos.x = this.getWidth() - mySprite.getBounds().width();
              //this.myXDirection = HorizontalDirection.LEFT; 
         } else if (mySpritePos.x <= 0) { 
             mySpritePos.x = 0;
              //this.myXDirection = HorizontalDirection.RIGHT; 
         } 


        this.mySpritePos.y -= mHeading; 

         if (mySpritePos.y >= this.getHeight() - mySprite.getBounds().height()) { 
             mySpritePos.y = this.getHeight() - mySprite.getBounds().height(); 
        } else if (mySpritePos.y <= 0) { 
            mySpritePos.y = 0; 
        } 



         /* Set the location, where the sprite 
          * will draw itself to the canvas */ 
         this.mySprite.setBounds(this.mySpritePos.x, this.mySpritePos.y, 
                   this.mySpritePos.x + 50, this.mySpritePos.y + 50); 

         /* Make the sprite draw itself to the canvas */ 
         this.mySprite.draw(canvas); 
    } 
}

Au plaisir!

Edited by Profete162
Link to comment
Share on other sites

@Profete162: Sympa ce code. Et en plus, ça marche du premier coup! Merci! :)

Pour l'anticollision pour ta bille "carrée", peut-être que le plus simple et d'utiliser un système de Views imbriquées?

Sinon, pour des jeux tels que Buka, je me demande encore comment ils font car c'est vraiment très précis...

Link to comment
Share on other sites

  • 2 weeks later...
Pour l'anticollision pour ta bille "carrée"' date=' peut-être que le plus simple et d'utiliser un système de Views imbriquées?[/quote']

Aucune idée de quoi tu parles, mais tu peux peut-être améliorer mon tuto et le poster, ce serait vraiment sympa!

En me relisant, moi non plus, je n'ai plus les idées trop claires sur ce que je voulais dire. :P

Par contre, j'ai ouvert un sujet spécial "Collision" ici:

https://www.frandroid.com/forum/viewtopic.php?id=8869

et dans lequel, j'ai mis un morceau de code qui je pense s'adapterait très simplement à ta gestion de l'accéléromètre (et donc là ça ferait plein de petites billes qui rouleraient sur l'écran en fonction de l'orientation du téléphone :) )

Pourquoi pas un billard géré uniquement par accéléromètre? (mais pas trop le courage de me lancer là-dedans donc si quelqu'un est tenté, j'offre l'idée :P )

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...