Показать сообщение отдельно
Старый 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;
    
y: real;
    
angle: real;
    
speed: real;
    
visible: boolean;
  
end;

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

var 
_r_0:array[0..0] of urecord;
// Создает массив указанного размера:
procedure r0_anew(size: integer); begin inline(
  
iload_0; anewarray class 'R_0'; putstatic field 'M', '_r_0', '[LR_0;';
); 
end;
// Создает и инициализирует новый элемент массива:
procedure r0_new(index: integer); begin inline(
  
getstatic field 'M', '_r_0', '[LR_0;'; iload_0; new class 'R_0';
  
dup; invokenonvirtual method 'R_0', '<init>', '()V'; aastore;
); 
end;
// Копирует элемент из основного массива во временный:
procedure r0_copy(index: integer); begin inline(
  
getstatic field 'M', '_r_0', '[LR_0;'; iload_0;
  
getstatic field 'M', 'units', '[LR_0;'; iload_0;
  
aaload; aastore;
); 
end;
// Возращает размер основного массива:
function r0_size: integer; begin inline(
  
getstatic field 'M', 'units', '[LR_0;'; arraylength; ireturn;
); 
end;
// Изменяет размер массива:
procedure r0_resize(newsize: integer);
var 
i: integer;
begin r0_anew(newsize);
  if 
newsize > r0_size then for i := 0 to r0_size - 1 do r0_copy(i);
  else for 
i := 0 to newsize - 1 do r0_copy(i);
  if 
newsize > r0_size then for i := r0_size to newsize - 1 do r0_new(i);
inline(
  
getstatic field 'M', '_r_0', '[LR_0;';
  
putstatic field 'M', 'units', '[LR_0;';
); 
end;

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

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

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

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