Показать сообщение отдельно
Старый 20.05.2011, 08:03   #4
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
Ответ: [MP3.0+] Магия inline()

Сообщение от cherepets Посмотреть сообщение
Молодец)
Правда я так и останусь на 2.02. Люблю писать игры только с "+, -, *" и drawimage.
Можно писать и с простыми функциями. Но, как мне кажется, если есть возможность использовать что-то более развитое, то почему бы и нет?
Сообщение от alexprey Посмотреть сообщение
YellowAfterlife, занятная штука. А если сделать не массив integer а допустим какойнить записи. Будет работать?
С небольшими изменениями, да:
program inl;

type
  urecord 
record
    x
real;
    
yreal;
    
anglereal;
    
speedreal;
    
visibleboolean;
  
end;

var 
aim: array[0..1of image;
    
units: array[0..0of urecord;

var 
_r_0:array[0..0of urecord;
// Создает массив указанного размера:
procedure r0_anew(sizeinteger); begin inline(
  
iload_0anewarray class 'R_0'putstatic field 'M''_r_0''[LR_0;';
); 
end;
// Создает и инициализирует новый элемент массива:
procedure r0_new(indexinteger); begin inline(
  
getstatic field 'M''_r_0''[LR_0;'iload_0; new class 'R_0';
  
dupinvokenonvirtual method 'R_0''<init>''()V'aastore;
); 
end;
// Копирует элемент из основного массива во временный:
procedure r0_copy(indexinteger); begin inline(
  
getstatic field 'M''_r_0''[LR_0;'iload_0;
  
getstatic field 'M''units''[LR_0;'iload_0;
  
aaloadaastore;
); 
end;
// Возращает размер основного массива:
function r0_sizeintegerbegin inline(
  
getstatic field 'M''units''[LR_0;'arraylengthireturn;
); 
end;
// Изменяет размер массива:
procedure r0_resize(newsizeinteger);
var 
iinteger;
begin r0_anew(newsize);
  if 
newsize r0_size then for := 0 to r0_size do r0_copy(i);
  else for 
:= 0 to newsize do r0_copy(i);
  if 
newsize r0_size then for := r0_size to newsize do r0_new(i);
inline(
  
getstatic field 'M''_r_0''[LR_0;';
  
putstatic field 'M''units''[LR_0;';
); 
end;

//
procedure AddUnit(indexinteger;xysdreal); begin
  units
[index].:= x;
  
units[index].:= y;
  
units[index].angle := d;
  
units[index].speed := s;
  
units[index].visible := true;
end;

var 
jintegertimage;
begin
  t 
:= LoadImage('/icon.png');
  
r0_resize(16);
  for 
:= 0 to r0_size-do
  
AddUnit(jrandom(getWidth), random(getHeight), random(100)/50+1random(360));
  
repeat
    SetColor
(646464);
    
FillRect(00GetWidthGetHeight);
    for 
:= 0 to r0_size do begin
      units
[j].:= units[j].cos(units[j].angle) * units[j].speed;
      if 
units[j].< -8 then units[j].:= units[j].GetWidth 16;
      if 
units[j].GetWidth+8 then units[j].:= units[j].GetWidth 16;
      
units[j].:= units[j].sin(units[j].angle) * units[j].speed;
      if 
units[j].< -8 then units[j].:= units[j].GetHeight 16;
      if 
units[j].GetHeight+8 then units[j].:= units[j].GetHeight 16;
      
DrawImage(tTrunc(units[j].x)-8Trunc(units[j].y)-8);
    
end;
    if 
GetKeyPressed <> 0 then begin
      r0_resize
(r0_size 1);
      
AddUnit(r0_size-1random(getWidth), random(getHeight), random(100)/50+1random(360));
    
end;
    
RePaint;
    
//Delay(20);
  
forever;
end
Заметка: При компиляции все типы (Record) изменяют названия на R_0, R_1, R_2, и т.д. Тип записи, который задан в исходнике ранее, будет иметь меньший индекс.
Стоит заметить, что с помощью такой системы можно делать весьма и весьма неплохие динамические игры

Скриншот и скомпилированный JAR этой демонстрации во вложениях.
Миниатюры
Нажмите на изображение для увеличения
Название: temp3.png
Просмотров: 1126
Размер:	55.0 Кб
ID:	13814  
Вложения
Тип файла: zip SampleProject.zip (10.4 Кб, 821 просмотров)
__________________

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
alexprey (20.05.2011), Igor (17.06.2011)