Hallo Leute, ich habe hier einige Probleme:
Ich bin gerade dabei, "MinePlex" zu programmieren, eine 2D-Nachmache von Minecraft!
Die Probleme sind, dass der Spieler flimmert, die gesammte Welt, wenn sich der Spieler bewegt, verschoben überlappt, d.h., es werden Blocks gezeichnet, wo keine sind, ... !
Hier der Quellcode: ( workspace im Anhang! )
Der MainFrame:
Die World:
Der Character:
Und die Credits:
Danke im Voraus!
Ich bin gerade dabei, "MinePlex" zu programmieren, eine 2D-Nachmache von Minecraft!
Die Probleme sind, dass der Spieler flimmert, die gesammte Welt, wenn sich der Spieler bewegt, verschoben überlappt, d.h., es werden Blocks gezeichnet, wo keine sind, ... !
Hier der Quellcode: ( workspace im Anhang! )
Der MainFrame:
Java:
package net.diegamingbrueder.games.MinePlex;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MainFrame extends JFrame implements ActionListener {
// Deklarationen
private static final long serialVersionUID = 1L;
public static JFrame frame;
public static Credits credits;
public static JButton BPlay, BCredits, BExit;
public static World world;
// Konstruktoren
public MainFrame() {
// Frame erzeugen
super( "MinePlex" );
setSize( 200, 200 );
setResizable( false );
setLocationRelativeTo( null );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setIconImage( Toolkit.getDefaultToolkit().getImage( "res/MinePlex/icon.png" ) );
try { setCursor( Toolkit.getDefaultToolkit().createCustomCursor( ImageIO.read( new File( "res/MinePlex/cursor.png" ) ), new Point( 0, 0 ), "MinePlex") ); } catch ( IOException e ) { e.printStackTrace(); }
// Elemente hinzufügen
setLayout( null );
BPlay = new JButton( "Spiel starten" );
BCredits = new JButton( "Credits" );
BExit = new JButton( "Beenden" );
BPlay.addActionListener( this );
BCredits.addActionListener( this );
BExit.addActionListener( this );
BPlay.setBounds( 20, 20, 150, 30 );
BCredits.setBounds( 20, 70, 150, 30 );
BExit.setBounds( 20, 120, 150, 30 );
add( BPlay );
add( BCredits );
add( BExit );
setVisible( true );
}
// Methoden
public static void main( String[] args ) {
frame = new MainFrame();
}
public void actionPerformed( ActionEvent e ) {
if ( e.getSource().equals( MainFrame.BPlay ) ) { world = new World(); } else
if ( e.getSource().equals( MainFrame.BCredits ) ) { credits = new Credits(); } else
if ( e.getSource().equals( MainFrame.BExit ) ) { frame.dispose(); }
}
}
Die World:
Java:
package net.diegamingbrueder.games.MinePlex;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class World extends JFrame implements KeyListener, Runnable, Serializable {
// Deklarationen
private static final long serialVersionUID = 1L;
public static int width = 500, height = 500;
public static Graphics g;
private static BufferedImage chars, blocks, items;
private static ObjectInputStream input;
private static ObjectOutputStream output;
private static int[][] world = new int[ 100 ][ 10 ];
private static Character character;
private static int[][] Items = new int[ world.length ][ world[ 0 ].length ];
public static final int size = 32;
public static int sX = 3, sY = 25;
// Konstruktoren
public World() {
// Frame vorbereiten
super( "MinePlex - Build 1.0.0" );
setSize( width, height );
setResizable( false );
setLocationRelativeTo( null );
setDefaultCloseOperation( JFrame.HIDE_ON_CLOSE );
addKeyListener( this );
setIconImage( Toolkit.getDefaultToolkit().getImage( "res/MinePlex/icon.png" ) );
// Texturen einlesen
try { setCursor( Toolkit.getDefaultToolkit().createCustomCursor( ImageIO.read( new File( "res/MinePlex/cursor.png" ) ), new Point( 0, 0 ), "MinePlex") ); } catch ( IOException e ) { e.printStackTrace(); }
try { chars = ImageIO.read( new File( "res/MinePlex/chars.png" ) ); } catch ( IOException e ) { e.printStackTrace(); }
try { blocks = ImageIO.read( new File( "res/MinePlex/blocks.png" ) ); } catch ( IOException e ) { e.printStackTrace(); }
try { items = ImageIO.read( new File( "res/MinePlex/items.png" ) ); } catch ( IOException e ) { e.printStackTrace(); }
g = getGraphics();
setVisible( true );
load();
new Thread( this ).start();
}
// Methoden
@ Override
public void run() {
while ( true ) {
try { Thread.sleep( 50 ); } catch ( InterruptedException e ) { e.printStackTrace(); }
if ( whichBlock( (int) ( character.x + 0.5 * size ), (int) ( character.y + 2.5 * size ) ) == 0 ) {
character.move( 0, (int) ( 0.5 * size ) );
repaint();
} else {
while ( whichBlock( (int) ( character.x + 0.5 * size ), character.y + 2 * size + 1 ) == 0 ) { character.move( 0, 1 ); }
repaint();
}
}
}
public static int whichBlock( int x, int y ) { x /= size; y /= size; return world[ x ][ y ]; }
public void paint( Graphics g ) {
for ( int x = 0; x < world.length; x++ ) { for ( int y = 0; y < world[ 0 ].length; y++ ) { g.drawImage( blocks, x * size + sX, y * size + sY, x * size + size + sX, y * size + size + sY, world[ x ][ y ] * size, 0, world[ x ][ y ] * size + size, size, null ); } }
g.drawImage( chars, character.x + sX, character.y + sY, character.x + size + sX, character.y + 2 * size + sY, character.g * size, 0, character.g * size + size, 2 * size, null );
for ( int x = 0; x < Items.length; x++ ) { for ( int y = 0; y < Items[ 0 ].length; y++ ) { g.drawImage( items, (int) ( x * size + 0.25 * size + sX ), (int) ( y * size + 0.25 * size + sY ), (int) ( x * size + 0.75 * size + sX ), (int) ( y * size + 0.75 * size + sY ), (int) ( Items[ 0 ][ 0 ] * 0.5 * size ), 0, (int) ( Items[ x ][ y ] * 0.5 * size + 0.5 * size ), (int) ( 0.5 * size ), null ); } }
g.dispose();
}
public static void scroll( int sX, int sY ) { World.sX += sX; World.sY += sY; }
public void load() { // Spielstand laden
if ( new File( "World.MinePlex-World" ).exists() ) {
try {
input = new ObjectInputStream( new BufferedInputStream( new FileInputStream( "World.MinePlex-World" ) ) );
world = (int[][]) input.readObject();
input.close();
} catch ( IOException e ) { e.printStackTrace(); } catch ( ClassNotFoundException e ) { e.printStackTrace(); } finally { if ( input != null ) { try { input.close(); } catch ( IOException e ) { e.printStackTrace(); } } }
input = null;
} else {
for ( int x = 0; x < world.length; x++ ) { for ( int y = 0; y < world[ 0 ].length; y++ ) { if ( x == 0 || y == 0 || x == world.length - 1 || y == world[ 0 ].length - 1 ) { world[ x ][ y ] = 1; } } }
character = new Character( 2 * size, 2 * size );
}
repaint();
}
public void save() { // Spielstand speichern
try {
output = new ObjectOutputStream( new BufferedOutputStream( new FileOutputStream( "World.MinePlex-World" ) ) );
output.writeObject( world );
output.close();
} catch ( IOException e ) { e.printStackTrace(); } finally { if ( output != null ) { try { output.close(); } catch ( IOException e ) { e.printStackTrace(); } } }
output = null;
}
@ Override
public void keyPressed( KeyEvent e ) {
switch ( e.getKeyCode() ) {
case KeyEvent.VK_ESCAPE : dispose(); break;
case KeyEvent.VK_S : save(); break;
case KeyEvent.VK_UP : character.move( 0, -size ); repaint(); break;
case KeyEvent.VK_LEFT : character.move( -size, 0 ); repaint(); break;
case KeyEvent.VK_DOWN : character.move( 0, size ); repaint(); break;
case KeyEvent.VK_RIGHT : character.move( size, 0 ); repaint(); break;
}
}
@ Override
public void keyReleased( KeyEvent e ) {
switch ( e.getKeyCode() ) {
case KeyEvent.VK_ESCAPE : dispose(); break;
case KeyEvent.VK_S : save(); break;
case KeyEvent.VK_UP : character.move( 0, -size ); repaint(); break;
case KeyEvent.VK_LEFT : character.move( -size, 0 ); repaint(); break;
case KeyEvent.VK_DOWN : character.move( 0, size ); repaint(); break;
case KeyEvent.VK_RIGHT : character.move( size, 0 ); repaint(); break;
}
}
@ Override
public void keyTyped( KeyEvent e ) {
switch ( e.getKeyCode() ) {
case KeyEvent.VK_ESCAPE : dispose(); break;
case KeyEvent.VK_S : save(); break;
case KeyEvent.VK_UP : character.move( 0, -size ); repaint(); break;
case KeyEvent.VK_LEFT : character.move( -size, 0 ); repaint(); break;
case KeyEvent.VK_DOWN : character.move( 0, size ); repaint(); break;
case KeyEvent.VK_RIGHT : character.move( size, 0 ); repaint(); break;
}
}
}
Der Character:
Java:
package net.diegamingbrueder.games.MinePlex;
public class Character {
// Deklarationen
public int x, y, g = 1;
// Konstruktoren
public Character( int x, int y ) { this.x = x; this.y = y; }
public void move( int dirX, int dirY ) {
if ( World.whichBlock( (int) ( x + 0.5 * World.size + dirX ), (int) ( y + 2.125 * World.size + dirY ) ) == 0 ) { x += dirX; y += dirY; }
if ( x + World.sX < World.width / 3 ) { World.scroll( ( World.width / 3 ) - ( x + World.sX ), 0 ); }
if ( x + World.sX > World.width * 2 / 3 ) { World.scroll( ( World.width * 2 / 3 ) - ( x + World.sX ), 0 ); }
if ( y + World.sY < World.height / 3 ) { World.scroll( 0, ( World.height / 3 ) - ( y + World.sY ) ); }
if ( y + World.sY > World.height * 2 / 3 ) { World.scroll( 0, ( World.height * 2 / 3 ) - ( y + World.sY ) ); }
}
}
Und die Credits:
Java:
package net.diegamingbrueder.games.MinePlex;
import java.awt.Point;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Credits extends JFrame {
// Deklarationen
private static final long serialVersionUID = 1L;
private static JLabel ProgrammerL, ProgrammerV, TexturesL, TexturesV;
// Konstruktoren
public Credits() {
// Frame vorbereiten
super( "Credits" );
setSize( 250, 120 );
setResizable( false );
setLocationRelativeTo( null );
setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
setIconImage( Toolkit.getDefaultToolkit().getImage( "res/MinePlex/icon.png" ) );
try { setCursor( Toolkit.getDefaultToolkit().createCustomCursor( ImageIO.read( new File( "res/MinePlex/cursor.png" ) ), new Point( 0, 0 ), "MinePlex") ); } catch ( IOException e ) { e.printStackTrace(); }
// Elemente hinzufügen
setLayout( null );
ProgrammerL = new JLabel( "Programmierer: " );
ProgrammerV = new JLabel( "Richtsfeld Robin" );
TexturesL = new JLabel( "Texturen: " );
TexturesV = new JLabel( "Wagner Jonas" );
ProgrammerL.setBounds( 20, 20, 100, 20 );
ProgrammerV.setBounds( 130, 20, 100, 20 );
TexturesL.setBounds( 55, 50, 100, 20 );
TexturesV.setBounds( 130, 50, 100, 20 );
add( ProgrammerL );
add( ProgrammerV );
add( TexturesL );
add( TexturesV );
setVisible( true);
}
}
Danke im Voraus!