bufferstrategy zu schnell

meinname1

Grünschnabel
Hallo,
ich habe ein kleines Snake-Programm geschrieben, das eigentlich keine Fehler hat und ganz gut klappt. Würde es nur langsamer laufen - wenn ich auf "Spiel starten" drücke, sehe ich so ca. eine halbe Sekunde, wie die Snake an meinem Bildschirm vorbeisaust und dann hab ich schon verloren. Ich habe das jetzt erstmal mit einem normalen Thread.sleep probiert - das laggt aber ein bisschen, könnt ihr mir weiterhelfen?
Das Programm ist wahrscheinlich schwer verständlich, bin ja auch noch jung :)
Java:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferStrategy;
import java.util.concurrent.ExecutorService;

import javax.swing.*;

import java.util.concurrent.Executors;

public class snake extends JFrame
{
	BufferStrategy bufferStrategy;
	final ExecutorService executorService = Executors.newFixedThreadPool(1);
	final Dimension currentWindowSize;
	boolean shouldExitGame;
	boolean keyUpPressed;
	boolean keyDownPressed;
	boolean keyRightPressed;
	boolean keyLeftPressed;
	Image hintergrund = Toolkit.getDefaultToolkit().getImage(getClass().getResource("hintergrund.png"));
	Image snake_kopf_hoch = Toolkit.getDefaultToolkit().getImage(getClass().getResource("snake_kopf_hoch.png"));
	Image snake_kopf_links = Toolkit.getDefaultToolkit().getImage(getClass().getResource("snake_kopf_links.png"));
	Image snake_kopf_rechts = Toolkit.getDefaultToolkit().getImage(getClass().getResource("snake_kopf_rechts.png"));
	Image snake_kopf_runter = Toolkit.getDefaultToolkit().getImage(getClass().getResource("snake_kopf_runter.png"));
	Image snake_rumpf = Toolkit.getDefaultToolkit().getImage(getClass().getResource("snake_rumpf.png"));
	Image kirsche = Toolkit.getDefaultToolkit().getImage(getClass().getResource("kirsche.png"));
	Image menu_hintergrund = Toolkit.getDefaultToolkit().getImage(getClass().getResource("menu_hintergrund.png"));
	Image rahmen = Toolkit.getDefaultToolkit().getImage(getClass().getResource("rahmen.png"));
	Image rahmen_active = Toolkit.getDefaultToolkit().getImage(getClass().getResource("rahmen_active.png"));
	int xsnake = 0;
	int ysnake = 280;
	int richtung = 0;
	int richtung_neu = 0;
	int teile = 3;
	int rumpf_richtung[] = new int[301];
	int rumpf_xsnake[] = new int[301];
	int rumpf_ysnake[] = new int[301];
	int neuefruchtx[] = new int[301];
	int neuefruchty[] = new int[301];
	int neuefruchtteile;
	int essen = 1;
	int essenx = 400;
	int esseny = 280;
	int einz_vierzig = 0;
	int mouse_x;
	int mouse_y;
	int mousedown;
	int i;
	int e;
	int xbild;
	int ybild;
	String hi = "";
	String menu_weiter = "";
	String einstellungen_weiter = "";
	String credits_weiter = "";
	String maus_on_klick = "";
	public int teilepruefen(int x, int y, int teile)
	{
		int i = teile;
		int e = 0;
		while(i > 0)
		{
			if(rumpf_xsnake[i] == x && rumpf_ysnake[i] == y)
				e = 1;
			i=i-1;
		}
		if(xsnake == x && ysnake == y)
			e = 1;
		return e;
	}
	
	Runnable gameLoop = new Runnable()
	{
		public void run()
		{
			while(!shouldExitGame)
			{
				processKeys();
				drawCene();
			}
			shutdown();
		}
	};
	
	public snake()
	{
		rumpf_richtung[1] = 0;
		rumpf_richtung[2] = 0;
		rumpf_richtung[3] = 0;
		rumpf_xsnake[1] = -40;
		rumpf_xsnake[2] = -80;
		rumpf_xsnake[3] = -120;
		rumpf_ysnake[1] = 280;
		rumpf_ysnake[2] = 280;
		rumpf_ysnake[3] = 280;
		
		this.setLayout(null);
		this.setSize(800,600);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setVisible(true);
		currentWindowSize = getSize();
		createBufferStrategy(2);
		bufferStrategy = getBufferStrategy();
		
		addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				switch(e.getKeyCode())
				{
				case KeyEvent.VK_UP:
					keyUpPressed = true;
					break;
				case KeyEvent.VK_DOWN:
					keyDownPressed = true;
					break;
				case KeyEvent.VK_LEFT:
					keyLeftPressed = true;
					break;
				case KeyEvent.VK_RIGHT:
					keyRightPressed = true;
					break;
				case KeyEvent.VK_ESCAPE:
					shouldExitGame = true;
					break;
				}
			}
			
			public void keyReleased(KeyEvent e)
			{
				switch(e.getKeyCode())
				{
				case KeyEvent.VK_UP:
					keyUpPressed = false;
					break;
				case KeyEvent.VK_DOWN:
					keyDownPressed = false;
					break;
				case KeyEvent.VK_LEFT:
					keyLeftPressed = false;
					break;
				case KeyEvent.VK_RIGHT:
					keyRightPressed = false;
					break;
				}
			}
		});
		
		addMouseMotionListener(new MouseMotionAdapter()
		{
			public void mouseMoved(final MouseEvent e)
			{
				mouse_x = e.getX();
				mouse_y = e.getY();
			}
			public void mouseDragged(final MouseEvent e)
			{
				mouse_x = e.getX();
				mouse_y = e.getY();
			}
			
		});
		
		addMouseListener(new MouseListener()
		{
			public void mouseClicked(MouseEvent e)
			{}
			
			public void mouseEntered(MouseEvent e)
			{}
			
			public void mouseExited(MouseEvent e)
			{}
			
			public void mousePressed(MouseEvent e)
			{
				mousedown = 1;
			}
			
			public void mouseReleased(MouseEvent e)
			{
				mousedown = 0;
			}
		});
	}
	
	protected void processKeys()
	{
		if(keyUpPressed)
		{
			if(richtung != 3)
				richtung_neu = 1;
		}
		if(keyDownPressed)
		{
			if(richtung != 1)
				richtung_neu = 3;
		}
		if(keyRightPressed)
		{
			if(richtung != 2)
				richtung_neu = 0;
		}
		if(keyLeftPressed)
		{
			if(richtung != 0)
				richtung_neu = 2;
		}
		
	}
	
	private void drawCene()
	{
		Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics();
		Font font = new Font("Arial", Font.BOLD, 20);
		g.setFont(font);
		if(menu_weiter.isEmpty())
		{
			g.drawImage(menu_hintergrund,0,0,this);
			g.drawImage(rahmen,200,270,this);
			g.drawImage(rahmen,200,340,this);
			g.drawImage(rahmen,200,410,this);
			g.drawImage(rahmen,200,480,this);
			
			if(mouse_x > 200 && mouse_x < 600 && mouse_y > 270 && mouse_y < 300)
				g.drawImage(rahmen_active,200,270,this);
			if(mouse_x > 200 && mouse_x < 600 && mouse_y > 340 && mouse_y < 370)
				g.drawImage(rahmen_active,200,340,this);
			if(mouse_x > 200 && mouse_x < 600 && mouse_y > 410 && mouse_y < 440)
				g.drawImage(rahmen_active,200,410,this);
			if(mouse_x > 200 && mouse_x < 600 && mouse_y > 480 && mouse_y < 510)
				g.drawImage(rahmen_active,200,480,this);
			
			g.drawString("Spiel starten",400,285);
			g.drawString("Einstellungen",400,355);
			g.drawString("Credits",400,425);
			g.drawString("Beenden",400,495);
			
			g.drawString(menu_weiter,200,40);
			
			if(mousedown == 1)
			{
				if(mouse_x > 200 && mouse_x < 600 && mouse_y > 270 && mouse_y < 300)
					maus_on_klick = "starten";
				else if(mouse_x > 200 && mouse_x < 600 && mouse_y > 340 && mouse_y < 370)
					maus_on_klick = "einstellungen";
				else if(mouse_x > 200 && mouse_x < 600 && mouse_y > 410 && mouse_y < 440)
					maus_on_klick = "credits";
				else if(mouse_x > 200 && mouse_x < 600 && mouse_y > 480 && mouse_y < 510)
					maus_on_klick = "end";
				else
					maus_on_klick = "";
			}else if(!(maus_on_klick.isEmpty()))
			{
					if(maus_on_klick.contains("end"))
						shouldExitGame = true;
					else
					{
						menu_weiter = maus_on_klick;
						maus_on_klick = "";
					}
			}
		}
		
		if(menu_weiter.contains("starten"))
		{
			g.drawImage(hintergrund,0,0,this);
			if(essen == 1)
				g.drawImage(kirsche,essenx,esseny,this);
			i = teile;
			while(i>0)
			{
				g.drawImage(snake_rumpf,rumpf_xsnake[i],rumpf_ysnake[i],this);
				i--;
			}
			if(richtung == 0)
				g.drawImage(snake_kopf_rechts,xsnake,ysnake,this);
			else if(richtung == 1)
				g.drawImage(snake_kopf_hoch,xsnake,ysnake,this);
			else if(richtung == 2)
				g.drawImage(snake_kopf_links,xsnake,ysnake,this);
			else if(richtung == 3)
				g.drawImage(snake_kopf_runter,xsnake,ysnake,this);
			
			if(xsnake == essenx && ysnake == esseny)
			{
				teile++;
				if(rumpf_richtung[teile-1] == 0)
				{
					rumpf_xsnake[teile] = rumpf_xsnake[teile-1]-40;
					rumpf_ysnake[teile] = rumpf_ysnake[teile-1];
				} else if(rumpf_richtung[teile-1] == 1)
				{
					rumpf_xsnake[teile] = rumpf_xsnake[teile-1];
					rumpf_ysnake[teile] = rumpf_ysnake[teile-1]+40;
				} else if(rumpf_richtung[teile-1] == 2)
				{
					rumpf_xsnake[teile] = rumpf_xsnake[teile-1]+40;
					rumpf_ysnake[teile] = rumpf_ysnake[teile-1];
				} else if(rumpf_richtung[teile-1] == 3)
				{
					rumpf_xsnake[teile] = rumpf_xsnake[teile-1];
					rumpf_ysnake[teile] = rumpf_ysnake[teile-1]-40;
				}
				xbild = 760;
				neuefruchtteile = 0;
				while(xbild > -1)
				{
					ybild = 560;
					while(ybild > -1)
					{
						e = teilepruefen(xbild,ybild,teile);
						if(e==0)
						{
							neuefruchtteile++;
							neuefruchtx[neuefruchtteile]=xbild;
							neuefruchty[neuefruchtteile]=ybild;
						}
						ybild=ybild-40;
					}
					xbild=xbild-40;
				}
				i = (int) ((Math.random()*neuefruchtteile)+1);
				essenx = neuefruchtx[i];
				esseny = neuefruchty[i];
			}
			
			if(xsnake % 40 == 0 && ysnake % 40 == 0)
			{
				i = teile;
				rumpf_richtung[0] = richtung;
				while(i>0)
				{
					rumpf_richtung[i] = rumpf_richtung[i-1];
					i--;
				}
				
				richtung = richtung_neu;
			}
			
			if(richtung == 0)
				xsnake++;
			else if(richtung == 1)
				ysnake--;
			else if(richtung == 2)
				xsnake--;
			else if(richtung == 3)
				ysnake++;
			
			i = teile;
			while(i>0)
			{
				if(rumpf_richtung[i] == 0)
					rumpf_xsnake[i]++;
				else if(rumpf_richtung[i] == 1)
					rumpf_ysnake[i]--;
				else if(rumpf_richtung[i] == 2)
					rumpf_xsnake[i]--;
				else if(rumpf_richtung[i] == 3)
					rumpf_ysnake[i]++;
				i--;
			}
			
			i = teile;
			e = 0;
			while(i>0)
			{
				if(rumpf_xsnake[i] == xsnake && rumpf_ysnake[i] == ysnake)
					e = 1;
				i--;
			}
			if(xsnake < 0 || xsnake > 760 || ysnake < 0 || ysnake > 560 || e == 1)
			{
				menu_weiter = "";
				xsnake = 0;
				ysnake = 280;
				richtung = 0;
				richtung_neu = 0;
				teile = 3;
				i = 300;
				while(i>-1)
				{
					rumpf_richtung[i] = 0;
					rumpf_xsnake[i] = 0;
					rumpf_ysnake[i] = 0;
					neuefruchtx[i] = 0;
					neuefruchty[i] = 0;
					i--;
				}
				rumpf_richtung[1]=0;
				rumpf_richtung[2]=0;
				rumpf_richtung[3]=0;
				rumpf_xsnake[1]=-40;
				rumpf_xsnake[2]=-80;
				rumpf_xsnake[3]=-120;
				rumpf_ysnake[1]=280;
				rumpf_ysnake[2]=280;
				rumpf_ysnake[3]=280;
				essen = 1;
				essenx = 400;
				esseny = 280;
				einz_vierzig = 0;
			}
			
			//try {
			//    Thread.sleep(10);
			//} catch(InterruptedException ex) {
			//    Thread.currentThread().interrupt();
			//}
		}else if(menu_weiter.contains("einstellungen"))
		{
			einstellungen_weiter = "";
				g.drawImage(menu_hintergrund,0,0,this);
				g.drawImage(rahmen,200,500,this);
				g.drawString("Einstellungen noch nicht vorhanden", 400, 300);
				
				if(mouse_x > 200 && mouse_x < 600 && mouse_y > 500 && mouse_y < 530)
					g.drawImage(rahmen_active,200,500,this);
				g.drawString("speichern",400,515);
				
				if(mousedown == 1)
				{
					if(mouse_x > 200 && mouse_x < 600 && mouse_y > 500 && mouse_y < 530)
						maus_on_klick = "speichern";
					else
						maus_on_klick = "";
				}else if(!(maus_on_klick.isEmpty()))
				{
					einstellungen_weiter = maus_on_klick;
					maus_on_klick = "";
				}
				
				if(einstellungen_weiter.contains("speichern"))
					menu_weiter = "";
		}else if(menu_weiter.contains("credits"))
		{
				g.drawImage(menu_hintergrund,0,0,this);
				g.drawImage(rahmen,200,500,this);
				g.drawString("Made by Max Tröger", 400, 300);
				
				if(mouse_x > 200 && mouse_x < 600 && mouse_y > 500 && mouse_y < 530)
					g.drawImage(rahmen_active,200,500,this);
				g.drawString("zurück",400,515);
				
				if(mousedown == 1)
				{
					if(mouse_x > 200 && mouse_x < 600 && mouse_y > 500 && mouse_y < 530)
						maus_on_klick = "zurück";
					else
						maus_on_klick = "";
				}else if(!(maus_on_klick.isEmpty()))
				{
					credits_weiter = maus_on_klick;
					maus_on_klick = "";
				}
				
				if(credits_weiter.contains("zurück"))
					menu_weiter = "";
		}
		
		g.dispose();
		bufferStrategy.show();
	}
	
	private void shutdown()
	{
		executorService.shutdown();
		System.exit(0);
	}
	
	public static void main(String[] args)
	{
		new snake().start();
	}
	
	private void start()
	{
		executorService.execute(gameLoop);
	}
}
 
Zuletzt bearbeitet von einem Moderator: