Hallo zusammen
Wiedereinmal benötige ich eure Hilfe im Bezug auf mein TowerDefense.
Nachdem ich Scroll- und Zoomfunktion endlich bewerkstelligen konnte, bin ich nun auf ein unerwartetes Problem gestoßen.
Zunächst benötigt ihr aber etwas Vorwissen:
Die Scrollfunktion habe ich, wie bereits in anderen Threads erwähnt, über zwei Rects sowie eine Bitmap und die onDraw Methode von Canvas umgesetzt:
Konstruktor der Map:
public MapView(Context context, int mapID, Bitmap bitmapShow) {
super(context);
xPos = 0.0f;
yPos = 0.0f;
zoomlevel = 0;
displayHeight = getResources().getDisplayMetrics().heightPixels;
displayWidth = getResources().getDisplayMetrics().widthPixels;
displayDensity = getResources().getDisplayMetrics().density;
BitmapFactory.Options BitmapOptions = new BitmapFactory.Options();
BitmapOptions.inScaled = false;
//Die Map in den RAM laden
bitmapRAM = BitmapFactory.decodeResource(getResources(), R.drawable.ch1_map1_test, BitmapOptions);
//Das Rect, das den sichtbaren Teil aus der Bitmap "stanzt"
srcRect = new Rect(Math.round(xPos), Math.round(yPos), displayWidth, displayHeight);
//Das Rect, in welches der ausgestanzte Teil angezeigt wird
dstRect = new Rect(0, 0, displayWidth, displayHeight);
//Alles was auf Canvas gezeichnet wird, wird auf die Bitmap "bitmapShow" gezeichnet
canvas = new Canvas(bitmapShow);
onDraw();
}
Alles anzeigen
Scroll-Methode der Map:
protected void scroll(MotionEvent e1, MotionEvent e2) {
//------ If the Screen is bigger than the bitmap ------
if(displayWidth > bitmapRAM.getWidth() || displayHeight > bitmapRAM.getHeight()) {
srcRect.left = 0;
srcRect.top = 0;
srcRect.right = bitmapRAM.getWidth();
srcRect.bottom = bitmapRAM.getHeight();
}
else {
//------ Set new positions ------
xPos = (e1.getRawX() - e2.getRawX() + xPosBuffer);
yPos = (e1.getRawY() - e2.getRawY() + yPosBuffer);
//------ Set new Rect (before conditions, because we need the new Rect.right or Rect.bottom...) ------
srcRect.left = Math.round(xPos);
srcRect.top = Math.round(yPos);
srcRect.right = Math.round(xPos + displayWidth - zoomlevel);
srcRect.bottom = Math.round(yPos + displayHeight - zoomlevel);
//------ Conditions that u cant scroll out over the bitmap ------
if(Math.round(xPos) < 0)
xPos = 0f;
if(Math.round(srcRect.right) > bitmapRAM.getWidth())
xPos = (bitmapRAM.getWidth() - (srcRect.right - xPos));
if(Math.round(yPos) < 0)
yPos = 0f;
if(Math.round(srcRect.bottom) > bitmapRAM.getHeight())
yPos = (bitmapRAM.getHeight() - (srcRect.bottom - yPos));
//------ Set new Rect with new coordiantes ------
srcRect.left = Math.round(xPos);
srcRect.top = Math.round(yPos);
srcRect.right = Math.round(xPos + displayWidth - zoomlevel);
srcRect.bottom = Math.round(yPos + displayHeight - zoomlevel);
}
//------ Draw the new Bitmap ------
onDraw();
}
Alles anzeigen
onDraw-Methode der Map:
//------====== Draw the bitmap on canvas, and finally on bitmapShow ======------
private void onDraw() {
canvas.drawBitmap(bitmapRAM, srcRect, dstRect, null);
}
Nun geht es darum, die ersten Gegner auf der Map spawnen zu lassen, was im prinzip auch funktioniert.
Das Anzeigen der Gegner erfolgt sowie bei der Map durch zwei Rects und einer Bitmap. Das Canvas-Objekt bekommt beim instanzieren die Bitmap von der Map(bitmapShow) übergeben, sodass alle Bitmaps, die auf ihr gezeichnet werden, somit auf der Bitmap der Map(bitmapShow) gezeichnet wird(Zeile 10):
Konstruktor:
public Creep1(Bitmap bitmapShow, WavePath path) {
this.path = new WavePath();
//Nächste KoordinatenPunkt
this.nextCoordinateID = 0;
//Den Weg der auf der Map zu laufen ist
this.path = path;
//Die hier gezeichnete Bitmap(der Gegner) wird auf der Bitmap der Map gezeichnet
this.canvas = new Canvas(bitmapShow);
//Rects
this.srcRect = new Rect(0, 0, 40, 100);
this.dstRect = new Rect(0, 0, 40, 100);
this.health = 100;
this.speed = 20;
this.physicalArmor = 0;
this.magicArmor = 0;
}
Alles anzeigen
Der Gedanke dahinter war, dass somit in gewisser Weiße eine neue Bitmap "entsteht", auf der die Bitmaps der Gegner auf einer festen Position sind. Das hätte zur Folge, dass die Koordinaten der Gegner nicht vom Scrollen abhängig wären.
zur Verdeutlichung: feste Position(Koordinate des Gegners bezieht sich auf die Map) doch leider bezieht sich die Koordinate des Gegners auf den Bildschirm(Verdeutlichung ).
Gibt es irgent eine Möglichkeit, die Bitmap des Gegners auf die Bitmap der Map "festzunageln"? Dies würde mir die Synchronisation zwischen den Koordinaten des Gegners und den Koordinaten des Rects, das den Bildschirmausschnitt anzeigt, erspaaren.
Ich hoffe, ich konnte mein Problem einigermaßen verständlich darstellen
MfG XoR