Hem E-böcker Specialeffekter och spelutveckling i Java Ett röd-blått gradientexempel

Specialeffekter och spelutveckling i Java(TM) - Ett röd-blått gradientexempel

av Anibal Wainstein

7.0.3 Ett röd-blått gradientexempel

En gradient är en skala som visar resultaten när man blandar två färger. Vi skall nu utnyttja MemoryImageSource klassen för att skapa en gradient mellan rött och blått. Det enda vi behöver i den här appleten är en init() metod och en paint() metod. Låt oss först titta på init() metoden samt de globala deklarationerna:

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

public class gradient extends Applet {

//"gradientimage" kommer att hålla reda på
//bilden som vi skapar.
Image gradientimage=null;

public void init()
{
    //Vi måste nu veta appletskärmens storlek.
    Dimension d;
    d=size();

    //Vi börjar med att skapa en array som
    //är lika stor som skärmen. Den kommer
    //att innehålla färgvärdena som vi sedan
    //använder för att skapa en bild.
    int pixels[]=new int[d.width*d.height];
    int red,blue,colorvalue;

    //Följande FOR-slinga sveper igenom
    //bilden från vänster till höger.
    //Den fyller upp arrayen med
    //pixelvärden som blandas mellan
    //rött och blått (rött längst till vänster
    //och blått längst till höger.
    for (int x=0; x<d.width; x++)
{
//Räkna ut ett värde på röd- och blå-
//komponenterna beroende på var
//positionen på "x" är. ((d.width-x)/d.width)
//samt (x/d.width) används som faktorer.

red=(255*(d.width-x))/d.width;
blue=(255*x)/d.width; //Dessa två värden är //komponenter för färgvärdet, som vi //bygger upp tillsammans med alfa-kanalen //(0xff000000). Observera att röd-komponenten //måste skiftas 2 bytes åt vänster så att //den hamnar på rätt plats. Detta gör vi genom //att multiplicera två gånger med 256. //Blå-komponenten ÄR redan i rätt plats, så //där behöver vi inte multiplicera. colorvalue=0xff000000+(red*256*256)+blue; //Följande FOR-slinga kommer att //svepa igenom bilden upp och ner. for (int y=0; y<d.height; y++)
{
//Kom ihåg att x+y*d.width är
//positionen för pixeln som
//skall sättas eller läsas
//av.

pixels[x+y*d.width]=colorvalue;
}
}
//Nu kan vi skapa ett MemoryImageSource-
//objekt.

MemoryImageSource imgsrc= new MemoryImageSource(d.width,d.height,pixels,0,d.width); //Med createImage() skapar vi bilden som //man kan använda i paint() metoden. gradientimage=createImage(imgsrc); }

Titta noga på import-uttrycken. Observera att du måste importera java.awt.image paketet för att kunna ha tillgång till MemoryImageSource klassen. I programmet så har vi endast en global variabel, "gradientimage", som används för att lagra resultatet av gradientberäkningen. Detta görs i init() metoden, där vi börjar med att skapa arrayen som skall vara tillräckligt stor för att lagra alla pixlar i appletskärmen. Två FOR-slingor kommer att användas för att svepa igenom pixlarna i arrayen och skapa gradienten. För varje x-värde som den yttersta FOR-slingan går igenom, så sveper den inre FOR-slingan igenom alla y-värden från 0 till "d.height" (höjden på bilden). Beräkningen av blå och röd komponenterna samt färgvärdet, sker i den yttre FOR-slingan. Detta görs för att kunna spara på processorkraft, eftersom alla y-värdena som motsvarar ett x-värde kommer att ha samma färg. Så hur räknar vi ut färgkomponenterna? Vi vet att vi skall ha rött längst till vänster (där x=0) och blått längst till höger (där x=d.width-1). Den procentuella faktorn (x / d.width) kommer att vara noll längst till vänster och 1 längst till höger. Den kan vi multiplicera med 255 och sätta som blå komponent:

blue=(255*x)/d.width;

Kom ihåg att vid heltalsdivision så fick vi göra multiplikationen först och sedan divisionen. För rött kan vi använda faktorn ((d.width-x)/d.width) som är 1 längst till vänster och 0 längst till höger (Kolla det om du är osäker, genom att sätta in ett värde på "x"):

red=(255*(d.width-x))/d.width;

Efter det använder vi uttrycket i förra avsnittet för att bygga upp pixelvärdet. Observera att alfa-kanalen är värdet 0xff000000. Den inre FOR-slingan sätter värdet på pixeln i positionen x och y. Det sista som görs i init() metoden, är skapandet av själva bilden enligt samma recept som jag gav i förra avsnittet. Metoden paint() är inte särskild komplicerad:

ublic void paint(Graphics g)
{
    //Vi måste först kolla att gradientimage
    //inte är NULL innan vi ritar ut den.
    if (gradientimage!=null) g.drawImage(gradientimage,0,0,this);
}


Du behöver inte ha några parametrar för den här appleten och storleken kvittar. Det är bara att skapa en HTML fil och köra den. Vi du se på resultatet, så kan du klicka här.

Visst är det intressant? Resultatet visar ju att mittenpartierna i riksdagen har valt helt felaktiga färger för sina logon!

 

 

 

 


Nästa sida >>