NASZE SERWISY:    ANDROID   LINUX   MAEMO   SYMBIAN   WEBOS




Hosting sponsoruje:



GRIN3 - polskie fonty

Profesjonalne czcionki z polskimi znakami - czcionki.com

OpenMobile on Facebook


 

[Java] Malarz - nasze programy w Javie

Odpowiednie forum do zadawania pytań dotyczących rozpoczęcia programowania.

[Java] Malarz - nasze programy w Javie

Postprzez issa » 7 kwietnia 2009, o 13:08

Witam. Myślę , że nie będzie problemu jeśli założymy nowy wątek dedykowany naszym postępom w Javie. Jak pisałem w wątku o zabawach z Pythonem , napisałem prosty program w java2me na Nokię 5800 umożliwiający rysowanie palcem , czy raczej rysikiem. Tym razem program w którym zastosowałem podwójne buforowanie został wzbogacony o opcję zmiany koloru , oraz tak zwaną "gumkę". Interfejs programu oparty jest o czarny ekran , na którym dostępne są cztery kwadraciki - przyciski umożliwiające zmianę koloru i ścieranie. Przy okazji mam pytanie - można by spokojnie zaimplementować wyczyszczenie ekranu i zmianę tła na wcześniej wybrany kolor dodatkowym opcjonalnym wielokolorowym kwadracikiem , ale interesowałaby mnie zmiana przez wybór lewego klawisza (polecenie Command wyczysc_plotno) który na ekranie ma nazwę "Wyczysc". I tu jest mały problem , bo mimo kompilacji , ta akurat opcja nie działa , przycisk jest "głuchy". Tę część kodu ująłem w komentarz , gdyby ktoś mógł wyjaśnić gdzie jest błąd , byłbym wdzięczny. A tymczasem poniżej przedstawiam kod źródłowy i link ze zrzutkami oraz .jar z w pełni użyteczną aplikacją do pobrania pod adresem:

http://wrzucacz.pl/file/6791239101505

, powinna działać na każdym dotykowcu z Java. Proszę pamiętać o zmianie w "Ustawieniach aplikacji" Malarza na "Klawiatura ekranowa" - "Wyłacz".

Kod: Zaznacz cały

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class Malarz extends MIDlet implements CommandListener
{

public Plotno plotno;
public Display ekran;
public Malarz()
   {
    Plotno plotno = new Plotno ();
    Command koniec = new Command ("Koniec" , Command.EXIT , 0);
   
/*
Command wyczysc_plotno = new Command ("Wyczysc" , Command.SCREEN , 0);
   
    plotno.addCommand (wyczysc_plotno);
 
*/
 
    plotno.addCommand (koniec);
    plotno.setCommandListener (this);
    ekran = Display.getDisplay(this);
    ekran.setCurrent (plotno);

  }

public void startApp() {}
   
public void pauseApp() {}

public void destroyApp (boolean bezwarunkowo) {}

public void commandAction (Command polecenie , Displayable ekran)
      {
       if (polecenie.getCommandType () == Command.EXIT)
          {       
            notifyDestroyed();
          }
/* 
     if (polecenie.getCommandType () == Command.SCREEN)
          {       
            plotno.wyczysc();
          }
*/     


       }
   
}
class Plotno extends Canvas

{
   public Plotno ()
     {
       bufor = Image.createImage (getWidth() , getHeight());
       gbuforu = bufor.getGraphics();
       gbuforu.setColor (0,0,0);
       gbuforu.fillRect (0,0,getWidth(),getHeight());
       odmaluj_przyciski();
       gbuforu.setColor (255,255,0);
     }
     
   public void paint (Graphics g)
     {
       g.drawImage (bufor , 0 , 0 , Graphics.TOP|Graphics.LEFT);
     }
   public void pointerDragged (int x , int y)
     {
       wspolrzednaX = x;
       wspolrzednaY = y;
         
       gbuforu.fillArc (wspolrzednaX-3,wspolrzednaY-3,6,6,0,360);
       repaint ();
       }

   public void pointerPressed(int x , int y)
     {
     wspolrzednaX = x;
     wspolrzednaY = y;
    if (wspolrzednaX<80 && wspolrzednaX>20 && wspolrzednaY>20 && wspolrzednaY<80)
      {
       gbuforu.setColor (0,0,0);
       repaint();
      }
    if (wspolrzednaX<160 && wspolrzednaX>100 && wspolrzednaY>20 && wspolrzednaY<80)
      {
       gbuforu.setColor (255,0,0);
       repaint();
      }
    if (wspolrzednaX<240 && wspolrzednaX>180 && wspolrzednaY>20 && wspolrzednaY<80)
      {
       gbuforu.setColor (0,0,255);
       repaint();
      }
    if (wspolrzednaX<300 && wspolrzednaX>240 && wspolrzednaY>20 && wspolrzednaY<80)
      {
       gbuforu.setColor (0,255,0);
       repaint();
      }
   }

