# Verrückte Größenverhältnisse



## Androbin (10. Mai 2014)

Hallo Leute,
ich werde noch wahnsinnig und bin gerade dabei, mir die Haare auszuraufen ;(
Hier mein Problem: Zeile 82 ( nachfolgender Code ) spielt verrückt :autsch:


Spoiler: Hier der Code





```

```



Im Anhang habe ich euch einen Screenshot hinterlegt :toll:
PS. 83 & 84 dienen zur Fehlerbehebung und veranschaulichen, wo gezeichnet werden SOLL(TE) !!!


----------



## strußi (10. Mai 2014)

es ist schön, aber leider kein code im spoiler ;-)


----------



## Androbin (10. Mai 2014)

Sorry, hier nochmal


Spoiler: der Code





```
package net.diegamingbrueder.games.DoodleJump;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.sun.xml.internal.ws.api.ResourceLoader;

public class DoodleJump extends JPanel implements KeyListener, MouseMotionListener, Runnable {
	
	// Deklarationen
	
    private static final long serialVersionUID = 1L;
	
    public static final int width = 500, height = 500;
    
    private ArrayList<Rectangle> platforms = new ArrayList<Rectangle>();
    private           Rectangle  doodle;

    public static final double jumpHeight = 50;
    protected int doodlePic = 1;
    
    public static BufferedImage doodles, platformPic;
    public static final int   doodleWidth = 20,   doodleHeight = 50;
    public static final int platformWidth = 50, platformHeight = 20;
    
    // Konstruktoren
    
    public DoodleJump() { }
    
    public DoodleJump( int width, int height ) {
    	
    	try { doodles     = ImageIO.read( ResourceLoader.class.getResource( "/net/diegamingbrueder/games/DoodleJump/res/doodles.png"  ) ); } catch ( IOException e ) { e.printStackTrace(); }
    	try { platformPic = ImageIO.read( ResourceLoader.class.getResource( "/net/diegamingbrueder/games/DoodleJump/res/platform.png" ) ); } catch ( IOException e ) { e.printStackTrace(); }
    	
    	setFocusable( true );
    	setSize( width, height );
    	addKeyListener        ( this );
		addMouseMotionListener( this );
		setVisible( true );
		
		doodle = new Rectangle( ( getWidth() - doodleWidth ) / 2, getHeight() - doodleHeight - 20, doodleWidth, doodleHeight );
		
		new Thread( this ).start();
		
	}
    
    // Methoden
    
    public static void main( String[] args ) {
		
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setSize( width, height );
		frame.setResizable( false );
		frame.setUndecorated( true );
		frame.setLocationRelativeTo( null );
		frame.add( new DoodleJump( width, height ) );
		frame.setVisible( true );
		
	}
    
    @Override
    public void paintComponent( Graphics g ) {
    	
    	super.paintComponent( g );
    	
    	Graphics2D g2 = (Graphics2D) g;
    	
    	for ( int i = 0; i < platforms.size(); i++ ) {
    		g2.drawImage( platformPic, platforms.get( i ).x, platforms.get( i ).y, platformWidth, platformHeight, this ); }
    	
    	g2.drawImage( doodles, doodle.x, doodle.y, doodleWidth, doodleHeight, doodlePic * doodleWidth, 0, doodlePic * doodleWidth + doodleWidth, doodleHeight, this );
    	g2.drawImage( doodles, doodle.x, doodle.y, doodleWidth, doodleHeight, this );
    	g2.drawRect ( doodle.x, doodle.y, doodleWidth, doodleHeight );
    	
    }
    
	@ Override
    public void run() {
		
		int x, y;
		
		while( true ) {
			
			try { Thread.sleep( 10 ); }
			catch ( InterruptedException e ) { e.printStackTrace(); }
			
			if ( doodle.getY() < getHeight() / 2 ) {
				
				x = (int) ( Math.random() *   getWidth ()                             );
				y = (int) ( Math.random() * ( getHeight() - jumpHeight ) - jumpHeight );
				
				platforms.add( new Rectangle( x, y, platformWidth, platformHeight ) );
				
			}
			
			repaint();
			
		}
		
	}
	
	@ Override
	public void mouseDragged( MouseEvent e ) { }
	
	@ Override
	public void mouseMoved  ( MouseEvent e ) {
		
		     if ( e.getX() < doodle.x + doodleWidth / 2 ) doodlePic = 0;
		else if ( e.getX() > doodle.x + doodleWidth / 2 ) doodlePic = 2;
		
		doodle.setLocation( e.getX()  - doodleWidth / 2 , doodle.y );
		
	}
	
	@ Override
	public void keyPressed  (   KeyEvent e ) { switch ( e.getKeyCode() ) { case KeyEvent.VK_ESCAPE : System.exit( 0 ); break; } }
	
	@ Override
	public void keyReleased (   KeyEvent e ) { }
	
	@ Override
	public void keyTyped    (   KeyEvent e ) { }
	
}
```


----------



## Bananabert (21. Mai 2014)

Moin,

hm, so ganz verstehe ich dein Problem nicht, und aus dem Bild wird man auch nicht gerade schlauer.

Beschreib dein Problem mal genauer.


----------



## Androbin (21. Mai 2014)

> ... Beschreib' dein Problem mal genauer. ...


Mein Problem ist folgendes *8*

```
// Der eigentliche, leider fehlerhafte Draw-Aufruf
g2.drawImage( doodles, doodle.x, doodle.y, doodleWidth, doodleHeight, doodlePic * doodleWidth, 0, doodlePic * doodleWidth + doodleWidth, doodleHeight, this );
// Das Bild als ganzes gemalt (kein Bildausschnitt)
g2.drawImage( doodles, doodle.x, doodle.y, doodleWidth, doodleHeight,                                                                                  this );
// Kontroll-Rechteck für den in zu zeichnenden Bereich
g2.drawRect (          doodle.x, doodle.y, doodleWidth, doodleHeight );
```
Der erste Aufruf ist der eigentliche, leider fehlerhafte Draw-Aufruf,
die beiden anderen dienen lediglich zur Kontrolle.
Das Problem besteht darin, dass Java, mein Bild nur dann korrekt zeichnet, wenn ich das zu zeichnende Bild nicht eingrenze, sonst passiert folgendes *8*





Oben links sieht man das fehlerhafte Bild, unten rechts die Kontroll-Version


----------



## Bananabert (21. Mai 2014)

Moin,

alles klar. Ich würde mal "doodleWidth - doodleHeight" ausgeben lassen. Die Werte könnten falsch sein. Da nur das Grüne gezeichnet wird, gehe ich mal davon aus, dass die Source Parameter richtig sind.


----------



## Androbin (21. Mai 2014)

> ... Die Werte könnten falsch sein. ...


Alle Parameter wurden sorgfältigst überprüft,
zum einen über 
	
	
	
	





```
System.out.println();
```
 und
zum anderen über die Kontroll-Zeichnungen


----------



## Bananabert (23. Mai 2014)

Moin,

dann müsstest du mal etwas mehr Code posten oder am besten ein KSKB posten.


----------



## Androbin (23. Mai 2014)

> ... dann müsstest du mal etwas mehr Code posten oder am besten ein KSKB posten. ...


OK, hier der Code *8*


Spoiler: GoogleJump





