🤔 Para Refletir : "Escrever para o seu jogo já começa nas mecânicas" - AbsoluteXandy

Sistema de localização Player x Eventos

Membro Membro
Postagens
103
Bravecoins
0
Boa noite pessoal, eu estou com muita dificuldade na parte de ABS onde tenho que dar a localização do $gamePlayer.x e $gamePlayer.y em relação ao Evento $gameMap.events().x e $gameMap.events().y

estou usando a base "RPG_Objects"

apenas com o Input.isTriggered('ok') eu consigo apresenta resultado de dano, porem de qualquer area do mapa e isso tá feio!

para localizar um pouco o meio que estou tentando usar, eu fiz uma função onde:
Game_Event.prototype.isEnemy = function(){
return $dataMap.events[this._eventId].meta.enemy;
}
e dela fiz todo processo de call onde cheguei em:
this._eventEnemyId = Number($dataMap.events[eventId].meta.enemy);

que é onde a mágica começa aqui, dai consigo atribuir os valores do database de monstros a um evento qualquer no mapa colocando em note <enemy: ...> ...
mais ai que chega a duvida cruel, a parte da localização mencionada ali em cima...

eu precisava aprender como devo fazer isso, ja ate acho que perguntei antes sobre isso a outros mais acabei desistindo e fazendo o sistema por eventos acabou sendo mais trabalhoso porem facil...

alguem pode me ensinar de uma forma que eu não tenha mais duvida nisso nos meus projetos, talvez seja algo tão simples, mais realmente nao esta entrando na mente!
 
Compara, exemplo:

$player.x == $enemy.x

Citando o exemplo acima só pra fins de fazer você ter uma visão, você pode comparar, exemplo, se o enemy está à um tile à frente em relação ao x do player ou um tile atrás. (Direita e Esquerda)

$player.x + 1 == $enemy.x ( => Direita)

$player.x - 1 == $enemy.x ( => Esquerda)

Aí tem outras comparações tbm, como o player estar olhando pra direita, etc. Mas vai de você fazer, espero que tenha te dado ao menos uma visão, de como pode ser feito XD
 
Ai é que esta Felipe!
acho que entendi melhor minha duvida, eu creio que não estou conseguindo dar o call da função da forma correta...
a forma que vc mostra ai ela vai se aplica diretamente no monstro da base certo?
Se o evento por exemplo em nota coloquei <enemy: 1> " o comando indicado vai se atribuir tbm ao evento por esta relacionado ou nao?

exemplo que estava pensando aqui é esse:

if(this._$gamePlayer.y - 1 = "(como chamaria o evento aqui)".y){
this._eventEnemyHp -= $gameActors.actor(actorId).param[2];

ali que estou me complicando, não estou sabendo dizer qual nome vou dar ali pra sinalizar meu evento...

me indicaram essas aqui Tambem:

Game_Map.prototype.roundX = function(x) {
    return this.isLoopHorizontal() ? x.mod(this.width()) : x;
};

Game_Map.prototype.roundY = function(y) {
    return this.isLoopVertical() ? y.mod(this.height()) : y;
};

Game_Map.prototype.xWithDirection = function(x, d) {
    return x + (d === 6 ? 1 : d === 4 ? -1 : 0);
};

Game_Map.prototype.yWithDirection = function(y, d) {
    return y + (d === 2 ? 1 : d === 8 ? -1 : 0);
};

Game_Map.prototype.roundXWithDirection = function(x, d) {
    return this.roundX(x + (d === 6 ? 1 : d === 4 ? -1 : 0));
};

Game_Map.prototype.roundYWithDirection = function(y, d) {
    return this.roundY(y + (d === 2 ? 1 : d === 8 ? -1 : 0));
};

mais creio que esteja apenas indicando a localização, teria que fazer o dano atraves delas?
como desenvolveria isso? Daniel perguntei no chat mais acho que não deu pra você ver kkkk
 
Bom, eu mexi, mexi e mexi mais, e acabei chegando aqui:

var n = this._eventEnemyId;
var a = Math.abs($gamePlayer.x - $gameMap.events()[n].x) + Math.abs($gamePlayer.y - $gameMap.events()[n].y);
Game_Event.prototype.updateAction = function(){
//verificando o processamento de entrada do dano.
//if(Input.isTriggered('ok')) this._eventEnemyHp -= 200;
if(a < 3){
this._eventEnemyHp -= $gameActors.actor(actorId).param[2];
};
}

porem quando cheguei ai apresentou que eu devo atribuir valores a X e Y....

tentei usar as formulas que conheço e a indicada pelo daniel acima, porem não tive exito, ate mesmo deltax e deltay... aquela formula que compara 2 objetos (x1, x2, y1, y2)...
podem me tirar a duvida se estou indo no rumo certo? Se não, explica onde estou errando...
 
Acredito que não funcione pois deixou a captura do evento ($gameMap.events()[x]) fora da função, perdendo a referência da instância do evento:

Código:
Game_Event.prototype.updateAction = function() {
    if (!this.isEnemy()) {
        return;
    }
    
    var distance = $gameMap.distance(
        $gamePlayer.x, $gamePlayer.y, this.x, this.y
    );
    
    if (distance < 3){
        this._eventEnemyHp -= $gameParty.leader().atk;
    }
};
 
bom dia gente!
valew mesmo pela ajuda Kyo, testei e funciona super bem, mais preciso colocar um sistema de direção nele...
bom ja tentei por um switch aqui mais nao sei se seria a melhor forma, bom tentei fazer isso!

var d = this.direction();
switch(d){
case 8: return (this.y <= $gamePlayer.y);
case 4: return (this.x <= $gamePlayer.x);
case 6: return (this.x >= $gamePlayer.x);
case 2: return (this.y >= $gamePlayer.y);
default : return false;

mais apresenta erro de função, como alei sou realmente muito fraco nessa parte mais estou entendendo tudo que estao me explicando, desde ja agradeço!
 
me perguntaram qual o objetivo da direção, é fazer com que o objeto x so seja tocado se ele estiver de frente!
da forma que esta sem por, se eu estiver de costas para o objeto ele esta sendo atacado, ou de lado... nao importa o rumo que o personagem esteja em relação ao objeto x o mesmo esta sendo tocado como se o personagem estivesse olhando pra ele!
 
Acho que só inverteu os sinais de maior e menor:

Javascript:
switch (this.direction()) {
    case 8: return (this.y >= $gamePlayer.y); break;
    case 4: return (this.x >= $gamePlayer.x); break;
    case 6: return (this.x <= $gamePlayer.x); break;
    case 2: return (this.y <= $gamePlayer.y); break;
    default : return false;
}
 
entao acho que achei algo aqui... existe um call no evento chamado:
this.attackEnemy(1)
se eu tiro a informação acima do evento nada acontece de forma alguma nem clicando independente da posiçao.
o erro a baixo acontece ao ficar de frente com o evento e aperta tecla de ação:
https://imgur.com/rqTPeQH
se eu desativo o meu comando de direcionamento, eu consigo atacar de lado o evento como mostra aqui:
https://imgur.com/TmtPFKn
porem se eu aperto botão de ação de frente para o evento ele da o mesmo erro!

abaixo possui todo meu andamento ate agora...
https://pastebin.com/print/BGrLf3jM

esta tudo funcionando, existe alguma coisa bugando mais nao mostra no console...
podem tentar me ajuda... se acharem o erro me explica por favor quero entender!
mencionaram que o dano esta errado,
this._eventEnemyAtk -= $gameParty.leader().hp;
realmente estou colocando invertido?
 
JulioRPGCriator comentou:
[...]o erro a baixo acontece ao ficar de frente com o evento e aperta tecla de ação: [...]
Mas pelo que entendi, este código que passou se refere ao comportamento do evento/inimigo, não? Se o erro acontece ao tu pressionar uma tecla, este erro diz respeito ao código que cuida das ações do jogador, não desse aí.
E os erros apresentados não demonstram ser de nenhum código novo, o que me faz supor que: ou tu tá mudando o código nos arquivos padrões (o que não é recomendável), ou; o erro acontece por algum comando Chamar Script em algum evento. Nos erros que recebo, quando o console.log contém esse <anonymous> acontece devido ao último caso. Seria bom tu conferir.

O que eu aconselho é, começando do disparador da ação do inimigo, ir comentando e vendo no log se tudo está sendo printado conforme esperado.
 
Ai que esta, eu so estou fazendo as ações do evento, ainda nao mexi em nada do "Player"
isso ta muito estranho eu fiz um novo projeto so com evento e o personagem cru, mais nada nem arvore eu coloquei!
dei o mesmo erro, dizendo na tela do jogo que nao existe a função e nao existe informação no console, isso so acontece ao colocar aquele call script que falei

"this.attackEnemy(1)"

que na verdade realmente nao existe uma função com esse nome, tenho que fazer algo pro Enemy atacar alem doque fiz no script?
coloquei console.log() em tudo como me indicou e tudo da resulttado, tudo esta normal...

OBS: nem sei porque tinha essa call ali, devo ter colocado por engano ou de algo que tentei fazer anteriormente...
 
JulioRPGCriator comentou:
[...]dei o mesmo erro, dizendo na tela do jogo que nao existe a função e nao existe informação no console, isso so acontece ao colocar aquele call script que falei "this.attackEnemy(1)" que na verdade realmente nao existe uma função com esse nome, tenho que fazer algo pro Enemy atacar alem doque fiz no script?
[...]
Sim, escrever a função antes de chamar ela.

'-'

Bom, pelo que vi, tu tá fazendo somente a parte funcional do código, a que vai trabalhar a troca de dano da luta. Ainda é cabível de ter um código para exibir o popup de dano, executar a animação do inimigo e do personagem se tiver, e aplicar efeitos.
Ao menos, tendo conhecimento que o erro acontecia pela função não existir, parou de ocorrer o erro, certo?
 
sim parou sim agora rodou perfeito, ja ate descobri onde esta a falha!
nisso aqui:

console.log($gameParty.leader().hp -= this._eventEnemyAtk)

não esta fazendo o calculo! e corrigi a informação, estava realmente tirando o hp do ataque, agora ta certinho... exceto pelo calculo nao esta dando resultado! kkk
deu NAN mais se buscar os valores individualmente o HP aparece e confere com database...

o this._eventEnemyAtk nao esta dando resultado deu "NAN", POREM, testei com console.log() linha por linha ate o fim, e tudo apresenta valor correto ate chegar ai nesse inferninho!

https://pastebin.com/print/BGrLf3jM

sabe me dizer o porque?escrevi de forma errada?
 
King muito obrigado pela força ai, a correção que você me mostrou no switch funcionou perfeito!
segue abaixo:
switch(this.direction()){
case 2: if (this.y >= $gamePlayer.y) { return }; break;
  case 4: if (this.x <= $gamePlayer.x) { return }; break;
  case 6: if (this.x >= $gamePlayer.x) { return }; break;
  case 8: if (this.y <= $gamePlayer.y) { return }; break;
};

mais o evento despara ataques infinitamente, eu antigamente usava esse comando por callscript:
this.wait((1 / 1000) * ($gameVariables.value(44)));
isso faria aquele delay entre um golpe e outro, "estou ciente de questoes como valores muito altos ou baixos nao vai adiantar em nada...
tentei usar a função mais estou apanhando dinovo...fica no game interpreter

Game_Interpreter.prototype.wait = function(duration) {
        this._waitCount = duration;
};

não estou conseguindo configura isso direito!

esse processo aqui permite fazer os eventos tomarem ações sozinhos?

Game_Event.prototype.moveTypeTowardPlayer = function() {
    if (this.isNearThePlayer()) { };

tipo estipular uma area que se o player entra nela o evento segue ele esse sai andar normal aleatorio?
 
Boa tarde, sobre a informação anterior que postei...
consegui fazer o esquema de cooldown, porem o sistema não esta se aplicando ao evento, nao esta reduzindo a velocidade entre os ataques, continua desparado um atraz do outro!

e o sistema de perseguição do personagem ta falhando =[
ele fica em randon o tempo todo, nao esta entrando em moveTowardPlayer...

segue como esta agora:
https://pastebin.com/raw/RrRp19bn

disseram que tem como melhorar e corrigir isso, mais nao estou conseguindo! pode socorrer?
 
Nessa parte aqui:

Código:
//Verificando a velocidade de ataque do evento.
	var Wait_Max = 360
	var Wait_Min = 180
	var Wait = 360 - this._eventEnemyAgi * 10; 
	this.Wait_Max = Wait > 360 ? 360 : Wait;
	this.Wait_Min = Wait < 180 ? 180 : Wait;
	this.Wait = 360 - this._eventEnemyAgi * 10;
quero que seja tipo um cooldown entre um soco e outro... da forma que esta ai seria o mais rapido a 3s e o mais lento a 6s na contagem dos frames!
Porem não esta agindo como deveria, o evento esta dando ataques seguidos infinitamente!

nesse aqui:
Código:
//Movimentacao do evento.
_GameEvent_updateSelfMovement = Game_Event.prototype.updateSelfMovement;
Game_Event.prototype.updateSelfMovement = function(){
	_GameEvent_updateSelfMovement.call(this);
	  if (this.isNearThePlayer()) {
		  if(!this.isEnemy()){
			  return;
			  this.x = Math.abs(this.deltaXFrom($gamePlayer.x));
    		  this.y = Math.abs(this.deltaYFrom($gamePlayer.y));
    		  return this.x + this.y < 12;
			  switch (Math.randomInt(4)) {
        	  case 0: case 1: case 2:
        	      this.moveTowardPlayer();
        	      break;
        	  case 3:
        	      this.moveRandom();
        	      break;
        	  }
    	  } else {
        	this.moveRandom();
          }
      }
}
O evento era pra seguir o personagem se entrar na area de visão do evento! Porem aparentemente nao existe area de visão pois fica andando aleatorio o tempo todo, não segue o personagem!

segue o codigo organizado!
https://pastebin.com/raw/8zsDtTdW
 
Então, vou tentar passar o modo como eu faria, daí, caso o Kyo apresente-lhe mais um modo depois, fica a critério qual utilizar.

Primeiro, creio que o cooldown entre ataques seria mais um dos atributos específicos de um inimigo, pois cada um teria um valor diferente e trabalhando simultaneamente, então acredito ser cabível de se colocar entre as variáveis definidas no initialize do evento. Então, após a criação da variável que armazena a sorte mas ainda dentro da condição, colocaria algo assim:

Código:
this._eventEnemyActingCooldown = this.resetActingCooldown();
Nomearia como ActingCooldown pois o objeto pode ter vários cooldowns, como de habilidades, e acting pois ele não iria atacar e usar uma skill ao mesmo tempo, ou um, ou outro, então este seria para o intervalo entre ações.

Dito isto, precisaríamos da função para qual setamos a variável.

Código:
Game_Event.prototype.resetActingCooldown = function() {
  return ((50 - this._eventEnemyAgi) / 50) * 180 + 180;
};
Pelo que mostrou de suas ideias, o valor mínimo de cooldown seria 180 e o máximo 360, e ainda sendo proporcional à quantidade de agilidade que o inimigo tenha, certo? Bom, no modo como pensei, 50 ali seria o valor máximo de agilidade de um inimigo. O inimigo com 50 pontos de agilidade teria o cooldown mínimo de 180, pois:

((50 - 50) / 50) * 180 + 180 = (0 / 50) * 180 + 180 = 0 * 180 + 180 = 0 + 180 = 180.

Por outro lado, tendo 0 de agilidade.

((50 - 0) / 50) * 180 + 180 = (50 / 50) * 180 + 180 = 1 * 180 + 180 = 180 + 180 = 360.

Até aí criamos e atribuímos o valor inicial ao cooldown, mas ele ainda não está impedindo o inimigo de agir segundo suas condições. Em tese, iríamos constantemente diminuir o valor de this._eventEnemyActingCooldown até chegar a zero. Chegando a zero, significa que o evento esperou esse tempo sem, aí executaríamos sua ação e atribuiríamos novamente o valor à this._eventEnemyActingCooldown.

Como já demos um valor inicial à this._eventEnemyActingCooldown no initialize, iremos no update e vamos colocar:

Código:
if (this.isEnemy()) {
  if (this._eventEnemyActingCooldown > 0) {
    this._eventEnemyActingCooldown--;
  } else {
    this.updateAction();
  };
};
Primeiro esta função irá verificar se o evento é um inimigo. Se não for, nada adiante necessita ser lido. Se for, a verificação seguinte será se a variável de cooldown ainda possui um valor maios que 0. Se sim, será diminuído 1 do valor dela. Se não, aí sim iremos chamar o comando que atualiza uma ação do evento.

É um portante que, ao terminar a realização da ação, tu coloque um:

Código:
this._eventEnemyActingCooldown = this.resetActingCooldown();
Para a variável de cooldown voltar a ter um valor e assim o evento esperar novamente para agir. Seria, teoricamente, deste como como eu faria esta questão do cooldown, espero não ter esquecido nenhum detalhe.
 
Olha King acho que funcionou hein, so que nao tenho certeza ainda por um motivo, não tenho animação e acho que o console.log() esta mostrando o valor do resultado do dano varias vezes ao mesmo tempo sem respeitar as outras informações, exemplo(cooldown)... em outras palavras:
"o valor nu e cru exato de oque estou pedindo ao pe da letra retornando varias vezes"...

e estou com uma duvida pra cria a tal animação, eu posso usar o construct pra criar funções que nao existem em Game_Enemy e Game_Event
EXEMPLOS:
Game_CharacterBase.prototype.requestAnimation = function(animationId) {}
Game_CharacterBase.prototype.animationId = function() {}
Game_CharacterBase.prototype.startAnimation = function() {}
Game_CharacterBase.prototype.isAnimationPlaying = function() {}
Game_CharacterBase.prototype.endAnimation = function() {}

Ou posso fazer as animações de alguma forma sem as funçoes?
 
Boa noite pessoal, ainda sobre o sistema... eu fiz um sistema da seguinte forma
Código:
//Movimentacao do evento.
var _GameEventABS_updateSelfMovement = Game_Event.prototype.updateSelfMovement;
Game_Event.prototype.updateSelfMovement = function() {
	_GameEventABS_updateSelfMovement.call(this);
	if (this.isNearThePlayer()) {
		if (!this.isEnemy()) {
			this.x = Math.abs(this.deltaXFrom($gamePlayer.x));
	  		this.y = Math.abs(this.deltaYFrom($gamePlayer.y));
    		return this.x + this.y < 5;
    	};
		this.moveTowardPlayer();
    } else {
        this.moveRandom();
	};
};

Ele serve para fazer o evento seguir o personagem se estiver proximo a ele, porem o evento segue meu personagem mesmo se eu estiver em um mapa de 100/100 e eu estiver no ponto "99" do mapa e o evento no "0" ele crusa o mapa inteiro ate me achar'-'

não esta respeitando a parte que eu falo se ele estiver distante é pra andar aleatoriamente pelo mapa....
Podem me ajudar?
 
Voltar
Topo