    public void odmaluj_przyciski()
     {   
          gbuforu.setColor (238,130,238);
          gbuforu.fillRect (0,0,getWidth(),100);
          gbuforu.setColor (0,0,0);
          gbuforu.fillRect (20,20,60,60);
          gbuforu.setColor (255,0,0);
          gbuforu.fillRect (100,20,60,60);
          gbuforu.setColor (0,0,255);
          gbuforu.fillRect (180,20,60,60);
          gbuforu.setColor (0,255,0);
          gbuforu.fillRect (260,20,60,60);
      }
/*
     public void wyczysc()
      {
       gbuforu.fillRect (0,0,getWidth(),getHeight());
       odmaluj_przyciski();
       gbuforu.setColor (255,255,0);
       repaint();
      }
*/
private int wspolrzednaX;
private int wspolrzednaY;
private Image bufor;
private Graphics gbuforu;
}



-- 07 kwi 2009 16:53 --

Trochę popracowałem , tu: http://wrzucacz.pl/file/6501239118816 dostępna jest wersja 2.1 aplikacji ze screenami , poszerzona gama kolorów oraz dodana opcja zmiany koloru tła o której pisałem wcześniej ale dokonana w inny sposób niż przez polecenie Command, poprawiłem też kod , oczywiście przy zmianie koloru pędzla nie trzeba "repaintowac" , niezbędne jest to tylko przy zmianie koloru tła które odbywa się dotknięciem wybranego koloru , oraz dotknięciu rysikiem poziomego prostokąta w prawym górnym rogu. Poprawiony jest też mały błąd objawiający się rysowaniem na polu wyborów koloru , przez dodanie w metodzie pionterDragged warunku

if (wspolrzednaY>100)
{
gbuforu.fillArc (wspolrzednaX-3,wspolrzednaY-3,6,6,0,360);
repaint ();
}

, że reakcja narysowania punktu (który tak naprawdę jest wypełnionym okręgiem o małej średnicy oczywiście) na buforze ma odbyć się tylko wtedy kiedy współrzędnaY jest poza polami wyboru koloru i zmiany tła (czyli >100). Oczywiście bez najmniejszych problemów można poszerzyć własnoręcznie gamę kolorów w polu wyboru o dodatkowe 8.

Kod: Zaznacz cały

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class Malarz extends MIDlet implements CommandListener
{

public Plotno plotno;
public Display ekran;
public Malarz()
   {
    Plotno plotno = new Plotno ();
    Command koniec = new Command ("Koniec" , Command.EXIT , 0);
   
/*
    Command wyczysc_plotno = new Command ("Wyczysc" , Command.SCREEN , 0);
    plotno.addCommand (wyczysc_plotno);
 
*/
 
    plotno.addCommand (koniec);
    plotno.setCommandListener (this);
    ekran = Display.getDisplay(this);
    ekran.setCurrent (plotno);

  }

public void startApp() {}
   
public void pauseApp() {}

public void destroyApp (boolean bezwarunkowo) {}

public void commandAction (Command polecenie , Displayable ekran)
      {
       if (polecenie.getCommandType () == Command.EXIT)
          {       
            notifyDestroyed();
          }
/* 
     if (polecenie.getCommandType () == Command.SCREEN)
          {       
            plotno.wyczysc();
          }
*/     


       }
   
}
class Plotno extends Canvas

{
   public Plotno ()
     {
       bufor = Image.createImage (getWidth() , getHeight());
       gbuforu = bufor.getGraphics();
       gbuforu.setColor (0,0,0);
       gbuforu.fillRect (0,0,getWidth(),getHeight());
       odmaluj_przyciski();
       gbuforu.setColor (255,255,0);
     }
     
   public void paint (Graphics g)
     {
       g.drawImage (bufor , 0 , 0 , Graphics.TOP|Graphics.LEFT);
     }
   public void pointerDragged (int x , int y)
     {
       wspolrzednaX = x;
       wspolrzednaY = y;
       if (wspolrzednaY>100)
         {
           gbuforu.fillArc (wspolrzednaX-3,wspolrzednaY-3,6,6,0,360);
           repaint ();
         }
       }

