Android Teile in onDraw() nur einmal zeichnen

Java1337

Mitglied
Hey Leute :)

hab hier eine Aufgabe für einen Einstellungstest und suche gerade eine Lösung auf ein bestimmtes Problem. Und zwar geht es darum, dass ich ein kleines Spiel entwickeln soll, bei dem ich die Welt zufällig generieren soll. Den Code hab ich natürlich in die entsprechende onDraw()-Methode gepackt. Hier mal kurz der komplette Code der onDraw()-Methode:

[CODE lang="java" title="onDraw()-Methode zum Zeichnen des Spiels."]protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);

if(drewFirst) {

// Initialize all map elements
dirt = BitmapFactory.decodeResource(getResources(), R.mipmap.dirt);
dirt = Bitmap.createScaledBitmap(dirt, 146, 248, true);

grass = BitmapFactory.decodeResource(getResources(), R.mipmap.grass);
grass = Bitmap.createScaledBitmap(grass, 146, 248, true);

stone = BitmapFactory.decodeResource(getResources(), R.mipmap.stone);
stone = Bitmap.createScaledBitmap(stone, 146, 248, true);

water = BitmapFactory.decodeResource(getResources(), R.mipmap.water);
water = Bitmap.createScaledBitmap(water, 146, 248, true);

int top = 0;
int left = 0;
int random = 0; // for generating random maps

// it's completely random generated, no structures

for (int i = 0; i < 10; i++) {
for (int j = 0; j < 5; j++) {
random = (int) (Math.random() * 100) + 1;
if (random <= 25)
canvas.drawBitmap(dirt, left, top, paint);
else if (random > 25 && random <= 50)
canvas.drawBitmap(grass, left, top, paint);
else if (random > 50 && random <= 75)
canvas.drawBitmap(stone, left, top, paint);
else
canvas.drawBitmap(water, left, top, paint);

top += 125;
}

top = 0;
left += 145;
}
}

for(int i = 0; i < bugs.length; i++) {
canvas.drawBitmap(bugs.getImage(), bugs.getX(), bugs.getY(), paint);
}

for(int i = 0; i < hostages.length; i++) {
canvas.drawBitmap(hostages.getImage(), hostages.getX(), bugs.getY(), paint);
}
}[/CODE]

Jetzt ist es so, dass ich den Codeblock, welcher in der If-Bedingung "if(drewFirst) { ... }" nur einmal zu Beginn zeichnen lassen möchte. Ich dachte mir zuerst, dass ich einfach ein boolean-Feld erstelle (drewFirst), welches ich zuerst auf true setze und dann am Ende des if-Blocks auf false setze, sodass dieser Teil nicht nochmal ausgeführt wird. Aber dann wird dieser Code bei mir gar nicht mehr ausgeführt :confused:
Vielleicht hab ich hier auch nur ein Brett vorm Kopf, aber ich weiß hier gerade nicht ganz weiter. Vielleicht kann mir einer mal einen Stups in die richtige Richtung geben :)
 
K

kneitzel

Gast
Also generell ist die Idee so doch Unsinn.

onDraw muss immer, wenn es aufgerufen wird, etwas malen. Und da ist dann die Aufgabe doch nur, die hinterlegten Daten darzustellen.

Also musst Du das, was dargestellt werden soll, irgendwann generiert haben. Und dann muss es immer dargestellt werden.

Also so wie Du das hier hast:
Java:
        for(int i = 0; i < bugs.length; i++) {
            canvas.drawBitmap(bugs[i].getImage(), bugs[i].getX(), bugs[i].getY(), paint);
        }

        for(int i = 0; i < hostages.length; i++) {
            canvas.drawBitmap(hostages[i].getImage(), hostages[i].getX(), bugs[i].getY(), paint);
        }

Musst Du da auch einen Code haben, der den Hintergrund als 10x5 Feld zeichnet. Und dieses 20x5 feld musst Du einmal initialisiert haben.

Also wäre eine Logik denkbar wie:
- ist das 2d Array null? -> 2d Array initialisieren
- 2d Array darstellen
- bugs darstellen
- hostages darstellen

Aber die Initialisierung des 2D Arrays kannst Du natürlich auch an eine andere Stelle verschieben. Vielleicht kennst Du ja eine andere, bessere Stelle für sowas als die onDraw Methode.
 

Java1337

Mitglied
Hallo kneitzel,
vielen Dank für Deine schnelle Antwort :)

Ja, Du hast da recht, keine Ahnung wieso ich noch nicht daran gedacht habe 🤦‍♂️
Ich denke, der Konstruktor wäre für das Generieren der Map die beste Wahl. 😁
 

Neue Themen


Oben