Dateityp verhindert Positionswechsel

Status
Nicht offen für weitere Antworten.
S

Satanica

Gast
Hallo ich hab ein rießenproblem (sry wenn der Threadtitel keinen Sinn macht, aber mit ist nichts besseres eingefallen). Hier mein Problem:

Ich ändere zuerst bei einem Lable ein Bild und verändere die Position, aber wenn die Pfadangabe ein Integer oder sonst irgendein Dateityp enthält (z.b. "...."+i+".gif"), was sich immer um 1 erhöhen soll, springt er immer wieder in die Ursprungsposition zurück.

Hier mein Code:


Code:
   public void run() 
    {
        int i=1;
        while(start)
        {

                player.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pic/bewegen"+i+".gif")));
                try 
                {
                    Thread.sleep(50);
                } 
                catch (InterruptedException ex) 
                {
                }
                x+=5;
                player.setLocation(x,y);
                if(i>4)
                {
                    i=0;
                }
                i++;
        }
    }

Ich hoffe ihr könnt mir helfen

mfg Satanica
 
S

Satanica

Gast
Wow muss schon sagen 100% Schadenfreude und 0 Hilfe.

Was glaubst du wieso ich unter Anfängerfragen poste.

Und zufällig hab ich erst seit 1 Jahr programmieren.
 
G

Guest

Gast
ich versteh dein problem nicht so 100%ig. Wenn du i mal mit System.out.println ausgibst erhählst du die Zahlen 1,2,3,4,5. Jetzt musst du wissen was für zahlen bzw. was für bilder du brauchst und das i irgedwann wieder 0 ist ist ja auch logisch da in deinem code
Code:
                if(i>4)
                {
                    i=0;
                }
steht
 

ToKaM OnE

Aktives Mitglied
Was soll in dieser Zeile
Code:
player.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pic/bewegen"+i+".gif")));
das getClass().getResource() bewirken? Ist das so richtig? Ich mach ImageIcons immer mit nem String als übergabe parameter?

Ist starten auf true?
geht er in die while schleife rein? bau doch mal ne ausgabe rein um das zu testen oder mach einen debug
 

anfänger15

Bekanntes Mitglied
Code:
player.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pic/bewegen"+i+".gif")));

ja es funktioniert so da getResource eine URL zurückgibt und man ImageIcon auch eine URL mitgeben kann.

ToKaM OnE hat aber schon recht eigentlich ist es unnötig, denn es würde reichen wenn du einfach nur einen String mitgibts
 

merlin2

Top Contributor
Eigentlich wäre es doch besser, die Bilder am Anfang zu laden und dann nur noch auf die gespeicherten Objekte zuzugreifen.
 
S

Satanica

Gast
Ok sorry, das ich mich unklar ausgedrückt habe.

Ich hab 5 Bilder, die heißen bewegen 0, bewegen1, bewegen2 bis bewegen5.

starten ist auf true (wenn er die jeweilige Taste wieder los lässt, wird es auf false gesetzt).
Und er geht in die while Schleife rein.

Mein Problem ist, dass wenn ich die Bilder so lade (mit "bewegen"+i+".gif") und dann die Position wechsele, wieder zurückspringt auf die Ursprungsposition.
Ich weiß das es etwas mit dem i zu tun hat, denn wenn ich nur "bewegen1.gif" eintippe geht alles normal.

mfg Satanica
 

Quaxli

Top Contributor
Grundsätzlich verstehe ich nicht, was genau Du vorherst.

Das Ganze soll in irgendeiner Form eine Animation werden, richtig?
Da wirst Du mit dieser Lösung keine Freude haben. Jedesmal das Image einzulesen, wird Dir Dein Programm ausbremsen.

Lade die Bilder einzeln im Konstruktor und ordne sie im laufenden Programm zu, so wie schon merlin2 angemerkt hat.

Da Dein Objekt player heißt, vermute ich aber einen grundsätzlich falschen Ansatz. Beschreibe doch mal genau, was Du vorhast.
 

ToKaM OnE

Aktives Mitglied
Meinst du es so, du drückst deinen key, er geht ....

du lässt los bei img3

das bild bleib auf img 3

du drückst wieder die taste und er startet bei 1 anstatt bei 4 ??

Angenommen, das ist was du meinst, liegt es daran, dass i immer wieder auf 1 in der methode run gesezt wird, dann solltest du es auserhalb der run methode initialisieren und diese anweisung vergessen.


Oder tut sich da gar nichts???

Falls gar nichts passiert eine Vermutung:
Eventl. reichen 50ms nicht aus um das Bild zu ändern, er springt zur nächsten änderungsanweisung und bricht mit dieser die erste ab. dann reichen ihm wieder nicht die 50 ms und damit wäre der kreislauf der schleife geschlossen...


nur eine vermutung.


oder müsste er nicht erst weiterarbeiten, wenn er das bild geändert hat?


Die frage ist ja auch, wieso es angeblich geht, wenn er unten in den while block das i gegen einen int ersezt, dies würde eigentl. meine 2. vermutung wiederlegen.


wie oft lößt du denn im keylistener die methode run aus, nur einmal, sofern der knopf gedrückt ist oder 1000000000 mal ???
in welcher keylistener methode startest du den thread?

eventl. startest du den ja auch mehrfach und daher wird immer wieder das bild nacheinander auf 1 gesezt? wäre auch nicht wiedersprüchlich zu dem test mit der zahl anstelle von i

falls es das ist, nimm die richtige keylistener methode.

mfg hf&gl
 

anfänger15

Bekanntes Mitglied
ich rate dir auch dei bilder vorher zu laden.

Ich denke er will die Bilder nach vorne laufen lassen, weshalb er jedesmal x um 5 erhöt und dann mit setLocation setzt.

Richtig?

Wenn ja dann gib mal x auf der Konsole aus ob es auch wirklich jedesmal um 5 erhöt wird
 
S

Satanica

Gast
Das mit dem vorher laden werd ich dann eh machen.

Er führt die Methode run (wird als Thread gestartet) nur 1 mal aus (nur wenn start auf false ist).

Es sollte eine Animation werden, wo dann er umherlauft.

Und x wird jedesmal um 5 erhöht.

Es lauft immer so ab: 4 Bilder auf der Ursprungsposition (Was er eigentlich nicht tun soll und das ist mein Problem) und dann 1 Bild auf der neuen Position. Wenn ich den Thread beende (start auf false ist) ist player immer auf der neuen Position (ist schwer zu erklären^^).
Vielleicht lad ich ein Video hoch.

mfg Satanica
 

ToKaM OnE

Aktives Mitglied
was passiert wenn du player.repaint nach dem .setLocation reinbaust?

hast du das JLabel eventl. in einem extra Panel?
Ist ein Layoutmanager Aktiv?
 

Quaxli

Top Contributor
Tja, wo fange ich an?
Das wichtigste: nimm kein Label!

Ich skizziere Dir mal auf, wie ich das üblicherweise mache. Ich hoffe ich vergesse jetzt auf die Schnelle nichts

Die Klasse Player bzw. Sprite als grundlegende Klasse für alle bewegten Objekte:

- Player erbt von Rectangle2D.Double . Damit habe ich schon mal Variablen für x/y, Breite, Höhe und ganz wichtig: fertige Variablen für die Kollisionserkennung.
- Player bekommt im Konstruktor ein Image-Array übergeben, daß die Animation enthält.
- Player enthält eine Methode drawObjekt, die ein Graphics-Objekt übergeben bekommt (vodi drawObjekt(Graphics g){..})
- weitere Methoden wären move (Bewegung und Animation) und doLogic (alles was man so raucht z. B. um zu erkennen, ob der sichtbare Bereich verlassen wird):

Das wäre es so im Groben.

Ich habe meine persönliche Klasse hier gepostet, guck mal rein, dann bekommst Du vielleicht ungefähr eine Idee.
Da solltest Du Dich sowieso mal umgucken.

Für die Animation nimmt man ein JPanel und überschreibt die paint-Methode. Dann ruft man periodisch ein repaint() auf. Innerhalb der paint-Methode, rufst Du dann die drawObjekt-Methode der Player-Klasse auf und übergibst das Graphics-Objekt der paint-Methode. Damit zeichnet die Klasse Player in Dein JPanel.

So ungefähr sieht das im Regelfall aus. Wie schon gesagt, guck mal im Unterforum für Spieleprogrammierung und lies Dich dort ein.
 

Satanica

Neues Mitglied
thx werd ich mal durchschauen.

Aber noch eine Frage: was bedeutet das super.?

Hab ich noch nie gehört.

mfg Satanica
 

Murray

Top Contributor
Satanica hat gesagt.:
Aber noch eine Frage: was bedeutet das super.?
"super." bedeutet, dass man sich auf eine Instanzvariable oder eine Methode der Basisklasse bezieht. Das braucht man dann, wenn man in einer abgeleiteten Klasse die Variable bzw. Methode überschrieben hat und daher unter dem Namen nur die überschriebene Version erreicht. Wenn man jetzt die Version der Basisklasse braucht, dann muss man explizit "super." davorschreiben.

@Gast: ziemlich heldenhaft, anonym solche Kommentare zu schreiben...
 

Mr. P

Mitglied
ich hab das selbe probläm gehabt und schuld war bei mir das absolute layout!! habs umgestellt auf null-layout und *tada* alles hat funktioniert wie es sollte!!!
 

ToKaM OnE

Aktives Mitglied
ToKaM OnE hat gesagt.:
was passiert wenn du player.repaint nach dem .setLocation reinbaust?

hast du das JLabel eventl. in einem extra Panel?
Ist ein Layoutmanager Aktiv?

^^ "Layoutmanager"

PS: rufst du die methode super(); auf, so ist dies der konstruktor der vaterklasse. Üblicherweise macht man das nur im eigenen konstruktor, und es muss die erste anweisung im eigenen konstruktor sein! Schreibt man es nicht expliziet rein, so wird an den anfang aller konstruktoren super() gesezt. Das ist interessant zu wissen, wenn man einen parametisierten konstruktor der vaterklasse nutzen möchte, oder diese keinen parameterlosen konstruktor hat.

willst du einen konstruktor deiner eigenen klasse durch einen anderen aufrufen, so geht das mit this()
das kannst du machen um operationen, die an bestimmte übergabeparameter gekoppelt sind nicht doppeln zu müssen.

Code:
public class Kunde{
     private String vorname;
     private String name;
     
     public Kunde(String name){
          this.name=name;
          System.out.println(name);
      }
      public Kunde(String name, String vorname){
            this(name);
            this.vorname=vorname;
            System.out.println(vorname);
       }
}


was mich jezt mal interessieren würde, ob es bei dir am null layout lag, oder ob dahinter noch ein weiteres problem steckt.
Kann man das nicht mit nem label realisieren? was hat der player, was das label nicht hat?



Entschuldigt meine "schnelle" "Recht"schreibung :D
Ich hoffe euch ist das so "recht" :D
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben