Home | History | Annotate | Download | only in snake
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.snake;
     18 
     19 import android.app.Activity;
     20 import android.os.Bundle;
     21 import android.view.KeyEvent;
     22 import android.view.MotionEvent;
     23 import android.view.View;
     24 import android.view.View.OnTouchListener;
     25 import android.widget.TextView;
     26 
     27 /**
     28  * Snake: a simple game that everyone can enjoy.
     29  *
     30  * This is an implementation of the classic Game "Snake", in which you control a serpent roaming
     31  * around the garden looking for apples. Be careful, though, because when you catch one, not only
     32  * will you become longer, but you'll move faster. Running into yourself or the walls will end the
     33  * game.
     34  *
     35  */
     36 public class Snake extends Activity {
     37 
     38     /**
     39      * Constants for desired direction of moving the snake
     40      */
     41     public static int MOVE_LEFT = 0;
     42     public static int MOVE_UP = 1;
     43     public static int MOVE_DOWN = 2;
     44     public static int MOVE_RIGHT = 3;
     45 
     46     private static String ICICLE_KEY = "snake-view";
     47 
     48     private SnakeView mSnakeView;
     49 
     50     /**
     51      * Called when Activity is first created. Turns off the title bar, sets up the content views,
     52      * and fires up the SnakeView.
     53      *
     54      */
     55     @Override
     56     public void onCreate(Bundle savedInstanceState) {
     57         super.onCreate(savedInstanceState);
     58 
     59         setContentView(R.layout.snake_layout);
     60 
     61         mSnakeView = (SnakeView) findViewById(R.id.snake);
     62         mSnakeView.setDependentViews((TextView) findViewById(R.id.text),
     63                 findViewById(R.id.arrowContainer), findViewById(R.id.background));
     64 
     65         if (savedInstanceState == null) {
     66             // We were just launched -- set up a new game
     67             mSnakeView.setMode(SnakeView.READY);
     68         } else {
     69             // We are being restored
     70             Bundle map = savedInstanceState.getBundle(ICICLE_KEY);
     71             if (map != null) {
     72                 mSnakeView.restoreState(map);
     73             } else {
     74                 mSnakeView.setMode(SnakeView.PAUSE);
     75             }
     76         }
     77         mSnakeView.setOnTouchListener(new OnTouchListener() {
     78 
     79             @Override
     80             public boolean onTouch(View v, MotionEvent event) {
     81                 if (mSnakeView.getGameState() == SnakeView.RUNNING) {
     82                     // Normalize x,y between 0 and 1
     83                     float x = event.getX() / v.getWidth();
     84                     float y = event.getY() / v.getHeight();
     85 
     86                     // Direction will be [0,1,2,3] depending on quadrant
     87                     int direction = 0;
     88                     direction = (x > y) ? 1 : 0;
     89                     direction |= (x > 1 - y) ? 2 : 0;
     90 
     91                     // Direction is same as the quadrant which was clicked
     92                     mSnakeView.moveSnake(direction);
     93 
     94                 } else {
     95                     // If the game is not running then on touching any part of the screen
     96                     // we start the game by sending MOVE_UP signal to SnakeView
     97                     mSnakeView.moveSnake(MOVE_UP);
     98                 }
     99                 return false;
    100             }
    101         });
    102     }
    103 
    104     @Override
    105     protected void onPause() {
    106         super.onPause();
    107         // Pause the game along with the activity
    108         mSnakeView.setMode(SnakeView.PAUSE);
    109     }
    110 
    111     @Override
    112     public void onSaveInstanceState(Bundle outState) {
    113         // Store the game state
    114         outState.putBundle(ICICLE_KEY, mSnakeView.saveState());
    115     }
    116 
    117     /**
    118      * Handles key events in the game. Update the direction our snake is traveling based on the
    119      * DPAD.
    120      *
    121      */
    122     @Override
    123     public boolean onKeyDown(int keyCode, KeyEvent msg) {
    124 
    125         switch (keyCode) {
    126             case KeyEvent.KEYCODE_DPAD_UP:
    127                 mSnakeView.moveSnake(MOVE_UP);
    128                 break;
    129             case KeyEvent.KEYCODE_DPAD_RIGHT:
    130                 mSnakeView.moveSnake(MOVE_RIGHT);
    131                 break;
    132             case KeyEvent.KEYCODE_DPAD_DOWN:
    133                 mSnakeView.moveSnake(MOVE_DOWN);
    134                 break;
    135             case KeyEvent.KEYCODE_DPAD_LEFT:
    136                 mSnakeView.moveSnake(MOVE_LEFT);
    137                 break;
    138         }
    139 
    140         return super.onKeyDown(keyCode, msg);
    141     }
    142 
    143 }
    144