obrazki w apletach

0

wiem ze to bylo juz wiele razy wiec przepraszam!
oto kod:

/**

  • @(#)test1.java
  • test1 Applet application
  • @Author
  • @version 1.00 2008/9/28
    */

import java.awt.;
import java.applet.
;
import java.awt.Image;
import java.net.URL;

public class test2 extends Applet {

private Image dbImage;
private Graphics dbg;
float rad,value;
Image img;
public void digitd(double vd,int x,int y,Graphics g)
{
g.drawString(String.valueOf(vd),x,y);
}
public void digitf(float vf,int x,int y,Graphics g)
{
g.drawString(String.valueOf(vf),x,y);
}
public void digiti(int vi,int x,int y,Graphics g)
{
g.drawString(String.valueOf(vi),x,y);
}
/*public static byte[] imageToByteArray(Image image) {

  MediaTracker tracker = new MediaTracker(new Container());
  tracker.addImage(image, 0);
  try {
      tracker.waitForAll();
  }
  catch(InterruptedException e) { }
  BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), 1);
  Graphics gc = bufferedImage.createGraphics();
  gc.drawImage(image, 0, 0, null);
  
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  ImageIO.write(bufferedImage, "jpeg", bos);

  return bos.toByteArray();
}*/

//BufferedImage bufor=(BufferedImage)createImage(img.getWidth(null),img.getHeight(null));

public void init() 
{
	setBackground (Color.black);
	value=0;	
	rad=(float)3.141592653/180;	
}

public void run ()
{
		
}
public void paint(Graphics g) {
	value+=0.1;	
		
	g.setColor(Color.green);		
	float beta=value*rad;
	int x=Math.round(160+100*(float)Math.sin(beta));
	int y=Math.round(100+100*(float)Math.cos(beta));

	img=getImage(getDocumentBase(),"plika.jpg");


    

	g.drawImage(img,x,y,this);
	g.drawString("BH is live!",x,y);
			
	repaint();	
	
}

public void update (Graphics g)
{
	//DoubleBuffers
	if (dbImage == null)
	{
		dbImage = createImage (this.getSize().width, this.getSize().height);
		dbg = dbImage.getGraphics ();
	}
	dbg.setColor (getBackground ());
	dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
	dbg.setColor (getForeground());
	paint (dbg);
	g.drawImage (dbImage, 0, 0, this);
}

}

przeszukalem tematy z obrazkami w apletach i nic nie pomoglo,
na komputerze dziala, ale po zaladowaniu na strone obrazek sie nie wczytuje
probowalem roznymi sposobami np:

URL url = getClass().getResource("plika.jpg");
img = getToolkit().getImage(url);

img = Toolkit.getDefaultToolkit().getImage("plika.jpg");

URL url = this.getClass().getResource("plika.jpg");
img = this.getImage(url);

powiem tylko ze obrazek znajduje sie w glownym katalogu a adres www to X.w8w.pl, nie wiem czy to moze jest wina czasem w8w.pl, pomocy!

0

mialem kiedys podobny problem i znalazlem takie rozwiazanie, moze tobie tez pomoze.
U mnie to tak wygladalo:

ImageIcon icon  = new ImageIcon(loadImageResource("obrazek.jpg"));

public Image loadImageResource(String resname)
         throws IOException
         {
           Image ret = null;
           Class clazz = getClass();
           InputStream is = clazz.getResourceAsStream(resname);
            if (is != null) {
             byte[] buffer = new byte[0];
             byte[] tmpbuf = new byte[1024];
             while (true) {
               int len = is.read(tmpbuf);
               if (len <= 0) {
                 break;
               }
               byte[] newbuf = new byte[buffer.length + len];
               System.arraycopy(buffer, 0, newbuf, 0, buffer.length);
               System.arraycopy(tmpbuf, 0, newbuf, buffer.length, len);
               buffer = newbuf;
             }
             //create image
             ret = Toolkit.getDefaultToolkit().createImage(buffer);
             is.close();
           }
           return ret;
         }

