Пишем на Java

Темы о Java и ее разновидностях типа J2me
DuMOH
Обсуждатель
Сообщения: 133
Зарегистрирован: Ср янв 02, 2008 6:14 pm
Откуда: Смоленск
Контактная информация:

Re: Пишем на Java

Сообщение DuMOH » Чт янв 10, 2008 9:39 pm

Я наверно уже всех достал, но как сделать так, чтоб картинки были по центру?
http://DuMOHsmol.narod.ru - мой сайт

Аватара пользователя
blackstrip
Админ
Сообщения: 1177
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Чт янв 10, 2008 9:55 pm

Phantom по идее - ты прав. Потому что действительно придется перерисовывать целиком задний фон и потом сверху рисовать прицел. Но конечно это будет тормозно - поэтому выхода два:

1) использовать Game API - спецклассы в яве (которыми я особо не пользовался никогда, но хочу када нить начать). Там есть движок спрайтов - то бишь маленьких рисунков. Ты добавляешь на экран спрайт (с запихнутым внутрь рисунком) и указываешь ему где рисоваться надо. Это например для таких игр как там когда кто нить бежит - снизу у него земля, на заднем фоне небо едет, еще сверху облака летят, солнце круглое висит, а человек который бежит - у него тоже анимация бега из пяти кадров например. И надо при каждом очередном кадре отрисовки - сразу рисовать все эти объекты в нужном порядке, и выбрав нужные кадры их анимации для отрисовки. Вот тут короч про спрайты надо где то читать - ибо я на Яве спрайтами не пользовался, зато пользовался в компе - вот там нечто подобное тому, что я описал тока что =)

2) отрисовывать кусок Билла Гейтса соответствующий предыдущему расположению прицела. В яве можно всякими setClip управлять выбором области на экране для отрисовки тока куска. Тока там правило такое - setClip выбирает бОльшую область для отрисовки (по сравнению с той, которая была до этого), а другая команда ClipRect - меньшую область.

Вот пример из паинткада - там в меню "инструменты" картинки инструментов размазываются по экрану путем "рубки" на части большого рисунка

//сначала выбираю мелкий квадрат в соответствии с размерами экрана (ну эт там специфичные для паинткада всякие stx, dx и др переменные)
g.clipRect(stx-8+dx*(i%5),sty-8+dy*(i/5),16,16);

//потом рисую рисунок на экране. но выкидывает на экран только то, что попало в выбранную clipRect-ом область
g.drawImage(MainForm.brushes[0],stx-8+(dx-16)*(i%5),sty-8+(dy-16)*(i/5),Graphics.LEFT|Graphics.TOP);

//потом обратно делую возможность для отрисовки на всем экране (sw,sh - переменные ширины и высоты экрана)
g.setClip(0,0,sw,sh);

Вот так =)

DuMOH
например если ширина экрана 240 точек, то команда
g.drawImage(Risunok, 120, 0, Graphics.HCENTER|Graphics.TOP);
нарисует рисунок посередине экрана по горизонтали и верхушкой точно примкнет к верху экрана по вертикали (Y=0)

Все зависит от точки опоры - последнего параметра в команде drawImage.
По горизонтали может быть Graphics.LEFT, Graphics.HCENTER, Graphics.RIGHT
По вертикали может быть Graphics.TOP, Graphics.VCENTER, Graphics.BOTTOM

Например
g.drawImage(Risunok, getWidth()/2, getHeight()/2, Graphics.HCENTER|Graphics.VCENTER);
нарисует рисунок точно посередине экрана

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт янв 11, 2008 2:40 am

В МидлетПаскале есть функция, которая позволяет выбрать прямоугольное выделение произвольного размера на экране, и после этого все графические функции работают только с этим выделением. То есть если я выберу кусочек картинки размером в два прицела (точнее в полтора, чтобы "затереть Биллом Гейтсом" нарисованный прицел и нарисовать новый) и буду заливать большой картинки Билла этот маленький участок, то Java сделает это быстрее, чем так, как я делал до этого?

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт янв 11, 2008 2:41 am

И что на счёт коннекта с интернетом? Как правильно делать?

Аватара пользователя
blackstrip
Админ
Сообщения: 1177
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Пт янв 11, 2008 3:27 am

да - чем меньше кусь рисуешь - тем быстрее он отрисуется

а с инетом - хз. я единственное что делал с инетом (и тока через HTTPConnection) - проверку версии паинткада (это када паинткад просто лез ко мне на сайт к текстовому файлу, и читал из него 2 строки). да и там и то были проблемы - много оттуда прочитать не удавалось, где то байтов 50 может, а потом поток оказывался будто бы пустым и я ваще так и до сих пор не знаю как вообще из инета чото выкачивать большое =) так что хз

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт янв 11, 2008 5:44 am

Заголовки у меня нормально принимает (а сам файл я не пробовал, да оно мне и не нужно), и вообще работает стабильно, если, конечно на мобиле интернет не глючит. Если глючит, просто прога висит, пока инет не восстановится. )) Вот только как в опере сделано, что она страницу открытую может листать вверх-вниз даже во время передачи/приёма данных из интернета? - загадка... Ваще ХЗ...

Аватара пользователя
blackstrip
Админ
Сообщения: 1177
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Пт янв 11, 2008 11:51 am

Разгадка вот в чем:
В яве есть некоторое подобие многозадачности - вот твоя прога это считай некоторый поток, который изначально занимает 100% времени выполнения.

Но можно написать в проге
public class MoyPotok implements Runnable {
public void run(){
while (true) {
//бесконечный цикл выполнения чего либо, например скачивание из инета
}
}
}

А там где надо его запустить - вписать:
//создаем экземпляр нашего нового потока
Thread VtoroyPotok = new Thread(new MoyPotok());
//даем команду на запуск
VtoroyPotok.start();

И тогда в проге помимо основной проги будет (параллельно) выполняться этот поток - после вызова VtoroyPotok.start(); ява запустит в экземпляре потока MoyPotok метод run - и по окончании выполнения метода run наш поток закроется и прекратит выполняться. Но если там поставить бесконечный цикл - и например чо нить там опрашивать в нем, или инет качать - то второй поток будет бесконечно долго оставаться запущенным параллельно нашей основной проге. И тогда - в то время как в основной проге мы ловим клавиши и листаем страницы, в созданном потоке можно качать инет или еще чо то делать.

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт янв 11, 2008 6:42 pm

Эх... В МидлетПаскале этого, вроде, нет... Жаль... Кстати, в Java есть тип данных image? В этом Паскале есть. Если присвоить переменной тип image, то в неё нужно открывать загруженное ресурсное изображение. Ну так вот, я делаю Морской Бой, хочу загрузить в массив куски корабля. Создаю массив общим размером в 12 ячеек, даже если ничего в массив не записываю, прога не идёт. Компилируется нормально, но ни на теле, ни на эмуляторе не идёт. Просто белый экран. Пробовал вместо массива использовать переменные - та же хрень. Что это? Оперативы не хватает для выделения такого большого массива? И как же тогда поступать? Подгружать все картинки на лету? О_о Будет жутко тормозить, я пробовал (это ещё на Билле испытывал, если с каждым движением прицела, брать фото билла не из переменной, а подгружать на лету, то прога оочень тормозит). Что делать? Синтаксиса языка знать мало... Везде есть свои нюансы, нужно многое учитывать, чтобы прога работала шустрее. Ещё хотелось бы узнать, какие переменные предпочтительнее использовать, локальные или глобальные? Локальные переменные освобождают место в оперативе, когда, допустим, цикл завершается? А как принудительно стереть переменную из памяти?
И ещё такой вопрос, сколько переменных и массивов объявлено в ПэинтКаде? И сколько в общей сложности строк кода он содержит?

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Пишем на Java

Сообщение Phantom » Пт янв 11, 2008 7:04 pm

"Сборка мусора"

Назад Вперед

Одна из интереснейших особенностей языка программирования Java и среды выполнения приложений Java заключается в наличии специального процесса сборки мусора, предназначенного для удаления ненужных объектов из памяти. Эта система избавляет программиста от необходимости внимательно следить за использованием памяти, освобождая ненужные более области явным образом.

Создавая объекты в Java, вы можете руководствоваться принципом "создай и забудь", так как система сборки мусора позаботится об удалении ваших объектов. Объект будет удален из памяти, как только на него не останется ни одной ссылки из других объектов.

Приоритет процесса сборки мусора очень низкий, поэтому "уборка" среды выполнения приложений Java не отнимает ресурсы у самих приложений.

###################################################################################

Это как раз следит за тем, будет ли использоваться переменная в дальнейшем?

Аватара пользователя
blackstrip
Админ
Сообщения: 1177
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Пишем на Java

Сообщение blackstrip » Сб янв 12, 2008 12:30 am

Хз чо там в мидлетпаскале, в яве я вот делаю Image A, потом пишу где нить в коде A = Image.createImage('/moyproekt/a.png'); и у мя внутрь там при выполнении подружается рисунок.

Насчет строк - хз, ибо там одних классов штук 20, во всех строки кода считать лень. А вот например смотри насчет объявлений массивов и переменных - вот объявления из модуля MainForm (это окно, где как раз происходит рисование):

Код: Выделить всё

static boolean PartWS=true;
static int defeb=5;
static int OldDef=-1;
static boolean RotVert;
static int step=0;
static int curbacklevel;
static int maxbacklevel=3;
static int inbuf;
static int LinW=1;
static Graphics gra;
static int styl;
static int KEY_JOYSTICK = -26;
static int KEY_UP = -59;
static int KEY_DOWN = -60;
static int KEY_LEFT = -61;
static int KEY_RIGHT = -62;
static int KEY_RED = -12;
static int KEY_GREEN = -11;
static int KEY_LSOFT = -1;
static int KEY_RSOFT = -4;
static int KEY_MOTO = -23;
static int KEY_FOTO = -20;
static int KEY_PLUS = -13;
static int KEY_MINUS = -14;
static int pvx=0,pvy=0,pvw=0,pvh=0;
static boolean GIFRQ = false;
static boolean GIFRQ2 = false;
static boolean PNGRQ = false;
static boolean AutoC = true;
static boolean Indic=true;
static boolean TextMode=true;
static boolean BmpLoaded=false;
static Image comparator=Image.createImage(1,1);
static boolean compview=false;
static boolean WideScreen=false;
static boolean Blocked=false;
static boolean ZPEO=false;
static boolean XZinCB = false;
static int ZPI=0;
static int dfsx=0,dfsy=0,dfcx=0,dfcy=0,dfcw=0,dfch=0;
static int[] MarksX = new int[100];
static int[] MarksY = new int[100];
static int[] MarksT = new int[100];
static int MarksC=0;
static boolean UseMaxSizes=false;
static int RMSMaxW=64;
static int RMSMaxH=64;

static Random w = new Random();
static Image NoIm;
static boolean ph,ref,nf,mov,hh,brk,rf,mesaga,wait,txt;
static int bigs=1;
static int gr,ogr;
static int lx1,ly1,lx2,ly2,r,jj,hei,oldImW,oldImH;
static int lstep,addmov;
int dx,dy;
static boolean kist;
static boolean kvit,cel;
static boolean repe=false;
static int repcount=0;
static boolean pro=false;
static boolean gradd,gradir,gradd2;
static String pro1="";
static String pro2="";
static int procur=0;
static int promax=0;
static int plot;
static boolean fscr=false;
static boolean ob = false;
static boolean ut=false;
static boolean flod=false;
static boolean flodd=false;
static boolean[] Img2 = new boolean[2050];
static Image ic;
static Image[] clock = new Image[3];
static Image[] bmpi = new Image[3];
static Image[] brushes = new Image[1];
static Image[] effects = new Image[1];
static Image[] selects = new Image[1];
static byte CurCol,CurBCol;
static int MaxW, MaxWX;
static int MaxH, MaxHX;

static byte Pica[][];
static byte Pica2[][];
static byte UnBuf[][];
static byte Clipboard[][];
static boolean CBUsed;
static int CBW,CBH;
static Image CBImage;

static byte[] Palette = new byte[768];
static byte[] Palette2;
static byte[] UnPalette = new byte[768];

static byte[] Dummy = new byte[1];
static byte[] Dummies = new byte[4];
static Image Pix;
static boolean Adapt = true;
static boolean Podbor = true;
static boolean wdraw=false;

static int x=4;
static int y=18;
static int cx,cy,ocx,ocy,ofx,ofy,reas,reas2,opn,opnb,opnw,opng,opnxz,lin,gc,lin2,lin3,Imml,Imms,Imwp,sx,sy,reasb,reasw,reasg,reasi,reasp,i,j;
static String opt;
static byte ImL,ImS;
  static int ImH=16;
  static int ImW=16;
  static int GImH=0;
  static int GImW=0;
  static int ImWX;
  static int ImHX;
  static int ImWM;
  static int ImHM;
  static int SelX,SelY,SelW,SelH,oSelX,oSelY,oSelW,oSelH;
  byte cv;
  static int sw,sh,fh;
  static String out;
  static String s="";
  static String sf="";
  static String i1664sf="";
  static String iwbmpsf="";
  static byte[] byt = new byte[350];
  int cr1 = 255;
  int cg1 = 0;
  int cb1 = 0;
  int cr2 = 255;
  int cg2 = 0;
  int cb2 = 0;
  static int oldrand;
Всё статическое чтоб оно висело в единственном экземпляре и никуды не девалось =) В режиме када оперативы мало - тока это коекак спасало более-менее нормальную работу проги, да и давало возможность работать именно в MainForm с этими массивами и переменными и доставать их из других модулей проги.

А последний твой пост - это про gc - garbage collector ("мусоропровод" по русски). Он стирает все када оно не нужно. Например ты в какой нить процедуре создал переменную (например в цикле счетчиковую, и она тебе после цикла не нужна уже никогда будет):

public void Procedura() {
for (int i = 0; i<5; i++) {
...
}

...
}
И вот када выйдет выполнение из этой процедуры - то больше эта выделенная переменная i не нужна (да и она уже считай стерлась, и нигде больше не доступна) - вот тада ее gc съедает и освобождает место под новые переменные разные. Вручную можно это сделать хоть прям посередине процедуры до выхода, главное перед этим убить переменную i (кажись чото типа i.Free, или i.Destroy, ну чтото подобное написать, не помню точно что - чтоб переменная i перестала существовать) - и тогда после вызова garbage collectora он ее подъест побырому.

ну суть то вся в том что необязательно освобождать переменную (с помощью free или destroy), достаточно чтобы она сама прекратила существование - и тогда когда оперативы мало останется - будет запущен автоматически gc, и он очистит от ненужных переменных память.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей