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

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

Вернуться   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 Кб, 1046 просмотров)
(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 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
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 638 пользователей)
Ответ: 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 полезных сообщений
(для 638 пользователей)
Ответ: 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, время: 22:44.


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