Auf Thema antworten

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]



Oben