Jump'n Run Background wiederholen

F4ckHanoi

Mitglied
Hallöchen zusammen,

ich habe Anhand eines Tutorials ein Spiel programmiert. Jedoch habe ich ein Problem. Im Tutorial wurde das mit dem Hintergrund zeichnen gelöst, jedoch war die Framebreite 600 Pixel. Ich möchte es nun aber 1200 Pixel breit haben. Meiner Meinung nach habe ich mit absoluten Werten gearbeitet. Es sind komische Lücken dazwischen.



Screenshots:
http://img5.fotos-hochladen.net/uploads/screen1tpwmy7zqn1.png
http://img5.fotos-hochladen.net/uploads/screen2sm0jn9qe7k.png

Auf dem ersten Bild ist schon mein Problem dargestellt. Ich möchte, dass sich das Hintergrund schon vorher zeichnet, bevor man es sieht. Auf dem zweiten Bild wird es erst dann gezeichnet, nachdem ich paar Schritte gelaufen bin.


Naja, hier ist mein Code:
Code:
package HNGProduction;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


public class Spiel extends JPanel implements ActionListener {
 
    //Timer
    Timer time;
 
    //Hintergrund
    Image background;
    int backgroundZeichnenX,backgroundZeichnenX_zwei;
    int background_aktuelle_posX;
    static int background_posX;
    int anzahl = 0;
    int anzahl_zwei= 0;
 
    //Taste
    int gedrueckteTaste;
 
 
    //Charakter 
    Image figur;
    int figur_posX = 75;
    int figur_posY = 235;

    //Blöcke
    Random random = new Random();
    Block block[] = new Block[5];
    int blockAnzahl = 1000;
    int blockPosX = 350;
    int randomPosX = 1 + (int) Math.floor(Math.random()*5);
    Block blockArray[] = new Block[blockAnzahl];
    int coin_score = 0;

 
 
 
    /********************* KONSTRUKTOR *********************/
    public Spiel(){

     
        /*
         * Inizialisieren
         */
        backgroundZeichnenX = 0;
        backgroundZeichnenX_zwei = 690;
        gedrueckteTaste = 0;
        background_posX = 0;
        setFocusable(true);
     
     
     
     
        /*
         * Bilder von Charakter und Hintergrund
         */
        ImageIcon u = new ImageIcon((getClass().getResource("background.jpg")));
        background = u.getImage();
     
        ImageIcon s = new ImageIcon((getClass().getResource("char.png")));
        figur = s.getImage();
     
 
     
     
     
        /*
         * KeyListener
         */
        addKeyListener(new AL());
     
     
     
     
        /*
         * Blöcke
         */
        //149 y hoch Springen - Höhe
        block[0] = new Block(250,110,50,50, Color.YELLOW);
        block[1] = new Block(310,110,50,50, Color.YELLOW);
        block[2] = new Block(370,110,50,50, Color.YELLOW);
     
        for(int i = 1; i < blockArray.length; i++){
            randomPosX = 1 + (int) Math.floor(Math.random()*5);
            blockArray[i] = new Block(((blockPosX*i)*randomPosX),110,50,50, Color.WHITE);
        }
         
     
     
     
        /*
         * Springen
         */
        Springen sprung = new Springen();
 
     
     
     
        /*
         * Alternative zu "update - Methode" die sich alle 5 Millisekunden wiederholt
         */
        time = new Timer(5,this);
        time.start();
     
    }
    /***********************************************/
 
 

 
 
 
 
    /********************* Wiederholende Methodenaufruf *********************/
    public void actionPerformed(ActionEvent e){
        //(Wird immer wieder neu gezeichnet)
        bewegen();
        repaint();
        figur_posY = Springen.sprungposition;
    }
    /***********************************************/
 
 
 
 
 
 
 