dodatkowa funkcja loadImageResource, ale u mnie to akurat dzialalo.

0

jeszcze jedno, poniewaz od paru dni ucze sie javy i nie wiem jakie dodac tzw "zalaczniki" np
import java.awt.*;
ps:jak sie to nazywa?

jak pisze w vc++6.0 juz pare lat to wiem co dodac wiec prosze o wyrozumialos a w tym jestem total zielony.

--------------------Configuration: test2 - JDK version 1.6.0_07 <Default> - <Default>--------------------
E:\JAVA_MOJE_FAQ\test2\src\test2.java cannot find symbol
symbol : class ImageIcon
location: class test2
ImageIcon icon = new ImageIcon(loadImageResource("obrazek.jpg"));
^
E:\JAVA_MOJE_FAQ\test2\src\test2.java cannot find symbol
symbol : class IOException
location: class test2
throws IOException
^
E:\JAVA_MOJE_FAQ\test2\src\test2.java cannot find symbol
symbol : class ImageIcon
location: class test2
ImageIcon icon = new ImageIcon(loadImageResource("obrazek.jpg"));
^
E:\JAVA_MOJE_FAQ\test2\src\test2.java cannot find symbol
symbol : class InputStream
location: class test2
InputStream is = clazz.getResourceAsStream(resname);
^
4 errors

0

import javax.swing.ImageIcon;
import java.io.IOException;
import java.io.InputStream;

0

jesli ktos jest ciekaw co bylo wiec pisze:
rozroznianie duzych i malych liter plus dodanie '/'

np xxx.w8w.pl//plika.JPG

i dziala przez getDocumentBase();

0

Z tym, że plik musi być fizycznie w miejscu gdzie jest html, a nie w miejscu gdzie siedzi sobie aplet - a to nie musi być ta sama lokacja (obrazki często warto wrzucać sobie do podkatalogu od lokacji apletu). Ten drugi przypadek uzyskuje się przez getCodeBase(), a konkretnie przez new URL(getCodeBase(), nazwa_pliku);

Dodatkowo jeżeli ktoś chce użyć ten sam kod zarówno jako samodzielny program oraz jako aplet (aplet może być użyty jako panel w JFrame), to warto sobie zdefiniować taką metodę:

class MyApplet extends JApplet
{
/...
public URL getCodeBase()
{	//próbuje uzyskać dostęp do katalogu klasycznie wczytanej klasy apletu
	URL folder = this.getClass().getResource("."); 
	if(folder == null) //klasę wczytała przeglądarka lub appletviewer
		folder = super.getCodeBase(); //uzyskanie dostępu przez metodę apletu
	return folder;
}
//...
URL folderApletu = getCodeBase(); //zadziała zawsze
}

A potem normalnie używać do budowania URL najróżniejszych plików, które znajdować się mogą w katalogu apletu/programu lub dowolnym z podkatalogów.

0

Uważam, że obrazki dla apletu winny być w pliku jar

<applet code="MojAplet" archive="MojeArchiwum.jar" ...>
</applet>

Odczytuję się je tak samo

Image img=getImage(getCodeBase(),"images/ayers.jpg");

(w pliku jar winien być podkatalog images)
ale jest mniejszy ruch w sieci - tylko jedno żądanie.
pozdrawiam

0

ale nie rozumiem czemu tam jest taka durnowatość, że np:
index jest http://#####.w8w.pl/index.htm
a obrazek http://#####.w8w.pl//plika.JPG

przez to trzeba przeszukiwać fora i traci czas jak ktoś uczy się czegoś nowego.

0

