NScumm.Sky.Screen.DrawSprite C# (CSharp) Méthode

DrawSprite() private méthode

private DrawSprite ( byte spriteInfo, Compact sprCompact ) : void
spriteInfo byte
sprCompact Compact
Résultat void
        private void DrawSprite(byte[] spriteInfo, Compact sprCompact)
        {
            if (spriteInfo == null)
            {
                // TODO: warning("Screen::drawSprite Can't draw sprite. Data %d was not loaded", sprCompact.frame >> 6);
                sprCompact.Core.status = 0;
                return;
            }
            var sprDataFile = ServiceLocator.Platform.ToStructure<DataFileHeader>(spriteInfo, 0);
            _sprWidth = sprDataFile.s_width;
            _sprHeight = sprDataFile.s_height;
            _maskX1 = _maskX2 = 0;
            var spriteData = (sprCompact.Core.frame & 0x3F) * sprDataFile.s_sp_size;
            spriteData += ServiceLocator.Platform.SizeOf<DataFileHeader>();
            var spriteY = sprCompact.Core.ycood + sprDataFile.s_offset_y - TopLeftY;
            if (spriteY < 0)
            {
                spriteY = -spriteY;
                if (_sprHeight <= (uint)spriteY)
                {
                    _sprWidth = 0;
                    return;
                }
                _sprHeight -= (ushort)spriteY;
                spriteData += sprDataFile.s_width * spriteY;
                spriteY = 0;
            }
            else
            {
                var botClip = GameScreenHeight - sprDataFile.s_height - spriteY;
                if (botClip < 0)
                {
                    botClip = -botClip;
                    if (_sprHeight <= (uint)botClip)
                    {
                        _sprWidth = 0;
                        return;
                    }
                    _sprHeight -= (ushort)botClip;
                }
            }
            _sprY = (uint)spriteY;
            var spriteX = sprCompact.Core.xcood + sprDataFile.s_offset_x - TopLeftX;
            if (spriteX < 0)
            {
                spriteX = -spriteX;
                if (_sprWidth <= (uint)spriteX)
                {
                    _sprWidth = 0;
                    return;
                }
                _sprWidth -= (ushort)spriteX;
                _maskX1 = spriteX;
                spriteX = 0;
            }
            else
            {
                var rightClip = GameScreenWidth - (sprDataFile.s_width + spriteX);
                if (rightClip < 0)
                {
                    rightClip = -rightClip + 1;
                    if (_sprWidth <= (uint)rightClip)
                    {
                        _sprWidth = 0;
                        return;
                    }
                    _sprWidth -= (ushort)rightClip;
                    _maskX2 = rightClip;
                }
            }
            _sprX = (uint)spriteX;
            var screenPtr = _sprY * GameScreenWidth + _sprX;
            if ((_sprHeight > 192) || (_sprY > 192))
            {
                _sprWidth = 0;
                return;
            }
            if ((_sprX + _sprWidth > 320) || (_sprY + _sprHeight > 192))
            {
                // TODO: warning("Screen::drawSprite fatal error: got x = %d, y = %d, w = %d, h = %d", _sprX, _sprY, _sprWidth, _sprHeight);
                _sprWidth = 0;
                return;
            }

            for (ushort cnty = 0; cnty < _sprHeight; cnty++)
            {
                for (ushort cntx = 0; cntx < _sprWidth; cntx++)
                    if (spriteInfo[spriteData + cntx + _maskX1] != 0)
                        Current[screenPtr + cntx] = spriteInfo[spriteData + cntx + _maskX1];
                spriteData += _sprWidth + _maskX2 + _maskX1;
                screenPtr += GameScreenWidth;
            }
            // Convert the sprite coordinate/size values to blocks for vertical mask and/or vector to game
            _sprWidth += (ushort)(_sprX + GridW - 1);
            _sprHeight += (ushort)(_sprY + GridH - 1);

            _sprX >>= GridWShift;
            _sprWidth >>= GridWShift;
            _sprY >>= GridHShift;
            _sprHeight >>= GridHShift;

            _sprWidth -= (ushort)_sprX;
            _sprHeight -= (ushort)_sprY;
        }