   public void pointerPressed(int x , int y)
     {
     wspolrzednaX = x;
     wspolrzednaY = y;
    if (wspolrzednaX<40 && wspolrzednaX>10 && wspolrzednaY>10 && wspolrzednaY<40)
      {
       gbuforu.setColor (0,0,0);
       
      }
    if (wspolrzednaX<80 && wspolrzednaX>50 && wspolrzednaY>10 && wspolrzednaY<40)
      {
       gbuforu.setColor (255,0,0);
       
      }
    if (wspolrzednaX<120 && wspolrzednaX>90 && wspolrzednaY>10 && wspolrzednaY<40)
      {
       gbuforu.setColor (0,0,255);
       
      }
    if (wspolrzednaX<160 && wspolrzednaX>130 && wspolrzednaY>10 && wspolrzednaY<40)
      {
       gbuforu.setColor (0,255,0);
       
      }
    if (wspolrzednaX<200 && wspolrzednaX>170 && wspolrzednaY>10 && wspolrzednaY<40)
      {
       gbuforu.setColor (255,255,0);
     
      }

    if (wspolrzednaX<240 && wspolrzednaX>210 && wspolrzednaY>10 && wspolrzednaY<40)
      {
       gbuforu.setColor (192,192,129);
     
      }

     if (wspolrzednaX<280 && wspolrzednaX>250 && wspolrzednaY>10 && wspolrzednaY<40)
      {
       gbuforu.setColor (128,128,0);
       
      }

     if (wspolrzednaX<320 && wspolrzednaX>290 && wspolrzednaY>10 && wspolrzednaY<40)
      {
       gbuforu.setColor (255,255,255);
       
      }
     if (wspolrzednaX<350 && wspolrzednaX>330 && wspolrzednaY>10 && wspolrzednaY<80)
      {
       gbuforu.fillRect (0,0,getWidth(),getHeight());
       odmaluj_przyciski();
       gbuforu.setColor (255,255,0);
       repaint();
      }

    }

    public void odmaluj_przyciski()
     {   
          gbuforu.setColor (238,130,238);
          gbuforu.fillRect (0,0,getWidth(),90);
          gbuforu.setColor (0,0,0);
          gbuforu.fillRect (10,10,30,30);
          gbuforu.setColor (255,0,0);
          gbuforu.fillRect (50,10,30,30);
          gbuforu.setColor (0,0,255);
          gbuforu.fillRect (90,10,30,30);
          gbuforu.setColor (0,255,0);
          gbuforu.fillRect (130,10,30,30);
          gbuforu.setColor (255,255,0);
          gbuforu.fillRect (170,10,30,30);
          gbuforu.setColor (192,192,129);
          gbuforu.fillRect (210,10,30,30);
          gbuforu.setColor (128,128,0);
          gbuforu.fillRect (250,10,30,30);
          gbuforu.setColor (255,255,255);
          gbuforu.fillRect (290,10,30,30);
          gbuforu.setColor (70,130,180);
          gbuforu.fillRect (330,10,20,70);
         


      }
/*
     public void wyczysc()
      {
       gbuforu.fillRect (0,0,getWidth(),getHeight());
       odmaluj_przyciski();
       gbuforu.setColor (255,255,0);
       repaint();
      }
*/
private int wspolrzednaX;
private int wspolrzednaY;
private Image bufor;
private Graphics gbuforu;
}



-- 17 kwi 2009 21:02 --

Witam.
Dziś program wykorzystujący wątki , które intensywnie rozpracowywałem. Nie bawiłem się na razie interfejsem Runnable , więc jedyne co pozostało to użycie po długim główkowaniu , klasy wewnętrznej w klasie dziedziczącej po klasie Canvas , która w moim programie nosi nazwę WatekGraficzny i która oczywiście musi dziedziczyć po klasie Thread , nadpisując jej metodę run().
W konstruktorze Płótna konstruuję dwa wątki (a może ich być rzecz jasna więcej , lepszy efekt) , z parametrami: kolor , opóźnienie , bo przecież każda kulka powinna się przemieszczać we własnym tempie , by zaprezentować działanie autonomicznych wątków , punkt startowy x,y kulek , oraz kierunkiem ich przemieszczania się które opisują składowe dx oraz dy. Motyw ten można by użyć w jakiejś grze , dobrym przykładem jest bardzo sympatyczna i prosta gra na iFona o nazwie Blix.

A oto kod z dokłądnym opisem:


