赞 | 0 |
VIP | 17 |
好人卡 | 0 |
积分 | 1 |
经验 | 1022914 |
最后登录 | 2017-2-4 |
在线时间 | 10 小时 |
Lv1.梦旅人 月下可怜人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 10 小时
- 注册时间
- 2005-11-23
- 帖子
- 4085
|
以下引用kaze于2007-9-5 7:44:47的发言:
以下引用美兽于2007-9-5 3:12:02的发言:
这里的电脑不能随便下载,
麻烦LZ能否将 “高速数字描绘”的脚本直接贴出来?
#◆◇◆◇◆ 開発者用・高速数字描写機構 1.00 ◇◆◇◆◇
# サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/
# by みんと
=begin
XPに初期導入されている Bitmap の draw_text は
処理が重く過度のリフレッシュには非情に適していません。
(この処理には時間がかかるため、
1 フレームごとに文字列を再描画するような使い方は推奨されません。)
なのでXPゲームにとって恐らく最も多く更新と思われる
「数値」の描写に特化したクラスです。
このクラスで生成された数値の表示は1フレームごとに描写しても
FPSの消費が実質0で済み、非情に高速です。
ただし、このRGSSスクリプトは開発者用なので、
使いこなすには「ある程度」のRGSS知識が求められます。
詳しい使い方は
公開中のアクティブレベルアップか、
アクティブバトルステータスを参照してくっださい。
Mint_Picture_Number のプロトタイプが実際に使用されています。
☆ 以下、開発者様向けの説明
┏━━━━ クラスメソッド ※()内部は省略可能な引数 ━━━━━━━━━━━━━
┃
┃ Mint_Picture_Number.new(x, y, index, (z, size, text))
┃
┠──────────────────────────────────────
┃
┃ index : 描写可能な桁数です。(10000桁なら5)
┃
┃ z : Z座標です。省略した場合は999になります。
┃
┃ size : 1カラーの高さです。
┃ カラーとは読み込んだ画像をsizeで割った内の1つです。
┃ 読み込んだ画像を size で割った数がカラーの数になります。
┃ なので、画像はこの数値で割り切れる必要があります。
┃
┃ text : 読み込む画像です。
┃ 省略した場合はString02というピクチャーを参照します。
┃ 1つ1つの数字は必ず均等幅で並べる必要があります。
┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┏━━━━ メソッド ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃
┃ dispose
┃ clear
┃ update
┃ string_pop(picture)
┃ set_text(number, (collar))
┃
┠──────────────────────────────────────
┃
┃ dispose : このクラスで生成されたオブジェクトを解放します。
┃ 原則的に $scene が変わる前に実行する必要があります。
┃
┃ clear : 表示中のピクチャーを削除します。
┃ ただし、string_pop で生成されたピクチャーは除きます。
┃
┃ update : string_pop で表示したピクチャーのスライドを進めます。
┃ 原則として1フレームに1度呼び出す必要があります。
┃
┃ string_pop : pictureで指定した名前のピクチャーを
┃ ピクチャーフォルダから参照してポップします。
┃ ピクチャーが存在しない場合はエラー落ちします。
┃ また、このメソッドは処理が重いため、
┃ 過度の使用はオススメできますん。
┃
┃ set_text : number で指定した数字を描写します。
┃ collar で色を変更できますが、
┃ size で複数のカラーを用意しておく必要があります。
┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┏━━━━ プロパティ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃
┃ visible
┃ contents_opacity
┃
┠──────────────────────────────────────
┃
┃ visible : 可視状態を変更します。真の時に可視状態になります。
┃
┃ contents_opacity : ピクチャーの透明度を変更します。
┃ ただし、string_pop で生成されたピクチャーは除きます。
┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=end
#==============================================================================
# ■ Mint_Picture_Number
#------------------------------------------------------------------------------
# ピクチャー数字のスプライト表示を扱うクラスです。
# このクラスは数値の高速再描写に特化したクラスとなっています。
#==============================================================================
class Mint_Picture_Number
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :x # X座標
attr_accessor :y # Y座標
attr_reader :visible # 可視状態
attr_reader :string_pop_duration # ストリングポップカウント
attr_accessor :string # 文字列のピクチャー
attr_reader :contents_opacity # 内容の透明度
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# x : X座標
# y : Y座標
# index : 求められた行数
# z : Z座標
# size : 求められた1カラーの高さ
# text : 求められたピクチャー
#--------------------------------------------------------------------------
def initialize(x, y, index, z = 999, size = 24, text = "String02")
# ピクチャーデータを読み込んで代入
@number = RPG::Cache.picture(text)
# 各種データを初期化
@x = x
@y = y
@index = index
@string_pop_sprite = []
@string_pop_duration = []
# カラーサイズを取得(画像の高さをsizeで割った数)
collar_size = @number.rect.height / size
# 読み込んだ画像の幅を10で割った値が、1文字1文字の幅になる
@width = @number.rect.width / 10.0
# 読み込んだ画像の高さをカラーサイズで割った数が1カラーの高さになる
height = @number.rect.height / collar_size
# スプライトを収納する配列を定義
@sprite = []
# スプライト生成(求められた行数分)
for i in 0...@index
@sprite = Sprite.new
@sprite.x = x.to_i + (i * @width)
@sprite.y = y.to_i
@sprite.z = z
end
# ピクチャー数字用の配列生成
@picture_number = []
# X, Y, 幅, 高さ
rect = Rect.new(0, 0, @width, height)
# 各カラー分のピクチャーを作成
for collar_index in 0...collar_size
# 配列内配列を作成
@picture_number[collar_index] = []
# 0~9までのピクチャー数字を予め作成
for i in 0..9
# インデックス(i)から、
# 基本幅(@width)を掛けたところにある画像を参照する
rect.x = i * @width
# collar_index から
# 基本高さ(height)を掛けたところにある画像を参照する
rect.y = collar_index * height
# Bitmapを作成
bitmap = Bitmap.new(@width, height)
# ピクチャー生成
bitmap.blt(0, 0, @number, rect)
# 生成したピクチャーを収納
@picture_number[collar_index] = bitmap
end
end
end
#--------------------------------------------------------------------------
# ● Y座標の変更
# n : 新しいY座標
#--------------------------------------------------------------------------
def y=(n)
# Y座標の変更(イテレータ)
# for i in 0...@index
# @sprite.y = n
# end
# という意味 ↓
(0...@index).each{|i| @sprite.y = n}
end
#--------------------------------------------------------------------------
# ● 内容の可視状態の変更
# flag : 新しい可視状態
#--------------------------------------------------------------------------
def visible=(flag)
# 可視状態の変更(イテレータ)
(0...@index).each{|i| @sprite.visible = flag}
end
#--------------------------------------------------------------------------
# ● 内容の透明度の変更
# opacity : 新しい透明度
#--------------------------------------------------------------------------
def contents_opacity=(opacity)
# 透明度の変更(イテレータ)
(0...@index).each{|i| @sprite.opacity = opacity}
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
# 求められた行数分のビットマップをクリア
for i in 0...@index
@sprite.bitmap = nil
end
end
#--------------------------------------------------------------------------
# ● セットテキスト
# number : 求められた数値
# collar : 求められたカラーインデックス
#--------------------------------------------------------------------------
def set_text(number, collar = 0)
# 求められた文字を一文字ずつ配列にする
text = number.to_s.split(//)
# クリア行数
clear_index = text.size == 1 ? 1 : 0
# X座標を調整する
x_size = @index - text.size
# 求められた行数分繰り返す
for i in 0...@index
# クリア行数が0で求められた数字が0か、
# 元の数字が存在しなければなら次へ
if clear_index == 0 && text.to_i == 0 ||
text == nil
@sprite.bitmap = nil
next
end
# X座標を調整する(右寄せ)
@sprite.x = @x.to_i + (i * @width) + (x_size * @width)
# 条件をクリアしていれば、クリア行数に1を加算
clear_index += 1
# 条件をクリアしていれば描写
@sprite.bitmap = @picture_number[collar][text.to_i]
end
end
#--------------------------------------------------------------------------
# ● ストリングポップ
# string : 求められた文字列のピクチャーの名前
# x_plus : 外部からのX座標の調整用
# y_plus : 外部からのY座標の調整用
#--------------------------------------------------------------------------
def string_pop(string = "", x_plus = 0, y_plus = 0)
# 画像を読み込む(空文字の場合は無視)
if string != ""
@string = RPG::Cache.picture(string)
end
# @string が nil なら処理を終了
return if @string == nil
# 配列の nil をなくす
@string_pop_sprite.compact!
@string_pop_duration.compact!
# ストリングポップを解放(解放されている場合は無視)
dispose_string_pop
# スプライトを生成
string_pop_sprite = Sprite.new
# 幅を代入
width = @string.rect.width
# 高さを代入
height = @string.rect.height
# 画像の幅と高さからビットマップを生成
string_pop_sprite.bitmap = Bitmap.new(width, height)
# 画像を実際に描写
string_pop_sprite.bitmap.blt(0, 0, @string, @string.rect)
# 座標データを代入
string_pop_sprite.x = @x.to_i + x_plus
string_pop_sprite.y = @y.to_i + y_plus
string_pop_sprite.z = 999
# 配列の先頭にシフト
@string_pop_sprite.unshift(string_pop_sprite)
@string_pop_duration.unshift(40)
end
#--------------------------------------------------------------------------
# ● ストリングポップ解放
# index : 求められたインデックス
#--------------------------------------------------------------------------
def dispose_string_pop(index = nil)
# インデックスが nil なら処理を中断
if index == nil
return
end
# インデックスが -1 なら全て解放する
if index == -1
# for 文を使って1つずつ処理
for id in 0...@string_pop_sprite.size
# IDが0以上でそこにスプライトが存在すれば解放
if id >= 0 && @string_pop_sprite[id]
@string_pop_sprite[id].bitmap.dispose
@string_pop_sprite[id].dispose
@string_pop_sprite[id] = nil
@string_pop_duration[id] = nil
end
end
else
# インデックスが0以上でそこにスプライトが存在すれば解放
if index >= 0 && @string_pop_sprite[index]
@string_pop_sprite[index].bitmap.dispose
@string_pop_sprite[index].dispose
@string_pop_sprite[index] = nil
@string_pop_duration[index] = nil
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
# 1つでもストリングポップが表示中の場合
if @string_pop_sprite.size > 0
# 表示中のストリングポップを1つずつ処理する
for i in 0...@string_pop_sprite.size
# ストリングポップを代入
string = @string_pop_sprite
# カウントが0の場合
if @string_pop_duration == 0
# ストリングポップを解放
dispose_string_pop(i)
# 次の処理へ
next
end
# カウントを減らす
@string_pop_duration -= 1
# 残りカウントに応じて分岐
case @string_pop_duration
when 36..39
string.y -= 4
when 33..37
string.y -= 2
when 32..34
string.y += 2
when 25..32
string.y += 4
end
# 透明度をカウントに応じて下げる
string.opacity = 256 - (12 - @string_pop_duration) * 32
end
# 配列の nil を無くす
@string_pop_sprite.compact!
@string_pop_duration.compact!
end
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
# スプライトを解放
for s in @sprite
s.dispose
s = nil
end
# ストリングポップを全て解放
dispose_string_pop(-1)
end
end
提示:你可以先修改部分代码再运行
十分感谢,与想象的出入较大,原以为是DC,失望——
|
|