From a49f6b9f604788bb8dec5bb1ebc4b8bab6141c7d Mon Sep 17 00:00:00 2001 From: MrPixel92 <35262174+MrPixel92@users.noreply.github.com> Date: Tue, 2 May 2023 18:21:36 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D0=BF=D1=80=D0=B0=D0=B9=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Все спрайты вписывать в Sprites.cfg --- Applications/RayWalk.app/Sprites/Banana.pic | Bin 0 -> 573 bytes Applications/RayWalk.app/Sprites/Plasma.pic | Bin 0 -> 754 bytes Applications/RayWalk.app/Sprites/Sprites.cfg | 4 ++++ 3 files changed, 4 insertions(+) create mode 100644 Applications/RayWalk.app/Sprites/Banana.pic create mode 100644 Applications/RayWalk.app/Sprites/Plasma.pic create mode 100644 Applications/RayWalk.app/Sprites/Sprites.cfg diff --git a/Applications/RayWalk.app/Sprites/Banana.pic b/Applications/RayWalk.app/Sprites/Banana.pic new file mode 100644 index 0000000000000000000000000000000000000000..bed153604dae4a3d2d856302c9b4d569a0d54908 GIT binary patch literal 573 zcmaix%MOAt5JfL-=?g@j6<>sZF)?xFg8%;r*%K`&STTVn?PAW%o#x*A<#v@-@c5=znlI2A56wy@dYLp zm@NM^M@eO7XaqWU!DLL3O=ZWf@KgOYakFM(wANs=s%eLg38a!(b;X9HwExbGBYmJ% vl-T$f?YH}E$dMBphv*;a<%P0W(;fuc$vf0e{w+WSjD%4z9Hv17((AqeJtQU- literal 0 HcmV?d00001 diff --git a/Applications/RayWalk.app/Sprites/Plasma.pic b/Applications/RayWalk.app/Sprites/Plasma.pic new file mode 100644 index 0000000000000000000000000000000000000000..ad855c72dfd4d8b5455c2e26ef3a9f232c87f0d9 GIT binary patch literal 754 zcmZuv*--;A43%y9+;u`=lRa`Qb&wC3Az=o7s3ufE4HQ62bU-5@$q6vPk0nd;v-I>H zZ}0EII8`42mkt1?FoMzst@9zKs?L+?+3ftHnJ?O|AC{~2W>mRUw8y)Sp!fmjj0LGd z4QjNSB2L3*^a{pc=@|tgr;=4tS8=xX0!XRmG8+18F#~1aU!LIr4^YF!rF#P~-k;_TwhSH(Tc_!GRZr+uH4m0( zAwr@f%haS&V~H%f@>k6kc3I8-^x0|DzU`JK6pCpuj7)Z6(mI)MxpGMP)!G|PR0M67 zt7x@h_7j3O{ZK^)D7@6sy3=-YT^7gdBFsrPKX$licd&&FX%B}=m-SMiL2?%@BDLFg zmH-IXp)}>uAmIdsLsZx&-biIg8*R-1IeZD^30|Ft6d*>3i76s35G8NFXmzTYA7G!f yJL<|*KQ)FVxue=_kOp}W=Y>cTp!Xt6@`8A*$tWHZkUTvRp;nV$+O5B7Xg&eZH7}t6 literal 0 HcmV?d00001 diff --git a/Applications/RayWalk.app/Sprites/Sprites.cfg b/Applications/RayWalk.app/Sprites/Sprites.cfg new file mode 100644 index 00000000..209767af --- /dev/null +++ b/Applications/RayWalk.app/Sprites/Sprites.cfg @@ -0,0 +1,4 @@ +{ + "Banana.pic", + "Plasma.pic", +} From 61f86dcf340f821bf8787795a7ce888b470a7cc3 Mon Sep 17 00:00:00 2001 From: MrPixel92 <35262174+MrPixel92@users.noreply.github.com> Date: Tue, 2 May 2023 18:31:23 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D1=81=D1=83=D1=89?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20(=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B5=D1=89=D1=91=20=D1=81=D0=BF=D1=80=D0=B0=D0=B9?= =?UTF-8?q?=D1=82=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Worlds/ExampleWorld/Entities.cfg | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Applications/RayWalk.app/Worlds/ExampleWorld/Entities.cfg diff --git a/Applications/RayWalk.app/Worlds/ExampleWorld/Entities.cfg b/Applications/RayWalk.app/Worlds/ExampleWorld/Entities.cfg new file mode 100644 index 00000000..1ee4ded1 --- /dev/null +++ b/Applications/RayWalk.app/Worlds/ExampleWorld/Entities.cfg @@ -0,0 +1,27 @@ +{ + { + type="sprite", + x = 180, + y = 500, + w = 60, + sprite = {image = 1}, + params = {image = "Banana.pic"}, + }, + { + type="sprite", + x = 180, + y = 700, + w = 60, + sprite = {image = 2}, + params = {image = "Plasma.pic"}, + }, + + { + type="sprite", + x = 385, + y = 758, + w = 60, + sprite = {image = 1}, + params = {image = "Banana.pic"}, + }, +} From a090d87a33902137e7918221eb84c6c11a053587 Mon Sep 17 00:00:00 2001 From: MrPixel92 <35262174+MrPixel92@users.noreply.github.com> Date: Tue, 2 May 2023 18:38:27 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=98=20=D1=81=D1=8E=D0=B4=D0=B0=20=D1=81?= =?UTF-8?q?=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=B8=D0=BC,=20=D1=87=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B5=20=D0=BA=D1=80=D0=B0=D1=88=D0=BD=D1=83?= =?UTF-8?q?=D0=BB=D0=BE=D1=81=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Worlds/SundownBeams/Entities.cfg | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Applications/RayWalk.app/Worlds/SundownBeams/Entities.cfg diff --git a/Applications/RayWalk.app/Worlds/SundownBeams/Entities.cfg b/Applications/RayWalk.app/Worlds/SundownBeams/Entities.cfg new file mode 100644 index 00000000..1ee4ded1 --- /dev/null +++ b/Applications/RayWalk.app/Worlds/SundownBeams/Entities.cfg @@ -0,0 +1,27 @@ +{ + { + type="sprite", + x = 180, + y = 500, + w = 60, + sprite = {image = 1}, + params = {image = "Banana.pic"}, + }, + { + type="sprite", + x = 180, + y = 700, + w = 60, + sprite = {image = 2}, + params = {image = "Plasma.pic"}, + }, + + { + type="sprite", + x = 385, + y = 758, + w = 60, + sprite = {image = 1}, + params = {image = "Banana.pic"}, + }, +} From 1a60bbb63e89c8849dcd14b3b28c8e7d84f339b7 Mon Sep 17 00:00:00 2001 From: MrPixel92 <35262174+MrPixel92@users.noreply.github.com> Date: Tue, 2 May 2023 18:44:06 +0300 Subject: [PATCH 4/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=83=20=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B9=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Работают немного через раз, но зато спрайты! --- Applications/RayWalk.app/Main.lua | 1 + Applications/RayWalk.app/RayEngine.lua | 168 ++++++++++++++++++++++++- 2 files changed, 163 insertions(+), 6 deletions(-) diff --git a/Applications/RayWalk.app/Main.lua b/Applications/RayWalk.app/Main.lua index 419f64f3..26317c95 100755 --- a/Applications/RayWalk.app/Main.lua +++ b/Applications/RayWalk.app/Main.lua @@ -174,6 +174,7 @@ local controls = { rayEngine.loadEngineProperties(applicationResourcesDirectory .. "RayEngine.cfg") rayEngine.loadWeapons(applicationResourcesDirectory .. "Weapons/") +rayEngine.loadSprites(applicationResourcesDirectory .. "Sprites/") rayEngine.loadWorld(worldsPath .. "ExampleWorld") rayEngine.changeResolution(rayEngine.properties.screenResolution.width, rayEngine.properties.screenResolution.height) -- rayEngine.intro() diff --git a/Applications/RayWalk.app/RayEngine.lua b/Applications/RayWalk.app/RayEngine.lua index 345f6f1d..7fe648cd 100755 --- a/Applications/RayWalk.app/RayEngine.lua +++ b/Applications/RayWalk.app/RayEngine.lua @@ -20,7 +20,6 @@ local endRenderClock = os.clock() local frameCount = 0 local fps = 0 local lastFPSCheck = os.clock() - ---------------------------------------------------- Константы ------------------------------------------------------------------ local rayEngine = {} @@ -32,7 +31,7 @@ rayEngine.watchEnabled = false rayEngine.drawFieldOfViewOnMinimap = false rayEngine.chatShowTime = 4 rayEngine.chatHistory = {} - +rayEngine.sprites = {} ---------------------------------------------- Расчетные функции ------------------------------------------------------------------ -- Позиция горизонта, относительно которой рисуется мир @@ -149,9 +148,34 @@ function rayEngine.loadWorld(pathToWorldFolder) rayEngine.map = filesystem.readTable(pathToWorldFolder .. "/Map.cfg") rayEngine.player = filesystem.readTable(pathToWorldFolder .. "/Player.cfg") rayEngine.blocks = filesystem.readTable(pathToWorldFolder .. "/Blocks.cfg") + rayEngine.entities = filesystem.readTable(pathToWorldFolder .. "/Entities.cfg") -- Дополняем карту ее размерами rayEngine.map.width = #rayEngine.map[1] rayEngine.map.height = #rayEngine.map + -- Создаём карту блоков для коллизий + rayEngine.hitBlocks = {} + for i = 1,rayEngine.map.width do + line={} + rayEngine.hitBlocks[i] = {} + for j =1,rayEngine.map.height do + rayEngine.hitBlocks[i][j] = {} + end + end + + for i =1,#rayEngine.entities do + for dx = -1,1 do + for dy = -1,1 do + mapX = math.floor((rayEngine.entities[i].x + rayEngine.entities[i].w * dx) / rayEngine.properties.tileWidth) + mapY = math.floor((rayEngine.entities[i].y+rayEngine.entities[i].w * dy) / rayEngine.properties.tileWidth) + + if rayEngine.hitBlocks[mapX] and rayEngine.hitBlocks[mapX][mapY] then + cellCount = #rayEngine.hitBlocks[mapX][mapY] + + rayEngine.hitBlocks[mapX][mapY][cellCount + 1] = i + end + end + end + end -- Ебашим правильную позицию игрока, основанную на этой ХУЙНЕ, которую ГЛЕБ так ЛЮБИТ rayEngine.player.position.x = rayEngine.properties.tileWidth * rayEngine.player.position.x - rayEngine.properties.tileWidth / 2 rayEngine.player.position.y = rayEngine.properties.tileWidth * rayEngine.player.position.y - rayEngine.properties.tileWidth / 2 @@ -188,6 +212,14 @@ function rayEngine.changeWeapon(weaponID) end end +function rayEngine.loadSprites(pathToSprites) + fileList = filesystem.readTable(pathToSprites .. "Sprites.cfg") + for i = 1,#fileList do + rayEngine.sprites[i] = image.load(pathToSprites .. fileList[i]) + + end +end + function rayEngine.move(distanceForward, distanceRight) local forwardRotation = math.rad(rayEngine.player.rotation) local rightRotation = math.rad(rayEngine.player.rotation + 90) @@ -311,6 +343,15 @@ function rayEngine.drawMap(x, y, width, height, transparency) if rayEngine.map[i] and rayEngine.map[i][j] then screen.semiPixelSet(xPos, yPos, rayEngine.blocks[rayEngine.map[i][j]].color) end + + if rayEngine.hitBlocks[i + 1] and rayEngine.hitBlocks[i+1][j+1] then + entities = rayEngine.hitBlocks[i + 1][j + 1] + for entityID= 1,#entities do + entity = rayEngine.entities[entityID] + scale = rayEngine.properties.tileWidth + screen.semiPixelSet(entity.x//scale - xMap + x, entity.y*2//scale - yMap + y, 0x00FFFF) + end + end xPos = xPos + 1 end xPos = x; yPos = yPos + 1 @@ -510,12 +551,38 @@ end ---------------------------------------------------- Функции отрисовки мира ------------------------------------------------------------------ -local function raycast(angle) +rayEngine.caughtEntities = {} + +--Свистнул функцию с StackOverflow. Заменяет оператор in из питона +local function has_value (tab, val) + for index, value in ipairs(tab) do + if value == val then + return true + end + end + + return false +end + + +function rayEngine.getEntitiesAt(x,y) + mapX = math.floor(x / rayEngine.properties.tileWidth) + mapY = math.floor(y / rayEngine.properties.tileWidth) + if rayEngine.hitBlocks[mapX] and rayEngine.hitBlocks[mapX][mapY] then + return rayEngine.hitBlocks[mapX][mapY] + else + return {} + end +end + +local function raycast(angle,maxRange) + rayEngine.caughtEntities = {} angle = math.rad(angle) + local raySteps = 0 local angleSinDistance, angleCosDistance, currentDistance, xWorld, yWorld, xMap, yMap, tile = math.sin(angle) * rayEngine.properties.raycastQuality, math.cos(angle) * rayEngine.properties.raycastQuality, 0, rayEngine.player.position.x, rayEngine.player.position.y while true do - if currentDistance <= rayEngine.properties.drawDistance then + if currentDistance <= maxRange then xMap, yMap = math.floor(xWorld / rayEngine.properties.tileWidth), math.floor(yWorld / rayEngine.properties.tileWidth) if rayEngine.map[yMap] and rayEngine.map[yMap][xMap] then return currentDistance, rayEngine.map[yMap][xMap] @@ -523,12 +590,78 @@ local function raycast(angle) xWorld, yWorld = xWorld + angleSinDistance, yWorld + angleCosDistance currentDistance = currentDistance + rayEngine.properties.raycastQuality + raySteps = raySteps + 1 + if raySteps % 1 == 0 then + local entityList = rayEngine.getEntitiesAt(xWorld,yWorld) + + if entityList then + for i = 1,#entityList do + if not has_value(rayEngine.caughtEntities,entityList[i]) then + table.insert(rayEngine.caughtEntities, entityList[i]) + end + end + end + end else return nil end end end +function calcDistance(x1,y1,x2,y2) + relativeX = (x2-x1) + relativeY = (y2-y1) + distance = math.sqrt(relativeX*relativeX + relativeY*relativeY) + return distance +end + +function rayEngine.drawSpriteColumn(x,y,rayAngle,scrX,sprName) + + sprImage = rayEngine.sprites[sprName] + relativeX = (rayEngine.player.position.x - x) + relativeY = (rayEngine.player.position.y - y) + distance = math.sqrt(relativeX*relativeX + relativeY*relativeY) + + + iwidth,iheight = image.getSize(sprImage) + + --Повернуть на 90 градусов + horizontalX = -relativeY/distance*iwidth/2 + horizontalY = relativeX/distance*iwidth/2 + + angleTheta = math.deg(math.atan(-relativeX, -relativeY)) + angleDelta = angleTheta - rayEngine.player.rotation + + angleDelta = angleDelta + + centerX = angleDelta / rayEngine.raycastStep + screen.getWidth() / 2 + wingShift = iwidth / distance * rayEngine.distanceToProjectionPlane + startX = centerX - wingShift / 2 + endX = centerX + wingShift / 2 + + + height = iheight / distance * rayEngine.distanceToProjectionPlane + startY = rayEngine.horizonPosition - height / 2 + 1 + + picX = math.floor((scrX - endX) / wingShift * iwidth) + --Продолжи эту хуйню потом, ОК? + if scrX >= startX and scrX <= endX then + for iterY = 0, height do + coordY = math.floor(startY + iterY) + picY = math.floor(iterY/height * iheight)+1 + --picY = 4 + b,f,a,s = image.get(sprImage,picX,picY) + if b and f and (a == 0) then + --print(centerX,wingShift,startX,endX,picX,endX,f, b, 0xFFFFFF) + --print(rayEngine.player.rotation,angleTheta,angleDelta," ", startX,f, b, 0xFFFFFF) + screen.drawRectangle(scrX,coordY,1,1,b,f,s) + --screen.set(scrX,coordY,) + end + end + end + +end + function rayEngine.drawWorld() --Земля screen.clear(rayEngine.world.colors.groundByTime) @@ -537,7 +670,10 @@ function rayEngine.drawWorld() --Сцена local startAngle, endAngle, startX, distanceToTile, tileID, height, startY, tileColor = rayEngine.player.rotation - rayEngine.player.fieldOfView / 2, rayEngine.player.rotation + rayEngine.player.fieldOfView / 2, 1 for angle = startAngle, endAngle, rayEngine.raycastStep do - distanceToTile, tileID = raycast(angle) + distanceToTile, tileID = raycast(angle,rayEngine.properties.drawDistance) + + + if distanceToTile then -- Получаем цвет стенки tileColor = getTileColor(rayEngine.blocks[tileID].color, distanceToTile) @@ -560,6 +696,17 @@ function rayEngine.drawWorld() -- column = image.transform(column, 1, height) -- screen.drawImage(math.floor(startX), math.floor(startY), column) -- end + + --Поверх рисуем спрайты + if rayEngine.caughtEntities then + for i = #rayEngine.caughtEntities,1,-1 do + local entityID = rayEngine.caughtEntities[i] + local entity = rayEngine.entities[entityID] + rayEngine.drawSpriteColumn(entity.x,entity.y,angle,startX,entity.sprite.image) + end + end + + end startX = startX + 1 end @@ -567,6 +714,8 @@ end function rayEngine.update() + + local frameRenderClock = os.clock() rayEngine.rotate(rayEngine.player.rotationSpeed * inputYaw) rayEngine.move(rayEngine.player.moveSpeed * inputY, rayEngine.player.moveSpeed * inputX) @@ -583,12 +732,18 @@ function rayEngine.update() if rayEngine.chatEnabled then rayEngine.chat() end doDayNightCycle() + raycast(rayEngine.player.rotation,rayEngine.properties.drawDistance) + if rayEngine.debugInformationEnabled then rayEngine.drawDebugInformation(3, 2 + (rayEngine.minimapEnabled and 12 or 0), 24, 0.6, "renderTime: " .. string.format("%.2f", ((os.clock() - frameRenderClock) + (endRenderClock-startRenderClock)) * 1000) .. " ms", "FPS: " .. string.format("%.2f",fps), "freeRAM: " .. string.format("%.2f", computer.freeMemory() / 1024) .. " KB", - "pos: " .. string.format("%.2f", rayEngine.player.position.x) .. " x " .. string.format("%.2f", rayEngine.player.position.y) + "pos: " .. string.format("%.2f", rayEngine.player.position.x) .. " x " .. string.format("%.2f", rayEngine.player.position.y), + "blocks: " .. string.format("%i", #rayEngine.hitBlocks) .. "x" .. string.format("%i", #rayEngine.hitBlocks[1]), + "entities: " .. string.format("%i", #rayEngine.entities) .. ", " .. string.format("%i", rayEngine.entities[1].x), + "entities at: " .. string.format("%i", #rayEngine.caughtEntities), + "sprites: " .. string.format("%i", #rayEngine.sprites) ) end startRenderClock = os.clock() @@ -639,3 +794,4 @@ end ---------------------------------------------------------------------------------------------------------------------------------- return rayEngine + From 87503f903b996df081812660435bdfffabaac8d5 Mon Sep 17 00:00:00 2001 From: MrPixel92 <35262174+MrPixel92@users.noreply.github.com> Date: Tue, 2 May 2023 19:16:29 +0300 Subject: [PATCH 5/8] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BB-=D0=B2=D0=B0=20=D1=81=D1=83=D1=89=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Теперь игра случайно не попытается найти координату X не существующего спрайта --- Applications/RayWalk.app/RayEngine.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Applications/RayWalk.app/RayEngine.lua b/Applications/RayWalk.app/RayEngine.lua index 7fe648cd..e61dba5e 100755 --- a/Applications/RayWalk.app/RayEngine.lua +++ b/Applications/RayWalk.app/RayEngine.lua @@ -740,8 +740,8 @@ function rayEngine.update() "FPS: " .. string.format("%.2f",fps), "freeRAM: " .. string.format("%.2f", computer.freeMemory() / 1024) .. " KB", "pos: " .. string.format("%.2f", rayEngine.player.position.x) .. " x " .. string.format("%.2f", rayEngine.player.position.y), - "blocks: " .. string.format("%i", #rayEngine.hitBlocks) .. "x" .. string.format("%i", #rayEngine.hitBlocks[1]), - "entities: " .. string.format("%i", #rayEngine.entities) .. ", " .. string.format("%i", rayEngine.entities[1].x), + "collision check blocks: " .. string.format("%i", #rayEngine.hitBlocks) .. "x" .. string.format("%i", #rayEngine.hitBlocks[1]), + "entities: " .. string.format("%i", #rayEngine.entities), "entities at: " .. string.format("%i", #rayEngine.caughtEntities), "sprites: " .. string.format("%i", #rayEngine.sprites) ) From 5a47252679576309a65903ca4248b210d8d8d1d7 Mon Sep 17 00:00:00 2001 From: MrPixel92 <35262174+MrPixel92@users.noreply.github.com> Date: Tue, 2 May 2023 19:21:48 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BB=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D0=B2=20RayEngine.lua?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Applications/RayWalk.app/RayEngine.lua | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Applications/RayWalk.app/RayEngine.lua b/Applications/RayWalk.app/RayEngine.lua index e61dba5e..865dd0cd 100755 --- a/Applications/RayWalk.app/RayEngine.lua +++ b/Applications/RayWalk.app/RayEngine.lua @@ -625,10 +625,6 @@ function rayEngine.drawSpriteColumn(x,y,rayAngle,scrX,sprName) iwidth,iheight = image.getSize(sprImage) - --Повернуть на 90 градусов - horizontalX = -relativeY/distance*iwidth/2 - horizontalY = relativeX/distance*iwidth/2 - angleTheta = math.deg(math.atan(-relativeX, -relativeY)) angleDelta = angleTheta - rayEngine.player.rotation @@ -644,18 +640,15 @@ function rayEngine.drawSpriteColumn(x,y,rayAngle,scrX,sprName) startY = rayEngine.horizonPosition - height / 2 + 1 picX = math.floor((scrX - endX) / wingShift * iwidth) - --Продолжи эту хуйню потом, ОК? if scrX >= startX and scrX <= endX then for iterY = 0, height do coordY = math.floor(startY + iterY) picY = math.floor(iterY/height * iheight)+1 - --picY = 4 b,f,a,s = image.get(sprImage,picX,picY) if b and f and (a == 0) then - --print(centerX,wingShift,startX,endX,picX,endX,f, b, 0xFFFFFF) - --print(rayEngine.player.rotation,angleTheta,angleDelta," ", startX,f, b, 0xFFFFFF) + --print(centerX,wingShift,startX,endX,picX,endX,f, b) --раскомментируй на случай дебага + --print(rayEngine.player.rotation,angleTheta,angleDelta," ", startX) screen.drawRectangle(scrX,coordY,1,1,b,f,s) - --screen.set(scrX,coordY,) end end end From cd98f02286501a4146d9ebe425bc303f994b0f06 Mon Sep 17 00:00:00 2001 From: MrPixel92 <35262174+MrPixel92@users.noreply.github.com> Date: Sat, 6 May 2023 12:59:59 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=9F=D0=BE=D1=84=D0=B8=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D1=81=D1=87=D0=B5=D0=B7=D0=BD=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF=D1=80=D0=B0=D0=B9=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D0=BE=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=91=D0=BD=D0=BD=D1=8B=D0=BC=20=D1=83=D0=B3=D0=BB=D0=BE?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Applications/RayWalk.app/RayEngine.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Applications/RayWalk.app/RayEngine.lua b/Applications/RayWalk.app/RayEngine.lua index 865dd0cd..faa52f2c 100755 --- a/Applications/RayWalk.app/RayEngine.lua +++ b/Applications/RayWalk.app/RayEngine.lua @@ -77,11 +77,13 @@ end ---------------------------------------------- Вспомогательные функции ------------------------------------------------------------------ local function constrainAngle(value) - if ( value < 0 ) then - value = value + 360 - elseif ( value > 360 ) then - value = value - 360 - end + value = value % 360 + return value +end + + +local function constrain180(value) + value = (value + 180) % 360 - 180 return value end @@ -628,7 +630,7 @@ function rayEngine.drawSpriteColumn(x,y,rayAngle,scrX,sprName) angleTheta = math.deg(math.atan(-relativeX, -relativeY)) angleDelta = angleTheta - rayEngine.player.rotation - angleDelta = angleDelta + angleDelta = constrain180(angleDelta) centerX = angleDelta / rayEngine.raycastStep + screen.getWidth() / 2 wingShift = iwidth / distance * rayEngine.distanceToProjectionPlane From 0d33fff8409706a6ef1360620129c333ee44cf24 Mon Sep 17 00:00:00 2001 From: MrPixel92 <35262174+MrPixel92@users.noreply.github.com> Date: Sat, 6 May 2023 14:57:17 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=A3=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B0=D0=B7=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=20RayEngine.cfg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Иначе люто тормозит --- Applications/RayWalk.app/RayEngine.cfg | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Applications/RayWalk.app/RayEngine.cfg b/Applications/RayWalk.app/RayEngine.cfg index 0d11d9c0..72356dd6 100755 --- a/Applications/RayWalk.app/RayEngine.cfg +++ b/Applications/RayWalk.app/RayEngine.cfg @@ -1,28 +1,28 @@ { + tileWidth = 32, screenResolution = { - height = 50, - width = 160 + width = 110, + height = 45 }, shadingTransparencyMap = { - [12] = 0.50196078431373, - [6] = 1, - [13] = 0.4, [1] = 0.2, + [2] = 0.4, [3] = 0.6, + [4] = 0.8, + [5] = 1, + [6] = 1, [7] = 1, [8] = 0.8, - [4] = 0.8, [9] = 0.8, - [14] = 0.30196078431373, - [2] = 0.4, - [5] = 1, + [10] = 0.70196078431373, [11] = 0.6, - [10] = 0.70196078431373 + [12] = 0.50196078431373, + [13] = 0.4, + [14] = 0.30196078431373 }, - shadingDistance = 500, - shadingCascades = 8, + raycastQuality = 4.8953488372093, useSimpleRenderer = false, - tileWidth = 32, - raycastQuality = 6.4, - drawDistance = 1000 -} \ No newline at end of file + shadingCascades = 8, + drawDistance = 1000, + shadingDistance = 500 +}