# Canvas Ursprung ändern



## Ungetuem (1. Sep 2007)

Hallo
Wenn ich eine Canvas Zeichenfläche habe dann ist der Punkt oben links ja (0,0)
Kann ich den Anzeigeursprung verändern? ich möchte nämlich die "Kamera" verändern wenn sich meine SPielfigur bewegt.

MfG ungetüm


----------



## Templon (1. Sep 2007)

Also so wie du dir das vorstellst geht das glaube ich nicht...

Aber du hast wahrscheindlich eine Map (z.B. in einem 2-Dimensionalen Array) dann kannst du ja einfach die Position der Spielfigur holen, und dann nur das zeichnen was nötig ist.


----------



## Ungetuem (1. Sep 2007)

Hi und danke für die Antwort.
Das ist ja ärgerlich, wennd as wiorklich nicht gehen sollte.
Das Problem ist: Meine SPielfigur hat einen freien Bewegungsraum, bewegt sie sich ünber einen Bewegungsradius hinaus dann soll sie natürlich nicht aus dem Bild verschwinden. Jemand hat mir auch schon gesgat ich solle anstatt der Figur dann den Hintergrund bewegen.. das ist allerdings ein Problem, Beispiel Multiplayer: SPieler 1 hat x,y koordinaten spieler 2 ebenfalls. wenn spieler 1 jetzt z.b. nach "links" gehen soll, der hintergrund sich also nach rechts bewegt, dann bewegt sich spieler 2 ja nicht automatisch mit dem Hintergrund nach rechts..
Wäre es aber möglich ein festes spielfeld  zu haben und würde bei übertreten des bewegunbgsradius nur die sicht aufs feste spielfeld geändert, dann gäbe es diesen konflikt ja nicht. Ich überölege nun schon die ganze zeit wie ich das lösen kann. Hat jemand vllt noch einen tipp?



noch eins creenshot, der schwache rkennbare rote kreis solld as bewegungsradius sein:

http://www.file-upload.net/view-390530/screen.gif.html

mfg ungetuem


----------



## Templon (1. Sep 2007)

Nene ich mein nicht das du den hintergrund bewegst... sondern du zeichnest einfach immer den Teil den du brauchst...  Ich mach das bei meinem Tile basierten Spiel so:


```
// Draw the Map
		int tilesNumberX = (int) Game.WIDTH / 64; // The TileSize is 64
		int tilesNumberY = (int) Game.HEIGHT / 64;
		int screenPosX = (int) game.getScreenPosition().x;
		int screenPosY = (int) game.getScreenPosition().y;
		int ox = (int) screenPosX / 64;
		int oy = (int) screenPosY / 64;

		// +2 because otherwise not all tiles will be painted
		for (int y = 0; y < tilesNumberY + 2; y++) {
			for (int x = 0; x < tilesNumberX + 2; x++) {
				g2D.drawImage(map[oy + y][ox + x].getImage(), x * 64 - screenPosX % 64, y * 64 - screenPosY % 64, null);
			}
		}
```

ich hole immer diese Tiles die gerade sichtbar sind aus dem Array und zeichne sie an dem richtigen Ort, ich verändere also nie die Positionen der Tiles selber.


----------



## Ungetuem (1. Sep 2007)

okay das klingt gut. werds mal probieren
vielen dank


----------



## Ungetuem (1. Sep 2007)

hm ja aber wenn ich mich dann aus dem radius bewege dann muss ich ja "ruckartig" das neue bild laden, oder wie mache ich das als weiche bewegung?
mfg


----------



## Templon (2. Sep 2007)

Das könntest du in einem Thread lösen und dann halt z.B. immer nur alles 1 Pixel bewegen bis es die richtigen Koordinaten hat.


----------



## Ungetuem (2. Sep 2007)

okay, aber es ist wirklich nciht möglich einfach die sicht aufs canvas zu verschieben?
mfg ungetüm


----------



## Templon (2. Sep 2007)

Soweit ich weiss nicht, aber vielleicht weiss sonst jemand mehr?


----------



## Wildcard (2. Sep 2007)

http://java.sun.com/javase/6/docs/api/java/awt/Graphics.html#translate(int, int)


----------



## Templon (2. Sep 2007)

ja man kann schon zuerst alles in das graphics objekt zeichnen und dann den richtigen teil anzeigen lassen, aber ist das nicht langsamer?


----------



## Ungetuem (2. Sep 2007)

super genau das hab ich gesucht. vielen dank wildcard
vielen dank auch an templon für die hilfeversuche 
mfg


----------

