18. Tipos de entidades
Enviado: 03 Jun 2018, 20:35
Tópico antigo: http://brmodstudio.forumeiros.com/t6306 ... -variaveis
Esta é uma parte do tutorial onde iremos recapitular e entender melhor as entidades associadas com as variáveis.Concluindo esta parte você vai:
Se aprofundar no funcionamento do compilador. Como ele trata os tipos de variáveis para determinar que você fez certo ou errado.
Saber desviar do erro de compilação caso o compilador se engane.
Tudo leve e simples... Já que é um assunto sem muitos mistérios.
O compilador inteligente
Para evitar que você use variáveis erradas nos comandos (como por exemplo, um CAR num comando de um CHAR) o compilador "aprende" o tipo da variável que você está usando.
Por exemplo você criou um carro:

Mas você foi burro o bastante para usar um comando que pede uma pessoa, e não um carro:

E o compilador irá te alertar do erro:

Ok, já vimos isso anteriormente, nada de novo até então.
Só que é importante você entender exatamente como isso funciona.
O compilador não tão inteligente
O compilador não lê o seu código fazendo todos os caminhos possíveis para determinar exatamente o que você quis fazer ali — normalmente não se vê isso na computação.
O compilador simplesmente pega algum comando que você tenha usado em cima, e em seguida (embaixo) determina o que é aquela variável.
Vamos entender na prática:

"NONE"? Como assim? Eu criei o meu carro antes! Esta variável é do tipo CAR sim!
É o que acabei de dizer... Assim como várias outras programações, você tem que dizer ao compilador o que você irá fazer, para depois fazer. As ordens das linhas importam. (à parte, dentro do jogo isto não importa, estamos falando sobre o compilador)
Quando você passar por um problema parecido, você terá que usar gambiarra para burlar o compilador.
Se trata de colocarmos, de algum modo, algum comando antes para dizer ao compilador o que aquela variável é.
Código: Selecionar tudo
GOTO jump_var_types
CREATE_CAR 0 0.0 0.0 0.0 my_car
jump_var_types:
GOSUB create_car
CAR_WANDER_RANDOMLY my_car
//...
create_car:
CREATE_CAR ELEGY 0.0 0.0 0.0 (my_car)
RETURNOs programadores da Rockstar gostam de fazer uma condição impossível, ficando assim:
Código: Selecionar tudo
temp = 0
IF temp = 1
CREATE_CAR 0 0.0 0.0 0.0 (my_car)
ENDIF
GOSUB create_car
CAR_WANDER_RANDOMLY my_car
//...
create_car:
CREATE_CAR ELEGY 0.0 0.0 0.0 (my_car)
RETURNCódigo: Selecionar tudo
temp = 0
IF temp = 1
CREATE_CAR 0 0.0 0.0 0.0 (my_car)
ENDIFSe você está confuso quanto aos argumentos "0 0.0 0.0 0.0" deve ser porque não entendeu bem o que estamos fazendo aqui: A única utilidade de estarmos usando esta linha é para dizer ao compilador o tipo daquela variável, para não receber a mensagem de erro de compilação.
Os outros argumentos não importam, somente a variável!
Você inclusive pode usar outros comandos, não necessariamente
CREATE_CAR/CHAR/OBJECT etc. Basta ser um comando na qual retorne alguma entidade do tipo, como por exemplo o (muito usado) comando STORE_CAR_CHAR_IS_IN_NO_SAVE.Perceba inclusive que quando você envia por exemplo um carro com
CLEO_CALL, o tipo da variável também cai lá e funciona normalmente.Código: Selecionar tudo
SCRIPT_START
{
LVAR_INT scplayer my_car
LVAR_FLOAT angle
GOTO var_types_jump
CREATE_CAR 0 0.0 0.0 0.0 (my_car)
var_types_jump:
GOSUB create_car
CLEO_CALL get_car_z_angle 0 (my_car)(angle)
main_loop:
WAIT 0
GOTO main_loop
create_car:
REQUEST_MODEL ELEGY
LOAD_ALL_MODELS_NOW
CREATE_CAR ELEGY 0.0 0.0 0.0 (my_car)
MARK_MODEL_AS_NO_LONGER_NEEDED ELEGY
RETURN
}
SCRIPT_END
{
LVAR_INT car
LVAR_FLOAT angle
get_car_z_angle:
GET_CAR_HEADING car angle
CLEO_RETURN 0 angle
}CHAR e não para CAR, você receberia o erro normalmente:
Entity Tracking
Depois de você ler e entender tudo o que se passa, você pode agora aprender a simplesmente desativar esta checagem.
Sim, você tem opção de desativar a checagem de entidade e compilar mesmo que o compilador diga que está errado, simplesmente clicando no
CS no canto inferior direito do VS Code (lembra que isso faz abrir as opções do compilador?) e indo em Disable Entity Tracking.Eu não recomendo que você faça isso mesmo que você seja experiente, pois, é fato de que mesmo experientes fazem erros bobos e passam dores de cabeça para encontrá-los. Mas a decisão final é sua.
Utilidade?
E você pode ficar um pouco confuso "Isso é realmente útil eu saber?"
É que em scripts mais complexos isso acaba sendo comum acontecer, enquanto nos scripts mais simples você dificilmente necessitará usar.
Vamos supor que você leu o handle de um carro usando endereço de memória (uma coisa que você possivelmente ainda não sabe — você aprenderá logo aqui no tutorial), o compilador nunca saberá que o que você leu foi um carro, portanto você tem que dizer à ele que aquela variável é um carro.
Também é extremamente comum (na real, foi o único lugar que a Rockstar usou essa gambiarra) quando você cria uma nova thread e envia alguma variável de tipo específico. Você também possivelmente não sabe como criar novas threads pelo seu script ainda, mas quando saber muito possivelmente irá precisar usar isto.
Bônus
Outro erro comum que eu já tive, falei pro LINK/2012 pensando ser bug e inclusive fiz aqui de novo enquanto eu escrevia este tutorial, e inclusive outras pessoas já pediram ajuda por ter feito este erro, é isto aqui:

Consegue entender qual foi o erro?
Afinal, você enviou uma variável do tipo
CAR, mas foi como se não tivesse enviado nada (NONE), e no call o compilador diz que o tipo não se bate... ??Isso não foi um erro de tipos de variáveis, foi um erro de falta de argumento.
Perceba que você retorna uma variável (
angle) da função, e você só enviou o carro na chamada CLEO_CALL, você esqueceu de colocar a variável onde vai retornar o ângulo!Tudo vai virar de cabeça pra baixo e o compilador tratará a variável
my_car como retorno, ou seja, o compilador viu isso como "ele não enviou nenhuma variável, e a variável que tem ali é a variável onde vai retornar o valor", assim a variável car lá dentro da função será 0, e o valor da variável angle (do CLEO_RETURN 0 angle) retornará para a variável my_car, o que é errado.É interessante tutoriais ensinarem também os possíveis erros, e resolvi colocar este erro aqui pois é muito comum.
Próxima parte:
REQUIRE
