Back to project page balance-it.
The source code is released under:
Apache License
If you think the Android project balance-it listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package com.example.balanceit; /* w w w . ja v a 2s. co m*/ import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; import java.util.ArrayList; import java.util.List; import com.example.balanceit.FXHelper.ObjectType; /** * Die World-Klasse reprsentiert die Spielwelt. * Sie ist eine Kindklasse von View, die die Basisklasse aller UI-Elemente von Android ist. * Zum Zeichnen der Spielwelt wird die onDraw-Methode aus der View-Basisklasse neu implementiert. */ public class World extends View { //LOGTAG Konstante zum Markieren von Debugausgaben im System Log public static final String LOGTAG="BalanceIt"; //Hilfsobjekte private FXHelper mHelper; private GravitySensorListener mSensorListener; private Paint mPaint; private int mDifficulty; //Statusvariablen private boolean mTargetReached=false; private boolean mHoleDropped=false; //Variablen zur Spielfeldgre private int mWidth; private int mHeight; private int mTileSize; // Spielfeldobjekte private Ball mBall; private List<Tile> mTargets = new ArrayList<Tile>(); private List<Tile> mHoles = new ArrayList<Tile>(); //String der das Spielfeld beschreibt private String mBoard; //Spielfeldgre 16x26 Kacheln, das ist ~16:9, das Seitenverhltnis der meisten Smartphones private static final int NUM_ROWS=26; private static final int NUM_COLS=16; /** Ein Beispiel fr die Definition eines Levels ber einen String (NUM_ROWS x NUM_COLS) * Die einzelnen Buchstaben reprsentieren die Spielobjekte und ihre Position: * . - leere Kachel * b - Startposition der Spielkugel * h - Position der Hindernisse (Lcher) * t - Position des Zielbereichs * Mit Hilfe des Strings werden die Tile-Objekte und das Ball-Objekt in der onSizeChanged-Methode angelegt. */ private static final String BOARD1= "b..............."+ "................"+ "................"+ "................"+ "................"+ "................"+ "hhhhhhhhhhhhhh.."+ "................"+ "................"+ "................"+ "..hhhhhhhhhhhhhh"+ "................"+ "................"+ "................"+ "hhhhhhh..hhhhhhh"+ "......h..h......"+ "......h..h......"+ "................"+ "................"+ "................"+ "................"+ "...hhhhhhhhhh..."+ "................"+ ".......tt......."+ ".......tt......."+ "................"; private static final String BOARD2= "tt.............."+ "tt.............."+ "hhhhhhhhhhhhhh.."+ "................"+ "................"+ "..hhhhhhhhhhhhhh"+ "................"+ "................"+ "hhhhhhhhhhhhhh.."+ "................"+ "................"+ "..hhhhhhhhhhhhhh"+ "................"+ "................"+ "hhhhhhhhhhhhhh.."+ "................"+ "................"+ "..hhhhhhhhhhhhhh"+ "................"+ "................"+ "hhhhhhhhhhhhhh.."+ "................"+ "................"+ "..hhhhhhhhhhhhhh"+ "................"+ "...............b"; private static final String BOARD3= "b...hh.........."+ "....hh.........."+ "....hh.........."+ "....hh.....hh..."+ "....hh.....hh..."+ "...........hh..."+ "...........hh..."+ "...........hh..."+ "hhhhhhhhhhhhh..."+ "................"+ "................"+ "................"+ "...hhhhhhhhhhhhh"+ "................"+ "................"+ "hhhhhhh..hhhhhhh"+ "......h..h......"+ "......h..h......"+ "......h..h......"+ "......h..h......"+ "................"+ "...hhhhhhhhhh..."+ "................"+ ".......tt......."+ ".......tt......."+ "................"; private static final String BOARD4= ".....h......h..b"+ "............h..."+ "...h...hh...h..."+ "...h...hh......."+ "...h............"+ "...hhhhhhhhhhhhh"+ "................"+ ".......h........"+ "hhhhhhhhhh...hhh"+ ".......h........"+ ".......h........"+ "...h...h..hhh..."+ "...h...h..hhh..."+ "...h...h........"+ "...h...hhh...hhh"+ "...h............"+ "...h............"+ "...hhhhhhhhhhhhh"+ "........h......."+ "....h.......h..."+ "hhhhhhhhhhhhh..."+ "....h.......h..."+ "....h.......h..."+ "hhhhh...h...h..."+ "tt..h...h...h..."+ "tt......h......."+ "tt......h......."; private void createGameObjects(char objectType, int col, int row) { if(objectType == 'h') { Bitmap holeBitmap = mHelper.getBitmap(ObjectType.HOLE); mHoles.add(new Tile(Tile.Type.CIRCLE, col*mTileSize, row*mTileSize, mTileSize, mHelper.getBitmap(ObjectType.HOLE))); } if(objectType == 't') { Bitmap tileBitmap = mHelper.getBitmap(ObjectType.TARGET); mTargets.add(new Tile(Tile.Type.SQUARE, col*mTileSize, row*mTileSize, mTileSize, mHelper.getBitmap(ObjectType.TARGET))); } if(objectType == 'b') { Bitmap ballBitmap = mHelper.getBitmap(ObjectType.BALL); mBall = new Ball(col*mTileSize, row*mTileSize, mTileSize/2, mTileSize, mDifficulty, mHelper.getBitmap(ObjectType.BALL)); } } //TODO AP ALL: weitere Level entwerfen /** Konstruktor * @param context Kontext-Objekt der Android-Activity * @param sensorListener SensorListener-Objekt mit aktuellen Sensordaten * @param level Spielstufe * @param difficulty Schwierigkeitsgrad */ public World(Context context, GravitySensorListener sensorListener, int level, int difficulty) { super(context); //TODO AP2: bergabeparameter sensorListener in Membervariable speichern mSensorListener=sensorListener; mPaint=new Paint(); mPaint.setColor(Color.GRAY); mDifficulty=difficulty; mHelper=new FXHelper(context); if (level==1){ mBoard = BOARD1; } else if (level == 2){ mBoard = BOARD2; } else if (level == 3){ mBoard = BOARD3; } else if (level == 4){ mBoard = BOARD4; } //TODO AP Welt: restliche bergabeparameter speichern, Hilfsobjekte anlegen } /** vom System gelieferte Bildschirmgre merken und die Kachelgre berechnen, Spielfeld anlegen * @param width neue Spielfeldbreite * @param height neue Spielfeldhhe * @param oldw vorherige Spielfeldbreite (nicht verwendet) * @param oldh vorherige Spielfeldhhe (nicht verwendet) */ @Override protected void onSizeChanged(int width, int height, int oldw, int oldh) { //TODO AP2: width, height speichern, nur Kugel in Spielfeldmitte anlegen mWidth = width; mHeight = height; mTileSize = width/NUM_COLS; mHelper.initBitmaps(mWidth, mHeight, mTileSize, mTileSize/2); //TODO AP Welt: Kachelgr??e berechnen //TODO AP Welt: Bitmaps initialisieren //TODO AP Welt: Spielfeld-Objekte anlegen (Kugel, Ziel, Hindernisse) char c=' '; int index = 0; for(int row = 0; row < NUM_ROWS; row++) { for(int col = 0; col < NUM_COLS; col++) { c = mBoard.charAt(index++); createGameObjects(c, col, row); } } } /** Spielwelt darstellen (Hintergrund,Kugel,Hindernisse, Ziel), Spiellogik (Reaktion auf Ziel, Hindernisse) * @param canvas Leinwandobjekt */ @Override protected void onDraw(Canvas canvas) { //TODO AP2: Hintergrund l?schen canvas.drawBitmap(mHelper.getBitmap(ObjectType.BOARD), 0, 0, null); //TODO AP2: Ziel zeichnen //TODO AP Welt: Hintergrund zeichnen //TODO AP Welt: Ziel & Hindernisse zeichnen //canvas.drawBitmap(bitmap, 0, 0, null); for(Tile t:mHoles) { t.draw(canvas); } for(Tile z:mTargets) { z.draw(canvas); } //TODO AP2: Kugel bewegen mBall.updatePosition(-mSensorListener.mSensorX,mSensorListener.mSensorY); if(mBall.resolveCollisionWithBounds(mWidth, mHeight) == true){ mHelper.vibrate(500); } //TODO AP2: Kugel zeichnen mBall.draw(canvas); //TODO AP2: Test ob Ziel erreicht //TODO AP Welt: Test auf Kollision mit Hindernissen und Reaktion for(Tile t:mHoles) { if(mBall.centerIsOnTile(t)) { mBall.reset(); } } //TODO AP Welt: Test auf Erreichen des Ziels und Reaktion for(Tile z:mTargets) { if(mBall.centerIsOnTile(z)) { Activity a = (Activity) getContext(); a.setResult(Activity.RESULT_OK); a.finish(); } } // sofortiges Neuzeichnen auslsen invalidate(); } }