|
26.10.2008, 21:58
|
#1
|
Нуждающийся
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений (для 12 пользователей)
|
2D-движок + Splash-меню
Решил поделиться своим движком с народом, взамен на его оптимизацию.
Укажите пжлста где и что я нерационально использую. Щас подредактирую код и выложу.
|
(Offline)
|
|
27.10.2008, 05:22
|
#2
|
Нуждающийся
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений (для 12 пользователей)
|
Ответ: 2D-движок + Splash-меню
Вот собственно сам исходнеГ. Самая свежайшая версия, пока писал коментарии, понемногу обновлял код. Неплохо получилось.
Так сказать наброски моей портации СТАЛКЕР'а на мобилы.
|
(Offline)
|
|
27.10.2008, 05:26
|
#3
|
Нуждающийся
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений (для 12 пользователей)
|
Ответ: 2D-движок + Splash-меню
А вот и сам код:
program LandScroll4_by_Cliffe_aka_Snake; uses game, sprite, alpha; const versWidth=176;versHeight=220; //Мидлет ориентирует всю отрисовку на этот экран mapsize=255; // ширина и высота карты(квадратной, при желании можно сделать и неквадратную) //Возможно одновременное нажатие нескольких клавиш //функция для маскирования поля game.get_bit(value, mask) UP=2; LEFT=4; RIGHT=32; DOWN=64; FIRE=256; GAME_A=512; GAME_B=1024; GAME_C=2048; GAME_D=4096; var {Меню} vW,vH,PROGW : integer; // хз ,хз , ширина Прогрессбара np,xp,yp,xp2,upf,maxi: integer; // Nомер пункта меню и его координаты, сдвиг по вертикали и кол-во разрабов ir,ks,ksl: integer; New,Continue : boolean; // см. ниже exit : boolean; menu,jspeed : Integer; // Текущее состояние меню, регулируемая задержка st : Array [1..7] of string; // массив пунктов меню rz : Array [1..50] of string; // массив надписей RаZработчиков ry : Array [1..50] of integer; // массив высот надписей разрабов load,str : string; // впомогательные строки res : resource; // для открытия ресурсов rs: recordstore; // Для загрузки профиля из RMS-памяти + загрузка/сохранение прогресса {Для бэкграунда, игры} img: array[0..16] of image; {массив загруженных изображений} kl,sw,sh : integer; {нажатие кнопки | ширина, высота экрана} x,y,txp,typ,i,j: integer; {мелкий сдвиг карты | коорд.тайла наход-ся в верх-левом углу экрана | параметры циклов} my,mx,tx,ty : integer;{- ширина, высота карты | кол-во тайлов в строке и в столбце} th,tw: integer; {высота, ширина тайлов} bx,by,bc: integer; {проверка для буфер-ции, счётчик буфера} bufer: string; {список загруженных тайлов} lin: string; {считывание строки карты} map : array[1..mapsize,1..mapsize] of char; {Карта местности} scr : array[1..10,1..10] of char; {Отображаемый кусок карты} hero,fn,fd: integer; // спрайт, номер фрейма перса splash,karta,razraby:image; //менюшные картинки oxsv,oysv,oxmv,oymv : integer; //Для исключения лишних загрузок из ресурсов {Игра} speed,dspeed: integer; //Скорости обычная и диагональная(pixels/iteration) txt,object : string; //Впомогательные строки hx, hy : integer; // Коорд.героя d : integer; // Направление и номер кадра. lx,ly : integer; // Координаты надписи загрузка w,h : integer; // Сдвиг карты по X и Y. Ширина и высота карты health,armour,loading: integer;// текущее здоровье,броня. центрирование загрузки onum,omax : integer; //номер тек.объекта, кол-во объектов gbar,bpanel,armb,lifb,box : image; //картинки HUD'a obj,mask,shadow : array[1..15] of image; //Картинка объекта, его маска и тень ox,oy,oxm,oym,oys,oxs : array[1..15] of integer; //использ. для сбора данных объекта objname : array[1..15] of string; //название объекта ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// { БУФЕРИЗАЦИЯ!!!! =) Тайлов } procedure buferiz(v,w:integer); begin img[bc]:=LoadImage('/land'+scr[v,w]+'.JPG'); bufer:=bufer+scr[v,w]; bc:=bc+1; end; //////////////////////////////////////////////////////////////////////////// {----- Рисуем прогрессбар -----} Procedure DrawPBar; begin loading:= loading+(PROGW/20); //Здесь значение 20 это кол-во загружаемых файлов(постоянно нужно менять) If loading >= PROGW Then loading:= PROGW; SetColor(0, 0, 0); FillRect(0, 0, sw, sh); setcolor(255,255,255); DrawText(load,lx,ly); SetColor(150, 150, 0); DrawRect((sw - PROGW)/2-2, (sh + GetStringHeight('Загрузка'))/2+8, PROGW+2, 15); FillRect((sw - PROGW)/2, (sh + GetStringHeight('Загрузка'))/2+10, loading, 12); refresh;//repaint; end; ///////////////////////////////////////////////////////////////////////////// //// Конвертирует кракозябры, считаные с ресурса в русск-англ.строку { Не помню у кого взял код этой функции} function ansi(str : string) : string; var {rus_ansi to unicode} s : string; i,c : integer; begin s := ''; for i := 0 to length(str)-1 do begin c := ord(getChar(str,i)) and 255; if (c>=192) then c := c+(1040-192) else if (c<32) and (c<>10) then c := 32; s := s+chr(c); end; ansi := s; end; ///////////////////////////////////////////////////////////////////////////// Function joy(nk:integer) : integer; // укороченный вариант KeyToAction begin joy:=keytoaction(nk); end; ////////////////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ СОХРАНЕНИЯ И ЗАГРУЗКИ ПРОГРЕССА (c)Odd [Всё остальное писал сам (с)Cliffe] // ////////////////////////////////////////////////////////////////////////////////////////// Procedure SaveProgress; var id: integer; begin rs:=OpenRecordStore('Saving'); id:=GetRecordStoreNextId(rs); if id=1 then begin id:=AddRecordStoreEntry(rs,'0'); id:=AddRecordStoreEntry(rs,'0'); end; {Далее сохраняем значения переменных} ModifyRecordStoreEntry(rs,''+health,1); ModifyRecordStoreEntry(rs,''+armour,2); CloseRecordStore(rs); str:='Игра сохранена '; Drawtext(str,(sw-getstringwidth(str))/2,(sh-getstringheight(str))/2); delay(1600); refresh; end; Procedure LoadProgress; var id: integer; begin rs:=OpenRecordStore('Saving'); id:=GetRecordStoreNextId(rs); if id=1 then begin str:='Игра ещё не сохранялась '; Drawtext(str,(sw-getstringwidth(str))/2,(sh-getstringheight(str))/2); delay(1000); refresh; end else begin {Далее загружаем значения переменных} health:=stringtointeger(ReadRecordStoreEntry(rs,1)); armour:=stringtointeger(ReadRecordStoreEntry(rs,2)); str:='Игра загружена '; Drawtext(str,(sw-getstringwidth(str))/2,(sh-getstringheight(str))/2); delay(1000); refresh; end; CloseRecordStore(rs); end; ////////////////////////////////////////////////////////////////////////////// // Очень удобно работать с настройками шрифта, // // передаём процедуре строку char'ов, соответствие каждого см. в IF-THEN'ах // // причём к передаваемой строке нет никаких ограничений // ////////////////////////////////////////////////////////////////////////////// Procedure Font(fpar:string); var face,style1,style2,size,i,j: integer; tp: char; begin face:=FONT_FACE_SYSTEM; style1:=FONT_STYLE_PLAIN; style2:=FONT_STYLE_PLAIN; size:=FONT_SIZE_SMALL; j:=1; for i:=1 to length(fpar) do begin tp:=getchar(fpar,i-1); //Берём второй символ напр.: sYstem-->'Y' mOnospace-->'o' pRoportional-->'r' if (tp='y') or (tp='Y') then face:=FONT_FACE_SYSTEM; if (tp='o') or (tp='O') then face:=FONT_FACE_MONOSPACE ; if (tp='r') or (tp='R') then face:=FONT_FACE_PROPORTIONAL; //Далее проще используем первый символ: Small-->'S' Italic-->'i' и т.д. if (tp='p') or (tp='P') then if j=1 then style1:=FONT_STYLE_PLAIN else style2:=FONT_STYLE_PLAIN; if (tp='b') or (tp='B') then if j=1 then style1:=FONT_STYLE_BOLD else style2:=FONT_STYLE_BOLD; if (tp='i') or (tp='I') then if j=1 then style1:=FONT_STYLE_ITALIC else style2:=FONT_STYLE_ITALIC; if j=1 then j:=2 else j:=1; if (tp='s') or (tp='S') then size:=FONT_SIZE_SMALL if (tp='m') or (tp='M') then size:=FONT_SIZE_MEDIUM if (tp='l') or (tp='L') then size:=FONT_SIZE_LARGE end; if (style1=FONT_STYLE_PLAIN) or (style2=FONT_STYLE_PLAIN) then SetFont(face,FONT_STYLE_PLAIN,size) else SetFont(face,style1 or style2,size); end; ////////////////////////////////////////////////// // Так как функции game.get_key_clicked нету // // пришлось написать её самому // ////////////////////////////////////////////////// Function Click(key:integer): boolean; begin if (ks=key) and (ksl<>key) then click:=true else click:=false; end; {-------------------------------------------------------------} {=============== # # ### ### # # ==================} {=============== ## ## # # # ## # ==================} {=============== # # # #### # # ## ==================} {=============== # # # # ### # # ==================} {-------------------------------------------------------------} begin game.init(1); sprite.init(1); game.show; PROGW:=versWidth-6; //Устанавливаем ширину прогресс-бара loading:=0; speed:=3; Font('myb');// устанавливаем шрифт SYSTEM-BOLD-MEDIUM vW:=versWidth; vH:=versHeight; //Считываем значения констант в переменные sw:=GetWidth; //Записываем размеры экрана sh:=GetHeight;//чтобы по сто раз не писать GetWidth и GetHeight. {Здесь осуществляется поддержка экранов, логика такова: Если версия для меньшего экрана, то будем все вычисления проводить относительно онного. А если версия для большего экрана, то дабы не разжирять jar-файл, не будем осуществлять такую поддержку, хотя все вычисления будут проводиться отн-но реального экрана. Отсюда следует, что нужно компилить по 3-4 версии: v.176(132x176,128x160), v.208(176x208),v.220(176x220), v.320(240x320) Вот и вся не хитрая поддержка экранов =) } if (vw<sw) then sw:=vw; if (vh<sh) then sh:=vh; setclip(0,0,sw,sh); // Тут перечисляем пункты меню: st[1]:='Новая игра'; st[2]:='Карта'; st[3]:='Загрузить'; st[4]:='Сохранить'; st[5]:='Разработчики'; st[6]:='Выход'; //Ну и конечно же нас - разрабов =) res := openResource('/Autors.txt'); i:=0; upf:=vH*4/6; repeat i:=i+1; rz[i]:=readLine(res); ry[i]:=(getstringheight(rz[i]))*i; until (rz[i]='The End =)'); // Строка, означающая "Конец чтения ресурса" (Тоже выводится на экран) maxi:=i; closeResource(res); {Загружаем картинки соответственно версии:} splash:=loadimage('/menu/splash'+versHeight+'.JPG'); karta:=loadimage('/menu/karta'+versHeight+'.JPG'); razraby:=loadimage('/menu/razraby'+versHeight+'.JPG'); // Загружаем аним_спрайт hero:= sprite.create_frames('/walk1.png',29,39); menu:=1; new:=false; // Если true, то начинаем новую игру continue:=false; // Если true, то можно вернуться из меню обратно в игру setcolor(255,255,255); np:=1; // номер активного пункта меню xp:=(sw-getstringwidth(st[np]))/2; //Выравнивание пункта меню по центру; //Цикл меню: repeat if New=true then begin // Начать новую игру? //Переходим из меню в начало игры. menu:=-1; SetColor(0, 0, 0); FillRect(0, 0, sw, sh); dspeed:=Trunc(speed*7/10);//устанавливаем диагональную скорость передвижения персонажа if (Continue=false) then begin //Начинаем НОВУЮ ИГРУ health:=10; armour:=90; // устанавливаем начальные значения Здоровья и Брони //// Чёрный экран, загрузка //// load:='Загрузка анимации '; lx:=(sw-getstringwidth(load))/2; ly:=(sh-getstringheight(load))/2; //Раньше я загружал каждый кадр анимации из отдельного файла, поэтому далее идёт коммент {//// Загружаем АНИМАЦИИ персонажа... for d:=1 to 9 do begin for i:=0 to 3 do begin DrawPBar; load:=load+'.'; if (d<>5) then begin walk[d,i]:= LoadImage('/hero/walk/'+d+i+'.png'); talk[d,i]:= LoadImage('/hero/talk/'+d+i+'.png'); end; end; load:='Загрузка анимации '+d; end;} //// Чёрный экран, загрузка //// load:='Загрузка спрайтов '; lx:=(sw-getstringwidth(load))/2; ly:=(sh-getstringheight(load))/2; //Загрузка НЕ анимированных спрайтов персонажа и Анимированных спрайтов окружения {for d:=1 to 9 do begin DrawPBar; load:=load+'.'; if (d<>5) then begin stop[d]:= LoadImage('/hero/stop/stopped'+d+'.png'); end; if d<8 then fireborn[d]:=loadimage('/world/fire'+d+'.png'); end;} //далее загружаем по-одному однокадровые обьекты, которые не являются препятствием //box:=loadimage('/world/box.png'); ///// Загрузка картинок HUD'a gbar:=loadimage('/gunbar.png'); bpanel:=loadimage('/barpanel'+versHeight+'.png'); armb:=loadimage('/armorbar.png'); lifb:=loadimage('/healthbar.png'); hx:= trunc(sw/2-15); hy:= trunc(sh/2-20); d:=2;i:=0; load:='Загрузка Обьектов'; lx:=(sw-getstringwidth(load))/2; ly:=(sh-getstringheight(load))/2; {res:= openResource('/Objects.txt'); // Загружаем объекты (картинки). В этой версии объекты загружаются, но не включаются в карту onum:=0; repeat DrawPBar; onum:=onum+1; txt:=readLine(res); if (copy(txt,0,1)<>'_') then begin objname[onum]:=copy(txt,0,length(txt)-1); load:='Загрузка обьекта '+objname[onum]; txt:=readLine(res); ox[onum]:=Stringtointeger(copy(txt,3,length(txt))); txt:=readLine(res); oy[onum]:=Stringtointeger(copy(txt,3,length(txt))); if onum>1 then for i:=1 to onum do if (objname[i]=objname[onum]) then begin obj[onum]:=obj[i]; mask[onum]:=mask[i]; shadow[onum]:=shadow[i]; end; else begin obj[onum]:=loadimage('/world/'+objname[onum]+'.png'); mask[onum]:=loadimage('/world/'+objname[onum]+'_mask.png'); shadow[onum]:=loadimage('/world/'+objname[onum]+'_shadow.png'); end; else begin obj[onum]:=loadimage('/world/'+objname[onum]+'.png'); mask[onum]:=loadimage('/world/'+objname[onum]+'_mask.png'); shadow[onum]:=loadimage('/world/'+objname[onum]+'_shadow.png'); end; txt:=readLine(res); if txt<>'add' then txt:='_End' end; until (txt='_End'); omax:=onum; //Запиываем кол-во объектов closeResource(res); } SetColor(0, 0, 0); FillRect(0, 0, sw, sh); load:='Синхронизация Обьектов'; lx:=(sw-getstringwidth(load))/2-4; ly:=(sh-getstringheight(load))/2; DrawPBar; // Далее компонуем тень, маску и картинку объекта { res:= openResource('/index.dat'); object:=readline(res); repeat oxsv:=stringtointeger(readLine(res)); oysv:=stringtointeger(readLine(res)); oxmv:=stringtointeger(readLine(res)); oymv:=stringtointeger(readLine(res)); for i:=1 to omax do begin if objname[i]=object then begin oxs[i]:=oxsv; oys[i]:=oysv; oxm[i]:=oxmv; oym[i]:=oymv; end; load:='Синхронизация обьектов:'+i; lx:=(sw-getstringwidth(load))/2; ly:=(sh-getstringheight(load))/2; drawpbar; end; object:=readline(res); delay(10); until (object='end'); closeResource(res); } end; else //// Возврат в игру (чёрный экран, загрузка) //// begin load:='Загрузка'; lx:=(sw-getstringwidth('Загрузка..'))/2; ly:=(sh-getstringheight(load))/2; For i:=1 to 4 do begin SetColor(0, 0, 0); FillRect(0, 0, sw, sh); setcolor(255,255,255); DrawText(load,lx,ly); refresh;//repaint; load:=load+'.'; delay(40); end; end; setcolor(255,0,0); fillrect(0,0,240,320); refresh;//repaint; sprite.append(hero); // добавляем героя на экран sprite.set_position(hero, hx, hy-5); // и ставим его в центр экрана /////====== Новая часть движка ======///// res:=OpenResource('/map.txt'); //Загружаем символьную карту местности j:=1; setcolor(255,255,0); // Переодически встречающуюся связку \/ fillrect(0,0,240,320); // Setcolor->FillRect-->(Repaint/Refresh) использую \/ refresh;//repaint; // для выявления момента сбоя приложения bc:=0; {Далее в цикле переношу карту в массив map[j,i] } repeat bc:=bc+1; if (bc<mapsize) then lin:=ReadLine(res); if (length(lin)>=mapsize-1) then lin:=copy(lin,0,mapsize); if (length(lin)>0) and (lin<>'END') then begin i:=1; repeat map[j,i]:=getchar(lin,i-1); i:=i+1; until i>length(lin); j:=j+1; end until (lin='END') or (bc>=mapsize); //Условие окончания считывания карты из ресурса CloseResource(res); mx:=i-1;my:=j-1; setcolor(255,0,0); drawtext(''+mx,5,5); drawtext(''+my,25,5); refresh;//repaint; {==================================} {============VARIABLES=============} {==================================} th:=64; tw:=64; {размер тайла} bc:=0; //tx:=6;ty:=6; {кол-во строк и столбцов тайлов отображаемых на дисплее(увеличить, если наблюдаются шлейфы)} {Далее вариант с автоподгонкой значений tx и ty} tx:=Trunc(sw/tw)+3; ty:=Trunc(sh/th)+3; txp:=7;typ:=4; {координаты левого верхнего тайла (при запуске)} fd:=4; // устанавливаем начальное направление анимации перса fn:=1; // устанавливаем начальный кадр анимации setcolor(255,0,255); // Переодически встречающуюся связку \/ fillrect(0,0,240,320); // Setcolor->FillRect-->(Repaint/Refresh) использую \/ refresh;//repaint; // для выявления момента сбоя приложения {Загрузка буфера} for j:=1 to ty do for i:=1 to tx do begin scr[j,i]:=map[typ+j,txp+i]; //Считываем тайлы, которые должны быть отображены при старте if Pos(bufer, scr[j,i])=-1 then buferiz(j,i); // Загружаем тайлы end; ///=============== Игровой цикл ================/// repeat jspeed:=GetRelativeTimeMs; for j:=1 to ty do for i:=1 to tx do begin scr[j,i]:=map[typ+j,txp+i]; end; kl:=getkeypressed; ks:= game.get_key_states; if ks<>0 then begin if (game.get_bit(ks,4) <> 0) then begin x:=x-2; fd:=3; end; if (game.get_bit(ks,32)<> 0) then begin x:=x+2; fd:=4; end; if (game.get_bit(ks,2) <> 0) then begin y:=y-2; fd:=1; end; if (game.get_bit(ks,64)<> 0) then begin y:=y+2; fd:=6; end; // если двигаемся по диагонали, то изменяем if (game.get_bit(ks,64)<> 0)and(game.get_bit(ks,4) <> 0) then fd:=5; if (game.get_bit(ks,64)<> 0)and(game.get_bit(ks,32)<> 0) then fd:=7; if (game.get_bit(ks,2) <> 0)and(game.get_bit(ks,4) <> 0) then fd:=0; if (game.get_bit(ks,32)<> 0)and(game.get_bit(ks,2) <> 0) then fd:=2; end; //если убрать, то мидлет зависнет по незвестной причине(скорее всего из-за Lib_sprite или Lib_game) delay(1); {Далее идет смена кадров текущей анимации } if ((game.get_bit(ks,64)<>0)xor(game.get_bit(ks,2)<>0))or((game.get_bit(ks,32)<>0)xor(game.get_bit(ks,4)<>0))then fn:=fn+2; if fn>=40 then fn:=0; if (fn>=0) and (fn<10) then sprite.set_frame(hero, fd*4); if (fn>=10) and (fn<20) then sprite.set_frame(hero, fd*4+1); if (fn>=20) and (fn<30) then sprite.set_frame(hero, fd*4+2); if (fn>=30) and (fn<40) then sprite.set_frame(hero, fd*4+3); if (y<-th) and (typ=0) then begin y:=-th; end; if (y>th) and (typ=my-ty) then begin y:=th; end; if (x<-tw) and (txp=0) then begin x:=-tw; end; if (x>tw) and (txp=mx-tx) then begin x:=tw; end; {Проверка на наличие незабуфер-ых тайлов если таковые есть, подгружаем их налету (Выгрузку пока не сделал)} if by>typ then for i:=1 to tx do if Pos(bufer, scr[1,i])=-1 then buferiz(1,i); if by<typ then for i:=1 to tx do if Pos(bufer, scr[ty,i])=-1 then buferiz(ty,i); if bx>txp then for j:=1 to ty do if Pos(bufer, scr[j,1])=-1 then buferiz(j,1); if bx<txp then for j:=1 to ty do if Pos(bufer, scr[j,tx])=-1 then buferiz(j,tx); for j:=1 to ty do for i:=1 to tx do begin drawimage(img[Pos(bufer, scr[j,i])],(i-2)*tw-x,(j-2)*th-y); end; bx:=txp; by:=typ; if (x>tw) and (txp<=mx-tx) then begin txp:=txp+1; x:=0; end; if (x<-tw) and (txp>=0) then begin txp:=txp-1; x:=0; end; if (y>th) and (typ<=my-ty) then begin typ:=typ+1; y:=0; end; if (y<-th) and (typ>=0) then begin typ:=typ-1; y:=0; end; //Выводим техническую инфу на экран drawtext('AlphaLevels:'+IntegerToString(GetAlphaLevels),5,5); drawtext('Frames:'+fd+'_'+fn,5,20); drawtext('Your delay:'+(100/(GetRelativeTimeMs-jspeed)),5,35); drawtext('ks:'+ks+' kl:'+kl,5,50); //отрисовываем HUD drawimage(gbar,0,sh-getimageheight(gbar)); drawimage(bpanel,sw-getimagewidth(bpanel),sh-getimageheight(bpanel)); setclip(sw-58,sh-23,armour/2,10); drawimage(armb,sw-58,sh-23); setclip(sw-58,sh-12,health/2,10); drawimage(lifb,sw-58,sh-12); setclip(0,0,sw,sh); refresh; delay(Trunc(100/(GetRelativeTimeMs-jspeed))); //Делаем задержку для обеспечения эталонной скорости работы мидлета на девайсе /// Чтобы избавиться от шлейфов, сразу после рипейнта красим экран чёрным: // setcolor(0,0,0); // fillrect(0,0,sw,sh); until kl=-7; // по правому софту выходим в меню np:=0; menu:=1; If health>0 then begin continue:=true;//ставим флаг возможности продолжения игры new:=false; st[1]:='Вернуться'; //меняем значения пунктов меню st[6]:='Завершить игру'; end; remove(hero);//удаляем спрайт, дабы тот не вылез в меню setcolor(255,255,255); end; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// {Обработка менюшки} ks:=game.get_key_states; kl:=getkeyclicked; Font('rbm'); // Подготовка к выводу запрошенного пункта меню if (kl=KE_KEY5) or click(FIRE) then begin if (np=2) then begin menu:=2; np:=0; end; if (np=3) then begin menu:=1; LoadProgress; np:=0; end; if (np=4) then begin menu:=1; SaveProgress; np:=0; end; if (np=5) then begin menu:=3; np:=0; end; if (np=6) then begin menu:=4; np:=0; end; if menu=1 then if (np=1) then begin new:=true; menu:=-1; np:=0; end; end; ////Вывод меню if (menu=1) then begin if np=0 then np:=1; if (kl=KE_KEY4) or click(LEFT) then np:=np-1; if (kl=KE_KEY6) or click(RIGHT) then np:=np+1; if (np=7) then np:=1; if (np=0) then np:=6; yp:=sh-getstringheight(st[np])-4; xp:=(sw-getstringwidth(st[np]))/2; drawimage(splash,0,0); drawtext(st[np],xp,yp); refresh;//repaint; end; ////Вывод карты if menu=2 then begin ksl:=ks; repeat kl:=getkeyclicked; ks:=game.get_key_states; drawimage(karta,0,0); if (kl=KE_KEY5) or click(FIRE) then begin menu:=1; kl:=0; end; refresh;//repaint; ksl:=ks; until menu=1; end; ////Вывод экрана разрабов if menu=3 then begin Font('sbs'); ksl:=ks; repeat kl:=getkeyclicked; ks:=game.get_key_states; upf:=upf-2; drawimage(razraby,0,0); if ry[maxi]+upf<0 then upf:=vH*5/6; setclip(0,vH/6,vW,vH*14/24); for i:=1 to maxi do if (ry[i]+upf<vH*5/6) and (ry[i]+upf>vH/7)then drawtext(rz[i],vW/8,ry[i]+upf); setclip(0,0,sw,sh); refresh;//repaint; if (kl=KE_KEY5) or click(FIRE) then begin menu:=1; kl:=0; end; ksl:=ks; until menu=1; end; if menu=4 then begin ksl:=ks; if (Continue=true) then // обнуляем возможность вернуться или нет repeat kl:=getkeyclicked; if (kl=KE_KEY3) then begin menu:=1; kl:=0; np:=0 end; // отмена if (kl=KE_KEY1) then begin // завершаем np:=0; continue:=false; new:=false; st[1]:='Новая игра'; st[6]:='Выход'; menu:=1; end; str:='Завершить текущую игру?'; Drawtext(str,(sw-getstringwidth(str))/2,sh/2-getstringheight(str)); str:='yes[1] / no[3]'; Drawtext(str,(sw-getstringwidth(str))/2,sh/2+getstringheight(str)); refresh; delay(100); until menu=1 else // ВЫЙТИ? Да/Нет? repeat kl:=getkeyclicked; if (kl=KE_KEY3) then begin menu:=1; kl:=0; np:=0 end; // отмена if (kl=KE_KEY1) then begin menu:=1; exit:=true; end; // выбран выход str:='Вы уверены?'; Drawtext(str,(sw-getstringwidth(str))/2,sh/2-getstringheight(str)); str:='yes[1] / no[3]'; Drawtext(str,(sw-getstringwidth(str))/2,sh/2+getstringheight(str)); refresh; delay(100); until menu=1; end; ksl:=ks; until exit; //Выходим или возвращаемся end.
Жду комментариев по моим трудам
|
(Offline)
|
|
27.10.2008, 20:41
|
#4
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: 2D-движок + Splash-меню
Респект, красиво получилось! Только вот, имхо, лучше было бы разбить основную часть программы на процедуры. Код бы стало еще удобней читать, хотя и так хорошо читается, в отличие от моих прог .
Бродя по карте, я нашел какие-то странные места, где изображение как бы смазывается. Может быть, не загрузился какой-то тайл?
Насчет оптимизации: можно уменьшить размер карты, если она будет храниться в битовом формате. Еще мне не нравится, что главный герой может стоять на месте в позе "шпагат"
|
(Offline)
|
|
27.10.2008, 21:33
|
#5
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: 2D-движок + Splash-меню
особо порадовало:
{-------------------------------------------------------------} {=============== # # ### ### # # ==================} {=============== ## ## # # # ## # ==================} {=============== # # # #### # # ## ==================} {=============== # # # # ### # # ==================} {-------------------------------------------------------------}
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
28.10.2008, 16:57
|
#6
|
Нуждающийся
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений (для 12 пользователей)
|
Ответ: 2D-движок + Splash-меню
Сообщение от Romanzes
Бродя по карте, я нашел какие-то странные места, где изображение как бы смазывается. Может быть, не загрузился какой-то тайл?
|
Загрузка файлов case-sensetive, а уменя тайлы, то *.png, то *.PNG вот и незагружаются некоторые наверно. Спс за совет с картой. У меня вот вопрос как средствами MP отслеживать столкновения на пиксельном уровне? Lib_sprite не годится: там срайты, а их кол-во ограничено в яве.
|
(Offline)
|
|
28.10.2008, 17:26
|
#7
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: 2D-движок + Splash-меню
Я думаю, отслеживать столкновения на пиксельном уровне будет ну очень медленно . Лучше придумай другой способ.
|
(Offline)
|
|
29.10.2008, 07:44
|
#8
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: 2D-движок + Splash-меню
А покажите пожалуйста, где написано, чем ограничено количество спрайтов в яве?
Кстати, у меня меню работает отлично, а вот походить по карте не получилось. Желтый экран и герой в центре.
|
(Offline)
|
|
29.10.2008, 08:51
|
#9
|
Нуждающийся
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений (для 12 пользователей)
|
Ответ: 2D-движок + Splash-меню
Говорится это тут:
Сообщение от aureli0
со спрайтами помнится косяки были. Дело в том что с когда грузиш спрайт то для каждого объекта буквально надо загружать свое изображение. Проще выводить стандартными средствами в виде текстур.
Вот сравнить если в моей дюне средствами библиотеки спрайт выводится не более 13 объектов, стандартными средствами-до хрена
|
А потом ты ему отвечаешь:
Сообщение от pilgrim
это ограничение не библиотеки, а самой явы. Библиотека всего-лишь прослойка.
|
PS: извиняюсь, не "срайты", а спрайты.
|
(Offline)
|
|
30.10.2008, 11:26
|
#10
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: 2D-движок + Splash-меню
Уговорили, протестирую этот вопрос.
К слову, говорилось, больше про ограничение явы на конкретном телефоне, т.к. не думаю, что спрайты занимают намного больше места чем просто Image.
|
(Offline)
|
|
31.03.2009, 12:36
|
#11
|
Оператор ЭВМ
Регистрация: 27.11.2006
Сообщений: 28
Написано одно полезное сообщение
|
Re: Ответ: 2D-движок + Splash-меню
poigral i pondravilsea dvijok u menea menu ne vidno v emule ne znaiu pochemu a tak fps horoshii vse krutitsea ok
byl takoi error v stroke : game.init(1);
pomeneal na game.init; i vse poehalo.
a u menea svoi dvijok nemnogo po drugomu da i stili igry arkada . otzenite uje v igre Abuela_OTP ... ( link below )
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:16.
|