Avatar billede velle Nybegynder
07. december 2002 - 22:06 Der er 8 kommentarer

Bouncing balls

Jeg har forsøgt at lave en lille applet, hvor fire "bolde" kører rundt på skærmen. Når de rammer kanten preller de af og fortsætter. Programmet virker fint nok ud over at det kører sindsygt langsomt, fuldstændigt vildt langsomt. Jeg ved ikke hvad jeg skal gøre for at få det til at køre hurtigere. Desuden kramper det og ind imellem tager det hele et stort ryk!

Disse point gives til den, som laver et meget basalt applet, der kører flydende og "ikke langsomt!", hvor noget bevæger sig rundt. F.eks. nogle bolde, som i mit applet.

VH Velle
Avatar billede velle Nybegynder
07. december 2002 - 22:18 #1
Jeg tror det er min evne eller mangel på samme til at udnytte mulighederne med threads, der gør, at jeg ikke kan få det til at køre ordentligt.
Avatar billede aslan Nybegynder
07. december 2002 - 22:53 #2
Avatar billede aslan Nybegynder
08. december 2002 - 14:11 #3
Du vil bemærke på dette flydende eksampel at du kan stille farten på tråden via sleep medtoden...

import java.applet.*;
import java.awt.*;

public class BedreHoppeBold extends Applet implements Runnable
{
  Thread runner;
  Image buffer;
  Graphics bufferGfx;

  int x=0, y=0; // bold position
  int t=0; // tidspunkt

  public void start()
  {
    // hvis der ikke er en traad, saa lav en.
    if (runner == null)
    {
      runner = new Thread(this);
      runner.start();
    }
  }//start()

  public void stop()
  {
    // hvis der er en traad, saa stop den.
    if(runner != null)
    {
      runner = null;
    }
  }//stop()

  public void run()
  {
    while(bufferGfx==null)
    {
      try {
      Thread.currentThread().sleep(100);
      } catch(InterruptedException e){}
     
    }

    while(Thread.currentThread()==runner)
    {
       
      t++;
      x = x + 5;
      if (x>256)
      {
        x = -64;
      }

      y = (int)(128 + 64 * Math.sin(t/Math.PI));

      // baggrund
      bufferGfx.setColor(Color.black);
      bufferGfx.fillRect(0, 0, 256, 128);
      bufferGfx.setColor(Color.gray);
      bufferGfx.fillRect(0, 128, 256, 128);


      // bold
      bufferGfx.setColor(Color.red);
      bufferGfx.fillOval(x, y, 64, 64);

      repaint();
      try {
      Thread.currentThread().sleep(200);
      } catch(InterruptedException e) {}
     

    }
  }//run()

  public void paint(Graphics g)
  {
    update(g);
  }//paint()

  public void update(Graphics g)
  {
    if (bufferGfx == null)
    {
      buffer = createImage(256, 256);
      bufferGfx = buffer.getGraphics();
    }
    g.drawImage(buffer, 0, 0, this);

  }//update()

}//BedreHoppeBold
Avatar billede velle Nybegynder
12. december 2002 - 04:53 #4
Jeg beklager at jeg først svarer nu, men jeg har været lidt presset siden jeg skrev indlægget om fik først tid til at teste det nu. Det ser altsammen meget fint ud, men dit program har præcis samme problem som dem jeg selv lavede, dvs. kramper og rykker og kører ujævnt og langsomt. Er det min comp der er fucked? Jeg har en 1ghz pIII med 256mb.

Jeg ville meget gerne give dig de point eftersom du har været så flink rent faktisk at skrive hele koden, men mange ville have givet en lille bitte kort utydelig hentydning. Desværre har det på ingen måde lært mig noget nyt, og jeg gav de 100 point for at få inspiration til hvordan det kunne gøres, så det ville køre glattere og hurtigere.
Avatar billede aslan Nybegynder
12. december 2002 - 13:18 #5
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
Så prøv lige at kigge på det her.....

class Raptor extends JFrame implements KeyListener
{

    Graphics2D g;

    int x=400;
    int y=400;
    int skudXStart1=0;
    int skudYStart1=0;
    int skudXSlut1=0;
    int skudYSlut1=0;
    int skudXStart2=0;
    int skudYStart2=0;
    int skudXSlut2=0;
    int skudYSlut2=0;    
    boolean right,left,space;
    Image raptorImage = null;
   
    Image enemy1 = null;
    int enemy1x = 500;
    int enemy1y = -50;

   
    BufferStrategy bs = null;
    Rectangle bounds = null;
   
    long tid = System.currentTimeMillis();

    Raptor()
    {
        addKeyListener(this);
        setBounds(100,50,800,600);
        bounds = getBounds();
        setVisible(true);
       
        System.out.println(tid);
    }

    private void renderA(Graphics g1)
    {
        g = (Graphics2D) g1;
        g.clearRect(0,0,(int)bounds.getWidth(),(int)bounds.getHeight());
       
        if(raptorImage == null)
        { 
                 
            Image tempImage = new ImageIcon("raptorSmall.gif").getImage();        
            raptorImage = createImage(tempImage.getWidth(null), tempImage.getHeight(null));
            Graphics g = raptorImage.getGraphics();
            g.drawImage(tempImage,0,0,null);
            g.dispose();
           
        }        
        g.drawImage(raptorImage,x,y,this);
        g.setColor(Color.red);
        g.drawLine(skudXStart1,skudYStart1,skudXSlut1,skudYSlut1);
        g.drawLine(skudXStart2,skudYStart2,skudXSlut2,skudYSlut2);        
        if (space)
        {
            skudYStart1-=5;
            skudYSlut1-=5;
            skudYStart2-=5;
            skudYSlut2-=5;
       
            if (skudYStart1 <= 0)
            {
                space = false;
            }
        }
        if (left)
        {
            x -= 1;
        }
        if (right)
        {
            x += 1;
        }
       
    }       
    private void renderB(Graphics g1)
    {
        if(enemy1 == null)
        {
            Image tempImage2 = new ImageIcon("Enemy1.gif").getImage();
            enemy1 = createImage(tempImage2.getWidth(null), tempImage2.getHeight(null));
            Graphics g = enemy1.getGraphics();
            g.drawImage(tempImage2,0,0,null);
            g.dispose();           
        }
        g.drawImage(enemy1,enemy1x,enemy1y,this);
       
        enemy1x-=1;
        enemy1y+=1;   
    }   
    public void run()
    {
        while(true)
        {
          if (bs == null)
          {
              createBufferStrategy(2);
              bs = getBufferStrategy();
          }
          Graphics g = bs.getDrawGraphics();
          renderA(g);     
         
          long nytid = System.currentTimeMillis(); 

          if((nytid-tid)>3000)
          { 
            renderB(g); 
          }       
          bs.show();
           
          g.dispose();
        }
    }
    public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_ESCAPE )
        {
            System.exit(0);
        }
        if(e.getKeyCode() == KeyEvent.VK_LEFT)
        {
            left=true;
        }
        if(e.getKeyCode() == KeyEvent.VK_RIGHT)
        {
            right=true;
        }
        if(e.getKeyCode() == KeyEvent.VK_SPACE)
        {
            if (skudYStart1 <= 0)
            {
                skudXStart1=x+20;
                skudYStart1=y+30;
                skudXSlut1=x+20;
                skudYSlut1=450;
                skudXStart2=x+78;
                skudYStart2=y+30;
                skudXSlut2=x+78;
                skudYSlut2=450;
            }
           
            space=true;

        }
    }
    public void keyReleased(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_LEFT)
        {
          left=false;
        }
        if(e.getKeyCode() == KeyEvent.VK_RIGHT)
        {
          right=false;
        }
        if(e.getKeyCode() == KeyEvent.VK_SPACE)
        {
        }
    }
    public void keyTyped(KeyEvent e){}

    public static void main(String[] aslan)
    {
          new Raptor().run();
    }
}
Avatar billede aslan Nybegynder
12. december 2002 - 13:25 #6
ups... der var jeg for hurtig :-)
Avatar billede velle Nybegynder
13. december 2002 - 16:18 #7
Jeg chekker din kode på fredag/lørdag, beklager at du må vente. Sagen er at jeg vil koncentrer mig om min 3. årsopg i følgende uge, og jeg mange mange mange småting kørende udover dette indlæg, så jeg har valgt at sætte det hele på standby.

VH Thomas Wessel
Avatar billede velle Nybegynder
28. december 2002 - 13:26 #8
ved ikke engang hvordan jeg kører det program!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester