Verrückte Größenverhältnisse

Androbin

Bekanntes Mitglied
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:
Java:
Im Anhang habe ich euch einen Screenshot hinterlegt :toll:
PS. 83 & 84 dienen zur Fehlerbehebung und veranschaulichen, wo gezeichnet werden SOLL(TE) !!!
 

Anhänge

  • Screenshot.bmp
    5,2 KB · Aufrufe: 47

Androbin

Bekanntes Mitglied
Sorry, hier nochmal
Java:
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

Bekanntes Mitglied
Moin,

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

Beschreib dein Problem mal genauer.
 
Zuletzt bearbeitet:

Androbin

Bekanntes Mitglied
... Beschreib' dein Problem mal genauer. ...
Mein Problem ist folgendes 8
Java:
// 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
6235d1399736089-verrueckte-groessenverhaeltnisse-screenshot.bmp

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

Bananabert

Bekanntes Mitglied
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

Bekanntes Mitglied
... dann müsstest du mal etwas mehr Code posten oder am besten ein KSKB posten. ...
OK, hier der Code 8
Java:
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 ) { }
	
}
 
Zuletzt bearbeitet:

Bananabert

Bekanntes Mitglied
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

Bekanntes Mitglied
:mad:: Bananabert 8
DANKE, jetzt funktioniert's wieder 8
Java:
...
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 );
...
 

Ähnliche Java Themen

Neue Themen


Oben