Moinsen,
ich habe ne Frage, und zwar weiss ich da im Moment echt nicht mehr weiter, auch etliche Forenbeiträge etc. haben mir (nur teilweise) weitergeholfen. Deswegen frag ich jetzt mal in die Runde. Ich bin dabei (um endlich in Java besser zu werden), ein Spiel zu programmieren.
Im Augenblick bewegt sich nur ein roter Balken im Spiel, d.h. linke Pfeiltaste bewegt sich nach links, rechts ist klar.
Nun hab ich das Problem, das die CPU Auslastung natürlich extrem hoch ist , wegen der Endlosschleife, und das ganze Spiel nicht so recht flüssig läuft. Des weiteren hab ich Schlirren auf dem Bildschirm beim Bewegen.
Hat jemand ne Idee?
gameLoop() ist die Schleife und stösst bei jedem Durchlauf moveMouth an und zeichnet danach das Spiel (der Mund, ist dann ein Bild)
Die Funktion breeze() ist zu ignorieren.
ticks, sind die Zeiteinheiten seit dem letztem Durchlauf
ich habe ne Frage, und zwar weiss ich da im Moment echt nicht mehr weiter, auch etliche Forenbeiträge etc. haben mir (nur teilweise) weitergeholfen. Deswegen frag ich jetzt mal in die Runde. Ich bin dabei (um endlich in Java besser zu werden), ein Spiel zu programmieren.
Im Augenblick bewegt sich nur ein roter Balken im Spiel, d.h. linke Pfeiltaste bewegt sich nach links, rechts ist klar.
Nun hab ich das Problem, das die CPU Auslastung natürlich extrem hoch ist , wegen der Endlosschleife, und das ganze Spiel nicht so recht flüssig läuft. Des weiteren hab ich Schlirren auf dem Bildschirm beim Bewegen.
Hat jemand ne Idee?
gameLoop() ist die Schleife und stösst bei jedem Durchlauf moveMouth an und zeichnet danach das Spiel (der Mund, ist dann ein Bild)
Die Funktion breeze() ist zu ignorieren.
ticks, sind die Zeiteinheiten seit dem letztem Durchlauf
Java:
/**
*
* Beschreibung
*
* @version 1.0 vom 31.10.2010
* @author
*/
import java.awt.image.*;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.io.*;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
public class Torte extends JFrame {
// Anfang Attribute
double mouthPos;
int mouthWidth=100;
BufferedImage mouthImage;
int windowWidth=600;
int windowHeight=600;
// Ende Attribute
int airMouth=0;
int airLung=400;
final int airLungMax=400;
final int airMouthMax=100;
final int barMaxSize=200;
boolean keyLeftPressed=false;
boolean keyRightPressed=false;
boolean keySpacePressed=false;
boolean gameRunning=true;
int fps;
BufferStrategy bf;
public Torte(String title) {
super(title);
// Init
mouthPos=windowWidth/2-mouthWidth/2;
try{
mouthImage = ImageIO.read( new File( "mouth.png" ) );
}catch(Exception E){
System.out.println(E.getMessage());
}
// Frame-Initialisierung
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) { gameRunning=false;dispose(); }
});
addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
checkKey(e.getKeyCode(),true);
}
public void keyReleased(KeyEvent e) {
checkKey(e.getKeyCode(),false);
}
public void keyTyped(KeyEvent e) {
}
});
setSize(600,600);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setResizable(false);
setVisible(true);
createBufferStrategy(2);
bf=this.getBufferStrategy();
gameLoop();
}
public void gameLoop(){
long lastTick=System.nanoTime();
long currentTick=System.nanoTime();
long ticks=0;
while(gameRunning){
currentTick = System.nanoTime();
ticks = (currentTick - lastTick);
lastTick=currentTick;
fps = (int) (((long) 1e9)/(ticks));
moveMouth(ticks);
drawGame();
}
}
public void checkKey(int keyCode,boolean pressed){
switch(keyCode){
case 32:
keySpacePressed=pressed;
break;
case 37:
keyLeftPressed=pressed;
break;
case 39:
keyRightPressed=pressed;
break;
}
}
public void drawGame(){
Graphics g = null;
g = bf.getDrawGraphics();
g.setColor( new Color(255, 255, 255) );
g.fillRect( 1, 1, windowWidth , windowHeight);
int tmp;
if(airLung>0){
tmp=barMaxSize/(airLungMax/airLung);
}else{
tmp=0;
}
g.setColor( new Color(0, 255, 0) );
g.fillRect( 11, 40, tmp , 20);
g.setColor( new Color(255, 0 , 0) );
if(airMouth>0){
tmp=barMaxSize/(airMouthMax/airMouth);
}else{
tmp=0;
}
g.fillRect( 11, 70, tmp, 20);
g.setColor( Color.BLACK );
g.drawRect(10,39, barMaxSize+1, 21);
g.drawRect(10,69, barMaxSize+1, 21);
g.drawImage(mouthImage, (int) mouthPos, 120, null);
g.dispose();
bf.show();
Toolkit.getDefaultToolkit().sync();
}
public void breeze(){
if(keySpacePressed){
if(airMouth < airMouthMax){
airMouth++;
}
}
}
public void moveMouth(long ticks){
if(keyLeftPressed){
mouthPos-=ticks/3000000.0;
if(mouthPos < 1){
mouthPos=1;
}
}else if(keyRightPressed){
mouthPos+=ticks/3000000.0;
if(mouthPos > getSize().width-mouthWidth){
mouthPos=getSize().width-mouthWidth;
}
}
}
public static void main(String[] args) {
new Torte("Torte");
}
}