Pygame – Как изменить вид, чтобы он вращался вокруг меняющейся точки поворота?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pygame – Как изменить вид, чтобы он вращался вокруг меняющейся точки поворота?

Сообщение Anonymous »

Мне хотелось знать, где я ошибаюсь в своем коде. Я пытаюсь воспроизвести представление, аналогичное тому, как работает Old School Runescape, за исключением того, что вместо 3D-объектов я использую сложенные спрайты для имитации 3D-среды.
Как я понимаю, это работает заключается в том, что когда игрок перемещается в реальном мире, новая точка поворота должна основываться на плитке, на которой в данный момент находится игрок, а объекты с определенными позициями должны подстраиваться под текущую точку поворота.
Моя игра
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»