Tetris Spielschleife

korbmeister

Aktives Mitglied
Hey Leute versuche mich gerade dabei Tetris zu programmieren nur bei der Spielschleife komm ich nicht ganz weiter, da der Gamespeed ja je nachdem wie viele Punkte man hat sich verändert, auch ein Problem ist, dass manchmal die Tastendrücke dann nicht erkannt werden, und dass es sich einfach nicht flüssig anfühlt. Habt ihr ne Idee wie man das lösen könnte, sodass ich ne Game Loop habe, bei der sich alles flüssig anfühlt, kein Tastendruck verloren geht, die Blöcke gewohnt langsam fallen, man es aber trotzdem schneller machen kann.
Im Moment schaut es so aus :
Java:
public void run() {
		long lastTime = System.nanoTime();
		long timer =  System.currentTimeMillis();
		final double ns = 1000000000.0 / ups;  
		double delta = 0;
		int frames = 0;
		int updates = 0;
		requestFocus();
		
		
	
		
		while(running){
			long now = System.nanoTime();
			delta += (now-lastTime) / ns;			
			lastTime = now;		
			while (delta >= 1){
				update();
				updates++;
				delta--;
			}			
			render();
			frames++;
			
			if (System.currentTimeMillis() - timer > 1000){
				timer += 1000;
				frame.setTitle(  " | " + updates + " ups, " + frames + " fps");
				updates = 0;
				frames = 0;				
			}
		}	
		stop();
	}
	
	public void update(){
		
		logik.update(tastatur);
	}
	
	public void render(){
		BufferStrategy bs = getBufferStrategy();
		if (bs == null){
			createBufferStrategy(2);
			return;
		}
		
		bildschirm.render(logik);
		
		for(int i = 0; i < pixel.length; i++){
			pixel[i] = bildschirm.pixel[i];
		}
		
		Graphics g = bs.getDrawGraphics();			

		
		g.drawImage(image, 0, 0, getWidth(), getHeight(),null);
		
		
		g.dispose();
		bs.show();		
	}
//Die Logik klasse, in der das Ganze spiel halt eigentlich läuft
        public void update(Tastatur tastatur){	
		
				
				
		counter ++;
		if(counter % (20-game_speed) == 0){
			tastatur.update();
			if(!block_aktiv)erstelle_block();
			for(int i = 0; i < Spielfeld.length; i++) Spielfeld[i] = 0;
				
			
		
		update_block();
		
		if(tastatur.right == true && rechts_frei()){
			xPos++;			
		}
		if(tastatur.left == true && links_frei()){
			xPos--;
		}
		if(tastatur.up == true ){
			form++; 
			drehe_block();
		}
//geht noch weiter, aber hat eig nichts mehr mit der Game Loop zu tun
 

Bananabert

Bekanntes Mitglied
Für die Tastenabfrage kann ich meinen Vorrednern nur anschließen.
Für die Geschwindigkeit der Blöcke könntest du die Millisekunden des letzten und des jetzigen Updates subtrahieren und diese auf eine Variable in deiner Block Klasse addieren. Sollte diese Variable größer als 1000 Millisekunden, 800 Millisekunden, 500 Millisekunden ist, fällt der Block um 1 und setzt diese wieder auf 0.
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben