Vielleicht kann mir ja einer mal an diesem extrems simpel gehaltenen Beispiel verklickern wie das mit dem zeichnen der Positionen umzusetzen ist ,
ich habe hier mal so ziemlich auf alles verzichtet, mir geht es nur darum zu verstehen wo was an welcher stelle gezeichnet werden muss wenn die Map größer ist als der Sichtbare Bereich,
Wäre super wenn mir da mal einer die Richtung weisen würde, ob sich nun map , player , oder beide bewegen müssen und die Position dann von der map auf den player translatet werden muss oder umgekehrt, so müsst ihr euch auch nicht durch den Code im vorherigen Post wühlen
geht mir nur um das Prinzip , sehe den Wald vor lauter Bäumen schon nicht mehr ^^
Mal abgesehen davon gibt es so dermaßen unvollständige und fehlerbehaftete, tutorials im Netz das es mir mittlerweile kalt den Rücken runter läuft..... hoffe mein Buch ist bald da :lol:
[EDIT]Die Kollision lassen wir hier mal außen vor, die habe ich bereits schon mehrmals erfolgreich implementiert, mir geht es strikt um das tilemap scrolling [/EDIT]
[SPOILER="KSKB"]
[code=Java]
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Foo extends JPanel implements Runnable, KeyListener{
final static int WIDTH = 320;
final static int HEIGHT = 240;
//player
int x;
int y;
int xmove;
int ymove;
int width;
int height;
//map
int tileSize;
int xmap;
int ymap;
int[][] map =
{
{0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0, 1, 0, 1, 0},
};
//movement
boolean left;
boolean right;
boolean up;
boolean down;
//loop
Thread loop;
boolean running;
public Foo(){
width = 20;
height = 20;
tileSize = 32;
setPosition(20, 20);
setMapPosition(0, 0);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
requestFocus();
}
private void setPosition(int x, int y){
this.x = x;
this.y = y;
}
private void setMapPosition(int xmap, int ymap){
this.xmap = xmap;
this.ymap = ymap;
}
@Override
public void keyTyped(KeyEvent e){}
@Override
public void keyPressed(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_LEFT) {
left = true;
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
right = true;
}
if(e.getKeyCode() == KeyEvent.VK_UP) {
up = true;
}
if(e.getKeyCode() == KeyEvent.VK_DOWN) {
down = true;
}
}
@Override
public void keyReleased(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_LEFT) {
left = false;
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
right = false;
}
if(e.getKeyCode() == KeyEvent.VK_UP) {
up = false;
}
if(e.getKeyCode() == KeyEvent.VK_DOWN) {
down = false;
}
}
@Override
public void addNotify(){
super.addNotify();
if(loop == null) {
loop = new Thread(this);
addKeyListener(this);
loop.start();
}
}
public void update(){
if(left) {
x -= 2;
}
else if(right) {
x += 2;
}
if(up) {
y -= 2;
}
else if(down) {
y += 2;
}
}
//without double buffering ! direct draw !
public void draw(){
Graphics2D g = (Graphics2D) getGraphics();
//draw map
for (int row = 0; row < map.length; row++) {
for (int col = 0; col < map[row].length; col++) {
if(map[row][col] == 1) {
g.setColor(Color.BLACK);
}
if(map[row][col] == 0) {
g.setColor(Color.WHITE);
}
g.fillRect(col * tileSize, row * tileSize, tileSize, tileSize);
}
}
//draw Player
g.setColor(Color.RED);
g.fillRect(x, y, width, height);
//draw info
g.drawString("Cord. : " + x + "|" + y, x, y + height * 2);
g.drawString("Pos. : " + y / tileSize + "|" + x / tileSize, x, y + height * 2 + 20);
}
@Override
public void run(){
while(true){
update();
draw();
try {
Thread.sleep(100);
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args){
JFrame f = new JFrame();
f.setDefaultCloseOperation(2);
f.setContentPane(new Foo());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
[/code]
[/SPOILER]