Hintergrundgrafik wiederholen

Maxim6394

Bekanntes Mitglied
Ich versuch hier grade eine hintergrundgrafik unendlich zu wiederholen, wenn sich der spieler bewegt.
das klappt aber einfach nicht so richtig.
das soll in x und y richtung passieren. bis jetzt hab ich versucht die grafik 4 mal zu zeichnen, und immer die richtige grafik an die entsprechende stelle zu verschieben, je nachdem in welche richtung die bewegung verläuft:

Code:
if(level.pos.getX()<=0)
		{
			nx=1;
		}
		else
		{
			nx=-1;
		}
		if(level.pos.getY()<=0)
		{
			ny=1;
		}
		else
		{
			ny=-1;
		}
		bg.drawImage(level.ground,level.bgx,level.bgy,null);
		bg.drawImage(level.ground,level.bgx+(bgWidth*nx),level.bgy,null);
		bg.drawImage(level.ground,level.bgx+bgWidth*nx,level.bgy+bgHeight*ny,null);
		bg.drawImage(level.ground,level.bgx,level.bgy+bgHeight*ny,null);

die folgende methode wird jedes mal aufgerufen wenn es keine kollision gibt. dx und dy sind entweder 0,1 oder -1.
Code:
public void bgMove()
	{
		bgx+=dx*playerSpeed;
		if(bgx>ground.getWidth(null) || bgx<=-ground.getWidth(null) )
		{
			bgx=0;
		}
		
		bgy+=dy*playerSpeed;
		if(bgy>ground.getHeight(null) || bgy<=-ground.getHeight(null) )
		{
			bgy=0;
		}
		
	}

level.pos ist die position die sich bei tastendruck verändert, der spieler bleibt dabei immer in der mitte.
mit nx und ny hab ich versucht festzustellen ob die grafiken rechts oder links gezeichnet werden sollen.
wenn sich der spieler nur in x richtung bewegen kann wär das kein problem, aber hier klappt das nicht.

also hat jemand eine idee wie man das macht?
 

GUI-Programmer

Top Contributor
Etwas mehr Code bitte!

Was ist bg? Ich hoffe doch mal, dass es nicht ein Graphics-Objekt ist, dass mit getGraphics() geholt wurde!
Mein Tipp, auch wenn man gerade nicht weiß (wegen der geringen Menge Code) wie gezeichnet wird ist folgener:
Berechne in einer Methode, die nicht in paint() oder paintComponent() aufgerufen wird deine gewünschten Werte und speichere sie in ein java.awt.Rectangle ab und danach ein repaint(). In der entsprechenden Zeichenmethode, also paint (AWT) oder paintComponent (Swing) zeichnest du dein Bild mit den Werten des berechneten Rechtecks.
 

Maxim6394

Bekanntes Mitglied
Code:
Graphics2D bg=(Graphics2D)g.create();

eigentlich ist das schon alles was mit dem zeichnen des hintergrund zu tun hat.

vieleicht bringt noch der code für die tastatureingaben was:
Code:
private class TAdapter extends KeyAdapter
	{
		public void keyPressed(KeyEvent e)
		{
			int key=e.getKeyCode();
			player.keyPressed(e);
		
			 if(key==KeyEvent.VK_A)
			{
				 level.dx=1;
			}
			  if(key==KeyEvent.VK_D)
			 {
				 level.dx=-1;
			 }
			  if(key==KeyEvent.VK_W)
				 {
					 level.dy=1;
				 }
			  if(key==KeyEvent.VK_S)
				 {
					 level.dy=-1;
				 }
			  
		}
		
		public void keyReleased(KeyEvent e)
		{
			int key=e.getKeyCode();
			 if(key==KeyEvent.VK_A)
				{
					 level.dx=0;
				}
				  if(key==KeyEvent.VK_D)
				 {
					 level.dx=0;
				 }
				  if(key==KeyEvent.VK_W)
					 {
						 level.dy=0;
					 }
				  if(key==KeyEvent.VK_S)
					 {
						 level.dy=0;
					 }
		}
 

André Uhres

Top Contributor
Dieses Beispiel könnte helfen:
Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class LevelGround extends JPanel {

    private Image image;
    private Dimension imageSize;
    private int positionX;
    private int positionY;

    public LevelGround(final Image image) {
        this.image = image;
        imageSize = new Dimension(image.getWidth(null), image.getHeight(null));
    }

    public void setImage(final Image image) {
        this.image = image;
        imageSize.width = image.getWidth(null);
        imageSize.height = image.getHeight(null);
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return image == null ? super.getPreferredSize() : imageSize;
    }

    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);
        if (image != null) {
            drawImage(g);
        }
    }

    private void drawImage(final Graphics g) {
        Dimension panelSize = getSize();
        int imageWidth = image.getWidth(null);
        int imageHeight = image.getHeight(null);
        for (int x = -imageWidth; x < panelSize.width + imageWidth; x += imageWidth) {
            for (int y = -imageHeight; y < panelSize.height + imageHeight; y += imageHeight) {
                g.drawImage(image, x + positionX, y + positionY, null, null);
            }
        }
    }

    public int getPositionX() {
        return positionX;
    }

    public void setPositionX(final int positionX) {
        this.positionX = Math.abs(positionX) > imageSize.width ? 0 : positionX;
        repaint();
    }

    public int getPositionY() {
        return positionY;
    }

    public void setPositionY(final int positionY) {
        this.positionY = Math.abs(positionY) > imageSize.height ? 0 : positionY;
        repaint();
    }

    public static void main(final String... args) {
        Runnable gui = new Runnable() {

            @Override
            public void run() {
                final JFrame f = new JFrame("LevelGround Demo");
                final LevelGround levelGround = new LevelGround(new ImageIcon("ground1.png").getImage());
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setSize(800, 600);
                f.setLocationRelativeTo(null);
                f.add(levelGround);
                f.setVisible(true);
                Timer timer = new Timer(10, new ActionListener() {

                    @Override
                    public void actionPerformed(final ActionEvent e) {
                        levelGround.setPositionX(levelGround.getPositionX() + 1);
                    }
                });
                timer.start();
            }
        };
        EventQueue.invokeLater(gui);
    }
}
Gruß,
André
 

Ähnliche Java Themen

Neue Themen


Oben