Umieszczanie doskonale spakowanych plików obrazów (oraz filmów) w jednym pliku, to moim zdaniem jeden z powodów dla których programy w Javie są nazywane zakałą wydajności. Co z tego, że minimalizujemy ilość żądań sieciowych, skoro ucinamy sobie możliwość wczytywania równoległego? Kto powiedział, że łącze musi być tak niewydajne, że nie obsłuży wielokrotnych żądań? To moim zdaniem samoograniczanie. Dodatkowo pakowanie spakowanych mediów do pakowarki nie ma żadnego uzasadnienia z punktu widzenia ani odporności na błędy sieciowe, ani przesyłania mniejszej ilości danych (a jest wręcz odwrotnie).
Poza tym program powinien jak najkrócej być pozbawiony kontroli przez wmanewrowanie się w wywołania synchroniczne. Program czy aplet ma o wiele większe możliwości zrobienia "czegoś sensownego" w czasie gdy trzeba na coś oczekiwać niż JRE, które potrafi jedynie wyświetlić ikonkę javy i conajwyżej pokazać mniej czy bardziej prawdziwy pasek postępu.

W javie dopiero się uczę, ale co jakiś czas zaskakują mnie dziwne rozwiązania, których powody leżą najwyraźniej w bardzo starych koncepcjach czy kodzie, który już dawno nie jest aktualny. A chyba jedyną szansą dla tego języka jest likwidowanie utartych rozwiązań, które działają po prostu źle lub słabo. Np. Dlaczego w Javie nikt nie pisze odtwarzarek video czy rzeczy, które większość ludzi robi w "easy" flashu?
Być może dlatego, że utrudnia to sama Java. Ale czy na pewno? Może to tylko mit? Przecież Java ma teoretycznie o wiele większe możliwości. A Przynajmniej tak mi się na razie wydaje. Zresztą skoro Sony potrafiło napisać MMO Star Wars Galaxies oraz obsługę Blu-ray Disk w czystej w Javie, to czemu nie mają działać inne rzeczy?

0

trochę w tym racji jest Olamagato, dobra teraz coś z innej beczki

więc tak:
System.currentTimeMillis(); tutaj przypada na jedną sekundę 1000 jednostek
System.nanoTime() tutaj jest o wiele większa dokładność

takie pytanie jak pobrać rodzielczość jednej sekundy dla tego drugiego tak jak jest np w c++ np:
QueryPerformanceFrequency(&TimerFrequency);
coś w tym stylu dla javy

0

To bardzo proste. Po prostu wywołać raz lub kilka razy tę operację jedną po drugiej. Miesiąc temu sprawdzałem to w JRE 1.6_05 i 07 pod XP. Rozdzielczość licznika nano wynosi ok. 1500 nanosekund (półtora mikrosekundy). Co ciekawe w obecnej wersji javy dokładnie taką samą rozdzielczość mają wszystkie zegary w Javie - czyli również standardowy zegar milisekundowy. W związku z tym wszelkie książki do animacji, w których tak narzekano na wydajność i kombinowano z innymi zegarami czy licznikami można w tej sprawie wyrzucić do kosza.
W swoich pętlach do renderowania używam właśnie licznika nano i bardzo ładnie to wychodzi. trzeba tylko pamiętać, żeby sobie potworzyć takie stałe jak long SEKUNDA = 1000000000L oraz wszystkie wyliczane okresy czasu przeliczać na nanosekundy poza właściwymi pętlami, żeby niepotrzebnie nie obniżać wydajności.
Dodatkowo bardzo często można posługiwać się o wiele szybszymi operacjami w int, a nie w long przez obcinanie tuż po odczytaniu czasu. A to dlatego, że w int mieszczą się aż 2 sekundy wyrażone z nanosekundach. A takie odcinki czasu dla wydajnego programu posługującego się zwykle okresami 1/20..1/100 sekundy, to aż za dużo.
Dlatego używam często takiego czegoś:

long momentStart = 0L;
int jakiśOkres = 0;
//...
while(/*...*/)
{
long momentStart = System.nanoTime();
//... jakiś kod podlegający rygorom czasowym (na pewno krótszy niż 2 sekundy)
jakiśOkres =  (int)(System.nanoTime() - momentStart);
}

W ten sposób posługuję się tylko jedną lub maksymalnie dwiema zmiennymi long, a reszta to bardzo szybkie int (przynajmniej na systemie 32-bitowym).

Jednak do mniej skomplikowanych rzeczy można się oczywiście posługiwać zegarem milisekundowym (i dzieki temu ewentualnie liczbami byte/int) bo jego rozdzielczość jest sporo mniejsza od milisekundy. łatwo to sprawdzić bo wystarczy w pętli wywołać sprawdzanie wyników. Mniej więcej na kilkaset tysięcy wywołań zobaczymy wynik w postaci 1 milisekundy różnicy - zapewne w powodu chwilowego zadziałania odśmiecacza. Nawet z użyciem pojedynczego licznika (inkrementacja sporo trwa) raz na tysiąc wywołań zobaczymy 1 milisekundę różnicy odczytu. W sumie jest to doskonała wiadomość bo w ten sposób rozdzielczość zegara kompletnie przestała być problemem.

0

"Nawet z użyciem pojedynczego licznika (inkrementacja sporo trwa) raz na tysiąc wywołań zobaczymy 1 milisekundę różnicy odczytu" to oznacza ze jest stabilny i sprawdzilem jest ok, oraz dzieki za rozdzielczosc, teraz dziala to co chce jak nalezy. pozdo!!!

0

zamieszcze fragment kodu o co mi chodzilo z czasem teraz juz wszysko gra:

long newTime,oldTime;
int nowFps,getFpsT;
long newTimeS,oldTimeS;
int controlFps;

public void digitesi(int vi,int x,int y,Graphics g)
{
	g.drawString(String.valueOf(vi),x,y);
}

public void LockFps(int set_fps)
{
long timeLast,timeOld;
boolean done=false;
timeOld=System.nanoTime();
while(!done)
{
timeLast=System.nanoTime();
if(timeLast-timeOld>=1500000000/set_fps)
done=true;
}
}

long OldTime,NewTime;
long fps=85;
public int getFPS()
{

	NewTime=System.nanoTime();
	if(OldTime!=0 && (NewTime-OldTime)!=0)
	{
		long NEW_FPS=1500000000/(NewTime-OldTime);
		
		if (fps>NEW_FPS) 
			fps--;				
		else if (fps<NEW_FPS) 
			fps++;
	}
	OldTime=NewTime;
	return (int)fps;
}
public int getFps()
{
	newTimeS=System.nanoTime();
		if(newTimeS>oldTimeS)
		{
			if(newTimeS-oldTimeS>=1500000000)
			{
				oldTimeS=newTimeS;
				getFpsT=nowFps;
				nowFps=1;
			}
			else
				nowFps++;
		}
		
		if(oldTimeS>newTimeS)
		{
			if(oldTimeS-newTimeS>=1500000000)
			{
				oldTimeS=newTimeS;
				getFpsT=nowFps;
				nowFps=1;
			}
			else
				nowFps++;
		}	
			
		return getFpsT;
}
public void ControlFps(int set_fps)
{
	int tnowFps=getFPS();
	
	if(tnowFps<set_fps)
			controlFps+=1;
	if(tnowFps>set_fps)
			controlFps-=1;
			
	if(controlFps<24)
		controlFps=24;
			
	LockFps(controlFps);

}


public void paint(Graphics g) {
	ControlFps(25);

	g.setColor(Color.green);		

	digites(getFps(),10,10,g);
			
	repaint();	
	
}
0

Hmm, robisz dwa poważne błędy. Pierwszy to wywoływanie repaint() z metody odrysowującej ekran. Pamiętaj, że nad paint() nie masz absolutnie żadnej władzy. Metoda ta wywoływana jest kiedy jest to potrzebne AWT/Swingowi, a nie kiedy jest potrzebne Tobie. Możesz za pomocą repaint() zasugerować, żeby GUI w najbliższym czasie wykonało odrysowanie, ale tak naprawdę nie masz żadnej gwarancji, że tak się stanie, ani że stanie się to szybko. Nierzadko więc będzie tak, że ilość wywołań Paint() będzie znacząco większa od ilości Twoich wywołań repaint(). Wywołanie repaint() powinno być wyłącznie reakcją na zmianę stanu Twojego programu, który musi oznaczać przemalowanie komponentu/obrazu (zmianę jego wyglądu). Samo odrysowanie nie powoduje zmiany stanu, który wymuszałby kolejne odrysowywanie. To oczywiście może działać tu i teraz, ale nie masz żadnej gwarancji, że będzie działać kiedy indziej i na innym systemie.
Innym powodem tego błędu jest fakt iż wywołanie metody repaint() może być wykonane wyłącznie z wątku zdarzeń (event dispatch). Tak naprawdę nie wiesz na pewno czy Paint zostanie wykonany akurat z tego wątku (choć możesz to sprawdzić przez wywołanie odpowiedniej metody). Swing nie jest wielowątkowy i to co robisz może spowodować bardzo trudne do wykrycia błędy.

Drugim błędem jest to co wywołujesz z paint(), czyli lockFPS(). Metoda ta powoduje opóźnienia kręcąc się w martwych pętlach. Na dodatek dzieje się to w repaint(), czyli w metodzie, która powinna ekstremalnie szybko zrobić swoje odrysowanie ekranu i oddawać sterowanie.
Twoim zadaniem nie jest sterowaniem zależnościami czasowymi wątku Swinga/AWT bo jak się przekonasz renderując coś bardziej skomplikowanego niż tekst, że tego czasu jest za mało, a nie za dużo. W pasywnym renderingu, a takiego właśnie używasz nie ma większego sensu wypisywać liczby FPS, a już tym bardziej wpływać opóźnieniami na to aby ilość wywołań paint() to było np. 25 w jednej sekundzie. Generalnie jakiekolwiek usypianie lub zatrzymywanie wątku, nad którym nie powinieneś mieć kontroli, to zły pomysł.

Zasadą pasywnego renderingu jest wykonywanie jak najmniejszej liczby odrysowań. Mają być one wykonywane tylko wtedy gdy zmieni się stan programu, który powinien spowodować zmianę widoku. Jeżeli stan się nie zmieni - czyli gdy użytkownik niczego nie nacisnął, to metoda paint() nie powinna być w ogóle wywoływana. W takim wypadku FPS, to będzie zero. Tak wygląda grafika w GUI.
Natomiast to co ty chcesz uzyskać, to możliwie stałą liczbę odrysowań w celu kontrolowania czasu renderowania i ewentualnego pominięcia (zrzucania klatek) w przypadku gdy tego czasu (mocy procesora) jest w konkretnych warunkach za mało.
Robi się to tak, że do Swinga wysyła się polecenie setIgnoreRepaint(true) - dla konkretnego komponentu, co powoduje, że polecenia repaint() zaczną być przez komponent olewane. Wtedy dopiero można się zabrać za samodzielne zarządzanie wyświetlaniem klatek animacji. W tym celu tworzy się własny wątek, który w pętli (którą można przerwać zmianą jej warunku trwania) będzie wykonywał po kolei aktualizację stanu programu (np. stan klawiszy/myszki w grze), następnie renderowanie rysunku lub klatki filmu na BufferedImage utworzony w pamięci (np. przez createCompatibleImage() lub createCompatibleVolatileImage()), a na końcu przekopiowywanie wyrenderowanego obrazu na pamięć obrazu (blitting, w javie można go wykonać przez drawImage() na akcelerowanym obiekcie Image). Mierząc w takiej pętli czasy i sprawdzając czy tego czasu zabrakło można decydować o opuszczeniu niektórych renderowań i odmalowań. Efekty tych pomiarów i decyzji mogą być następnie źródłem stanu, który posłuży do renderowania rzeczywistej liczby wyświetlonych renderów na ekran w następnej klatce, czyli właśnie FPS. W takiej pętli najważniejsze jest to, aby liczba aktualizacji stanu (czyli UPS - update per second) wynosiła zawsze liczbę żądanych FPS. W efekcie nawet jeżeli komputer nie będzie się wyrabiał z renderowaniem i zdąży odrysować tylko np. 15 klatek, to sam program będzie się aktualizował te np. 60-85 razy na sekundę - dokładnie tak samo jak w każdej dobrze zrobionej grze. To co opisałem, to jest aktywny rendering, z którego korzystają wszystkie gry oraz większość odtwarzaczy video.

Trochę się rozpisałem, ale może coś pomogłem. :)

ps. Do sterowania wątkami nie używaj metody wait(). Jest ona niezalecana ponieważ nigdy nie ma pewności w jakie miejsce wątku trafi zatrzymanie (i co wtedy jest już zrobione, a co nie). Podobnie nie należy swoich wątków siłowo przerywać jako normalne zachowanie (nieawaryjne), ale zmieniać stan pętli wątku na taki, żeby cała pętla została gładko zakończona i wątek zakończył się prawidłowo.

ps2. Unikaj w pętlach - szczególnie tych wewnętrznych operacji dzielenia (są piekielnie czasochłonne). Tym bardziej, że zawsze może wystąpić dzielenie przez zero i w efekcie crash programu. Jeżeli to możliwe, to staraj się odwrócić ułamki tak, aby pierwotnym miejscu mnożyć, a jeszcze lepiej wielokrotnie dodawać. Wszelkie czasochłonne operacje matematyczne spróbuj przenosić/opóźniać do miejsca/momentu gdy jest to naprawdę pożądane. A jeszcze lepiej jest wyliczać maksymalną ilość danych przed pętlami, tak aby w czasie kręcenia się w pętli używać tych zmiennych jako wartości stałych.

0

z tym dzieleniem to racja to zapomnialem dodac mnozenia przez odwrotnosc, co to zmniejszania ilosci klatek to tak bede potrzebowal dlatego celowo to zrobilem, co do repaint to nie umiescilem calego kodu zaraz umieszcze prosze:

/**

  • @(#)test1.java
  • test1 Applet application
  • @Author
  • @version 1.00 2008/9/28
    */

import java.awt.;
import java.applet.
;
import java.awt.Image;
import java.net.URL;
import javax.swing.ImageIcon;
import java.io.IOException;
import java.io.InputStream;
import java.awt.image.*;

import java.awt.AWTException;
import java.awt.image.PixelGrabber;
import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.util.Vector;

//import java.awt.image.BufferedImage;
//import com.sun.image.codec.jpeg.JPEGImageEncoder;
//import com.sun.image.codec.jpeg.JPEGCodec;

