Avatar billede azak Nybegynder
12. oktober 2005 - 22:39 Der er 30 kommentarer og
1 løsning

problem med en random ting

hej med jer
jeg skal lave et projekt i programering på htx og jeg er løbet ind i problemer...opgave lød på at jeg skulle lave en lille animation af en sol som bevægede sig lidt. jeg har valgt at lave 7 billeder af min sol og så kommer problemet, jeg skal have min kode til at skifte tilfældigt mellem de 7 billeder. det er vigtigt at animationen er tidsbegrænset skal det lige siges...her er det jeg er kommet frem til:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;

public class Sol extends JFrame {

    Image offscreenImage;        //Grafikbufferen (baggrundsbillede),
                                  //hvor optegningen skal foregå.
    Graphics offscreen;          //offscreen skal indehold det grafiske indhold
                                  //fra vores grafikbuffer.
    Dimension dim;                //Størrelse, der senere tilknyttes
                                  //formens størrelse.
   
    Random random = new Random();
    int ranNum;
   
    //Konstruktor
    public Sol() {
       
        this.setBackground(Color.WHITE);
       
        //Eventlistener, der lytter på Windowsknappen, der lukker
        //applikationen/programmet
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                System.exit(0);
            }
        });
       
        pack();
        setTitle("Sol projekt - Mathias 2.w");
        setSize(800,600);
       
        //Double buffering/grafikbuffer initialiseringer.
        dim = getSize();
        offscreenImage = createImage(dim.width,dim.height);
        offscreen = offscreenImage.getGraphics();
       
        ImageIcon[] billedserie = new ImageIcon[6];
        // for (int i = 0; i >=6; i++){
        i=1;
                billedserie[i] = new ImageIcon("sol1.jpg");    //billedserie[i] = new ImageIcon("sol" + i + 1 + ".jpg");
        }
    }
   
    public void pause(int ms){
        try {Thread.sleep(ms);} catch (Exception e) {}
    }
   
    public void update(Graphics g){
        paint(g);
    }
   
    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D) g;            //Bruger java 2D
        {   
            //Sletter alt på baggrundsbilledet og giver det farven sort.
            for(int i = 0; i < 20; i++){                  //her har jeg lavet en lykke, så programmet bliver løbet igennem flere gange
                                                        //ved at bruge lykken spare jeg en masse tide og plads på at få programmet til at billederne frem flere gange
                offscreen.setColor(Color.black);
                offscreen.fillRect(0,0, dim.width, dim.height);
               
                ranNum = 1 + random.nextInt(5);
               
                billedserie[ranNum].paintIcon(this,g,1,1);   
                                //Baggrundsbilledet tegnes på skærmen.
               
                pause(100);
            }
        }
    }
   
        //Main-metoden skal altid findes i en applikation.
    public static void main(String[] args){       
        //Main-metoden kalder konstruktoren
            Sol ramme = new Sol(); 
            ramme.show();
        }

fejlen opstår i "public void pause(int ms){" delen men hvad er gået skævt?

på fårhånd tak
Avatar billede mikkelbm Nybegynder
12. oktober 2005 - 22:41 #1
Hvilken fejl får du?
Avatar billede mikkelbm Nybegynder
12. oktober 2005 - 22:43 #2
Og hvis du vil ha' grafik til at flytte sig, vil jeg foreslå at bruge en tråd.
Avatar billede arne_v Ekspert
12. oktober 2005 - 22:44 #3
ImageIcon[] billedserie

skal flytte ud fra constructor og op som instans variabel

// skal fjernes foran for

der mangler en } til sidst

så compiler det !
Avatar billede arne_v Ekspert
12. oktober 2005 - 22:44 #4
men jeg tror også at logikken skal laves om
Avatar billede azak Nybegynder
12. oktober 2005 - 22:56 #5
jeg får en fejl med Class ""Sol"" does not have a main method.
Avatar billede arne_v Ekspert
12. oktober 2005 - 23:02 #6
den har en main
Avatar billede azak Nybegynder
12. oktober 2005 - 23:21 #7
tak arne..
men det med at flytte ImageIcon[] billedserie kan jeg ikke finde du af...
Avatar billede arne_v Ekspert
12. oktober 2005 - 23:31 #8
ImageIcon[] billedserie = new ImageIcon[6];

rettes til

billedserie = new ImageIcon[6];

og

  ImageIcon[] billedserie;

sættes ind oppe under class
Avatar billede mikkelbm Nybegynder
12. oktober 2005 - 23:34 #9
Prøv at kig lidt på det her eksempel:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;

public class Sol extends JFrame implements Runnable
{
    Image offscreenImage;
    Image imageSun;
    Graphics offscreen;
    Random random = new Random();
   
    int x, y, size = 150;
   
    public Sol()
    {
        this.setBackground(Color.WHITE);
       
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
        pack();
        setTitle("Moving sun");
        setSize(800,600);
       
        offscreenImage = createImage(this.getWidth(), this.getHeight());
        offscreen = offscreenImage.getGraphics();
       
        x = (this.getWidth() / 2) - (size / 2);
        y = (int)(this.getHeight() * 0.66);
       
        Thread thread = new Thread (this);
        thread.start();
    }
   
    public void paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D)offscreen;
        g2.setColor(Color.blue);
        g2.fillRect(0, 0, this.getWidth(), (int)(this.getHeight() * 0.66));
       
        g2.setColor(Color.yellow);
        g2.fillOval(x, y, size, size);
       
        g2.setColor(Color.green);
        g2.fillRect(0, (int)(this.getHeight() * 0.66), this.getWidth(), (int)(this.getHeight() * 0.33));
       
        g.drawImage(offscreenImage, 0, 0, this);
    }
   
    public void run ()
    {
        while (y > 50)
        {
            y--;
            repaint ();
            try
            {
                Thread.sleep(10);
            }
            catch (Exception ex) {  }
        }
    }
   
    public static void main(String[] args)
    {       
        Sol ramme = new Sol(); 
        ramme.setVisible(true);
    }
}

Spørg endelig hvis du har nogle spørgsmål til det...
Avatar billede mikkelbm Nybegynder
12. oktober 2005 - 23:37 #10
Hov... Random random = new Random(); var et levn fra din egen kode. Jeg bruger den ikke :)
Avatar billede azak Nybegynder
12. oktober 2005 - 23:55 #11
jeg er gået vidre ad arnes vej og har ud rettet det til


        billedserie = new ImageIcon[6];
        for (int i = 0; i >=6; i++){
        billedserie[i] = new ImageIcon("sol" + i + 1 + ".jpg");

du er der som sådan ikkke nogen fejl i selve koden, der bliver åbnet et vindu osv, men billederne som skal vises kommer ikke med!?
Avatar billede mikkelbm Nybegynder
12. oktober 2005 - 23:58 #12
Har du prøvet mit eksempel? Jeg tror du vil få noget ud af at granske det lidt.
Avatar billede azak Nybegynder
13. oktober 2005 - 00:03 #13
ja jeg har kigget lidt på det, men det jeg har brug for er at få hendet mine 6 billeder ind i programmet i tilfældig række følge...jeg er virkelig ny i det her...!
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 00:17 #14
Så prøv følgende. Det er din egen kode jeg har rettet til så den burde virke.
Jeg har lavet det om til at være en tråd, da det er den eneste måde du kan få noget grafisk til at bevæge sig.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;

public class Sol extends JFrame implements Runnable
{
    Image offscreenImage;        //Grafikbufferen (baggrundsbillede),
                                  //hvor optegningen skal foregå.
    Graphics offscreen;          //offscreen skal indehold det grafiske indhold
                                  //fra vores grafikbuffer.
    Dimension dim;                //Størrelse, der senere tilknyttes
                                  //formens størrelse.
   
    Random random = new Random();
    int ranNum;
    ImageIcon[] billedserie;
   
    //Konstruktor
    public Sol()
    {
        this.setBackground(Color.WHITE);
       
        //Eventlistener, der lytter på Windowsknappen, der lukker
        //applikationen/programmet
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                System.exit(0);
            }
        });
       
        pack();
        setTitle("Sol projekt - Mathias 2.w");
        setSize(800,600);
       
        //Double buffering/grafikbuffer initialiseringer.
        dim = getSize();
        offscreenImage = createImage(dim.width,dim.height);
        offscreen = offscreenImage.getGraphics();
       
        billedserie = new ImageIcon[6];
        for (int i = 0; i < billedserie.length; i++)
        {
            billedserie[i] = new ImageIcon("sol1.jpg");    //billedserie[i] = new ImageIcon("sol" + i + 1 + ".jpg");
        }
       
        Thread thread = new Thread (this);
        thread.start();
    }
   
    public void pause(int ms)
    {
        try {Thread.sleep(ms);} catch (Exception e) {}
    }
   
    public void update(Graphics g)
    {
        paint(g);
    }
   
    public void paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;            //Bruger java 2D
        {
            offscreen.setColor(Color.black);
            offscreen.fillRect(0,0, dim.width, dim.height);

            billedserie[ranNum].paintIcon(this,offscreen,35,35);   
            //Baggrundsbilledet tegnes på skærmen.
           
            g.drawImage(offscreenImage, 0, 0, this);
        }
    }
   
    public void run ()
    {
        while (true)
        {
            ranNum = 1 + random.nextInt(5);
            pause(100);
        }
    }
   
        //Main-metoden skal altid findes i en applikation.
    public static void main(String[] args)
    {       
        //Main-metoden kalder konstruktoren
            Sol ramme = new Sol(); 
            ramme.show();
    }
}
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 00:18 #15
Og så har jeg fjernet dit loop fra paint metoden. Jeg kunne ikke lige forstå din kommentar til hvorfor du havde det loop?
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 00:19 #16
Og igen... Så spørger du bare, hvis der er noget.
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 00:21 #17
Hov... Ser lige jeg mangler en repaint i run metoden før det virker:

while (true)
{
            ranNum = 1 + random.nextInt(5);
            pause(100);
}

Bliver til

while (true)
{
            ranNum = 1 + random.nextInt(5);
            repaint ();
            pause(100);
}
Avatar billede azak Nybegynder
13. oktober 2005 - 00:29 #18
ja nu kommer der da billed på, men det er bare lige det der med at den skal skifte mellem billederne der stadig ikke virker..
Avatar billede azak Nybegynder
13. oktober 2005 - 00:37 #19
jeg her en mistanke om at problemet ligger her:
    billedserie = new ImageIcon[6];
    for (int i = 0; i >=6; i++){
        billedserie[i] = new ImageIcon("sol" + i + 1 + ".jpg");
men hvad er der galt, altså jeg har 6 billeder der skal hentes tilfældigt frem...
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 08:03 #20
Ovenstående burde virke. Men jeg så lige den her:

ranNum = 1 + random.nextInt(5);

Hvor du ligger 1 til. Det skal du ikke, da der så vil komme en Exception

Prøv i stedet:

while (true)
{
    ranNum = random.nextInt(billedserie.length);
    repaint ();
    pause(100);
}


Det virker i hvert fald her ved mig!
Avatar billede arne_v Ekspert
13. oktober 2005 - 08:07 #21
ingen exception - det første billede bliver bare aldrig brugt (billedserie.length er 6 ikke ?)
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 08:12 #22
Nåh jo, havde lige fået ind i hovedet at den var 5 lang.
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 08:16 #23
Ha! Kiggede lige en ekstra gang på forløkken. Og problemet må da ligge i tjekket på 'i'.

billedserie = new ImageIcon[6];
for (int i = 0; i >=6; i++){
    billedserie[i] = new ImageIcon("sol" + i + 1 + ".jpg");

Prøv i stedet:

billedserie = new ImageIcon[6];
for (int i = 0; i < billedserie.length; i++){
    billedserie[i] = new ImageIcon("sol" + i + 1 + ".jpg");


Som jeg også skrev i mit eksempel.
Avatar billede arne_v Ekspert
13. oktober 2005 - 08:20 #24
for (int i = 0; i >=6; i++){

er en super hurtig løkke
Avatar billede azak Nybegynder
13. oktober 2005 - 08:29 #25
mikkelbm den var ikke bedre...den brokker sig ikke helt så meget, men den kan stadig ikke hente billederne frem :O(
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 08:35 #26
Helt så meget? Det virker ved mig.

Hvad får du af fejl?
Avatar billede azak Nybegynder
13. oktober 2005 - 08:37 #27
jeg fik en af mine venner til lige at kigge på det og han fik løst problemet
        billedserie = new ImageIcon[6];
        for (int i = 0; i < billedserie.length; i++){
        String filnavn = ("sol" + ((int)i + 1) + ".jpg");
        billedserie[i] = new ImageIcon(filnavn);
i stedet for at min lykke hentede bille med navnet sol1, sol2 osv. tog den sol11, sol12 og sol13...
men mange tak for hjælpen begge to, i fik lavet det hele lidt mere klart for mig!
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 08:40 #28
Hmm. Og hvad skrev jeg i kommentar: 13/10-2005 08:16:33 ? :)
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 09:19 #29
Arne. Hvis du vil ha' point, så råb lige højt...
Avatar billede mikkelbm Nybegynder
13. oktober 2005 - 09:21 #30
Avatar billede arne_v Ekspert
13. oktober 2005 - 11:16 #31
nej tak

det er dig som har trukket det tunge læs her
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