ПроЭктировщик
Регистрация: 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 этой демонстрации во вложениях.
__________________
Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
|