# ============================================================================= # THEOALLEN - WINDOW AND SPRITE CIRCULAR MOVEMENT # VERSION : 1.0 # CONTACT : www.rpgmakerid.com # (This script documentation is written in informal indonesian language) # ============================================================================= $imported = {} if $imported.nil? $imported[:Theo_Circular] = true # ============================================================================= # CHANGE LOGS : # ----------------------------------------------------------------------------- # 2013.05.04 - Bux fixed before release # 2013.04.30 - Finished script # 2013.04.29 - Started script # ============================================================================= =begin PENGENALAN: Script ini ngebikin suatu object sprite atau window bisa bikin gerakan muter (circular) dengan pusat yg dah ditentuin. Pusat bisa berupa koordinat atau sebuah object window atau sprite yang lain. Tentunya ini cuman buat sebagai dasaran buat scripter aja. Bukan buat plug n play tanpa realisasi ---------------------------------------------------------------------------- CARA PENGGUNAAN: Movements: - object.circle_move(degree[,dur]) >> muter object sekian derajat - object.endless_circle(degree) >> muter object tanpa henti Center point modifiers: - object.center_coordinate(ox,oy) >> Ngeset pusatnya ke koordinat tertentu - object.center_distance(ox,oy) >> Ngeset pusat berdasar jarak dari object - object.center_obj(obj) >> Ngeset object lain sebagai pusat Stop states : - object.circle_freeze >> ngefreeze object - object.circle_unfreeze >> ngeunfreeze object - object.circle_frozen? >> true kalo freeze - object.stop >> ngestop endless rotate - object.continue >> lanjutin endless rotate - object.endless? >> true kalo state endless true ---------------------------------------------------------------------------- TERMS OF USE: Karena ini emang cuman buat tool para scripter, silahkan2 aja kalo mo dipake. Mau komersil juga boleh. Btw, kalo ada ide trus mo ngembangil ni modul monggo terserah. Gw mah dmen banget kalo ada yg mo ngembangin script gw yg satu ini. Tapi tetep kredit ya? \=w=/ =end # ============================================================================= # REDEFINE MATH MODULE (jangan dihapus modul ini!) : # ----------------------------------------------------------------------------- # Well, karena gw kesusahan kalo perhitungan pake radian, jadinya gw bikin # fungsi konvert dari derajat ke radian dan sebaliknya :P # ----------------------------------------------------------------------------- # - Math.radian(degree) >> konvert derajat ke radian # - Math.degree(radian) >> konvert radian ke derajat # ============================================================================= module Math # --------------------------------------------------------------------------- # Derajat >> Radian # --------------------------------------------------------------------------- def self.radian(degree) return (degree.to_f/180) * Math::PI end # --------------------------------------------------------------------------- # Radian >> Derajat # --------------------------------------------------------------------------- def self.degree(radian) return (radian.to_f/Math::PI) * 180 end end # ============================================================================= # Module THEO::Circular (diimplement ke window ama sprite) # ============================================================================= module THEO module Circular # ========================================================================= # Class Circular Object ~ # ------------------------------------------------------------------------- # Class untuk ngehandle perputaran object. # Beberapa instance variablenya : # - obj >> refers ke object yg mo digerakin # - center_obj >> object yg jadi referensi pusat (default : nil) # - ox >> koordinat x dari pusat perputaran # - oy >> koordinat y dari pusar perputaran # - degree_dest >> derajat yg jadi tujuan # - current_degree >> derajat saat itu # - speed >> nilai perubahan derajat per frame # - radius >> jarak dari pusat ke object (diitung otomatis) # - endless >> akan update terus kale bernilai true # - freeze >> akan berhenti berputar kalo true # ------------------------------------------------------------------------- # freeze lebih superior daripada endless. freeze akan menghentikan # pergerakan object apapun yang terjadi # ========================================================================= class Circular_Obj attr_reader :ox attr_reader :oy attr_reader :center_obj attr_reader :obj # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # inisialisasi object # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def initialize(obj,ox,oy,center_obj) @obj = obj @center_obj = center_obj if can_move?(center_obj) @ox = ox @oy = oy @speed = 0 @endless = false @freeze = false refresh_info end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngerefresh info derajat ama radius # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def refresh_info @radius = radius @degree_dest = @current_degree = get_degree end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeset object sebagai pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def center_obj=(center) return unless can_move?(center) @center_obj = center refresh_info end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeset koordinat x titik pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def ox=(ox) @ox = ox refresh_info end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeset koordinat y titik pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def oy=(oy) @oy = oy refresh_info end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngecek kemampuan object untuk bergerak # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def can_move?(obj) obj.is_a?(Window) || obj.is_a?(Sprite) end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Muter object beberapa derajat # ----------------------------------------------------------------------- # - degree >> derajat perputaran # - duration >> waktu yg dibutuhkan untuk berputar (frame) # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def circle_move(degree,duration) return if endless? @degree_dest = (@current_degree + degree) @speed = (@degree_dest - @current_degree) / duration.to_f end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Perputaran tanpa batas, ampe dihentiin # ----------------------------------------------------------------------- # - speed >> perubahan derajat tiap framenya # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def endless_circle(speed) @speed = speed @endless = true end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Menghitung derajat dari titik pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def get_degree Math.degree(Math.atan2(range_y,range_x)) rescue 0 end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Jarak dari koordinat x object ke koordinat x pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def range_x @obj.x - center_x end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Jarak dari koordinat y object ke koordinat y pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def range_y @obj.y - center_y end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngambil koordinat x pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def center_x @center_obj.nil? ? @ox : @center_obj.x end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngambil koordinat y pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def center_y @center_obj.nil? ? @oy : @center_obj.y end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Menghitung radius / jari2 dari titik pusat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def radius Math.sqrt((range_x**2) + (range_y**2)) end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Update pergerakan circle (dipangggil tiap frame) # ----------------------------------------------------------------------- # - Kalo freeze >> ga ngelakuin apa2 # - Kalo endless >> terus # - Kalo muter >> terus # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def update_circle return if circle_frozen? return unless rotate? || @endless @current_degree += @speed update_x update_y @degree_dest = @current_degree if @endless end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngecek perputaran # ----------------------------------------------------------------------- # - True >> Derajat tujuan tidak sama dengan derajat saat itu # - False >> Derajat tujuan sama dengan derajat saat itu # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def rotate? return @current_degree != @degree_dest end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Update posisi koordinat x object # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def update_x @obj.x = center_x + (@radius * Math.cos(Math.radian(@current_degree))).round end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Update posisi koordinat y object # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def update_y @obj.y = center_y + (@radius * Math.sin(Math.radian(@current_degree))).round end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngefreeze object buat muter # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def circle_freeze @freeze = true end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeunfreeze object buat buat muter # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def circle_unfreeze @freeze = false end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngecek freeze state # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def circle_frozen? @freeze end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngestop pergerakan endless # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def stop @endless = false end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngelanjutin pergerakan endless # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def continue @endless = true end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngecek endless state # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def endless? @endless end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Akhir dari Class Circular object ~ # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeset object circle ~ # ------------------------------------------------------------------------- # - obj >> object asli # - ox >> koordinat x pusat putaran # - oy >> koordinat y pusat putaran # - center_obj >> object yg jadi pusat (lebih superior dari ox,oy) # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def set_circle(obj,ox = 0,oy = 0,center_obj = nil) @circle = Circular_Obj.new(obj,ox,oy,center_obj) end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Stop # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def stop @circle.stop end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngelanjut # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def continue @circle.continue end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Apakah gerakannya tanpa henti? # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def endless? @circle.endless? end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Muter object dengan masukan derajat (misal nambah 30 derajat) # ------------------------------------------------------------------------- # - degree >> tambahan derajat # - dur >> durasi (dalam frame) # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def circle_move(degree, dur = Graphics.frame_rate) @circle.circle_move(degree,dur) end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Muter object tanpa henti # ------------------------------------------------------------------------- # - speed >> kecepatan muter dalam derajat # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def endless_circle(speed) @circle.endless_circle(speed) end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngefreeze object buat diputer # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def circle_freeze @circle.circle_freeze end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeunfreeze object # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def circle_unfreeze @circle.circle_unfreeze end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Apakah lagi difreeze? # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def circle_frozed? @circle.circle_frozen? end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Update perputaran (dipanggil tiap frame) # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def update_circle @circle.update_circle end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Lagi muterkah? # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def rotating? @circle.rotate? end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeset koordinat center # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def center_coordinate(ox,oy) @circle.ox = ox @circle.oy = oy end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeser koordinat center dengan jarak dari object # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def center_distance(ox,oy) @circle.ox = @circle.obj.x + ox @circle.oy = @circle.obj.y + oy end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # Ngeset object sebagai pusat utama # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def center_obj(obj) @circle.center_obj = obj end # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= def refresh_info @circle.refresh_info end end end # ============================================================================= # Akhir dari Module THEO::Movement # ----------------------------------------------------------------------------- # Class Window # ============================================================================= class Window include THEO::Circular alias theolized_circle_window_init initialize def initialize(x,y,width,height) theolized_circle_window_init(x,y,width,height) set_circle(self,x,y) end alias window_circle_update update def update window_circle_update update_circle end end # ============================================================================= # Class Sprite # ============================================================================= class Sprite include THEO::Circular alias theolized_circle_init initialize def initialize(viewport = nil) theolized_circle_init(viewport) set_circle(self,x,y) end alias sprite_circle_update update def update sprite_circle_update update_circle end end