```
package net.diegamingbrueder.games.GoogleJump;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;
import com.sun.xml.internal.ws.api.*;

public class GoogleJump extends JPanel implements KeyListener, MouseMotionListener, Runnable {
	
	// Deklarationen
	
    private static final long serialVersionUID = 1L;
	
    public static final int width = 500, height = 500;
    
    private ArrayList<Rectangle> platforms = new ArrayList<Rectangle>();
    private           Rectangle  doodle;

    public static final double jumpHeight = 50;
    protected int doodlePic = 1;
    
    public static BufferedImage doodles, platformPic;
    public static final int   doodleWidth = 20,   doodleHeight = 50;
    public static final int platformWidth = 50, platformHeight = 20;
    
    // Konstruktoren
    
    public GoogleJump() { }
    
    public GoogleJump( int width, int height ) {
    	
    	try   { doodles     =     ImageIO.read( ResourceLoader.class.getResource( "/net/diegamingbrueder/games/GoogleJump/res/doodles.png"  ) ); }
    	catch ( IOException e ) { e.printStackTrace(); }
    	
    	try   { platformPic =     ImageIO.read( ResourceLoader.class.getResource( "/net/diegamingbrueder/games/GoogleJump/res/platform.png" ) ); }
    	catch ( IOException e ) { e.printStackTrace(); }
    	
    	setFocusable( true );
    	setSize( width, height );
    	addKeyListener        ( this );
		addMouseMotionListener( this );
		setVisible( true );
		
		doodle = new Rectangle( (int) ( 0.5 * ( getWidth() - doodleWidth ) ), getHeight() - doodleHeight - 20, doodleWidth, doodleHeight );
		
		new Thread( this ).start();
		
	}
    
    // Methoden
    
    public static void main( String[] args ) {
		
		JFrame frame = new JFrame( "GoogleJump" );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setSize( width, height );
		frame.setResizable( false );
		frame.setUndecorated( true );
		frame.setLocationRelativeTo( null );
		frame.add( new GoogleJump( width, height ) );
		frame.setVisible( true );
		
	}
    
    @Override
    public void paintComponent( Graphics g ) {
    	
    	super.paintComponent( g );
    	
    	for ( int i = 0; i < platforms.size(); i++ )
    		g.drawImage( platformPic, platforms.get( i ).x, platforms.get( i ).y, platformWidth, platformHeight, this );
    	
    	g.drawImage( doodles, doodle.x, doodle.y, doodleWidth, doodleHeight, doodlePic * doodleWidth, 0, doodlePic * doodleWidth + doodleWidth, doodleHeight, this );
    	g.drawImage( doodles, doodle.x, doodle.y, doodleWidth, doodleHeight,                                                                                  this );
    	g.drawRect (          doodle.x, doodle.y, doodleWidth, doodleHeight );
    	
    }
    
	@ Override
    public void run() {
		
		int x, y;
		
		while( true ) {
			
			try { Thread.sleep( 40 ); }
			catch ( InterruptedException e ) { e.printStackTrace(); }
			
			if ( doodle.getY() < 0.5 * getHeight() ) {
				
				x = (int) ( Math.random() *   getWidth ()                             );
				y = (int) ( Math.random() * ( getHeight() - jumpHeight ) - jumpHeight );
				
				platforms.add( new Rectangle( x, y, platformWidth, platformHeight ) );
				
			}
			
			repaint();
			
		}
		
	}
	
	@ Override
	public void mouseDragged( MouseEvent e ) { }
	
	@ Override
	public void mouseMoved  ( MouseEvent e ) {
		
		     if ( e.getX() < doodle.x + 0.5 * doodleWidth ) doodlePic = 0;
		else if ( e.getX() > doodle.x + 0.5 * doodleWidth ) doodlePic = 2;
		
		doodle.setLocation( e.getX()  - 0.5 * doodleWidth, (int) doodle.getY() );
		
	}
	
	@ Override
	public void keyPressed  (   KeyEvent e ) {
		
		switch ( e.getKeyCode() ) {
			
			case KeyEvent.VK_ESCAPE :
				
				System.exit( 0 );
				break;
			
		}
		
	}
	
	@ Override
	public void keyReleased (   KeyEvent e ) { }
	
	@ Override
	public void keyTyped    (   KeyEvent e ) { }
	
}
```


----------



## Bananabert (23. Mai 2014)

Moin,

hab es mir gerade mal angeschaut.

Deine Koordinaten für das Zeichnen sind verdreht. Dein dx1/dy1 ist größer als dx2/dy2.

dx1[240] dy1[430] dx2[20] dy2[50] // diese Daten sind Fehlerhaft. Daher das Große Bild.
sx1[20] sy1[0] sx2[40] sy2[50]


----------



## Androbin (23. Mai 2014)

: Bananabert *8*
DANKE, jetzt funktioniert's wieder *8*

```
...
g2.drawImage( doodles, (int) doodle.getX(), (int) doodle.getY(), (int) doodle.getX() + doodleWidth, (int) doodle.getY() + doodleHeight,
	doodlePic * doodleWidth, 0, doodlePic * doodleWidth + doodleWidth, doodleHeight, this );
...
```


----------



## Joose (23. Mai 2014)

Androbin hat gesagt.:


> : Bananabert *8*
> DANKE, jetzt funktioniert's wieder *8*



[OT]
Gibt es einen Grund warum du immer wieder -> *8* <- mittem im Text einbaust?
[/OT]


----------



## Androbin (23. Mai 2014)

: Joose *8*


> ... Gibt es einen Grund warum du immer wieder -> *8* <- mittem im Text einbaust? ...


Ja, die fett-gedruckte "*8*" soll einen Doppel-Punkt darstellen !!!


----------



## Joose (23. Mai 2014)

Androbin hat gesagt.:


> : Joose *8*
> 
> Ja, die fett-gedruckte "*8*" soll einen Doppel-Punkt darstellen !!!



Und warum schreibst du nicht einfach *:*?


----------

