O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Masked Aditional Methods

Iniciado por Brandt, 19/02/2014 às 21:59

[box class=titlebg]Masked Aditional Methods[/box]

por Masked

[box2 class=titlebg title=Introdução]Bom, o RGSS que vem no RPG Maker é bem completo, e vem com várias coisas que nós, scripters, podemos usar.

MAS, ele não tem tudo, e é pra isso que esses scripts servem, para tapar essa falha, são métodos que eu sinto falta na hora de programar, e que, na minha opinião, deixam tudo mais fácil.[/box]

[box2 class=titlebg title=MS - Draw Line]
class Sprite
  #----------------------------------------------------------------------------
  # * Desenho de uma linha
  #----------------------------------------------------------------------------
def draw_line(x,y,target_x,target_y,color)
a = y - target_y
b = target_x - x
c = x*target_y - target_x*y
for i in y..target_y
  unless a == 0
  ax = (-b*i - c) / a
else
  ax = x
end
  self.bitmap.set_pixel(ax.to_i,i,color)
end
for i in x..target_x
  unless b == 0
  ay = (-a*i - c) / b
else
  ay = y
end
  self.bitmap.set_pixel(i,ay.to_i,color)
end
end
end


Cole acima do main.
O script cria um método 'draw_line', que desenha uma linha do ponto x y até o ponto target_x target_y.

Para chamar o método, use o código:
sprite.draw_line(x,y,target_x,target_y,cor)

no lugar de x e y, ponha as coordenadas iniciais da linha, e no lugar de target_x e target_y ponha as coordenadas funais, no lugar de cor, ponha uma Color

[box2 class=titlebg title=Créditos e Agradecimentos]- a mim, por escrever o script em Ruby
- ao Shiroyasha, por praticamente tudo, toda a matemática da coisa foi ele quem fez (é o autor do sistema de bússola, pra quem não conhece)[/box2][/box2]

[box2 class=titlebg title=Mover Sprite]
class Sprite
  #----------------------------------------------------------------------------
  # * Mover o Sprite 
  #----------------------------------------------------------------------------
def move(target_x,target_y,wait)
a = self.y - target_y
b = target_x - self.x
c = self.x*target_y - target_x*self.y
for i in self.y..target_y
  Graphics.wait(wait)
  unless a == 0
  ax = (-b*i - c) / a
else
  ax = self.x
end
  self.x = ax
  self.y = i
end
for i in self.x..target_x
  Graphics.wait(wait)
  unless b == 0
  ay = (-a*i - c) / b
else
  ay = self.y
end
  self.y = ay
  self.x = i
end
end
end


Apenas cole acima do main.
O script cria um método 'move' que leva a caixa para as coordenadas x y com n frames de espera entre cada pixel 'andado'

Para chamar o método, use o código:
sprite.move(x,y,wait)


no lugar de x e y, ponha as coordenadas de destino do sprite, e no lugar de wait, o número de frames a se esperar entre cada pixel

[box2 class=titlebg title=Créditos e Agradecimentos]- a mim, por adaptar o método de desenho de linha
- ao Shiroyasha, pela matemática do método de desenhar a linha)[/box2]
[/box2]

[box2 class=titlebg title=API: Posição do Mouse e da Janela e esconder o cursor do Windows]
module API
  
def self.get_cursor_position
result = "0"*8
getCursorXY = Win32API.new("user32","GetCursorPos",["P"],"V")
getCursorXY.call(result)
x, y = result.unpack("LL")
return [x,y]
end

def self.get_window_position
  result = "0"*16
  findWindowA = Win32API.new('user32', 'FindWindowA', 'pp', 'l')
  getClientRect = Win32API.new('user32', 'GetClientRect', 'lp', 'i')
  getWindowRect = Win32API.new('user32', 'GetWindowRect', 'lp', 'i')
  contents = File.open('Game.ini', 'r') {|f| f.read }
  q = contents[/Title=(.+)/].nil? ? "cccc" : $1
  @handle = findWindowA.call('RGSS Player', q) 
  a = getWindowRect.call(@handle, result)
  x, y, width, height = result.unpack("LLLL")
  return [x, y]
end

def self.hide_cursor
hd_cur = Win32API.new('user32', 'ShowCursor', 'I', 'L')
hd_cur.call(0)
end

end


Cole acima do main.
esse cria três métodos: 'API.get_cursor_position', 'API.get_window_position' e 'API.hide_cursor', o primeiro e segundo, pegam as coordenadas do mouse e da janela do Game.exe, respectivamente, e o último esconde o cursor do Windows

Os dois primeiros retornam uma array, onde o valor [0] é a posição X e o valor [1] é a posição Y

[box2 class=titlebg title=Créditos e Agradecimentos]- a mim, por criar e disponibilizar[/box2][/box2]
~ Masked

Essas coisas tem nome x3, Snippets :D

Aliás é possível encontrar vários por ai na net, e claro os 3 que você fez são bem úteis, parabéns man x).

É muito bom programar assim, modulado, da para poupar bastante trabalho e código na hora de fazer os scripts. Ah e uma coisa, testei o metodo move e não deu muito certo, porque faz com que tenha uma pequena espera entre cada movimento do sprite, paralizando todo o resto do jogo. Acho que o ideal seria você utilizar o frame_count ao inves do wait.
No mais obrigado por trazer os métodos :ok:

@Raizen: Ah, sim xD
Já tinha ouvido esse nome,e até sabia que isso seria um tipo de snippet, é que eu meio que fiz o tópico às 1:30 da madrugada (eu peguei ele da MRM, onde eu postei originalmente) então não tinha quase nada na minha cabeça naquela hora... vou reformular o tópico com os scripts mais comentados, mais fáceis de ler...

@Klarth: É, eu percebi essa falha no move, vou tentar arrumar, é que antes eu tinha usado o Graphics.update mas aí não tinha como controlar a velocidade... vou ver isso, obrigado por avisar
~ Masked

20/02/2014 às 00:26 #4 Última edição: 20/02/2014 às 00:29 por Klarth
Com o framecount é bem simples, tenta fazer assim:
- Armazena o framecount atual se a variavel tiver valor nulo
- Verifica se o valor armazenado é igual a framecount atual + o tempo de espera
- Caso seja verdadeiro move o sprite e muda o valor da variável para o framecount atual

E isso não afetará o resto do jogo :ok: