raynner Posted March 17, 2020 Share Posted March 17, 2020 Hello first sorry for the english I have a script that I'm editing it creates a radar: minimap and a bigmap (f11) (note: it does not replace the original it creates a new one and hides the original) I added gta v gps to it and everything works correctly but to create the route I type a command / gps and it renders me an image where I click and the script gets the coordinate and creates a route! what I want is to get the coordinate by clicking on the bigmap! I tried however the most I got was to create a function that returns the value x, y, z of the world that is being rendered in the center of the map and if I move the cursor I only have changes in the floot the function that I created --[[ mapX = CursorX mapY = CursorY PosX = playerX PosY = playerY x = bigmap render x y = bigmap render y w = bigmap render w h = bigmap render h range = zoom --]] function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range) local worldX = posx + ((mapX - (x + w / 2)) / range) / 3000 / (range/180); local worldY = posy - ((mapY - (y + h / 2)) / range) / 3000 / (range/180); return worldX, worldY end my main code I don't see the need to show others more if you need to let me know I'm testing this on line 256 Map = {} Map.__index = Map Map.instances = {} Map.damageEfect = {} local sx,sy = guiGetScreenSize() px,py = 1366,768 x,y = (sx/px), (sy/py) font = dxCreateFont("images/myriadproregular.ttf",20,true) local max,min = math.min,math.max function cstrain( value, v1, v2 ) return max(min(value,v1),v2) end function math.map(value, low1, high1, low2, high2) return low2 + (value - low1) * (high2 - low2) / (high1 - low1) end function Map.new(X,Y,W,H) local self = setmetatable({}, Map) self.x = X self.y = Y self.w = W self.h = H local pos = {getElementPosition(localPlayer)} self.posX = pos[1] self.posY = pos[2] self.posZ = pos[3] self.size = 90 self.color = {255,255,255,255} self.blipSize = x*18 self.drawRange = 220 self.map = dxCreateTexture("images/gtasa.png","dxt5") self.map2 = dxCreateTexture("images/gtasa2.png","dxt5") self.renderTarget = dxCreateRenderTarget(W, H, true) self.blips = {} for k=0, 63 do self.blips[k] = dxCreateTexture("images/icons/"..k..".png","dxt3") end if(#Map.instances == 0) then addEventHandler("onClientRender", getRootElement(), Map.render) end table.insert(Map.instances, self) return self end function Map.render() for k,v in pairs(Map.instances) do if v.visible then if not v.style then v:draw() elseif v.style == 1 then v:draw2() end end end end function Map:setVisible(bool) self.visible = bool if bool == true then self:setPosition(getElementPosition(localPlayer)) end return true end function Map:isVisible() return self.visible end function Map:setPosition(x,y,z) self.posX = x self.posY = y self.posZ = z return true end function Map:getPosition() return self.posX, self.posY, self.posZ end function Map:setColor(r,g,b,a) self.color = {r,g,b,a} return true end function Map:getColor() return self.color end function Map:setSize(value) self.size = value return true end function dxDrawEmptyRec(absX,absY,sizeX,sizeY,color,ancho) dxDrawRectangle ( absX,absY,sizeX,ancho,color ) dxDrawRectangle ( absX,absY+ancho,ancho,sizeY-ancho,color ) dxDrawRectangle ( absX+ancho,absY+sizeY-ancho,sizeX-ancho,ancho,color ) dxDrawRectangle ( absX+sizeX-ancho,absY+ancho,ancho,sizeY-ancho*2,color ) end function Map:draw() dxSetRenderTarget(self.renderTarget, true) local player = getLocalPlayer() local centerX = (self.x) + (self.w/2) local centerY = (self.y) + (self.h/2) local pr = getPedRotation(player) local mapSize = 3000 / (self.drawRange/180) local zoomwert = self.drawRange if getKeyState("=") then if self.drawRange > 120 then self.drawRange = self.drawRange - 8 end elseif getKeyState("-") then if self.drawRange < 660 then self.drawRange = self.drawRange + 8 end elseif getKeyState("arrow_l") then self.posX = self.posX - (self.drawRange/100*10) elseif getKeyState("arrow_r") then self.posX = self.posX + (self.drawRange/100*10) elseif getKeyState("arrow_u") then self.posY = self.posY + (self.drawRange/100*10) elseif getKeyState("arrow_d") then self.posY = self.posY - (self.drawRange/100*10) end local mapPosX, mapPosY = -(math.map(self.posX+3000,0,6000,0,mapSize)-self.w/2), -(math.map(-self.posY + 3000, 0, 6000, 0, mapSize)-self.h/2) --[[ local screenW, screenH = guiGetScreenSize() local mptx,mpty,mptz = getWorldFromScreenPosition ( centerX, centerY, self.drawRange ) dxDrawText(tostring(umgerechnetx1), screenW * 0.3713, screenH * 0.6276, screenW * 0.6272, screenH * 0.9154, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, false, false) --]] ----------------------------------------------------------------------------------------------------- -- draw map dxDrawRectangle(0,0,self.w,self.h,tocolor(0,120,210)) dxDrawImage(mapPosX, mapPosY, mapSize, mapSize, self.map, 0,0,0, tocolor(255,255,255)) ----------------------------------------------------------------------------------------------------- -- draw radar areas for i, area in ipairs (getElementsByType("radararea")) do local ex, ey = getElementPosition(area) local w, h = getRadarAreaSize(area) local areaX = (3000+ex) / 6000 * mapSize local areaY = (3000-ey) / 6000 * mapSize local scaledW = w / 6000*mapSize local scaledH = -(h / 6000*mapSize) areaX = areaX + mapPosX areaY = areaY + mapPosY local rr, gg, bb, alpha = 255,255,255,255 rr, gg, bb, alpha = getRadarAreaColor(area) if (isRadarAreaFlashing(area)) then alpha = alpha*math.abs(getTickCount()%1000-500)/500 end dxSetBlendMode("modulate_add") dxDrawRectangle(areaX, areaY, scaledW, scaledH,tocolor(rr,gg,bb,alpha)) dxSetBlendMode("blend") end --local minStreamPosX,maxStreamPosX,minStreamPosY,maxStreamPosY=playerX-300*px*zoomwert,playerX+300*px*zoomwert,playerY-300*py*zoomwert,playerY+300*py*zoomwert if (#wegTable > 0) then for i,wayPoint in ipairs(wegTable) do --if mapPosX<wegTable[i].posX and mapPosX >wegTable[i].posX and mapPosY<wegTable[i].posY and mapPosY>wegTable[i].posY then local ex,ey = wegTable[i].posX,wegTable[i].posY local blipX = (3000+ex) / 6000 * mapSize local blipY = (3000-ey) / 6000 * mapSize blipX = blipX + mapPosX blipY = blipY + mapPosY if wegTable[i+1] then local ex2,ey2 = wegTable[i+1].posX,wegTable[i+1].posY local blipX2 = (3000+ex2) / 6000 * mapSize local blipY2 = (3000-ey2) / 6000 * mapSize blipX2 = blipX2 + mapPosX blipY2 = blipY2 + mapPosY local umgerechnetx1, umgerechnety1 = blipX,blipY local umgerechnetx2, umgerechnety2 = blipX2,blipY2 dxDrawLine(umgerechnetx1,umgerechnety1,umgerechnetx2,umgerechnety2,gpsColorRed, zoomwert / 10 / 20) else local ex2,ey2 = lastMarkerPositionX,lastMarkerPositionY local blipX2 = (3000+ex2) / 6000 * mapSize local blipY2 = (3000-ey2) / 6000 * mapSize blipX2 = blipX2 + mapPosX blipY2 = blipY2 + mapPosY local umgerechnetx1, umgerechnety1 = blipX,blipY local umgerechnetx2, umgerechnety2 = blipX2,blipY2 dxDrawLine(umgerechnetx1,umgerechnety1,umgerechnetx2,umgerechnety2,gpsColorRed, zoomwert / 10 / 20) end --end end end --[[function getWorldFromMapPosition(mapX, mapY) self.posX, self.posY, self.posZ = getElementPosition(player) local mapX, mapY = getCursorPosition() local worldX = ((mapX - (self.posX + self.w / 2)) / self.drawRange) / 3000 / (self.drawRange/180); local worldY = ((mapY - (self.posY + self.h / 2)) / self.drawRange) / 3000 / (self.drawRange/180); outputChatBox(tostring(worldX).." | "..tostring(worldY)) --return worldX, worldY; --end--]] ----------------------------------------------------------------------------------------------------- -- draw arrow local local b = self.blipSize local ex,ey = getElementPosition(player) local blipX = (3000+ex) / 6000 * mapSize local blipY = (3000-ey) / 6000 * mapSize blipX = blipX + mapPosX blipY = blipY + mapPosY dxDrawImage(blipX-x*23/2, blipY-y*25/2,x*23,y*25, self.blips[2], (-pr)%360,0,0,tocolor(255,255,255,255)) dxSetRenderTarget() ----------------------------------------------------------------------------------------------------- -- draw render target dxDrawEmptyRec(self.x-x*5, self.y-y*5, self.w+x*10, self.h+y*10,tocolor(0,0,0,150),5) dxDrawImage(self.x, self.y, self.w, self.h, self.renderTarget,0,0,0,tocolor(unpack(self.color))) ----------------------------------------------------------------------------------------------------- -- draw blips for i, b in ipairs (getElementsByType('blip')) do if getElementDimension(b) == getElementDimension(player) and getElementInterior(b) == getElementInterior(player) then local elementAttached = getElementAttachedTo ( b ) if elementAttached ~= player then local ex, ey, ez = getElementPosition(b) local blipX = (3000+ex) / 6000 * mapSize local blipY = (3000-ey) / 6000 * mapSize blipX = blipX + mapPosX + self.x blipY = blipY + mapPosY + self.y --[[if isCursorShowing(localPlayer) then local mapX, mapY = getCursorPosition() local tx,ty = getWorldFromMapPosition(mapX, mapY, self.posX, self.posY, self.x, self.y, self.w, self.h, self.drawRange) outputChatBox(tostring(tx).." | "..tostring(ty)) end--]] if blipX < self.x then blipX = self.x end if blipX > self.x + self.w then blipX = self.x + self.w end if blipY < self.y then blipY = self.y end if blipY > self.y + self.h then blipY = self.y + self.h end local blipIcon = getBlipIcon(b) local rr,gg,bb,aa = 255,255,255,255 local blipSize = self.blipSize if (elementAttached) and (getElementType(elementAttached) == "vehicle") then blipSize = blipSize / 2 aa = 200 end local blipIcon = getBlipIcon(b) if blipIcon == 0 then rr, gg, bb, aa = getBlipColor(b) end local img = self.blips[blipIcon] if (elementAttached) and (getElementType(elementAttached) == "player") then img = self.blips[0] blipSize = blipSize / 1.6 end dxDrawImage(blipX-blipSize/2, blipY-blipSize/2, blipSize, blipSize, img,0,0,0,tocolor(rr,gg,bb,aa)) end end end end wegTable={} function Map:draw2() dxSetRenderTarget(self.renderTarget, true) local player = getLocalPlayer() local centerX = (self.x) + (self.w/2) local centerY = (self.y) + (self.h/2) local pr = getPedRotation(player) local mapSize = 3000 / (self.drawRange/180) local zoomwert = self.drawRange local _, _, camRotZ = getElementRotation(getCamera()) if getKeyState("=") then if self.drawRange > 120 then self.drawRange = self.drawRange - 8 end elseif getKeyState("-") then if self.drawRange < 260 then self.drawRange = self.drawRange + 8 end end self.posX, self.posY, self.posZ = getElementPosition(player) local playerX, playerY, playerZ = getElementPosition(player) local mapPosX, mapPosY = -(math.map(self.posX+3000,0,6000,0,mapSize)-self.w/2), -(math.map(-self.posY + 3000, 0, 6000, 0, mapSize)-self.h/2) ----------------------------------------------------------------------------------------------------- -- draw map local cx,cy,_,tx,ty = getCameraMatrix() local north = findRotation(cx,cy,tx,ty) dxDrawRectangle(0,0,self.w,self.h,tocolor(0,120,210)) dxDrawImage(mapPosX, mapPosY, mapSize, mapSize, self.map2, north, -mapSize/2 - mapPosX + self.w/2, -mapSize/2 - mapPosY + self.h/2, tocolor(255,255,255)) ----------------------------------------------------------------------------------------------------- -- draw wanted level effect if getPlayerWantedLevel(player) > 0 then if not old then old = getTickCount() wR,wG,wB = 0,0,255 end current = getTickCount () if current-old > 1500 then old = getTickCount() if wR == 255 then wR,wG,wB = 0,100,255 else wR,wG,wB = 255,0,0 end end dxDrawRectangle(0, 0, self.w, self.h,tocolor(wR,wG,wB,100)) end ----------------------------------------------------------------------------------------------------- -- draw radar areas for i, area in ipairs (getElementsByType("radararea")) do local ex, ey = getElementPosition(area) local w, h = getRadarAreaSize(area) local areaX = (3000+ex) / 6000 * mapSize local areaY = (3000-ey) / 6000 * mapSize local scaledW = w / 6000*mapSize local scaledH = -(h / 6000*mapSize) areaX = areaX + mapPosX areaY = areaY + mapPosY local rr, gg, bb, alpha = 255,255,255,255 rr, gg, bb, alpha = getRadarAreaColor(area) if (isRadarAreaFlashing(area)) then alpha = alpha*math.abs(getTickCount()%1000-500)/500 end dxSetBlendMode("modulate_add") dxDrawImage(areaX, areaY, scaledW, scaledH,self.blips[1], north, -scaledW/2 - areaX + self.w/2, -scaledH/2 - areaY + self.h/2,tocolor(rr,gg,bb,alpha)) dxSetBlendMode("blend") end ----------------------------------------------------------------------------------------------------- -- draw blips for i, b in ipairs (getElementsByType('blip')) do if getElementDimension(b) == getElementDimension(player) and getElementInterior(b) == getElementInterior(player) then local elementAttached = getElementAttachedTo ( b ) if elementAttached ~= player then local ex, ey, ez = getElementPosition(b) local bf = getBlipVisibleDistance(b) local blipIcon = getBlipIcon(b) local rr,gg,bb,aa = 255,255,255,255 local blipSize = self.blipSize local blipX, blipY = getRadarFromWorldPosition(ex,ey,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize) local Px, Py, Pz = getElementPosition(player) if getDistanceBetweenPoints2D(Px, Py, ex, ey) < 380 then --outputChatBox(getDistanceBetweenPoints2D(Px, Py, ex, ey)..' : '..bf) blipX, blipY = cstrain(blipX, 1, 258), cstrain(blipY, 1, 150) end if getDistanceBetweenPoints2D(Px, Py, ex, ey) < bf then if (elementAttached) and (getElementType(elementAttached) == "vehicle") then blipSize = blipSize / 2 aa = 200 end local blipIcon = getBlipIcon(b) if blipIcon == 0 then rr, gg, bb, aa = getBlipColor(b) end local img = self.blips[blipIcon] if (elementAttached) and (getElementType(elementAttached) == "player") then img = self.blips[0] blipSize = blipSize / 1.6 end dxDrawImage(blipX-blipSize/2, blipY-blipSize/2, blipSize, blipSize,img, 0,0,0,tocolor(rr,gg,bb,aa)) end if (elementAttached) and (getElementType(elementAttached) == "player") and getPedOccupiedVehicle(elementAttached) and getVehicleType(getPedOccupiedVehicle(elementAttached)) == "Helicopter" then dxDrawImage(blipX-x*50/2, blipY-y*50/2, x*50, y*50, "images/H.png",north-getPedRotation(elementAttached)) dxDrawImage(blipX-x*50/2, blipY-y*50/2, x*50, y*50, "images/HR.png",getTickCount()%360) end end end end --local minStreamPosX,maxStreamPosX,minStreamPosY,maxStreamPosY=playerX-300*px*zoomwert,playerX+300*px*zoomwert,playerY-300*py*zoomwert,playerY+300*py*zoomwert if (#wegTable > 0) then for i,wayPoint in ipairs(wegTable) do --if mapPosX<wegTable[i].posX and mapPosX >wegTable[i].posX and mapPosY<wegTable[i].posY and mapPosY>wegTable[i].posY then local screenW, screenH = guiGetScreenSize() if wegTable[i+1] then local umgerechnetx1, umgerechnety1 = getRadarFromWorldPosition(wegTable[i].posX,wegTable[i].posY,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize) local umgerechnetx2, umgerechnety2 = getRadarFromWorldPosition(wegTable[i+1].posX,wegTable[i+1].posY,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize) dxDrawLine(umgerechnetx1,umgerechnety1,umgerechnetx2,umgerechnety2,gpsColorRed, zoomwert / 6 / 10) else local umgerechnetx1, umgerechnety1 = getRadarFromWorldPosition(wegTable[i].posX,wegTable[i].posY,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize) local umgerechnetx2, umgerechnety2 = getRadarFromWorldPosition(lastMarkerPositionX,lastMarkerPositionY,-x*40, -y*40, self.w+x*80, self.h+y*80,mapSize) dxDrawLine(umgerechnetx1,umgerechnety1,umgerechnetx2,umgerechnety2,gpsColorRed, zoomwert / 6 / 10) end --end end end ----------------------------------------------------------------------------------------------------- -- draw arrow local local b = self.blipSize local ex,ey = getElementPosition(player) local blipX = (3000+ex) / 6000 * mapSize local blipY = (3000-ey) / 6000 * mapSize blipX = blipX + mapPosX blipY = blipY + mapPosY if getPedOccupiedVehicle(player) and getVehicleType(getPedOccupiedVehicle(player)) == "Helicopter" then dxDrawImage(blipX-x*50/2, blipY-y*50/2, x*50, y*50, "images/H.png",north-pr) dxDrawImage(blipX-x*50/2, blipY-y*50/2, x*50, y*50, "images/HR.png",getTickCount()%360) else dxDrawImage(blipX-x*23/2, blipY-y*25/2,x*23,y*25, self.blips[2], north-pr,0,0,tocolor(255,255,255,255)) end dxSetRenderTarget() ----------------------------------------------------------------------------------------------------- -- draw render target if getElementInterior(player) == 0 then dxDrawRectangle(self.x-x*5, self.y-y*5, self.w+x*10, self.h+y*10, tocolor(0, 0, 0, 150), false) dxDrawImage(self.x, self.y, self.w, self.h, self.renderTarget,0,0,0,tocolor(unpack(self.color))) else dxDrawImage(self.x, self.y, self.w, self.h, "images/lostc.png") end ----------------------------------------------------------------------------------------------------- -- draw damage effect for k, v in ipairs(Map.damageEfect) do v[3] = v[3] - (getTickCount() - v[1]) / 800 if v[3] <= 0 then table.remove(Map.damageEfect, k) else dxDrawImage(self.x, self.y, self.w, self.h, "images/mapred.png", 0, 0, 0, tocolor(255, 255, 255, v[3])) end end --dxDrawImage(self.x-x*5, self.y-y*22, self.w+x*10, self.h+y*28, "images/mapbg.png",0,0,0,tocolor(unpack(self.color))) --local zinColor = getKeyState("=") and tocolor(255,255,255,self.color[4]) or tocolor(172,211,115,self.color[4]) --dxDrawImage(self.x+x*263, self.y-y*19,x*17,y*17, "images/zin.png",0,0,0,zinColor) --local zoutColor = getKeyState("-") and tocolor(255,255,255,self.color[4]) or tocolor(172,211,115,self.color[4]) --dxDrawImage(self.x+x*285, self.y-y*19,x*17,y*17, "images/zout.png",0,0,0,zoutColor) --dxDrawText(zoneText,self.x+x*32,self.y-y*22, x*100, y*100, tocolor(unpack(self.color)), x*0.6, font,"left","top",false,false,false,true) --dxDrawRectangle(self.x-x*5, self.y-y*5, self.w+x*10, self.h+y*10, tocolor(0, 0, 0, 150), false) local zoneText = getElementInterior(player) == 0 and "#FFFFFF"..getZoneName(playerX,playerY,playerZ) or "#FFFFFF" dxDrawRectangle(self.x, self.y+self.h-y*20, self.w, self.h/8, tocolor(0, 0, 0, 80), false) dxDrawText(" "..zoneText,self.x, self.y+self.h-y*21, x*100, y*100, tocolor(255, 255, 255, 255), x*0.6, font,"left","top",false,false,false,true) end function findRotation(x1, y1, x2, y2) local t = -math.deg(math.atan2(x2-x1,y2-y1)) if t < 0 then t = t + 360 end return t end function getPointAway(x, y, angle, dist) local a = -math.rad(angle) dist = dist / 57.295779513082 return x + (dist * math.deg(math.sin(a))), y + (dist * math.deg(math.cos(a))) end function getRadarFromWorldPosition(bx, by, x, y, w, h, scaledMapSize) local RadarX, RadarY = x + w/2, y + h/2 local RadarD = getDistanceBetweenPoints2D(RadarX, RadarY, x, y) local px, py = getElementPosition(localPlayer) local _, _, crz = getElementRotation(getCamera()) local dist = getDistanceBetweenPoints2D(px, py, bx, by) if dist > RadarD * 6000/scaledMapSize then dist = RadarD * 6000/scaledMapSize end local rot = 180 - findRotation(px, py, bx, by) + crz local ax, ay = getPointAway(RadarX, RadarY, rot, dist * scaledMapSize/6000) return ax, ay end function onClientPlayerDamage(attacker, weapon, _, bodypart) local part = attacker and getElementType(attacker) == "player" and getPedWeaponSlot(attacker) and getPedWeaponSlot(attacker) or false if attacker and attacker ~= source and not (part == 8 or (part == 7 and weapon ~= 38)) then Map.damageEfect[#Map.damageEfect + 1] = {getTickCount(), 0, math.min(25.5 * bodypart, 255)} else Map.damageEfect[#Map.damageEfect + 1] = {getTickCount(), 0, math.min(20 * bodypart, 255)} end if #Map.damageEfect > 18 then repeat table.remove(Map.damageEfect, 1) until #Map.damageEfect < 18 end end addEventHandler("onClientPlayerDamage", localPlayer,onClientPlayerDamage) function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range) local worldX = posx + ((mapX*10 - (x + w / 2)) / range) / 3000 / (range/180); local worldY = posy - ((mapY*10 - (y + h / 2)) / range) / 3000 / (range/180); return worldX, worldY end Link to comment
The_GTA Posted March 17, 2020 Share Posted March 17, 2020 (edited) Dear raynner, since I have no map image to test with, no mathematical model of your map rendering other than the code I am just gonna assume some things. 1) your map starts from world coordinate x=-3000,y=-3000 (bottom-left) to x=3000,y=3000 (top-right). 2) mapX, mapY are relative coordinates into the map starting from top-left; posx, posy, x, y, w, h describe absolute coordinates Thus your function should look like this: --[[ mapX = CursorX mapY = CursorY PosX = playerX PosY = playerY x = bigmap render x y = bigmap render y w = bigmap render w h = bigmap render h range = zoom --]] local screenW, screenH = guiGetScreenSize() function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range) local zoomFactor = ( 180 / range ); local render_side_distance = 3000 * zoomFactor; local world_tl_start_x = ( posx - render_side_distance ); local world_tl_start_y = ( posy + render_side_distance ); local absCursorX = ( mapX * screenW ); local absCursorY = ( mapY * screenH ); local real_map_off_x = ( absCursorX - x ); local real_map_off_y = ( absCursorY - y ); -- Cursor outside of the map image? if ( real_map_off_x < 0 ) or ( real_map_off_x >= w ) or ( real_map_off_y < 0 ) or ( real_map_off_y >= h ) then return false; end local relative_map_off_x = ( real_map_off_x / w ); local relative_map_off_y = ( real_map_off_y / h ); local worldX = world_tl_start_x + relative_map_off_x * render_side_distance; local worldY = world_tl_start_y - relative_map_off_y * render_side_distance; return worldX, worldY; end If this function above should not work (I am unable to test without a working resource!), please do not shy away from providing a working resource if you want us to help you further. Edited March 17, 2020 by The_GTA Link to comment
raynner Posted March 17, 2020 Author Share Posted March 17, 2020 33 minutes ago, The_GTA said: Dear raynner, since I have no map image to test with, no mathematical model of your map rendering other than the code I am just gonna assume some things. 1) your map starts from world coordinate x=-3000,y=-3000 (bottom-left) to x=3000,y=3000 (top-right). 2) mapX, mapY are relative coordinates into the map starting from top-left; posx, posy, x, y, w, h describe absolute coordinates Thus your function should look like this: --[[mapX = CursorXmapY = CursorYPosX = playerXPosY = playerYx = bigmap render xy = bigmap render yw = bigmap render wh = bigmap render hrange = zoom--]]local screenW, screenH = guiGetScreenSize()function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range) local zoomFactor = ( 180 / range ); local render_side_distance = 3000 * zoomFactor; local world_tl_start_x = ( posx - render_side_distance ); local world_tl_start_y = ( posy + render_side_distance ); local absCursorX = ( mapX * screenW ); local absCursorY = ( mapY * screenH ); local real_map_off_x = ( absCursorX - x ); local real_map_off_y = ( absCursorY - y ); -- Cursor outside of the map image? if ( real_map_off_x < 0 ) or ( real_map_off_x >= w ) or ( real_map_off_y < 0 ) or ( real_map_off_y >= h ) then return false; end local relative_map_off_x = ( real_map_off_x / w ); local relative_map_off_y = ( real_map_off_y / h ); local worldX = world_tl_start_x + relative_map_off_x * render_side_distance; local worldY = world_tl_start_y - relative_map_off_y * render_side_distance; return worldX, worldY;end If this function above should not work (I am unable to test without a working resource!), please do not shy away from providing a working resource if you want us to help you further. this seems to work but is not correct! it does not return the correct coordinates I will leave this feature on my drive so that anyone can test it I thought first to leave it in the community more like this incomplete would not be fair radar Drive Link to comment
The_GTA Posted March 17, 2020 Share Posted March 17, 2020 (edited) Thank you for sharing your resource with us. I admit that I had to get my head around that zooming logic, because it is math that I was quite unfamiliar with, but here is your function: local map_world_units_width = 6000; function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range) local zoomFactor = ( 180 / range ); local render_pixel_side_distance = 3000 * zoomFactor; -- actual size of the map in pixels inside the render-target. local world_render_distance_w = w / render_pixel_side_distance * map_world_units_width; local world_render_distance_h = h / render_pixel_side_distance * map_world_units_width; local world_tl_start_x = ( posx - world_render_distance_w / 2 ); local world_tl_start_y = ( posy + world_render_distance_h / 2 ); local absCursorX = ( mapX * sx ); local absCursorY = ( mapY * sy ); local real_map_off_x = ( absCursorX - x ); local real_map_off_y = ( absCursorY - y ); -- Cursor outside of the map image? if ( real_map_off_x < 0 ) or ( real_map_off_x >= w ) or ( real_map_off_y < 0 ) or ( real_map_off_y >= h ) then return false; end local relative_map_off_x = ( real_map_off_x / w ); local relative_map_off_y = ( real_map_off_y / h ); local worldX = world_tl_start_x + relative_map_off_x * world_render_distance_w; local worldY = world_tl_start_y - relative_map_off_y * world_render_distance_h; return worldX, worldY; end The clue was to calculate the size of the map that you draw inside the render target, then calculate the fraction of the width and height of how much you draw of the actual map image. So if you draw only a third of the map image, then you can expect the render to cover about 2000 game units. Then we can just linearly interpolate the world position with the relative cursor position on the map render. I noticed that your map does not render using same width and height thus I added further adjustments. Have fun with the code! Edited March 17, 2020 by The_GTA 1 Link to comment
raynner Posted March 17, 2020 Author Share Posted March 17, 2020 2 hours ago, The_GTA said: Thank you for sharing your resource with us. I admit that I had to get my head around that zooming logic, because it is math that I was quite unfamiliar with, but here is your function: local map_world_units_width = 6000;function getWorldFromMapPosition(mapX, mapY, posx, posy, x, y, w, h, range) local zoomFactor = ( 180 / range ); local render_pixel_side_distance = 3000 * zoomFactor; -- actual size of the map in pixels inside the render-target. local world_render_distance_w = w / render_pixel_side_distance * map_world_units_width; local world_render_distance_h = h / render_pixel_side_distance * map_world_units_width; local world_tl_start_x = ( posx - world_render_distance_w / 2 ); local world_tl_start_y = ( posy + world_render_distance_h / 2 ); local absCursorX = ( mapX * sx ); local absCursorY = ( mapY * sy ); local real_map_off_x = ( absCursorX - x ); local real_map_off_y = ( absCursorY - y ); -- Cursor outside of the map image? if ( real_map_off_x < 0 ) or ( real_map_off_x >= w ) or ( real_map_off_y < 0 ) or ( real_map_off_y >= h ) then return false; end local relative_map_off_x = ( real_map_off_x / w ); local relative_map_off_y = ( real_map_off_y / h ); local worldX = world_tl_start_x + relative_map_off_x * world_render_distance_w; local worldY = world_tl_start_y - relative_map_off_y * world_render_distance_h; return worldX, worldY;end The clue was to calculate the size of the map that you draw inside the render target, then calculate the fraction of the width and height of how much you draw of the actual map image. So if you draw only a third of the map image, then you can expect the render to cover about 2000 game units. Then we can just linearly interpolate the world position with the relative cursor position on the map render. I noticed that your map does not render using same width and height thus I added further adjustments. Have fun with the code! very nice! thank, i really am not able to do this calculation! Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now