Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --2024.10.27 发布pastebin
- --显示活动块
- local spriteRamStart = 0x0
- local spriteRamEnd = 0x9F
- local spriteSize = 4
- local playerTileRanges = {
- {start = 0x00, endFlag = 0x49},
- {start = 0x53, endFlag = 0x56},
- {start = 0x7C, endFlag = 0x7C}
- }
- local enemyTileRanges = {
- {start = 0x80, endFlag = 0xFF}
- }
- local specialTileRanges = {
- {start = 0x50, endFlag = 0x52},
- {start = 0x76, endFlag = 0x77}
- }
- local itemTileRanges = {
- {start = 0x5A, endFlag = 0x5C}
- }
- local collidedSprites = {}
- local function isInTileRange(tileIndex, ranges)
- for _, range in ipairs(ranges) do
- if tileIndex >= range.start and tileIndex <= range.endFlag then
- return true
- end
- end
- return false
- end
- local function checkCollision(playerX, playerY, enemyX, enemyY)
- return playerX < enemyX + 8 and
- playerX + 8 > enemyX and
- playerY < enemyY + 16 and
- playerY + 16 > enemyY
- end
- local function drawSpriteBoxes()
- local playerPositions = {}
- local enemyPositions = {}
- collidedSprites = {}
- for i = 0, spriteRamEnd, spriteSize do
- local y = emu.read(spriteRamStart + i, emu.memType.gbSpriteRam)
- local x = emu.read(spriteRamStart + i + 1, emu.memType.gbSpriteRam)
- local tileIndex = emu.read(spriteRamStart + i + 2, emu.memType.gbSpriteRam)
- local attributes = emu.read(spriteRamStart + i + 3, emu.memType.gbSpriteRam)
- local isBackground = attributes >= 0x80
- local adjustedY = y - 16 -- 调整 Y 坐标
- local adjustedX = x - 8 -- 调整 X 坐标
- local isInActiveRange = adjustedX >= 0 and adjustedX <= 160 and adjustedY >= 0 and adjustedY <= 144
- if isInActiveRange then
- if isInTileRange(tileIndex, playerTileRanges) then
- table.insert(playerPositions, {x = adjustedX, y = adjustedY, collided = false})
- emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0F00FF00, false)
- elseif isInTileRange(tileIndex, specialTileRanges) then
- emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0FFF00FF, false)
- elseif isInTileRange(tileIndex, itemTileRanges) then
- emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0FFFFA00, false)
- elseif isBackground then
- emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0F0000FF, false)
- elseif isInTileRange(tileIndex, enemyTileRanges) then
- table.insert(enemyPositions, {x = adjustedX, y = adjustedY, collided = false})
- emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0FFF0000, false)
- else
- emu.drawRectangle(adjustedX, adjustedY, 8, 16, 0x0FFFFF00, false)
- end
- end
- end
- for _, player in ipairs(playerPositions) do
- for _, enemy in ipairs(enemyPositions) do
- if checkCollision(player.x, player.y, enemy.x, enemy.y) then
- player.collided = true
- enemy.collided = true
- table.insert(collidedSprites, {x = player.x, y = player.y})
- table.insert(collidedSprites, {x = enemy.x, y = enemy.y})
- end
- end
- end
- for _, player in ipairs(playerPositions) do
- local color = player.collided and 0x0FFF0000 or 0x0F00FF00
- emu.drawRectangle(player.x, player.y, 8, 16, color, false)
- end
- for _, enemy in ipairs(enemyPositions) do
- local color = enemy.collided and 0x0FFF0000 or 0x0FFF0000
- emu.drawRectangle(enemy.x, enemy.y, 8, 16, color, false)
- end
- end
- local function drawPlayerHP()
- local playerX = emu.read(0x50B, emu.memType.gbWorkRam)
- local supplayerX = emu.read(0x402, emu.memType.gbWorkRam)
- local playerY = emu.read(0x512, emu.memType.gbWorkRam)
- local playerHP = emu.read(0x519, emu.memType.gbWorkRam)
- local scrollX = emu.read(0x3D9, emu.memType.gbWorkRam)
- local hpBoxX = 0 --playerX - scrollX
- if playerX > scrollX then
- hpBoxX = playerX - scrollX
- else
- hpBoxX = 256-scrollX + playerX
- end
- local hpBoxY = playerY - 12
- local hpText = "" .. playerHP
- local charWidth = 8
- local boxWidth = #hpText * charWidth + 2
- local boxHeight = 10
- emu.drawRectangle(hpBoxX, hpBoxY, boxWidth, boxHeight, 0x0FFFFFFF, false)
- emu.drawString(hpBoxX + 1, hpBoxY + 1, hpText, 0x0F0000FF, 0xFF000000)
- end
- emu.addEventCallback(drawSpriteBoxes, emu.eventType.endFrame)
- emu.addEventCallback(drawPlayerHP, emu.eventType.endFrame)
Advertisement
Add Comment
Please, Sign In to add comment