Как я понимаю, это работает заключается в том, что когда игрок перемещается в реальном мире, новая точка поворота должна основываться на плитке, на которой в данный момент находится игрок, а объекты с определенными позициями должны подстраиваться под текущую точку поворота.
Моя игра
OSRS
Код: Выделить всё
import math
import pygame
from math import *
from pygame import Vector2
import shader
class DrawingObject:
def __init__(self, mainWindow, modMapSurface, mapCenter, worldPosX, worldPosY, playerPosX, playerPosY, camRotAngle, camTiltAngle):
self.mainWindow = mainWindow
self.modMapSurface = modMapSurface
self.mapCenter = mapCenter
self.worldPosX = worldPosX
self.worldPosY = worldPosY
self.playerPosX = playerPosX
self.playerPosY = playerPosY
self.camRotAngle = camRotAngle
self.camTiltAngle = camTiltAngle
DrawingObject.draw(self)
def draw(self):
objectImageList = []
imageScale = 4
# worldPosX, worldPosY, imageFilePath
worldObjectList =\
[
[512, 512, "Graphics\\person.png"],
[640, 512, "Graphics\\testBlock3.png"],
[768, 512, "Graphics\\testBlock2.png"],
[896, 896, "Graphics\\frog.png"],
]
for i in range(len(worldObjectList)):
currentObjectImage = pygame.image.load(worldObjectList[i][2]).convert_alpha()
# Scale
imageWdith = currentObjectImage.get_width()
imageHeight = currentObjectImage.get_height()
scaledWidth = imageWdith * imageScale
scaledHeight = imageHeight * imageScale
currentObjectImage = pygame.transform.scale(currentObjectImage, (scaledWidth, scaledHeight))
cellCount = currentObjectImage.get_width() // currentObjectImage.get_height()
print(cellCount)
objPosX = worldObjectList[i][0]
objPosY = worldObjectList[i][1]
for i in range(cellCount):
imageObjectRect = pygame.Rect(scaledHeight * i, 0, scaledHeight, scaledHeight)
objectImageList.append(imageObjectRect)
objectSurface = pygame.Surface((scaledHeight, scaledHeight))
objectSurface.blit(currentObjectImage, (0, 0), objectImageList[i])
objectSurface.set_colorkey([0, 0, 0])
# Call shader function
#shader.shader(objectSurface, cellCount, i)
objectSurfaceRot = pygame.transform.rotate(objectSurface, self.camRotAngle)
objectRotWidth, objectRotHeight = objectSurfaceRot.get_size()
# Object drawing
modObjectSurface = pygame.transform.scale(objectSurfaceRot, (objectRotWidth, objectRotHeight / 90 * self.camTiltAngle))
#objectCenter = modObjectSurface.get_rect(center=(originPosX + self.worldPosX, originPosY + self.worldPosY - imageScale * i))
# Orbit
#distance = math.sqrt((objPosX - objPosY)**2 + (self.worldPosX - self.worldPosY)**2)
distance = Vector2(self.worldPosX, self.worldPosY).distance_to((objPosX, objPosY))
pivot = (self.worldPosX, self.worldPosY - imageScale * i)
orbOffset = Vector2()
# Need distance from player to obj
orbOffset.from_polar((distance, -self.camRotAngle))
newPos = pivot + orbOffset
orbRect = modObjectSurface.get_rect(center = newPos)
self.mainWindow.blit(modObjectSurface, orbRect)
Подробнее здесь: https://stackoverflow.com/questions/789 ... ivot-point