    /********************* PAINT METHODE *********************/
    public void paint(Graphics g){
     
        super.paint(g);
        Graphics2D f2 =(Graphics2D)g;
     
     
        /*
         * Hintergrund wiederholt sich
         */
     
        //510
        if (getXBild() == 510 + (anzahl * 2350)){
            System.out.println("\n*****************************************\nErste Abrage\n\nAktuelle Position des Backgrounds: " + getXBild() + "\n" + "Berechnung: " + "(510 + " + anzahl + " * 2350)) = " + (510 + (anzahl * 2350)) + "\n" + anzahl + "*2350 = " + (anzahl*2350));
            anzahl += 1;
            System.out.println("\nAnzahl Variable: " + anzahl + "\n*****************************************");
            backgroundZeichnenX = 0;
        }
     
        //1690
        if (getXBild() == 1690 + (anzahl_zwei*2350)){
            System.out.println("\n*****************************************\nZweite Abrage\n\nAktuelle Position des Backgrounds: " + getXBild() + "\n" + "Berechnung: " + "(1690 + " + anzahl + " * 2350)) = " + (1690 + (anzahl_zwei * 2350)) + "\n" + anzahl + "*2350 = " + (anzahl*2350));
            anzahl_zwei += 1;
            System.out.println("\nAnzahl_Zwei Variable: " + anzahl + "\n*****************************************");
            backgroundZeichnenX_zwei = 0;
        }
     
        if (getXBild() >= 510){
            //685
            f2.drawImage(background,685-backgroundZeichnenX,0,null);
            //System.out.println("X-Position des Backgrounds die gezeichnet wird: " + (685-backgroundZeichnenX));
        }
        //System.out.println(getXBild());
     
     
        //Hintergrund
        f2.drawImage(background,685-backgroundZeichnenX_zwei,0,null);
        //System.out.println("X-Position ZWEI des Backgrounds die gezeichnet wird: " + (685-backgroundZeichnenX_zwei));
     
     
        //Charakter
        f2.drawImage(figur,figur_posX,figur_posY,null);
     
     
        //Blöcke
        f2.setColor(block[0].getFarbe());
        f2.fillRect(block[0].getX_Block()-getXBild(), block[0].getY_Block(), block[0].getWidth(), block[0].getHeight());
        f2.fillRect(block[1].getX_Block()-getXBild(), block[1].getY_Block(), block[1].getWidth(), block[1].getHeight());
        f2.fillRect(block[2].getX_Block()-getXBild(), block[2].getY_Block(), block[2].getWidth(), block[2].getHeight());
     
     
        /*
         * Kollisionsabfrage
         */
            //74 -12 (Größe des Charakters also die X Position minus den Abstand zu den Rand)
        block[0].kollisionsabfrage(block[0].getX_Block()-getXBild(), block[0].getY_Block() + block[0].getHeight(),figur_posX + (74-12), figur_posY);
        block[1].kollisionsabfrage(block[1].getX_Block()-getXBild(), block[1].getY_Block() + block[1].getHeight(),figur_posX + (74-12), figur_posY);
        block[2].kollisionsabfrage(block[2].getX_Block()-getXBild(), block[2].getY_Block() + block[2].getHeight(),figur_posX + (74-12), figur_posY);
     
         
     
     
            //Wenn Block berührt wird, erhält man Punkte
            if(block[0].Coin() == true || block[1].Coin() == true || block[2].Coin() == true ){
                coin_score = 1;
            }
         
            //Kollision, Punkte und Zeichnen für Random Blöcke
            for(int i = 1; i < blockArray.length; i++){
                f2.setColor(blockArray[i].getFarbe());
                f2.fillRect(blockArray[i].getX_Block()-getXBild(), blockArray[i].getY_Block(), blockArray[i].getWidth(), blockArray[i].getHeight());
                blockArray[i].kollisionsabfrage(blockArray[i].getX_Block()-getXBild(), blockArray[i].getY_Block() + blockArray[i].getHeight(), figur_posX + (74-12), figur_posY);
             
                if(blockArray[i].Coin() == true){
                    coin_score += 1;
                }
             
                /*if(){
                    //Wenn Blöcke übereinander liegen
                }*/
             
            }
         
         
        //Punktestand
        f2.setColor(Color.WHITE);
        f2.drawString("Score :" + coin_score, 10, 15);
     
    }
    /***********************************************/
 
 
 
 
 

 
    /***************** akutelle X Position des Hintergrunds zurückliefern ***********************/
    private int getXBild() {
        return background_aktuelle_posX;
    }
    /***********************************************/
 
 
 
 
 
 

    /********************BEWEGEN METHODE**************************/
    public void bewegen(){
     
        if (background_posX != -2) {
            if (figur_posX + background_posX <= 75) {
                figur_posX += background_posX;
            } else {
                background_aktuelle_posX += background_posX;
                backgroundZeichnenX += background_posX;
                backgroundZeichnenX_zwei += background_posX;
            }
        }else {
            if (figur_posX + background_posX > 0) {
                figur_posX += background_posX;
            }
        }

    }
    /**************************************************************/
 
 
 
 
 
 
 
    /**************************** KEYEVENT KLASSE *********************************/
    private class AL extends KeyAdapter{
        public AL(){}
     
        public void keyPressed(KeyEvent e){
            gedrueckteTaste = e.getKeyCode();
         
            if(gedrueckteTaste == KeyEvent.VK_LEFT){
                background_posX = -2;
                //figur_posX -= 2;
            }
         
            if(gedrueckteTaste == KeyEvent.VK_RIGHT){
                background_posX = 2;
                //figur_posX += 2;
            }
     
            if(gedrueckteTaste == KeyEvent.VK_ESCAPE){
                //Pause Menü öffnen
            }

            if(gedrueckteTaste == KeyEvent.VK_SPACE){
                if(Springen.springenAnimationFertig == true)
                Sprung();
            }

        }

        public void keyReleased(KeyEvent e){
            gedrueckteTaste = e.getKeyCode();
            if(gedrueckteTaste == KeyEvent.VK_LEFT || gedrueckteTaste == KeyEvent.VK_RIGHT){
                background_posX = 0;
            }
        }
        /*************************************************************/
 
     
     
     
     
        /**************************** SPRINGEN METHODE *********************************/
        public void Sprung(){
            Springen SprungAnimation = new Springen();
            SprungAnimation.start();
        }
        /*************************************************************/

     
    } }


Es sind die ersten drei IF Abfrage in der PAINT Methode. Dort wurde es so programmiert, dass sich das Background ständig wiederholt und es gezeichnet wird. Bei einer größeren Framebreite wird es auch gezeichnet, jedoch sind dort Lücken dazwischen, was auch hier mein Problem ist.

Habe schon einiges versucht aber irgendwie habe ich wiedermal nen Blackout.

Ich würde mich freuen, wenn Ihr mir helfen würdet.

Lg
 
Zuletzt bearbeitet:

F4ckHanoi

Mitglied
Vielen dank für deine Hilfe :).

Ich werde mir das genauer anschauen, wenn ich Zuhause bin. Danach poste ich, ob es geklappt hat oder nicht.

Lg
 

F4ckHanoi

Mitglied
Ich habs ausgetestet. Die Klasse ist eigentlich wunderbar anwendbar aber bei mir weiß ich jetzt echt nicht. Vieles musste ich weglassen und das umzusetzen für mein Code ist für mich irgendwie nicht möglich. Da bin ich doch nur noch mehr durcheinander gekommen.

Ich würde mich sehr freuen, wenn Ihr mir weiterhelfen könnt. Meine Java Fähigkeiten will ich auf jeden Fall verbessern! :).

Ich bedanke mich im Voraus

Lg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Mein Jump and Run charakter bewegt sich nicht mehr rückwärts... Spiele- und Multimedia-Programmierung 0
E Möchte Jump and Run programmieren Spiele- und Multimedia-Programmierung 2
N Jump and run Spiel - wo anfangen / weitermachen? Spiele- und Multimedia-Programmierung 11
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
S Jump 'n' Run-Spiel Kollisionserkennung Spiele- und Multimedia-Programmierung 3
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
C Doodle Jump Sprung Physik? Spiele- und Multimedia-Programmierung 4
M Jump 'n' Run Game - Blöcke? Spiele- und Multimedia-Programmierung 7
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
M Empfehlungen für ein 2D-Jump'n'run Spiele- und Multimedia-Programmierung 4
W Doodle Jump Spiele- und Multimedia-Programmierung 6
H Jump&Run Tutorial Spiele- und Multimedia-Programmierung 3
D Jump'n'run Kollision bei Blöcken Spiele- und Multimedia-Programmierung 10
K Jump'N'Run Hügel Spiele- und Multimedia-Programmierung 11
T Jump and Run - Unklarheiten Spiele- und Multimedia-Programmierung 5
Arcus Jump and Run etwas komplizierter - Benötige Starthilfe Spiele- und Multimedia-Programmierung 12
T Ist meine Jump and Run Engine zu genau? Spiele- und Multimedia-Programmierung 4
N Grundlagen für ein Jump&Run Spiele- und Multimedia-Programmierung 3
F "Doodle Jump" Projekt Spiele- und Multimedia-Programmierung 8
U Jump n' Run 2D Geometrie und Kollisionsabfrage? Spiele- und Multimedia-Programmierung 11
L Jump-n-Run Auslastung verringern Spiele- und Multimedia-Programmierung 16
Apo Kollisionserkennung bei Jump'n'Run Spiele- und Multimedia-Programmierung 69
F jump and run idee Spiele- und Multimedia-Programmierung 2
T Umsetzung eines 2D Jump and Runs Spiele- und Multimedia-Programmierung 7
K Jump n Run Keylistener und Schleifen Spiele- und Multimedia-Programmierung 8
F DJADD Jump and Run Spiele- und Multimedia-Programmierung 10
D Jump 'n run die 2. [spielerbewegen mit zeit] Spiele- und Multimedia-Programmierung 6
D Jump and Run Game -- Kollisionsabfrage Spiele- und Multimedia-Programmierung 30
S Kollisionsprob bei Jump&Run Spiele- und Multimedia-Programmierung 9
S Jump'n'Run: Probleme mit Kollision Spiele- und Multimedia-Programmierung 13
T JFrame Background Spiele- und Multimedia-Programmierung 5
E JPCT background image Spiele- und Multimedia-Programmierung 3
N Background in Java3D ähnlich einer Skybox erzeugen Spiele- und Multimedia-Programmierung 5
P Methoden Wiederholen Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben