Erschaffung von Sprites mit zufälliger Farbe
Die Methode createSprite() aus dem letzten Android Tutorial wird nun benötigt um unsere InitialSprites (die Sprites die zu Beginn eines Spiels vorhanden sind), zu erzeugen. Dies machen wir durch eine doppelte for- Schleife die 4 unterschiedliche Sprites jeweils drei Mal erzeugt.
private void initialSprites() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++)
createSprite(i);
}
createSprites=false;
}
Diese Methode(InitialSprites() ) müssen wir dann noch in der Methode onDraw() aufrufen.
if(createSprites==true){
initialSprites();
}
Die Boolsche-Variable creatSprites benötigen wir, für den Fall das unsere onCreate() Methode der Klasse GameView erneut aufgerufen wird. Zum Beispiel nachdem das Smartphone in den Sleep Modus gegangen ist und dann wieder daraus geweckt wurde. Wenn wir diese Variable nicht hätten, würden wir bei jedem weiteren Aufruf der onCreate() Methode weitere 12 Sprites haben. Außerdem müssen wir diese Boolsche- Variable noch anlegen und mit true initialisieren, da beim Start der app, noch keine Sprites gemalt wurden, und das natürlich geschehen soll.
private boolean createSprites=true;
Wenn wir im Verlauf des Spiel zufällige neue Sprites erstellen wollen, brauchen wir noch die Methode rndCreateSprites():
private void rndCreateSprite() {
Random rnd = new Random(System.currentTimeMillis());
int i = rnd.nextInt(4);
createSprite(i);
}
Hierbei wird wieder random zwischen die Zahlen 0-3 gewählt und dann ein Sprite mit der zu der Nummer gehörigen Farbe erschaffen. Nun müssen wir in der onDraw() Methode noch die Sprites malen lassen. Das erreichen wir durch:
for (Sprite sprite : spriteList) {
sprite.onDraw(canvas);
}
Da wir nicht wollen, dass alle Sprites an der gleichen Position starten, also der Position (0/0) müssen wir die Werte für x und y zufällig machen. Das tun wir in dem wir den folgenden Code in der Klasse Sprite im Konstruktor einfügen.
x=rnd.nextInt(theGameView.getWidth()- width);
y=rnd.nextInt(theGameView.getHeight() - height);
Dabei berechnen wir eine zufällige Zahl aus der Pixelanzahl des Bildschirms minus die Breite bzw. Länge des sprites. Da dieser sonst am Rand unseres Bildschirms hängen bleiben könnte.
Am ende des Tutorials sollte die Klasse GameView so aussehen:
package com.panjutorials.lazypudding;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class GameView extends SurfaceView {
private List<Sprite> spriteList = new ArrayList<Sprite>();
private List<Integer> spriteListNum = new ArrayList<Integer>();
private SurfaceHolder surfaceHolder;
private Bitmap bmp;
private GameLoopThread theGameLoopThread;
private boolean createSprites=true;
public GameView(Context context) {
super(context);
theGameLoopThread = new GameLoopThread(this);
surfaceHolder = getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
theGameLoopThread.setRunning(false);
while (retry) {
try {
theGameLoopThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
theGameLoopThread.setRunning(true);
theGameLoopThread.start();
}
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
// TODO Auto-generated method stub
}
});
}
@SuppressLint("WrongCall") @Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.DKGRAY);
if(createSprites==true){
initialSprites();
}
for (Sprite sprite : spriteList) {
sprite.onDraw(canvas);
}
}
private void createSprite(int index) {
Bitmap bmp = null;
switch (index) {
case 0:
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.alienspriteblue);
break;
case 1:
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.alienspritered);
break;
case 2:
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.alienspritegreen);
break;
case 3:
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.alienspriteyellow1);
break;
}
Sprite sprite = new Sprite(this, bmp);
spriteList.add(sprite);
spriteListNum.add(index);
}
private void initialSprites() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++)
createSprite(i);
}
createSprites=false;
private void rndCreateSprite() {
Random rnd = new Random(System.currentTimeMillis());
int i = rnd.nextInt(4);
createSprite(i);
}
}
}