|
|
| Color : Byte; // Цвет пикселя Const Blue = 0; Green = 1; If (Color div 16) = Blue then Color = Green*16 + ( Color mod 16 ); |

| var ... RMask,GMask,BMask, YMask,FMask,AMask : Word; ... // Получить их можно следующим образом: RMask := DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwRBitMask; GMask := DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwGBitMask; BMask := DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwBBitMask; // Маска желтого цвета получается сложением по системе OR зеленой и красной маски: YMask := DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwRBitMask or DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwGBitMask; // Маска сиреневого цвета получается сложением по системе OR синей и красной маски: FMask := DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwRBitMask or DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwBBitMask; // Маска голубого цвета получается сложением по системе OR зеленой и синей маски: AMask := DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwGBitMask or DXDraw1.Surface.SurfaceDesc.ddpfPixelFormat.dwBBitMask; |
| procedure TForm1.CloneSprite( ColorMask : Word); var //Объект - поверхность DirectDraw SurfaceDescSprite SpriteSurface, MaskSurface : TDirectDrawSurface; SurfaceDescMask : TDDSurfaceDesc; // Структура описывающая поверхность pBitsSprite, pBitsMask : PWordArray; // Указатель на начало области памяти поверхности SurfaceHeight: Integer; SurfaceWidth: Integer; // Размеры поверхности i,j : Integer; // Циклические переменные MaskColor : Word; // Цвет пикселя на серой маске (временная переменная) begin DXTimer.Enabled := False; // Отключить таймер ответственный за перерисовку // Здесь происходит присваивание ссылок на поверхность временным переменным SpriteSurface := DXImageList.Items.Find('Sprite').PatternSurfaces[0]; MaskSurface := DXImageList.Items.Find('Mask').PatternSurfaces[0]; // Для получения прямого доступа к поверхности ее надо заблокировать, // в параметрах передается прямоугольник на поверхности к которому // требуется получить доступ и структура с информационными полями SpriteSurface.Lock(SpriteSurface.ClientRect,SurfaceDescSprite); MaskSurface.Lock(MaskSurface.ClientRect,SurfaceDescMask); // После блокировки поля структуры будут содержать необходимую нам информацию // Получить высоту поверхности SurfaceHeight := SurfaceDescSprite.dwHeight; // Получить ширину поверхности в байтах, напомню, что она может отличаться от // ширины нашей картинки (спрайта), этот параметр надо разделить на 2, т.к. у // нас цвет кодируется двумя байтами SurfaceWidth := SurfaceDescSprite.lPitch div 2; // Получить указатели на поверхности спрайта и серой маски pBitsSprite := SurfaceDescSprite.lpSurface; pBitsMask := SurfaceDescMask.lpSurface; // В цикле по строкам и столбцам изображения производим сложение пикселей // серой маски с цветовой маской и присваиваем полученное пикселям спрайта for j := 0 to SurfaceHeight - 1 do for i := 0 to SurfaceWidth - 1 do begin // Получить пиксель серой маски MaskColor := pBitsMask[j*SurfaceWidth + i]; // Если он не черный, то if MaskColor <> 0 then // Сложить с цветовой маской и присвоить пикселю спрайта pBitsSprite[j*SurfaceWidth + i] := MaskColor AND ColorMask; end; // Не забыть разблокировать поверхности иначе компьютер зависнет в мертвую SpriteSurface.UnLock; MaskSurface.UnLock; DXTimer.Enabled := True; // Включить таймер перерисовки end; |
| procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer); begin DXDraw1.Surface.Fill(0);// Очистить буфер // Нарисовать спрайт DXImageList.Items.Find('Sprite').Draw(DXDraw1.Surface,0,0,0); // Вывести информацию о частоте кадров with DXDraw1.Surface.Canvas do begin Brush.Style := bsClear; Font.Color := clWhite; Font.Size := 12; Textout(0, 0, 'FPS: '+inttostr(DXTimer.FrameRate)); Release; end; // Переключить поверхности DXDraw1.Flip; end; |










|
Название компоненты |
Описание компоненты |
![]() |
Дает доступ к поверхностям DirectDraw и включает весь код, необходимый для работы с DirectDraw и DirectDraw. |
![]() |
Позволяет хранить DIB (Device Independent Bitmap) подробне |
![]() |
Позволяет хранить серии DIB-файлов, что очень удобно для программ, содержащих спрайты. Позволяет загружать серию с диска во время выполнения программы. |
![]() |
Оставлен для совместимости с предыдущими версиями DelphiX, используйте TDXDraw. |
![]() |
Позволяет легко проигрывать wav-файлы. |
![]() |
"Хранилище" для wav-файла. |
![]() |
"Хранилище" для серии wav-файлов. |
![]() |
Позволяет получить доступ к объекту DirectInput и, соответственно, к мыши, клавиатуре и т.д. |
![]() |
Позволяет разработчику легко подсоединить данные, находящиеся на другом компьютере, в том числе через Internet или LAN. |
![]() |
Облегчает и автоматизирует работу со спрайтами. Поддержка методов Move, Kill и т.д. |
![]() |
Дает более высокую точность, чем при использовании обычного таймера (TTimer). Используются потоки, синхронизация. |
![]() |
DIB-версия стандартной компоненты TImage |
| SineMove : array[0..255] of integer; { Таблица синусов для движения } CosineMove : array[0..255] of integer; { Таблица косинусов } SineTable : array[0..449] of integer; { Таблица синусов } CenterX, CenterY : Integer; { Для координат центра черной дыры, которую мы будем рисовать } procedure CalculateTables; { Заполнение таблиц синусов и косинусов } procedure PlotPoint( XCenter, YCenter, Radius, Angle : Word); { Рисование точки на бэк-буфере } |
| procedure TMainForm.CalculateTables; var wCount : Word; begin { Precalculted Values for movement } for wCount := 0 to 255 do begin SineMove[wCount] := round( sin( pi*wCount/128 ) * 45 ); CosineMove[wCount] := round( cos( pi*wCount/128 ) * 60 ); end; { Precalculated Sine table. Only One table because cos(i) = sin(i + 90) } for wCount := 0 to 449 do begin SineTable[wCount] := round( sin( pi*wCount/180 ) * 128); end; end; |
| procedure TMainForm.FormCreate(Sender: TObject); begin CenterX := Width div 2; CenterY := Height div 2; CalculateTables; end; |
| procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_ESCAPE then Close; end; |
| DXTimer.Enabled := False; |
| DXTimer.Enabled := True; |
| procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer); const x : Word = 0; y : Word = 0; IncAngle = 12; XMove = 7; YMove = 8; var CountAngle : Word; CountLong : Word; IncLong :Word; begin if not DXDraw.CanDraw then exit; IncLong := 2; CountLong := 20; DXDraw.Surface.Fill( 0 ); repeat CountAngle := 0; repeat PlotPoint(CosineMove[( x + ( 200 - CountLong )) mod 255], SineMove[( y + ( 200 - CountLong )) mod 255], CountLong, CountAngle); inc(CountAngle, IncAngle); until CountAngle >= 360; inc(CountLong, IncLong); if ( CountLong mod 3 ) = 0 then inc(IncLong); until CountLong >= 270; x := XMove + x mod 255; y := YMove + y mod 255; with DXDraw.Surface.Canvas do begin Brush.Style := bsClear; Font.Color := clWhite; Font.Size := 12; Textout( 0, 0, 'FPS: '+inttostr( DXTimer.FrameRate ) ); Release; end; DXDraw.Flip; end; |
| procedure TMainForm.PlotPoint(XCenter, YCenter, Radius, Angle: Word); var X, Y : Word; begin X := ( Radius * SineTable[90 + Angle]); asm sar x,7 end; X := CenterX + XCenter + X; Y := ( Radius * SineTable[Angle] ); asm sar y,7 end; Y := CenterY + YCenter + Y; if (X < Width ) and ( Y < Height ) then begin DXDraw.Surface.Canvas.Pixels[X, Y] := clBlue; DXImageList.Items[0].Draw( DXDraw.Surface, X, Y, 0 ); end; end; |
| DXImageList.Items[0].Draw( DXDraw.Surface, X, Y, 0 ); |

| Атрибут | Описание |
| doFullScreen | Запускает приложение в полноэкранном режиме. Видеорежим может быть указан в свойстве Display. |
| doNoWindowChange | Если выбрана эта опция и doFullScreen, приложение сначала максимизирует свое окно, а затем устанавливает режим, указанный в свойстве Display. |
| doAllowReboot | Определяет, можно ли в программе использовать комбинацию Alt+Ctrl+Del. Это полезно во время отладки. |
| doWaitForBlank | Определяет, будет ли ожидаться вертикальная развертка при выполнении операции флиппинга. Опция немного уменьшает FPS. |
| doAllowPalette256 | Будет ли использоваться 256-цветная палитра |
| doSystemMemory | Определяет, использовать ли системную память вместо видеопамяти. Опция немного уменьшает FPS. |
| doStretch | Если ваша игра использует область отображения большую (или меньшую), чем указано в свойстве Display, с помощью этой опции можно сжать (растянуть) изображение на весь экран. |
| doCenter | Поверхность отобразится в центре экрана. |
| doFlip | Применяется только для полноэкранных режимов. Если используется двойная буферизация и требуется отобразить буфер, то в случае установленной опции это происходит очень быстро (применяется операция флиппинга). Замечание: размер буфера должен равняться размеру основной поверхности. |
| do3D | Позволено ли использовать 3D акселерацию |
| doHadrware | Если видеоадаптер поддерживает аппаратное ускорение типа 3D или 2D, то полезно установить опцию в true. Замечание: Если опция установлена в true, а видеокарта не поддерживает акселерацию, опция будет установлена в false. это можно использовать для определения поддержки аппаратного ускорения. |
| doRetainedMode | Опция имеет эффект только если установлена опция do3D. Если опция равна true, используется режим Direct3D Retained, иначе - Immediate. |
| doSelectDriver | В полноэкранном режиме определяет будет ли использоваться драйвер DirectDraw. Для Voodoo и подобных видеоадаптеров опция должна быть установлена в True. |
| doDrawPrimitive | Использовать рисование примитивов. |
| doZBuffer | Использовать ли Z-буфер. Эта опция может устранить некоторые проблемы с пропаданием объектов или наоборот, с появлением объектов, которые должны находиться на заднем плане. Требует часть процессорного времени. Некоторые карты поддерживают эту функцию аппаратно. |
| doTexture | Будем ли мы использовать текстуры на 3D объектах? |
| doRGB | Определяет, станет ли использоваться цветовая модель RGB. Может улучшить внешний вид 3D объектов, но отнимает процессорное время. Если карта аппаратно поддерживает эту функцию, опция не влияет на работу. |
| doMono | Использовать ли черно-белую цветовую модель. |
| doDither | Определяет будет ли подбираться ближайший цвет из палитры, если в ней не окажется запрашиваемого нами цвета. В основном используется с атрибутом doAllowPalette256. |

| ... For i := 0 to 2 do For j := 0 to 2 do Begin Number := Map[i,j]; X := J * TextureWidth; Y := i * TextureHeight; DrawTexture(X,Y,Number); End; ... Number - номер текстуры, Х - координата текстуры на экране, Y - то же самое, DrawTexture - некая процедура вывода текстуры на экран. |
| GetMem(PbyteArray,MapWidth*MapHeight*SizeOf(Тип ячейки)); |
| Number := PbyteArray[Y*MapWidth + X];Где X,Y - координаты нужной ячейки в матрице. |







| Рисунок 6а | Рисунок 6б |
| PMap : PbyteArray; // указатель на матрицу содержащую нашу карту WorldWidth, WorldHeight : Integer; // Ширина и высота карты в ячейках Procedure CreateNewMap(WorldWidth,WorldHeigth : Integer); Begin // Выделение памяти под матрицу GetMem(pMap,WodrldWidth*WorldHeight); // Заполнение этого участка нулями FillChar(pMap,WorldWidth*WorldHeight,0); End; funcion GetElement(x,y : Integer):byte; Begin // Получить значение ячейки Result := pMap[y*WorldWidth + x]; End; Procedure PutElement(x,y : Integer; Index : Byte); Begin // Записать значение в ячейку PMap[y*WorldWidth + x] := Index; End; Function GetBaseIndex(Index : byte): byte; Begin // Получить тип земли в виде номера(индекса) Result := Index div 16; End; Function GetAdditionalIndex(Index : byte):byte; Begin // Получить номер переходной текстуры Result := Index mod 16; End; |

| // Определение класса Matrix5 Type TMatrix5 = class(TObject) private Matrix : array[0..4,0..4] of byte; Vector : array[0..24] of byte; public function GetBaseIndex( ElementIndex : Integer ): Integer; Function GetAdditionalIndex( ElementIndex : Integer ): Integer; procedure Fill(X,Y : Integer); procedure Place(X,Y : Integer); procedure Culculate(X,Y : Integer; BrushIndex : Integer ); procedure Draw(X,Y : Integer; BrushIndex : Integer ); end; |
| procedure TMatrix5.Fill(X,Y : Integer); var i,j : Integer; begin for j := 0 to 4 do for i := 0 to 4 do Matrix[i,j] := MainForm.GetElement(X - 2 + i,Y - 2 + j); for j :=0 to 4 do for i := 0 to 4 do Vector[j*5 + i] := Matrix[i,j]; end; |
| procedure TMatrix5.Place(X,Y : Integer); var i,j : Integer; begin for j := 0 to 4 do for i := 0 to 4 do Matrix[i,j] := Vector[j*5 + i]; for j := 0 to 4 do for i := 0 to 4 do MainForm.PutElement(X - 2 + i,Y - 2 + j, Matrix[i,j] ); end; |
| procedure TMatrix5.Draw(X,Y : Integer; BrushIndex : Integer); begin Self.Culculate(X,Y,BrushIndex); Self.Place(X,Y); end; |
| const BasicTable : array[0..24,0..15] of byte = ( (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), ( 9, 1, 6, 8, 4, 5, 6,15, 8, 9, 1,14, 4, 5,14,16), ( 1, 1, 6,15, 5, 5, 6,15,15, 1, 1, 6, 5, 5, 6,16), (10, 1, 2, 7,15, 5, 6, 7,15, 1,10, 2, 7,13, 6,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), ( 4, 5,15, 8, 4, 5,15,15, 8, 4, 5, 8, 4, 5, 8,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), ( 2, 6, 2, 7,15,15, 6, 7,15, 6, 2, 2, 7, 7, 6,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (12, 5, 7, 3, 4, 5,15, 7, 8, 4,13, 3,12,13, 8,16), ( 3,15, 7, 3, 8,15,15, 7, 8, 8, 7, 3, 3, 7, 8,16), (11, 6, 2, 3, 8,15, 6, 7, 8,14, 2,11, 3, 7,14,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16)); EqualTable : array[0..24,0..15] of byte = ( (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,10,16,16,12,13, 2,16, 3, 0,16,16,16,16,11, 7), (16, 0,11,16,12,12,11, 3, 3, 0, 0,16,16,12,11, 3), (16, 9,11,16,16, 4,14, 3,16,16, 0,16,16,12,16, 8), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,10,16,11, 0,10, 2, 2,11, 0,16,16, 0,10,11, 2), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16, 9, 0,12,16, 4, 9,12, 4,16, 0, 0,16,12, 9, 4), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,11, 9, 1,16, 2,14,16,16,16, 0,10,16, 6), (16,16,10, 0, 9, 1, 1,10, 9,16,16, 0, 0,10, 9, 1), (16,16,10,12,16,16, 1,13, 4,16,16, 0,16,16, 9, 5), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16)); NotEqualTable : array[0..24,0..15] of byte = ( ( 9, 1, 6, 8, 4, 5, 6,15, 8, 9, 1,14, 4, 5,14,15), ( 1, 1, 6,15, 5, 5, 6,15,15, 1, 1, 6, 5, 5, 6,15), ( 1, 1, 6,15, 5, 5, 6,15,15, 1, 1, 6, 5, 5, 6,15), ( 1, 1, 6,15, 5, 5, 6,15,15, 1, 1, 6, 5, 5, 6,15), (10, 1, 2, 7, 5, 5, 6, 7,15, 1,10, 2,13,13, 6,15), ( 4, 5,15, 8, 4, 5,15,15, 8, 4, 5, 8, 4, 5, 8,15), (23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23), (19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19), (24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24), ( 2, 6, 2, 7,15,15, 6, 7,15, 6, 2, 2, 7, 7, 6,15), ( 4, 5,15, 8, 4, 5,15,15, 8, 4, 5, 8, 4, 5, 8,15), (18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18), (16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16), (20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20), ( 2, 6, 2, 7,15,15, 6, 7,15, 6, 2, 2, 7, 7, 6,15), ( 4, 5,15, 8, 4, 5,15,15, 8, 4, 5, 8, 4, 5, 8,15), (22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22), (17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17), (21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21), ( 2, 6, 2, 7,15,15, 6, 7,15, 6, 2, 2, 7, 7, 6,15), (12, 5, 7, 3, 4, 5,15, 7, 8, 4,15,13,12,13, 8,15), ( 3,15, 7, 3, 8,15,15, 7, 8, 8, 7, 3, 3, 7, 8,15), ( 3,15, 7, 3, 8,15,15, 7, 8, 8, 7, 3, 3, 7, 8,15), ( 3,15, 7, 3, 8,15,15, 7, 8, 8, 7, 3, 3, 7, 8,15), (11, 6, 2, 3,15,15, 6, 7, 8,14, 2,11, 3, 7,14,15)); BasicTable - используется, когда мы рисуем переходным типом земли. EqualTable - испльзуется, когда прежняя земля в ячейке равна активной. NotEqualTable - испльзуется, когда прежняя земля в ячейке не равна активной. |
| procedure TMatrix5.Culculate(X,Y : Integer ; BrushIndex : Integer ); var i:Integer; BaseIndex, AdditionalIndex : Integer; Begin // Заполнить матрицу считав значения с карты Self.Fill(X,Y); if BrushIndex = 3 then // Если рисуем переходной землей begin Vector[12] := 15;// Заносим центральный элемент for i := 0 to 24 do begin // Получить тип земли в виде индекса(0,1,2) BaseIndex := GetBaseIndex(Vector[i]); // и прежний номер переходной текстуры AdditionalIndex := GetAdditionalIndex(Vector[i]); // Если число в таблице BasicTable не равно 16 то, // к индексу типа земли умноженному на 16 // прибавляем новое смещение // и заносим в Vector // ,иначе ничего не меняется if BasicTable[i,AdditionalIndex] <> 16 then Vector[i] := BaseIndex*16 + BasicTable[i,AdditionalIndex]; end; end { Конец обработки варианта "Переходная земля"} else // Иначе, если рисуем не переходной землей begin Vector[12] := BrushIndex*16;// Заносим центральный элемент for i := 0 to 24 do begin // Получить тип земли в виде индекса(0,1,2) BaseIndex := GetBaseIndex(Vector[i]); // и прежний номер переходной текстуры AdditionalIndex := GetAdditionalIndex(Vector[i]); // Если прежняя земля имеет тот же тип, что и активная if BaseIndex = BrushIndex then begin // Если число в таблице EqualTable не равно 16 то, // к индексу типа земли умноженному на 16 // прибавляем новое смещение // и заносим в Vector // ,иначе ничего не меняется if EqualTable[i,AdditionalIndex] <> 16 then Vector[i] := BaseIndex*16 + EqualTable[i,AdditionalIndex]; end else // Если заменяемая и замещающая земля имеют разные типы begin // Если число в таблице NotEqualTable не равно 16 то, // к индексу типа земли умноженному на 16 // прибавляем новое смещение // и заносим в Vector // ,иначе ничего не меняется if NotEqualTable[i,AdditionalIndex] < 16 then Vector[i] := BaseIndex*16 + NotEqualTable[i,AdditionalIndex] else if NotEqualTable[i,AdditionalIndex] > 16 then Vector[i] := BrushIndex*16+ NotEqualTable[i,AdditionalIndex] - 16; end; end; end; |
| if BrushIndex = 3 then begin Vector[12] := 15; for i := 0 to 24 do begin BaseIndex := GetBaseIndex(Vector[i]); AdditionalIndex := GetAdditionalIndex(Vector[i]); if BasicTable[i,AdditionalIndex] <> 16 then Vector[i] := BaseIndex*16 + BasicTable[i,AdditionalIndex]; end; end; |

| else begin Vector[12] := BrushIndex*16; for i := 0 to 24 do begin BaseIndex := GetBaseIndex(Vector[i]); AdditionalIndex := GetAdditionalIndex(Vector[i]); if BaseIndex = BrushIndex then begin if EqualTable[i,AdditionalIndex] <> 16 then Vector[i] := BaseIndex*16 + EqualTable[i,AdditionalIndex]; end else begin if NotEqualTable[i,AdditionalIndex] < 16 then Vector[i] := BaseIndex*16 + NotEqualTable[i,AdditionalIndex] else if NotEqualTable[i,AdditionalIndex] > 16 then Vector[i] := BrushIndex*16+ NotEqualTable[i,AdditionalIndex] - 16; end; end; end; end; |

| procedure TMainForm.RedrawMap; Var OffsPoint : TPoint; TopLeftElem : TPoint; ElemCount : TPoint; HelpVar1 : Integer; HelpVar2 : Integer; i,j : Integer; x,y : Integer; Index : Integer; begin OffsPoint.x := TopLeftCorner.x mod ElemWidth; OffsPoint.y := TopLeftCorner.y mod ElemHeight; |
| TopLeftElem.x := TopLeftCorner.x div ElemWidth; TopLeftElem.y := TopLeftCorner.y div ElemHeight; |
| HelpVar1 := DXDraw.Width - (ElemWidth - OffsPoint.x ); HelpVar2 := DXDraw.Height - (ElemHeight - OffsPoint.y ); ElemCount.x := HelpVar1 div ElemWidth; ElemCount.y := HelpVar2 div Elemheight; |
| if (HelpVar1 mod ElemWidth) > 0 Then Inc( ElemCount.x ); if (HelpVar2 mod ElemHeight) > 0 Then Inc( ElemCount.y ); |
| For j := 0 to ElemCount.y do For i := 0 to ElemCount.x do Begin // Вычислить координаты куда выводить X := i * ElemWidth - OffsPoint.x; Y := j * ElemHeight - OffsPoint.y; // Вычислить номер текстуры Index := GetElement(TopLeftElem.X + i,TopLeftElem.Y + j); // Вывести текстуру на экран // Учтите что LandType это не тип земли, а тип мира // Snow,West и т.д. ImageList.Items.Find(LandType).Draw(DXDraw.Surface,x,y,Index); end; |
| Index := GetElement(TopLeftElem.X + i,TopLeftElem.Y + j); |
| Адрес автора |
![]() |
| Исходный код примера |
![]() |
| Компоненты DelphiX |
![]() |
![]() |
![]() |
![]() ![]() ![]() |
| Адрес автора |
![]() |
| Исходный код примера |
![]() |
| Компоненты DelphiX |
![]() |
![]() ![]() ![]() |
| Скачать пример |
![]() |
| Скачать библиотеку DelphiX |
![]() |
| Официальный сайт DelphiX |
![]() |
| Не официальный сайт поддержки DelphiX |
![]() |
| DelphiX FAQ |
![]() |
![]() ![]() ![]() |
| Адрес автора |
![]() |
| Официальный сервер True Space |
![]() |
| Пример полученных спрайтов |
![]() |
| Исходный код BMP Creator |
![]() |
| Модели 3D Cafe |
![]() |
| Просмоторщик и конвертер 3D форматов 3D Exploration |
![]() |
| Адрес автора |
![]() |
| Исходный код примера |
![]() |
| Компоненты DelphiX |
![]() |
![]() |
![]() |
![]() ![]() ![]() |
| Адрес автора |
![]() |
| Исходный код примера |
![]() |
| Компоненты DelphiX |
![]() |
![]() ![]() ![]() |
| Скачать пример |
![]() |
| Скачать библиотеку DelphiX |
![]() |
| Официальный сайт DelphiX |
![]() |
| Не официальный сайт поддержки DelphiX |
![]() |
| DelphiX FAQ |
![]() |
![]() ![]() ![]() |
| For i := 0 to Sprite.Width-1 do For j := 0 to Sprite.Height-1 do Begin If Sprite.Pixels[i,j]=GrayColor then Canvas.Pixels[i,j]:=RedColor Else Canvas.Pixels[i,j]:=Sprite.Pixels[i,j]; End; |

| 000000000000000011111111 | это есть максимальная интенсивность чисто красного цвета, единички - это биты красного цвета, нули - биты других цветов. Соответственно существуют еще пять цветов. |
| 000000001111111100000000 | зеленый |
| 111111110000000000000000 | синий |
| 000000001111111111111111 | желтый |
| 111111111111111100000000 | морская волна |
| 111111110000000011111111 | темно-сиреневый |


![]() |
![]() |
| type ... ColorBox: TComboBox;// Список выбора цвета ... end; var MainForm: TMainForm; RoboSprite : TBitmap; // Картинка спрайта RoboMask : TBitmap; // Картинка серой маски MaskColor : TColor; // Цветовая маска ... procedure TMainForm.FormCreate(Sender: TObject); begin RoboSprite := TBitmap.Create; // Загружаем картинки RoboMask := TBitmap.Create; RoboSprite.LoadFromFile('Sprite.bmp'); RoboMask.LoadFromFile('Maska.bmp'); // Устанавливаем прзрачный цвет спрайта в черный RoboSprite.Transparent := True; RoboSprite.TransparentColor := clBlack; end; procedure TMainForm.ColorBoxChange(Sender: TObject); Var W,H : Integer; X,Y : Integer; begin W := RoboSprite.Width; H := RoboMask.Width; // Получаем цвет маски из ComboBox'a выбора цвета MaskColor := StringToColor(ColorBox.Text); // В цикле осуществляем сложение по системе И for Y := 0 to H-1 do for X := 0 to W-1 do begin // Если пиксель в спрайте не равен черному if RoboMask.Canvas.Pixels[X,Y] <> clBlack Then // Складываем пиксель маски с цветовой маской и результат кладем на спрайт RoboSprite.Canvas.Pixels[x,y] := RoboMask.Canvas.Pixels[X,Y] AND MaskColor; end; Self.Canvas.Draw(0,0,RoboSprite);// Отрисовываем спрайт end; end. |
![]() |
![]() |