public class test2 extends Applet {

private Image dbImage;
private Graphics dbg;
float rad,value;
Image img;
int WidthScreen,HeightScreen;

long newTime,oldTime;
int nowFps,getFpsT;
long newTimeS,oldTimeS;
int controlFps;

public void digitd(double vd,int x,int y,Graphics g)
{
	g.drawString(String.valueOf(vd),x,y);
}
public void digitf(float vf,int x,int y,Graphics g)
{
	g.drawString(String.valueOf(vf),x,y);
}
public void digiti(int vi,int x,int y,Graphics g)
{
	g.drawString(String.valueOf(vi),x,y);
}

public int[] ImageToInt(Image image, int width, int height){
int pixMap[] = new int[width*height];
PixelGrabber pg = new PixelGrabber(image, 0,0,width,height, pixMap, 0, width);
try {
pg.grabPixels();
} catch (InterruptedException e){return null;}
if((pg.status() & ImageObserver.ABORT)!=0) return null;
return pixMap;
}

public Image IntToImage(int pix[], int width, int height)
{
	return this.createImage(new MemoryImageSource(width,height,pix,0,width));
}

public void init() 
{
	oldTime=0;
	newTime=0;
	oldTimeS=0;
	newTimeS=0;
	nowFps=0;
	getFpsT=0;
	controlFps=85;
	
	setBackground (Color.black);
	value=0;	
	rad=(float)3.141592653/180;	
	img=getImage(getDocumentBase(),"plika.JPG");
 	WidthScreen=320;
	HeightScreen=240;
	
	int pix[] = ImageToInt(img,WidthScreen,HeightScreen);
	
	for(int i=0;i<WidthScreen*HeightScreen;i++)
	{
		int alpha=(pix[i] >> 24) & 255;
		int red=(pix[i] >> 16) & 255;
		int green=(pix[i] >> 8) & 255;
		int blue=(pix[i]) & 255;
			
		pix[i]=blue+256*green+(256*256)*red+(256*256*256)*alpha;		
	}
	
	img=IntToImage(pix,WidthScreen,HeightScreen);
	
}

public void LockFps(int set_fps)
{
	long timeLast,timeOld;
	boolean  done=false;
	timeOld=System.nanoTime();
	while(!done)
	{
		timeLast=System.nanoTime();
		if(timeLast-timeOld>=1500000000/set_fps)
		done=true;
	}
}
public int getTimeDi()
{
	long timeD;
	oldTime=newTime;
	newTime=System.nanoTime();
	if(newTime>oldTime)	
		timeD=newTime-oldTime;
	else
		timeD=oldTime-newTime;
		
	return	(int)timeD;	
}
public float getTimeDf()
{
	return (float)getTimeDi()/1500000000;
}

long OldTime,NewTime;
long fps=85;
public int getFPS()
{

	NewTime=System.nanoTime();
	if(OldTime!=0 && (NewTime-OldTime)!=0)
	{
		long NEW_FPS=1500000000/(NewTime-OldTime);
		
		if (fps>NEW_FPS) 
			fps--;				
		else if (fps<NEW_FPS) 
			fps++;
	}
	OldTime=NewTime;
	return (int)fps;
}
public int getFps()
{
	newTimeS=System.nanoTime();
		if(newTimeS>oldTimeS)
		{
			if(newTimeS-oldTimeS>=1500000000)
			{
				oldTimeS=newTimeS;
				getFpsT=nowFps;
				nowFps=0;
			}
			else
				nowFps++;
		}
		
		if(oldTimeS>newTimeS)
		{
			if(oldTimeS-newTimeS>=1500000000)
			{
				oldTimeS=newTimeS;
				getFpsT=nowFps;
				nowFps=0;
			}
			else
				nowFps++;
		}	
			
		return getFpsT;
}
public void ControlFps(int set_fps)
{
	int tnowFps=getFPS();
	
	if(tnowFps<set_fps)
			controlFps+=1;
	if(tnowFps>set_fps)
			controlFps-=1;
			
	if(controlFps<15)
		controlFps=15;
			
	LockFps(controlFps);

}

public void run ()
{
		
}
public void paint(Graphics g) {
	ControlFps(25);
	value+=1;	
	g.setColor(Color.green);
	g.drawString("fps:",2,10);
	digiti(getFps(),25,10,g);	
			
	float beta=value*rad;
	int x=Math.round(160+100*(float)Math.sin(beta));
	int y=Math.round(100+100*(float)Math.cos(beta));
	

	g.drawImage(img,x,y,this);
	g.drawString("BH is live!",x,y);
	
	
	
					
	repaint();	
	
}

public void update (Graphics g)
{
	//DoubleBuffers
	if (dbImage == null)
	{
		dbImage = createImage (this.getSize().width, this.getSize().height);
		dbg = dbImage.getGraphics ();
	}
	dbg.setColor (getBackground ());
	dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
	dbg.setColor (getForeground());
	paint (dbg);
	g.drawImage (dbImage, 0, 0, this);
}

}

