X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame_sp%2FDDSpriteBuffer.c;h=e2f47eee2195a554e31a49720aea0642bf89e06f;hp=1384a38fa78949e15deed57355b9699b6dc7c80f;hb=3ff2e8a0b5c27b99a9920bdf5ed82bc41bf40181;hpb=5ba7f2d9a3f07f342afdf215a3307d5487cb6d43 diff --git a/src/game_sp/DDSpriteBuffer.c b/src/game_sp/DDSpriteBuffer.c index 1384a38f..e2f47eee 100644 --- a/src/game_sp/DDSpriteBuffer.c +++ b/src/game_sp/DDSpriteBuffer.c @@ -4,229 +4,58 @@ #include "DDSpriteBuffer.h" -static void Blt(int pX, int pY, int SpriteX, int SpriteY); -// --- VERSION 1.0 CLASS -// --- BEGIN -// --- MultiUse = -1 'True // True -// --- Persistable = 0 'NotPersistable // NotPersistable -// --- DataBindingBehavior = 0 'vbNone // vbNone -// --- DataSourceBehavior = 0 'vbNone // vbNone -// --- MTSTransactionMode = 0 'NotAnMTSObject // NotAnMTSObject -// --- END +static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY) +{ + int scx = (mScrollX_last < 0 ? 0 : mScrollX_last); + int scy = (mScrollY_last < 0 ? 0 : mScrollY_last); + int sx1 = scx - 2 * TILEX; + int sy1 = scy - 2 * TILEY; + int sx2 = scx + (SCR_FIELDX + 1) * TILEX; + int sy2 = scy + (SCR_FIELDY + 1) * TILEY; + int sx = pX - sx1; + int sy = pY - sy1; + int tile_x = sx / TILESIZE; + int tile_y = sy / TILESIZE; + int move_x = (sx + TILESIZE - 1) / TILESIZE; + int move_y = (sy + TILESIZE - 1) / TILESIZE; -static char *VB_Name = "DDSpriteBuffer"; -static boolean VB_GlobalNameSpace = False; -static boolean VB_Creatable = True; -static boolean VB_PredeclaredId = False; -static boolean VB_Exposed = False; -// --- Option Explicit - -// needs reference to: DirectX7 for Visual Basic Type Library - -DirectDrawSurface7 Buffer; -DirectDrawSurface7 mDest; -long mXSpriteCount, mYSpriteCount; -long mSpriteWidth, mSpriteHeight; -long mDestXOff, mDestYOff; - -void DDSpriteBuffer_Let_DestXOff(long NewVal) -{ - mDestXOff = NewVal; -} - -long DDSpriteBuffer_Get_DestXOff() -{ - long DestXOff; - - DestXOff = mDestXOff; - - return DestXOff; -} - -void DDSpriteBuffer_Let_DestYOff(long NewVal) -{ - mDestYOff = NewVal; -} - -long DDSpriteBuffer_Get_DestYOff() -{ - long DestYOff; - - DestYOff = mDestYOff; - - return DestYOff; -} - -int DDSpriteBuffer_Set_DestinationSurface(DirectDrawSurface7 DSurface) -{ - int DestinationSurface; - - mDest = DSurface; - - return DestinationSurface; -} - -DirectDrawSurface7 DDSpriteBuffer_Get_Surface() -{ - DirectDrawSurface7 Surface; - - Surface = Buffer; - - return Surface; -} - -long DDSpriteBuffer_Get_Width() -{ - long Width; - - Width = mSpriteWidth * mXSpriteCount; - - return Width; -} - -int DDSpriteBuffer_Get_Height() -{ - int Height; - - Height = mSpriteHeight * mYSpriteCount; - - return Height; -} - -boolean DDSpriteBuffer_CreateFromFile(char *Path, long xSprites, long ySprites) -{ - boolean CreateFromFile; - - DDSURFACEDESC2 SD; - - { - SD.lFlags = DDSD_CAPS; // Or DDSD_WIDTH Or DDSD_HEIGHT - SD.ddsCaps.lCaps = DDSCAPS_VIDEOMEMORY; // DDSCAPS_SYSTEMMEMORY 'DDSCAPS_OFFSCREENPLAIN - } - - // --- On Error GoTo CreateFromFileEH - Buffer = DDraw.CreateSurfaceFromFile(Path, SD); - // --- On Error GoTo 0 - - Buffer.GetSurfaceDesc(SD); - mSpriteWidth = SD.LWidth / xSprites; - mSpriteHeight = SD.LHeight / ySprites; - mXSpriteCount = xSprites; - mYSpriteCount = ySprites; - CreateFromFile = True; - return CreateFromFile; - -CreateFromFileEH: - CreateFromFile = False; - - return CreateFromFile; -} - -boolean DDSpriteBuffer_CreateAtSize(long Width, long Height, long xSprites, long ySprites) -{ - boolean CreateAtSize; - - DDSURFACEDESC2 SD; - - { - SD.lFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - SD.ddsCaps.lCaps = DDSCAPS_VIDEOMEMORY; - // SD.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN - SD.LWidth = Width; - SD.LHeight = Height; - } - - // --- On Error GoTo CreateAtSizeEH - Buffer = DDraw.CreateSurface(SD); - // --- On Error GoTo 0 - - mSpriteWidth = Width / xSprites; - mSpriteHeight = Height / ySprites; - mXSpriteCount = xSprites; - mYSpriteCount = ySprites; - CreateAtSize = True; - return CreateAtSize; - -CreateAtSizeEH: - CreateAtSize = False; - - return CreateAtSize; -} + if (NoDisplayFlag) + return; -void DDSpriteBuffer_Cls(int BackColor) -{ - RECT EmptyRect; + /* do not draw fields that are outside the visible screen area */ + if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2) + return; - Buffer.BltColorFill(EmptyRect, BackColor); -} + sx = sx * TILESIZE_VAR / TILESIZE; + sy = sy * TILESIZE_VAR / TILESIZE; -static void Blt(int pX, int pY, int SpriteX, int SpriteY) -{ - RECT DR, SR; - long Tmp; + BlitBitmap(bitmap, bitmap_db_field_sp, SpriteX, SpriteY, + TILEX_VAR, TILEY_VAR, sx, sy); - if (NoDisplayFlag) - return; + redraw[tile_x][tile_y] = TRUE; + redraw_tiles++; + if (move_x != tile_x) { - DR.left = pX + mDestXOff; - DR.top = pY + mDestYOff; - DR.right = pX + mSpriteWidth + mDestXOff; - DR.bottom = pY + mSpriteHeight + mDestYOff; + redraw[move_x][tile_y] = TRUE; + redraw_tiles++; } + else if (move_y != tile_y) { - SR.left = mSpriteWidth * (SpriteX - 1); - SR.top = mSpriteHeight * (SpriteY - 1); - SR.right = SR.left + mSpriteWidth; - SR.bottom = SR.top + mSpriteHeight; + redraw[tile_x][move_y] = TRUE; + redraw_tiles++; } - Tmp = mDest_Blt(DR, Buffer, SR, DDBLT_WAIT); } -void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos) +void DDSpriteBuffer_BltImg(int pX, int pY, int graphic, int sync_frame) { - int XPos, YPos; + struct GraphicInfo_SP g; if (NoDisplayFlag) return; - XPos = (SpritePos % mXSpriteCount) + 1; - YPos = (SpritePos / mXSpriteCount) + 1; - Blt(pX, pY, XPos, YPos); -} - -// Public Function GetStretchCopy(Stretch!) As DDSpriteBuffer -// Dim SR As RECT, DR As RECT, Y%, X%, pX%, pY%, Tmp& -// // Set GetStretchCopy = New DDSpriteBuffer // (handle this later, if needed) -// If Not GetStretchCopy.CreateAtSize(Stretch * Width, Stretch * Height, mXSpriteCount, mYSpriteCount) Then -// Set GetStretchCopy = Nothing -// Else -// For Y = 0 To mYSpriteCount - 1 -// pY = Y * Stretch * mSpriteHeight -// For X = 0 To mXSpriteCount - 1 -// pX = X * Stretch * mSpriteWidth -// With DR -// .left = pX -// .top = pY -// .right = pX + mSpriteWidth * Stretch -// .bottom = pY + mSpriteHeight * Stretch -// End With -// With SR -// .left = mSpriteWidth * X -// .top = mSpriteHeight * Y -// .right = .left + mSpriteWidth -// .bottom = .top + mSpriteHeight -// End With -// Tmp = GetStretchCopy.Surface.Blt(DR, Buffer, SR, DDBLT_WAIT) -// Next X -// Next Y -// 'GetStretchCopy.Surface.Blt DR, Buffer, DR, DDBLT_WAIT -// End If -// End Function + getGraphicSource_SP(&g, graphic, sync_frame, -1, -1); -static void Class_Initialize() -{ - mDestXOff = 0; - mDestYOff = 0; + Blt(pX, pY, g.bitmap, g.src_x, g.src_y); }