import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class Watki extends MIDlet implements CommandListener
{

public Plotno plotno;
public Display ekran;
public Watki()
{
Plotno plotno = new Plotno ();
Command koniec = new Command ("Koniec" , Command.EXIT , 0);

plotno.addCommand (koniec);
plotno.setCommandListener (this);
ekran = Display.getDisplay(this);
ekran.setCurrent (plotno);

}

public void startApp() {}

public void pauseApp() {}

public void destroyApp (boolean bezwarunkowo) {}

public void commandAction (Command polecenie , Displayable ekran)
{
if (polecenie.getCommandType () == Command.EXIT)
{
notifyDestroyed();
}


}
}

class Plotno extends Canvas

{
public Plotno ()
{
setFullScreenMode (true);
//ustawienie pełnego ekranu (true)
bufor = Image.createImage (getWidth() , getHeight());
//utworzenie buforu
gbuforu = bufor.getGraphics();
//pobranie "wykreślacza" buforu
gbuforu.setColor (0x00FF00);
//ustawienie koloru buforu
gbuforu.fillRect (0,0,getWidth(),getHeight());
//wypełnienie buforu metodą fillRect wybranym kolorem
WatekGraficzny watek1 = new WatekGraficzny (0x0000FF ,100 ,200 ,100 , 1 , 1);
//utworzenie watku1 , parametry przekazane do konstruktora to:
kolor kulki , punkt startowy x oraz y od którego kulka zaczyna animację , oraz kierunek przemieszczania się dx oraz dy.
Te dwa ostatnie parametry przyjmując odpowiednio wartość (1,1) , (1,-1) , (-1,1) oraz (-1,-1) powodują przemieszczanie
się animowanego w osobnym wątku obiektu odpowiednio w prawo dół , prawo góra , lewo dół oraz lewo góra
WatekGraficzny watek2 = new WatekGraficzny (0xFF1493 ,500, 10 ,40 ,-1 , 1);
watek1.start();
//uruchomienie wątku
watek2.start();

}



public void paint (Graphics g)
{
g.drawImage (bufor , 0 , 0 , Graphics.TOP|Graphics.LEFT);
}
//klasa wewnętrzna WatekGraficzny dziedziczy z klasy Thread.
class WatekGraficzny extends Thread
{
public WatekGraficzny (int kolor , int opoznienie , int x , int y , int dx , int dy)
{
Konstruktor klasy WatekGraficzny inicjalizuje każdy autonomiczny wątek
this.kolor = kolor;
this.opoznienie = opoznienie;
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
petla = 0;
}
//Nadpisana metoda run() klasy Thread w której definiuje się zachowanie wątku
public void run()

{
while (petla<5000)
// taka sobie mała pętla , żeby kulka pośmigała po ekranie
{
gbuforu.setColor (kolor);
gbuforu.fillArc (x , y , 10,10,0,360);
//rysujemy kulkę
gbuforu.setColor (0x00FF00);
gbuforu.fillArc (x-dx*2 , y-dy*2 , 10,10,0,360);
// a kulkę na wcześniejszej pozycji "zmazujemy" , dzięku czemu otrzymujemy efekt przemieszczania się
if (y<1) {dy = +1;}
//jeśli kulka odbije się od lewej krawędzi , zmieniamy kierunek przemieszczania się
if (y>getHeight()-10) {dy = -1;}
//jeśli idbije się od prawej to samo
if (x<1) {dx = +1;}
//itp.
if (x>getWidth()-10) {dx = -1;}
//itp. Dzięki zastosowaniu w warunkach metod getHeihgt() oraz getWidth()
program dopasowuje się automatycznie do wszystkich ekranów na których będzie uruchomiony
y=y+dy;
x=x+dx;
//zmieniamy współrzędne kulki
petla = petla+1;
repaint();
//odmalowujemy płótno
try
{
Thread.sleep (opoznienie);
}
//wywołujemy statyczną metodę sleep klasy Thread której parametrem jest podane w konstruktorze opóźnienie ,
stąd każda kulka może się przemieszczać w swoim tempie
catch (Exception e)
{
}
// wszystko to zamknięte jest w klauzuli try ... catch , bo metoda sleep może wygenerować wyjątek
}
}
private int x;
private int y;
private int opoznienie;
private int dx;
private int dy;
private int petla;
private int kolor;
//skłądowe klasy wewnętrznej
}
private Image bufor;
private Graphics gbuforu;
//oraz składowe klasy zewnętrznej
}
issa
10%
10%
 
Posty: 49
Dołączył(a): 11 sierpnia 2006, o 20:13
    WindowsXPFirefox

Powrót do Od czego zacząć?

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość