Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Проекты на MidletPascal

Ответ
 
Опции темы
Старый 26.10.2008, 21:58   #1
Cliffe Snake
Нуждающийся
 
Аватар для Cliffe Snake
 
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений
(для 12 пользователей)
2D-движок + Splash-меню

Решил поделиться своим движком с народом, взамен на его оптимизацию.

Укажите пжлста где и что я нерационально использую. Щас подредактирую код и выложу.
(Offline)
 
Ответить с цитированием
Старый 27.10.2008, 05:22   #2
Cliffe Snake
Нуждающийся
 
Аватар для Cliffe Snake
 
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений
(для 12 пользователей)
Ответ: 2D-движок + Splash-меню

Вот собственно сам исходнеГ. Самая свежайшая версия, пока писал коментарии, понемногу обновлял код. Неплохо получилось.
Так сказать наброски моей портации СТАЛКЕР'а на мобилы.
Вложения
Тип файла: zip 2DEngine.zip (184.8 Кб, 748 просмотров)
(Offline)
 
Ответить с цитированием
Старый 27.10.2008, 05:26   #3
Cliffe Snake
Нуждающийся
 
Аватар для Cliffe Snake
 
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений
(для 12 пользователей)
Ответ: 2D-движок + Splash-меню

А вот и сам код:
program LandScroll4_by_Cliffe_aka_Snake;
uses gamespritealpha;
const  
versWidth=176;versHeight=220//Мидлет ориентирует всю отрисовку на этот экран
mapsize=255// ширина и высота карты(квадратной, при желании можно сделать и неквадратную) 
  //Возможно одновременное нажатие нескольких клавиш
  //функция для маскирования поля game.get_bit(value, mask)
  
UP=2LEFT=4RIGHT=32DOWN=64;
  
FIRE=256;
  
GAME_A=512GAME_B=1024;
  
GAME_C=2048GAME_D=4096;
var
{
Меню}
  
vW,vH,PROGW integer// хз ,хз , ширина Прогрессбара
  
np,xp,yp,xp2,upf,maxiinteger// Nомер пункта меню и его координаты, сдвиг по вертикали и кол-во разрабов
  
ir,ks,kslinteger;
  New,Continue  : 
boolean// см. ниже
  
exit                    : boolean;
  
menu,jspeed        Integer// Текущее состояние меню, регулируемая задержка
  
st                        : Array [1..7of string// массив пунктов меню
  
rz                        : Array [1..50of string// массив надписей RаZработчиков
  
ry                        : Array [1..50of integer// массив высот надписей разрабов
    
load,str            string;   // впомогательные строки
    
res           resource// для открытия ресурсов
    
rsrecordstore// Для загрузки профиля из RMS-памяти + загрузка/сохранение прогресса
{Для бэкграундаигры}    
img: array[0..16of image; {массив загруженных изображений}
kl,sw,sh integer; {нажатие кнопки ширинавысота экрана}
x,y,txp,typ,i,jinteger; {мелкий сдвиг карты коорд.тайла наход-ся в верх-левом углу экрана параметры циклов}
my,mx,tx,ty integer;{- ширинавысота карты кол-во тайлов в строке и в столбце}
th,twinteger; {высоташирина тайлов}
bx,by,bcinteger; {проверка для буфер-циисчётчик буфера}
buferstring; {список загруженных тайлов}
linstring;  {считывание строки карты}
map : array[1..mapsize,1..mapsizeof char; {Карта местности}
scr : array[1..10,1..10of char; {Отображаемый кусок карты}

hero,fn,fdinteger// спрайт, номер фрейма перса
splash,karta,razraby:image//менюшные картинки
oxsv,oysv,oxmv,oymv integer//Для исключения лишних загрузок из ресурсов
{Игра}
speed,dspeedinteger;    //Скорости обычная и диагональная(pixels/iteration)
txt,object                    string//Впомогательные строки
hxhy integer// Коорд.героя
d                integer// Направление и номер кадра.
lx,ly                integer// Координаты надписи загрузка
w,h        integer// Сдвиг карты по X и Y. Ширина и высота карты
health,armour,loadinginteger;// текущее здоровье,броня. центрирование загрузки
onum,omax                      integer//номер тек.объекта, кол-во объектов
gbar,bpanel,armb,lifb,box image//картинки HUD'a

obj,mask,shadow           : array[1..15of image;   //Картинка объекта, его маска и тень
ox,oy,oxm,oym,oys,oxs            : array[1..15of integer//использ. для сбора данных объекта
objname                                 : array[1..15of 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(000); 
FillRect(00swsh); 
setcolor(255,255,255);
DrawText(load,lx,ly);
SetColor(1501500);
DrawRect((sw PROGW)/2-2, (sh GetStringHeight('Загрузка'))/2+8PROGW+215);
FillRect((sw PROGW)/2, (sh GetStringHeight('Загрузка'))/2+10loading12);
refresh;//repaint;
end;  
/////////////////////////////////////////////////////////////////////////////
////    Конвертирует кракозябры, считаные с ресурса в русск-англ.строку
 
Не помню у кого взял код этой функции}
function 
ansi(str string) : string;
var  {
rus_ansi to unicode}
  
s   string;
  
i,integer;
begin
  s 
:= '';
  for 
:= 0 to length(str)-do
  
begin
    c 
:= ord(getChar(str,i)) and 255;
    if (
c>=192then  c := c+(1040-192) else
      if (
c<32) and (c<>10then c := 32;
    
:= s+chr(c);
  
end;
  
ansi := s;
end;
/////////////////////////////////////////////////////////////////////////////
Function joy(nk:integer) : integer// укороченный вариант KeyToAction
begin
joy
:=keytoaction(nk);
end;
//////////////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ СОХРАНЕНИЯ И ЗАГРУЗКИ ПРОГРЕССА (c)Odd [Всё остальное писал сам (с)Cliffe]    //
//////////////////////////////////////////////////////////////////////////////////////////
Procedure SaveProgress;
var
    
idinteger;
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
    
idinteger;
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,jinteger;
tpchar;
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:=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_PLAINthen
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<>keythen 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:=versWidthvH:=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<swthen sw:=vw;
if (
vh<shthen sh:=vh;
setclip(0,0,sw,sh);
// Тут перечисляем пункты меню:
 
st[1]:='Новая игра';
 
st[2]:='Карта';
 
st[3]:='Загрузить';
 
st[4]:='Сохранить';
 
st[5]:='Разработчики';
 
st[6]:='Выход';
 
//Ну и конечно же нас - разрабов =)
res := openResource('/Autors.txt'); 
i:=0upf:=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(000); 
    
FillRect(00swsh);
  
dspeed:=Trunc(speed*7/10);//устанавливаем диагональную скорость передвижения персонажа
  
if (Continue=false)  then 
   begin
     
//Начинаем НОВУЮ ИГРУ
     
health:=10armour:=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<>5then 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<>5then 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(000); 
        
FillRect(00swsh); 
        
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
(000); 
         
FillRect(00swsh); 
         
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(herohxhy-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<mapsizethen lin:=ReadLine(res);
   if (
length(lin)>=mapsize-1then 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:=64tw:=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(buferscr[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) <> 0then begin x:=x-2fd:=3end;
   if (
game.get_bit(ks,32)<> 0then begin x:=x+2fd:=4end;
   if (
game.get_bit(ks,2) <> 0then begin y:=y-2fd:=1end;
   if (
game.get_bit(ks,64)<> 0then begin y:=y+2fd:=6end;
// если двигаемся по диагонали, то изменяем 
   
if (game.get_bit(ks,64)<> 0)and(game.get_bit(ks,4) <> 0then fd:=5;   
   if (
game.get_bit(ks,64)<> 0)and(game.get_bit(ks,32)<> 0then fd:=7;
   if (
game.get_bit(ks,2) <> 0)and(game.get_bit(ks,4) <> 0then fd:=0;
   if (
game.get_bit(ks,32)<> 0)and(game.get_bit(ks,2) <> 0then 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<10then sprite.set_frame(herofd*4);
  if (
fn>=10) and (fn<20then sprite.set_frame(herofd*4+1);
  if (
fn>=20) and (fn<30then sprite.set_frame(herofd*4+2);
  if (
fn>=30) and (fn<40then sprite.set_frame(herofd*4+3);
 if (
y<-th) and (typ=0then begin y:=-thend;
 if (
y>th) and (typ=my-tythen begin y:=thend
 if (
x<-tw) and (txp=0then begin x:=-twend;
 if (
x>tw) and (txp=mx-txthen begin x:=twend
 {
Проверка на наличие незабуфер-ых тайлов
если таковые есть
подгружаем их налету (Выгрузку пока не сделал)}
 if 
by>typ then for i:=1 to tx do if Pos(buferscr[1,i])=-1 then buferiz(1,i);
 if 
by<typ then for i:=1 to tx do if Pos(buferscr[ty,i])=-1 then buferiz(ty,i);
 if 
bx>txp then for j:=1 to ty do if Pos(buferscr[j,1])=-1 then buferiz(j,1);
 if 
bx<txp then for j:=1 to ty do if Pos(buferscr[j,tx])=-1 then buferiz(j,tx);

  for 
j:=1 to ty do
  for 
i:=1 to tx do begin
  drawimage
(img[Pos(buferscr[j,i])],(i-2)*tw-x,(j-2)*th-y);
  
end;
  
bx:=txpby:=typ;
  if (
x>tw) and (txp<=mx-txthen begin txp:=txp+1x:=0end;
  if (
x<-tw) and (txp>=0then begin txp:=txp-1x:=0end;
  if (
y>th) and (typ<=my-tythen begin typ:=typ+1y:=0end;
  if (
y<-th) and (typ>=0then begin typ:=typ-1y:=0end;
//Выводим техническую инфу на экран  
  
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:=0menu:=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(FIREthen begin
     
if (np=2then begin menu:=2np:=0;  end;
     if (
np=3then begin menu:=1LoadProgressnp:=0;  end;
     if (
np=4then begin menu:=1SaveProgressnp:=0;  end;
     if (
np=5then begin menu:=3np:=0;  end;
     if (
np=6then begin menu:=4np:=0;  end;
     if 
menu=1 then if (np=1then begin new:=truemenu:=-1np:=0end;
  
end;
////Вывод меню 
  
if (menu=1then begin
    
if np=0 then np:=1;
    if (
kl=KE_KEY4) or click(LEFTthen np:=np-1;
    if (
kl=KE_KEY6) or click(RIGHT)  then np:=np+1;
    if (
np=7then np:=1;
    if (
np=0then 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(FIREthen begin menu:=1kl:=0end;
      
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(FIREthen begin menu:=1kl:=0end;
         
ksl:=ks;
     
until menu=1;  
    
end
   if 
menu=4 then 
    begin
     ksl
:=ks;
     if (Continue=
truethen // обнуляем возможность вернуться или нет
            
repeat
      kl
:=getkeyclicked;
      if (
kl=KE_KEY3then begin menu:=1kl:=0np:=0 end// отмена
      
if (kl=KE_KEY1then 
         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_KEY3then begin menu:=1kl:=0np:=0 end// отмена
      
if (kl=KE_KEY1then begin menu:=1; exit:=trueend// выбран выход
        
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
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: 2D-движок + Splash-меню

Респект, красиво получилось! Только вот, имхо, лучше было бы разбить основную часть программы на процедуры. Код бы стало еще удобней читать, хотя и так хорошо читается, в отличие от моих прог .
Бродя по карте, я нашел какие-то странные места, где изображение как бы смазывается. Может быть, не загрузился какой-то тайл?
Насчет оптимизации: можно уменьшить размер карты, если она будет храниться в битовом формате. Еще мне не нравится, что главный герой может стоять на месте в позе "шпагат"
(Offline)
 
Ответить с цитированием
Старый 27.10.2008, 21:33   #5
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: 2D-движок + Splash-меню


особо порадовало:
{-------------------------------------------------------------} 
{===============   
#   #   ###  ###  #  #   ==================} 
{===============   ## ##  #  #   #   ## #   ==================} 
{===============   # # #  ####   #   # ##   ==================} 
{===============   #   #  #  #  ###  #  #   ==================} 
{-------------------------------------------------------------} 
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 28.10.2008, 16:57   #6
Cliffe Snake
Нуждающийся
 
Аватар для Cliffe Snake
 
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений
(для 12 пользователей)
Ответ: 2D-движок + Splash-меню

Сообщение от Romanzes Посмотреть сообщение
Бродя по карте, я нашел какие-то странные места, где изображение как бы смазывается. Может быть, не загрузился какой-то тайл?
Загрузка файлов case-sensetive, а уменя тайлы, то *.png, то *.PNG вот и незагружаются некоторые наверно. Спс за совет с картой. У меня вот вопрос как средствами MP отслеживать столкновения на пиксельном уровне? Lib_sprite не годится: там срайты, а их кол-во ограничено в яве.
(Offline)
 
Ответить с цитированием
Старый 28.10.2008, 17:26   #7
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: 2D-движок + Splash-меню

Я думаю, отслеживать столкновения на пиксельном уровне будет ну очень медленно . Лучше придумай другой способ.
(Offline)
 
Ответить с цитированием
Старый 29.10.2008, 07:44   #8
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Ответ: 2D-движок + Splash-меню

А покажите пожалуйста, где написано, чем ограничено количество спрайтов в яве?
Кстати, у меня меню работает отлично, а вот походить по карте не получилось. Желтый экран и герой в центре.
(Offline)
 
Ответить с цитированием
Старый 29.10.2008, 08:51   #9
Cliffe Snake
Нуждающийся
 
Аватар для Cliffe Snake
 
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений
(для 12 пользователей)
Ответ: 2D-движок + Splash-меню

Говорится это тут:
Сообщение от aureli0 Посмотреть сообщение
со спрайтами помнится косяки были. Дело в том что с когда грузиш спрайт то для каждого объекта буквально надо загружать свое изображение. Проще выводить стандартными средствами в виде текстур.
Вот сравнить если в моей дюне средствами библиотеки спрайт выводится не более 13 объектов, стандартными средствами-до хрена
А потом ты ему отвечаешь:
Сообщение от pilgrim Посмотреть сообщение
это ограничение не библиотеки, а самой явы. Библиотека всего-лишь прослойка.
PS: извиняюсь, не "срайты", а спрайты.
(Offline)
 
Ответить с цитированием
Старый 30.10.2008, 11:26   #10
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Ответ: 2D-движок + Splash-меню

Уговорили, протестирую этот вопрос.
К слову, говорилось, больше про ограничение явы на конкретном телефоне, т.к. не думаю, что спрайты занимают намного больше места чем просто Image.
(Offline)
 
Ответить с цитированием
Старый 31.03.2009, 12:36   #11
oposum_2000
Оператор ЭВМ
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движок rpg Sand Основной форум 3 06.12.2009 18:07
Хочу сделать движок Petrofan C++ 30 09.07.2009 20:18
Как программно узнать имя пункта меню который был выбран (Обычное/стандартные меню)? Richik Основной форум 5 25.05.2009 23:20
Движок для гонок sash13 3D-программирование 10 16.11.2007 17:54
Движок vadim2 Наш форум 1 10.07.2006 15:58


Часовой пояс GMT +4, время: 10:16.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com