Como devo lidar com os recursos ausentes?

13

Seu jogo espera que um determinado recurso seja carregado, mas não foi encontrado. Como a situação deve ser tratada? Por exemplo:

Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found
Mesh* car             = LoadMesh("Car.obj");      // returns NULL; 3D mesh not found

Pode ter sido acidentalmente excluído pelo usuário, corrompido ou com erros ortográficos durante o desenvolvimento.

Algumas respostas em potencial:

  • Asserções (idealmente apenas durante o desenvolvimento)
  • Saia do jogo normalmente
  • Lance uma exceção e tente lidar com isso.

Qual o melhor caminho?

concept3d
fonte
Uma maneira de fazer isso é verificar se os dados do jogo ainda estão intactos. Caso contrário, faça o download automático dos dados ausentes. erro> peça ao usuário para verificar os dados> download. Você obviamente precisa criar uma pequena ferramenta para isso.
Sidar
@Sidar I como o que você disse mais do que o mais votado resposta talvez você possa explicar melhor o que você está tentando dizer
concept3d
A feiúra dos erros é que, às vezes, apenas quebra o jogo e as pessoas não podem jogar / iniciar. No Steam, por exemplo, se seu jogo não estiver funcionando corretamente, você poderá verificar os dados do jogo. Quando algo parece corrompido / ausente / alterado, o Steam faz novamente o download automático desses arquivos. Eu não sei exatamente como eles fazem isso. Mas eles obviamente conferem com alguns dados. Talvez códigos de hash? Eu realmente não sei. Mas você deve sempre ter um ativo de substituição standard (simplesmente textura que diz "erro" nele ou algo)
Sidar
@Sidar Por que não formatá-lo bem em uma resposta?
concept3d
Porque não sei exatamente como isso funciona e não quero ser desinformado. Então, eu não poderia lhe dar uma resposta adequada.
Sidar

Respostas:

19

Muitos jogos têm um "material de erro" e uma "malha de erro" genéricos que são realmente óbvios. Emparelhe isso com um aviso nos logs, é claro.

Robert Fraser
fonte
Concordo totalmente com este post. No entanto, você pode querer fazer coisas diferentes em uma versão / versão distribuída.
11133 Jonkel
Para versões de lançamento, pode-se pensar em uma abordagem para validar os arquivos disponíveis usando hash para baixar arquivos ausentes ou inválidos. No entanto, durante o desenvolvimento, é definitivamente a melhor maneira de exibir uma textura quadriculado em preto e magenta para chamar sua atenção. Para os modelos, pode-se usar um enorme modelo de ERRO que deve ser óbvio.
Christian Ivicevic
Isso faz sentido para Texturas. não tanto para modelos 3D. E se a maioria dos modelos 3D estivesse faltando? O jogo vai parecer engraçado, embora deva ser jogável em primeiro lugar. E se você calcular sua base de estrutura de dados espaciais nas propriedades geométricas dos Modelos 3D, o que deve acontecer. Estou com isso apenas em circunstâncias simples, como falta de textura. Mas acho que a verificação da integridade dos dados é apenas uma abordagem melhor para jogos comerciais.
usar o seguinte
1
@ concept3d - Eu sei que pelo menos o mecanismo Source tem uma grande e óbvia malha de erros (eu o vi ocasionalmente no cliente de teste do Dota 2, quando eles estavam adicionando heróis). Concordo que, se faltarem grandes quantidades de dados de nível, provavelmente é melhor apenas errar, especialmente em uma versão, mas para fins de depuração, ter um grande ponto de interrogação dançando não é tão ruim.
Robert Fraser
6

Se você tiver recursos de resolução diferentes da mesma textura , tente recuperar a situação usando uma resolução diferente.

Texture* grassTexture;
try {
    grassTexture = LoadTexture("Grass.png");
} catch (WhateverExcaption e) {
    grassTexture = LoadTexture("Grass_512.png");
}

Se mesmo isso falhar, talvez seja hora de pagar a fiança.

daniel
fonte
2
Você pode adicionar uma alternância à captura, para que no Dev você sempre mostre a malha / tex ausente, mas quando Publicado, tentaria se recuperar primeiro e talvez tenha uma textura ausente menos óbvia.
DampeS8N