АНИМАЦИОННЫЕ ФАЙЛЫ THE BATTLE CATS, КАК ИХ ПРАВИЛЬНО НАСТРОИТЬ И ОТОБРАЖАТЬ? [дубликат]Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 АНИМАЦИОННЫЕ ФАЙЛЫ THE BATTLE CATS, КАК ИХ ПРАВИЛЬНО НАСТРОИТЬ И ОТОБРАЖАТЬ? [дубликат]

Сообщение Anonymous »

The Battle Cats — это двухмерная мобильная игра в жанре защита башни, разработанная PONOS CORP., с одной из лучших анимаций, которые я когда-либо видел. игры на данный момент. Они содержат минималистичные детали, а некоторые анимации огромны и содержат десятки анимированных частей.
"Проблема" здесь в том, что они анимированы и организованы с помощью специальной неизвестной системы редактирования, созданной самими PONOS. Я мог просмотреть и извлечь некоторые данные анимации из игры с помощью Battle Cats Ultimate, движка, написанного на Java, предназначенного для изучения данных о юнитах и ​​врагах, а также для прохождения этапов игры и сражений.
И здесь начинается настоящая проблема... Файлы для анимации юнитов, врагов и эффектов вроде как жестко закодированы без объяснения их значения. Поэтому мне пришлось порыться в Интернете в поисках того, что означают эти файлы, и я нашел то, что искал:
Итак, в основном:
< strong>-Для анимации требуется файл .png. Это таблица спрайтов, из которой будут извлечены различные части анимации
.
-файл .imgcut. Он определяет, где именно будет разрезан файл .png для извлечения частей спрайта.
-файл .mamodel. Он настраивает "модели", необходимые для анимации, а также устанавливает родительские связи между этими моделями. Он также содержит переменную информацию о модели, такую ​​как location_x, location_y, масштаб и т. д.
-файл .maanim. Этот файл показывает фактическую анимацию цели, сообщая игре, какие модели использовать и как изменять их свойства с течением времени.
Дано гораздо больше информации об этом. здесь: Значение значений и описание этих значений.
Так что спасибо тем людям, которые помогли мне понять это лучше.
Поэтому я попытался создать движок en, способный анимировать эти файлы, используя python с его модулем pygame, и в основном это сработало! Но я сталкивался с одной проблемой за другой, и наконец вращение вокруг начала координат сломало меня. Итак, теперь я здесь и прошу вас о помощи! Но не с вращением, а также со всеми другими проблемами или неточностями, которые могли возникнуть в моем скрипте Python!
Без лишних слов, вот моя программа на Python для попытки реанимировать эти файлы одним скриптом:

Код: Выделить всё

import os
import sys
import pygame
from math import *

pygame.init()
pygame.font.init()

def lerp(xmin, xmax, xrel):
return xmin+(xmax-xmin)*xrel

def sign(x):
if x>0:
return 1
elif x=0

class AdvancedMath():
def __init__(self):
pass

def point_distance(self, x1, y1, x2, y2):
return sqrt((x2-x1)**2+(y2-y1)**2)

def point_direction(self, x1, y1, x2, y2):
return -degrees(atan2(y1-y2, x1-x2))+180

def lengthdir_x(self, length, dir):
return cos(radians(dir))*length

def lengthdir_y(self, length, dir):
return sin(radians(dir))*length

class Animation():
def __init__(self, name, animnumber):
self.running=True
self.clock=pygame.time.Clock()
self.fps=30
self.window_size=(600, 600)
self.window=pygame.display.set_mode(self.window_size)

self.amath=AdvancedMath()

self.sprite_offset=(self.window_size[0]/2, self.window_size[1]/2)
self.sprite_frame=0
self.sprite_frame_number=self.fps
self.current_frame_model=0

self.debugfont=pygame.font.Font(None, 17)

self.imgcut_data=self.read_image_data(name+".imgcut")
if self.imgcut_data[0][0]!="[imgcut]":
raise Exception("Error: File is not a [imgcut]!")
self.sprite_elements=self.setup_sprite_elements()

self.scalefactor=100
self.anglefactor=360
self.alphafactor=255
self.model_data=self.read_image_data(name+".mamodel")
if self.model_data[0][0]!="[modelanim:model]":
raise Exception("Error: File is not a [modelanim:model]!")
self.sprite_models=self.setup_models()

self.animation_data=self.read_image_data(name+animnumber+".maanim")
if self.animation_data[0][0]!="[modelanim:animation]":
raise Exception("Error: File is not a [modelanim:animation]!")
self.sprite_animation=self.setup_animation()

def read_image_data(self, path):
if not os.path.exists(path):
raise Exception(f"Error: file '{path}' not found!")

finaldata=[]

with open(path, "r", encoding="utf-8-sig") as file:
content=file.read()
finaldata=content.split("\n")

for idx in range(len(finaldata)-1, -1, -1):
line=finaldata[idx]
if line!="":
finaldata[idx]=line.split(",")
finaldata[idx]=[int(val) if val.isdigit() else val for val in finaldata[idx]]
else:
del finaldata[idx]

return finaldata

def setup_sprite_elements(self):
if not os.path.exists(self.imgcut_data[2][0]):
raise Exception("Error:  image not found!")

finaldata=[]
sprite=pygame.image.load(self.imgcut_data[2][0])

for pidx in range(4, self.imgcut_data[3][0]+4):
elem=self.imgcut_data[pidx]
elemsurf=sprite.subsurface((elem[0], elem[1], elem[2], elem[3])).copy()
finaldata.append(elemsurf)

return finaldata

def setup_models(self):
finaldata=[]

for midx in range(3, len(self.model_data)):
model=self.model_data[midx]
if len(model)==3:
self.scalefactor, self.anglefactor, self.alphafactor=model

for midx in range(3, self.model_data[2][0]+3):
model=self.model_data[midx]

if len(model)==14:
orig_surf=self.sprite_elements[int(model[2])]
rxscale=int(model[8])/self.scalefactor*orig_surf.get_width()
ryscale=int(model[9])/self.scalefactor*orig_surf.get_height()

new_surf=pygame.transform.scale(orig_surf, (abs(rxscale), abs(ryscale)))
new_surf=pygame.transform.flip(new_surf, signbool(rxscale), signbool(ryscale))
new_surf=pygame.transform.rotate(new_surf, int(model[10])/self.scalefactor*360)
new_surf.set_alpha(int(model[11])/self.alphafactor*255)

finaldata.append([new_surf, model, model.copy()])

return finaldata

def setup_animation(self):
finaldata={}
maxframes=0

for aidx in range(3, len(self.animation_data)):
anim=self.animation_data[aidx]

if len(anim)==6:
part, modif, loop, unknown3, unknown4, partname=anim
animtoadd=[]

for ridx in range(aidx+2, aidx+2+self.animation_data[aidx+1][0]):
aframe=self.animation_data[ridx]

if len(aframe)==4:
maxframes=max(maxframes, aframe[0])
animtoadd.append([aframe, anim])

nametry=str(part)
while nametry in finaldata:
if not "." in nametry:
nametry+="."
nametry+="0"
finaldata[nametry]=animtoadd.copy()

for modelnum, child in enumerate(self.sprite_models):
parent=self.sprite_models[int(modelnum)][1][0]
if int(parent)==int(part):
nametry=str(modelnum)

while nametry in finaldata:
if not "."  in nametry:
nametry+="."
nametry+="0"
finaldata[nametry]=[]

if maxframes!=0:
self.sprite_frame_number=maxframes
return finaldata

def biggest_not_equal(self, timeline, target):
finalval=inf
finalanimstate= -1

for tidx, fdata in enumerate(timeline):
anim, csettings=fdata
frame, elem, easing, ease_setting=anim

if finalval>(target-frame)>0:
finalval=frame
finalanimstate=elem

if isinf(finalval):
finalval=target
return finalval, finalanimstate

def set_children_models(self, parent, modif, value):
for num, timeline in self.sprite_animation.items():
if float(parent)==float(self.sprite_models[int(float(num))][1][0]):
model=self.sprite_models[int(float(num))]
model[1][int(modif)]=value

def get_tc_index(self, idx):
finalidx=idx

if idx!=3:
if (idx-3)

Подробнее здесь: [url]https://stackoverflow.com/questions/79186391/the-battle-cats-animation-files-how-to-properly-setup-and-display-them[/url]
Ответить

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

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

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

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

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