to jeszcze nie jest wszystko co powinno bo chce to jeszcze rozbudowac wiec zrobie update.

0

Czy ten tzw aktywny rendering jest uzyty w twoim temacie Olamagato?

Przechodzenie obrazów
http://4programmers.net/Forum/487959?h=setIgnoreRepaint#id487959

poniewaz przegladalem ten kod i na to wyglada ze tak bo jest tak jak pisales za pomoca funkcji setIgnoreRepaint, to bym sprobowal cos z tego dodac

ps:jesli sie zgadzasz [wstyd]

0

bogdans napisał

Uważam, że obrazki dla apletu winny być w pliku jar
<applet code="MojAplet" archive="MojeArchiwum.jar" ...>
</applet>
Odczytuję się je tak samo
Image img=getImage(getCodeBase(),"images/ayers.jpg");

@Olamagato, zapewne masz rację krytykując moje stanowisko, ja używałem w apletach małe pliki graficzne "upiększające" aplet, całe archiwum miało kilkadziesiąt kB i ładowanie tego archiwum na starcie było jednocześnie konieczne i nie powodowało zauważalnego opóźnienia.
W tym samym poście chciałem się odnieść do tego co napisał cof_user

ale nie rozumiem czemu tam jest taka durnowatość, że np:
index jest http://#####.w8w.pl/index.htm
a obrazek http://#####.w8w.pl//plika.JPG

W żadnym aplecie ani w samodzielnej aplikacji nigdy nie użyłem w ścieżce "//", a wszystkie pliki graficzne odczytałem. Dla plików niegraficznych (chcąc zachować przenośność) ścieżkę należy pisać tak "katalog"+File.separator+"podkatalog+...+File.separator+"plik". W przypadku plików graficznych też tak można, ale co najmniej w Windowsach i w Linuksie można użyć formatu linuksowego "katalog/podkatalog/.../plik". Nie wiem czy jest to prawdziwe zawsze, u mnie działało we wszystkich przypadkach, w których z użytej metody wynikało, że pobierany winien być plik graficzny (getImage() w aplecie, new ImageIcon(),..)
pozdrawiam

0
cof_user napisał(a)

Czy ten tzw aktywny rendering jest uzyty w twoim temacie Olamagato?

Aktywny rendering w tym komponencie składa się z setIgnoreRepaint() oraz następującego za nim kodu Timera, który renderuje oraz odrysowuje obraz co (zaledwie) 1/4 sekundy. To bardzo prymitywna i niewydajna wersja aktywnego renderingu.

Jeżeli chcesz załapać o co chodzi w aktywnym renderingu, to polecam dostępną (legalnie) z sieci książkę, w której jest on opisany na samym początku (drugi rozdział):
http://fivedots.coe.psu.ac.th/~ad/jg/

Dodatkowo możesz też poczytać inną książkę tego samego autora, ale tym razem wyłącznie o programowaniu gier w Javie 3D:
http://fivedots.coe.psu.ac.th/~ad/jg2/index.html

Zrobiłem sobie oczywiście osobną klasę, która wykonuje pełny aktywny rendering z wszelkimi zależnościami czasowymi. Jednak zamiast wrzucać tu piekielnie zoptymalizowany kod, który musiałbyś rozgryzać - lepiej jak poczytasz jak się taki kod buduje od zera i jakie są warunki jego działania. W pierwszej z książek jest właściwie podany cały na tacy i wystarczy wszystkie jego elementy przekopiować.
Oczywiście, ten w książce nie jest idealny i można go jeszcze zoptymalizować, albo wręcz "wywrócić do góry nogami" - ważne jednak jest załapanie idei, a nie używanie kodu, o którym nie bardzo się wie, co robi.

0

no racja trzeba samemu dojsc co i jak, co do umieszczanie plikow w pliku jar to troche lepiej wychodzi, dzieki za informacje i zajme sie tymi lekturami

1 użytkowników online, w tym zalogowanych: 0, gości: 1