Bewegung falsch

BDG

Aktives Mitglied
HeyLeute.
In c# hatte ich eine klasse, in der eine Münze erstellt wurde und durch die Luft geflogen ist...
Diese habe ich GENAU so in Java gemacht.
Allerdings bewegt sich die Münze völlig falsch und man sieht sie irgendwie garnicht...
hier wie ich sie erstelle :

Random random = new Random();
Coin coin = new Coin(random.nextInt(80-(-80)+1)+-80, random.nextInt(150-(50)+1)+50);
coins.add(coin);

das erste soll ein random-wert zwischen -80 und 80 sein, und das zweite zwischen 150 und 50.


Und hier die Klasse coin : [Java] Coin.java - Pastebin.com
Gezeichnet wird halt so :
for (Coin coin : coin)
{

coin.Draw(...);
}
 
Steht eig. im ersten Beitrag ganz unten ^^
Mit einer foreach schleife :
for (Coin coin : coins)
{
coin.Draw(g, ie);
}
 
Und da überschreibst du paintComponent()?

Und was bedeutet "falsch" dargestellt?

Wieviele münzen sind es?

Weißt du, wann und wie oft diese Methode aufgerufen wird?
 
man sieht die münze in der einen Sekunde noch ganz oben irgendwo, und dann is sie weg.
Normal, also in c#, sollte die münze einen bogen nach oben machen, und dann auf dem boden immer apprallen und irgendwann leigen bleiben ...
 
Hier nochmal die Update Methode :
Java:
@Override
	public void run()
	{
		while (frame.isVisible())
		{
			tilemap.Update();
			spieler.Update();
			
			
			
			computeDelta();
			
			
			repaint();
			
			
			
			try {
				Thread.sleep(10);
			}
			catch (InterruptedException e) {}	
		}	
	}

und in figur.Update ist eben die schleife wo dann die coins geupdatet werden...
das gleiche mit draw.
 
Woran kann das denn liegen ? 🙁
Die Klassen sind doch komplett gleich, in Java und in c#...
Und in Java gehts nicht und in c# schon....
 
Steht eig. im ersten Beitrag ganz unten ^^
Mit einer foreach schleife :
for (Coin coin : coins)
{
coin.Draw(g, ie);
}


Foreachschleifen gibt es in Java so nicht, da sie für C# erfunden wurden. Wie sowas in Java realisierbar ist, kann man in jedem Buch nachlesen.
Nicht jeder Code ist 1:1 gleich...😉
 
Ja, aber fast 1 zu 1 ! Ich hab nur die minimalen änderungen vorgenommen, bei den schleifen und so.
aus foreach (Block block in blocks) wird for (Block block : blocks)
Und da ist ja kein Unterschied...
Sieht man denn am Code (siehe erster Beitrag, pastebin-link ) irgendwas falsches ?
 
Foreachschleifen gibt es in Java so nicht, da sie für C# erfunden wurden. Wie sowas in Java realisierbar ist, kann man in jedem Buch nachlesen.
Nicht jeder Code ist 1:1 gleich...😉

Du wirst es nicht glauben, aber es gibt tatsächlich Zeiten da hilft erst denken, dann nachlesen und zum Schluss den Stuss nicht schreiben den man auf der Zunge hat. Dann steht man auch nicht so blamiert da.
Foreach loop - Wikipedia, the free encyclopedia
 
Oke, Danke ;D Aber ob die foreach schleifen jetzt extra für java erfunden wurden oder nicht, ist mir eigentlich garnicht mal so wirklich das wichtigste an der Sache 🙁

Also wenn es euch hilft kann ich auch das ganze projekt hochladen oder so 🙁
Und von mir aus auch das c# Projekt...
Also so sollte aus aussehen mit den Coins :
c# + XNA : CoinBox Hero Alpha 1.2 [Nachmache] - YouTube
Aber in meinem Java Projekt sieht man sie nur ganz kurz, dann sind sie sofort weg, und dann wieder da und die bewegen sich völlig falsch und alles 🙁
 
Der Java-Code würde schon helfen. Bevorzugt (wenn's nicht sooo viel ist) in einem Stück, das man direkt rauskopieren, compilieren und starten kann.
 

Nur so nebenbei:

1) Wäre es netter, den Code hier in Java-Tags zu schreiben.

2) Werden Methodennamen in Java anders als in C# mit einem Kleinbuchstaben begonnen. Also
Code:
update()
und
Code:
draw()
.

Ich hole 1) mal für die anderen Leser nach:

Java:
public class Coin{

	float jumpValue, grav, magvalue;
    boolean jump = true;
    float coinPositionX, coinPositionY, directionX, directionY;
	
    Image coinImage;
    
    public Coin(float directionX, float jumpValue)
    {
    	this.directionX = directionX;
    	this.directionY = jumpValue;
    	this.jumpValue = jumpValue;
    	
    	doInitializations();
    }
    
    public void doInitializations()
    {
    	coinPositionX = 285;
    	coinPositionY = 455;
    	grav = 2f;
        magvalue = 1.8f;
        
        coinImage = Toolkit.getDefaultToolkit().createImage("coinBoxCoinKlein.png");
    }
    
    
    public void Update()
    {
    	
    	if (jump)
        {
            directionY = -directionY * 4;
            jump = false;
        }

        
        coinPositionY += directionY;
        coinPositionX += directionX;
        directionY += grav;
        if (coinPositionY >= 270)
        {
            grav = 1190f;
        }
        if (coinPositionY <= 270)
        {
            grav += 50f;
        }
        

        if (coinPositionY >= 400)
        {
            //change direction! 
            coinPositionY = 400;
            directionY = -directionY / 40 * 25;
            if (directionY >= -80)
            {
                directionX = 0;
                directionY = 0;

            }
        }
    }
    
    
    public void Draw(Graphics g, ImageExample ie)
    {
    	g.drawImage(coinImage, (int)coinPositionY, (int)coinPositionX, ie);
    	
    }
    
}
 
Zuletzt bearbeitet:
Nein. Das ist halt Konvention. Einer der Vorteile bei Java (meiner Meinung nach) ist der, dass ich auf einen Blick sehe, ob ein Aufruf eine Klassenmethode oder Instanzmethode ist. Welche Bezeichner in meinem Code eindeutig! Klassen sind und welche lediglich Variablen darstellen.

Sowas macht Code um Längen lesbarer. Ich hasse dieses Rätselraten in fremden Code.


Zu deinem Problem: Zeig doch mal den Code der das ganze benutzt.
 
Okeee :
Java:
//Liste :
public List<Coin> coins = new ArrayList<Coin>();

//KeyPressed Methode :

if(e.getKeyCode()== KeyEvent.VK_SPACE){
        	
			if (!space) space = true;
			
			
				Random random = new Random();
				int random1 = random.nextInt(80-(-80)+1)+-80;
				int random2 = random.nextInt(150-(50)+1)+50;
		        Coin coin = new Coin(random.nextInt(161)-80, random.nextInt(101)+50);      
		        coins.add(coin);
			
}

//Update :

for (Coin coin : coins)
		{
			coin.Update();
		}

//Draw :

public void Draw(Graphics g, ImageExample ie)
	{
		
		g.drawImage(figur, (int)x, (int)y, ie);
		
		for (Coin coin : coins)
		{
			coin.Draw(g, ie);
		}
		
	}
 
Ich hab jeweils nur den relevanten COde gepostet, weil in der Klasse ist auch noch die ganze Seteuerung der Figur etc.
 
Ja, das führt irgendwie zu nichts. Debuggen wirst du früher oder später ohnehin selbst müssen. Am besten mit einem Debugger (deswegen heißen die Dinger so 😀 ) oder mit sowas wie
Java:
    public void Update()
    {
...
        System.out.println("Position vorher "+curPositionX+" "+curPositionY);
        System.out.println("Bewege um "+directionX+" "+directionY);

        coinPositionY += directionY;
        coinPositionX += directionX;

        System.out.println("Position nachher "+curPositionX+" "+curPositionY);
und schauen, wo wann der Fehler herkommt
 
Könnte es vielleicht sein dass es daran liegt : ?
Ich habe in c# so :

coinPosition.Y += direction.Y * (float)gameTime.ElapsedGameTime.TotalSeconds;

und in Java genau das gleiche nur ohne das mal...
Und wenn die elapsed GameTime unter 0 ist, dann whäre es ja kleiner, und alles whäre richtig 😀
Weiß jemand wie ich dass so in Java mache ?
 
:autsch:

:noe:


Kommt drauf an was gameTime.ElapsedGameTime.TotalSeconds liefert.
Java:
class Game
{
    private long initialMS = -1;

    public static float getElapsedSeconds()
    {
        long currentMS = System.currentTimeMillis();
        if (initialMS == -1)
        {
            initialMS = currentMS;
        }
        long elapsedMS = currentMS - initialMS;
        float elapsedS = (float)elapsedMS / 1000.0f;
        return elapsedS;
    }
}
HACK!!! Aber jetzt kannst du das auch mit dem mal machen.
 
Das Video ist privat. Beschreibe den Fehler oder poste Code, das hier ist nicht das "Was könnte irgendjemand bei irgendwas falsch gemacht haben"-Quizforum.
 
🙁 Da will man einem einmal was leichter machen, in dem man gleich ein ganzes Video ( Grulala - YouTube ) schickt, wo man den Fehler sieht und schon meckert wieder jeder 🙁

Also wenn ich sehr viele Coins auf einmal erzeuge, dann stoppt das Programm, und in der Console steht :

Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at Figur.Update(Figur.java:117)
at ImageExample.run(ImageExample.java:65)
at java.lang.Thread.run(Unknown Source)

Wenn irh Code wollt, einfach sagen von welcher Klassse ihr wollt ^^
 
Nun, auf die Idee einen Fehler per Youtube-Video zu beschreiben, wo es ein Stacktrace und ein paar Zeilen code schon tun würden (und viel zielgerichteters Helfen erlauben würden) ist schon abwegig :bahnhof: Wenn du statt des Videos EINE Datei mit dem zusammenkopierten Quellcode gepostet oder auch (wenns sein muss) irgendwo hochgeladen hättest, hättest du am 19.08.2012 um ca. 10:22 schon ein funktionierendes Programm gehabt 😉

Dort wird eine Liste verändert, während darüber iteriert wird (evtl. von zwei verschiedenen Threads, wenn es beim Einfügen passiert). Poste den Code, wo etwas in diese Liste eingefügt wird, und wo sie verwendet wird.
 
Und für die Zukunft: In der Konsole auf den link (!)
at Figur.Update(Figur.java:117)
zu klicken würde dich schon zu der Stelle führen, wo was falsch läuft...
 
Java:
if(e.getKeyCode()== KeyEvent.VK_SPACE){
        	
			if (!space) space = true;
			
			
				Random random = new Random();
				int random1 = random.nextInt(80-(-80)+1)+-80;
				int random2 = random.nextInt(150-(50)+1)+50;
		        Coin coin = new Coin(random.nextInt(161)-80, random.nextInt(101)+50, stone);      
		        coins.add(coin);
			
		}

Da werden die erstellt ^^

Java:
	public void Update()
	{
		for (Coin coin : coins)
		{
			
			coin.Update();
		}

                [...]
       }


geuptdatet ^^

Java:
public void Draw(Graphics g, ImageExample ie)
	{
		
		
		for (Coin coin : coins)
		{
			coin.Draw(g, ie);
		}
		
	}

und gezeichnet ^^

Sonst eigentlich nichts ^^
 
In welchem Thread das "Update" passiert, ist noch ganz klar, aber zumindest ist es nicht der EDT, von daher..... ganz pragmatisch:

Java:
// Wo auch immer:
//List<Coin> coins = new ArrayList<Coin>(); // WEG
List<Coin> coins = Collections.synchronizedList(new ArrayList<Coin>()); // HIN

...



	public void Update()
	{
            synchronized(coins) // synchronized drum
            {
		for (Coin coin : coins)
		{
			
			coin.Update();
		}
           }

                [...]
       }

...
        public void Draw(Graphics g, ImageExample ie)
	{
		
            synchronized(coins) // synchronized drum
            {
		
		for (Coin coin : coins)
		{
			coin.Draw(g, ie);
		}
            }
		
	}
 
Falls das Zeichnen etwas dauert, kann man vorher auch eine (tiefe) Kopie der Objekte anfertigen. Dann kann im Hintergrund sich ruhig schon weiter was dran ändern, das stört beim Zeichnen dann nicht.
 
Okee, vielen Dank Marco. Aber was macht dieses Synchronized ?
Damit ich das später auch mal alleine verwenden kann ^^
 

Neue Themen


Zurück
Oben