RGSS3で落ちる。

れおっくす
記事: 1
登録日時: 2023年8月01日(火) 00:41

RGSS3で落ちる。

投稿記事by れおっくす » 2023年8月01日(火) 00:49

はじめまして。れおっくすです。
DAIPAGEさんの3DMAPをRGSS2からアレンジしてますがメニューを開いてマップに戻ると落ちてしまいます。
どうしたら落ないようになるでしょうか?
よろしくお願いします!


#==============================================================================
# ■ DAI_3d
#==============================================================================
module DAI_3d
#--------------------------------------------------------------------------
# ● カスタマイズ
#--------------------------------------------------------------------------

# 擬似3D表示するMAPID
MAP_ID = [1,2]
# 遠景ファイル名(縦80*横画面サイズ以上のループ画像)
PARA = Cache.system("parallax")

# 処理の細かさ (8:綺麗・重い 16:荒い・軽い)…くらいで設定。
MAP_CAT = 4
end


#==============================================================================
# ■ Spriteset_3D
#==============================================================================
class Spriteset_3D
#--------------------------------------------------------------------------
# ● 定数
#--------------------------------------------------------------------------
MAP_ID = DAI_3d::MAP_ID
PARA = DAI_3d::PARA
MAP_CAT = DAI_3d::MAP_CAT
ZOOM_Y = MAP_CAT * 0.00001
ZOOM_X = MAP_CAT * 0.00001
BASE_ZOOM_Y = 0.01
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
create_viewport
create_bitmap
create_map_sprites
create_parallax
create_characters
update
end
#--------------------------------------------------------------------------
# ● ビューポートの作成
#--------------------------------------------------------------------------
def create_viewport
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 1
end
#--------------------------------------------------------------------------
# ● ビットマップの作成
#--------------------------------------------------------------------------
def create_bitmap
@bitmap = Graphics.snap_to_bitmap
end
#--------------------------------------------------------------------------
# ● 3Dマップスプライトの作成
#--------------------------------------------------------------------------
def create_map_sprites
@bitmap = Graphics.snap_to_bitmap
gw = Graphics.width
gh = Graphics.height
@x_table = Table.new(gw, gh + 100)
@y_table = Table.new(gh + 100)
@zoom_table = Table.new(gh + 100)
@color_table = Table.new(gh + 100)
@map_sprites = []
for i in 0..gh / MAP_CAT
@map_sprites[i] = Sprite.new(@viewport)
@map_sprites[i].bitmap = @bitmap
@map_sprites[i].src_rect.set(0, i * MAP_CAT, gw, MAP_CAT)
# y座標と縦方向倍率
@map_sprites[i].zoom_y = BASE_ZOOM_Y + (i * ZOOM_Y)
@map_sprites[i].y = 80
a = @map_sprites[i - 1].y
b = @map_sprites[i - 1].zoom_y
@map_sprites[i].y = a + MAP_CAT * b if i > 0
# x座標と横方向倍率
@map_sprites[i].zoom_x = 1.00 + (i * ZOOM_X)
@map_sprites[i].x = 0 - (gw * @map_sprites[i].zoom_x - gw) / 2
# カラーセット
@map_sprites[i].color = Color.new(255, 255, 255, 223 - (i * MAP_CAT * 2))
@map_sprites[i].z = i + 200
@map_sprites[i].update
next if $DAI_3D_data != nil
# y座標対応表に記録
c = i * MAP_CAT
d = c + MAP_CAT
e = 0
for y in c..d
f = @map_sprites[i].y + (@map_sprites[i].zoom_y * e)
@y_table[y] = f
e += 1
end
# 拡大率対応表に記録
e = 0
for y in c..d
g = @map_sprites[i].zoom_y + ZOOM_Y / MAP_CAT
@zoom_table[y] = (@map_sprites[i].zoom_y + (g * e)) * 1000
e += 0
end
# カラー対応表に記録
for y in c..d
@color_table[y] = @map_sprites[i].color.alpha
end
# x座標対応表に記録
for x in 0..gw
for y in c..d
@x_table[x, y] = @map_sprites[i].x + (@map_sprites[i].zoom_x * x)
end
end
end
$DAI_3D_data = [@x_table, @y_table, @zoom_table, @color_table] if $DAI_3D_data == nil
end

#--------------------------------------------------------------------------
# ● キャラクタースプライトの作成
#--------------------------------------------------------------------------
def create_characters
@character_sprites = []
for i in $game_map.events.keys.sort
sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
@character_sprites.push(sprite)
end
for vehicle in $game_map.vehicles
sprite = Sprite_Character.new(@viewport1, vehicle)
@character_sprites.push(sprite)
end
@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
end


#--------------------------------------------------------------------------
# ● キャラクタースプライトの作成
#--------------------------------------------------------------------------
def create_characters
@character_sprites = []
for i in $game_map.events.keys.sort
sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
@character_sprites.push(sprite)
end
for vehicle in $game_map.vehicles
sprite = Sprite_Character.new(@viewport1, vehicle)
@character_sprites.push(sprite)
end
@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
end
#--------------------------------------------------------------------------
# ● 遠景の作成
#--------------------------------------------------------------------------
def create_parallax
@para = Plane.new(@viewport)
@para.bitmap = PARA
@para.z = 200
@para.visible = false
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
for sprite in @map_sprites
sprite.dispose
end
for sprite in @character_sprites
sprite.dispose
end
@para.dispose
@bitmap.dispose
@viewport.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
bitmap_update
map_sprites_update
update_characters
parallax_update
update_viewport
end
#--------------------------------------------------------------------------
# ● ビットマップの更新
#--------------------------------------------------------------------------
def bitmap_update
@bitmap.dispose
# 写ってたらおかしい物を全部消す

SceneManager.scene.spriteset.set_visible(false)
SceneManager.scene.message_window.visible = false
character_sprites_visible(false)
if @para.disposed? == false
@para.visible = false
end
@bitmap = Graphics.snap_to_bitmap
# 消したのを元に戻す
character_sprites_visible(true)
SceneManager.scene.spriteset.set_visible(true)
SceneManager.scene.message_window.visible = true

if @para.disposed? == false
@para.visible = true
end

end
#--------------------------------------------------------------------------
# ● 3Dマップスプライトの更新
#--------------------------------------------------------------------------
def map_sprites_update
a = 0


for sprite in @map_sprites

if sprite.disposed? == false
if sprite.is_a?(Sprite)
sprite.bitmap = @bitmap
sprite.src_rect.set(0, a * MAP_CAT, 544, MAP_CAT)
sprite.update
end

end


a += 1
end
end
#--------------------------------------------------------------------------
# ● キャラクタースプライトの更新
#--------------------------------------------------------------------------
def update_characters
x_t = $DAI_3D_data[0]
y_t = $DAI_3D_data[1]
z_t = $DAI_3D_data[2]
c_t = $DAI_3D_data[3]
for s in @character_sprites
s.update
c = s.character
if x_t[c.screen_x, c.screen_y].nil? or y_t[c.screen_y].nil?
s.x = -200
s.y = -200
s.zoom_x = 1
s.zoom_y = 1
else
s.x = x_t[c.screen_x, c.screen_y]
s.y = y_t[c.screen_y]
s.zoom_x = z_t[c.screen_y] / 2500.0
s.zoom_y = z_t[c.screen_y] / 2500.0
s.color = Color.new(255, 255, 255, c_t[c.screen_y])
end
end
end
#--------------------------------------------------------------------------
# ● 遠景の更新
#--------------------------------------------------------------------------
def parallax_update
@para.ox += 1 if Graphics.frame_count % 10 == 0
end
#--------------------------------------------------------------------------
# ● ビューポートの更新
#--------------------------------------------------------------------------
def update_viewport
@viewport.update
end
#--------------------------------------------------------------------------
# ● キャラクタースプライトの可視状態設定
#--------------------------------------------------------------------------
def character_sprites_visible(v)
for sprite in @character_sprites

if sprite.disposed? == false
sprite.visible = v
end
end
end
end

#==============================================================================
# ■ Game_Player
#==============================================================================
class Game_Player
def new_map_id
return @new_map_id
end
end

#==============================================================================
# ■ Spriteset_Map
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# ● キャラクタースプライトの可視状態設定
#--------------------------------------------------------------------------
def character_sprites_visible(v)
for sprite in @character_sprites
sprite.visible = v
end
end
#--------------------------------------------------------------------------
# ● ピクチャスプライトの可視状態設定
#--------------------------------------------------------------------------
def pictures_visible(v)
for sprite in @picture_sprites
sprite.visible = v
end
end
#--------------------------------------------------------------------------
# ● タイマースプライトの可視状態設定
#--------------------------------------------------------------------------
def timer_visible(v)
@timer_sprite.visible = v
end
#--------------------------------------------------------------------------
# ● 可視状態一括設定
#--------------------------------------------------------------------------
def set_visible(v)
character_sprites_visible(v)
pictures_visible(v)
timer_visible(v)
@weather.set_visible(v)
end
end

#==============================================================================
# ■ Spriteset_Weather
#==============================================================================
class Spriteset_Weather
#--------------------------------------------------------------------------
# ● 可視状態一括設定
#--------------------------------------------------------------------------
def set_visible(v)
for sprite in @sprites
sprite.visible = v
end
end
end

#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map < Scene_Base

#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
alias dai_3d_start start
def start
dai_3d_start

if $game_switches[0001] == true && DAI_3d::MAP_ID.include?($game_map.map_id)

Graphics.brightness = 255
create_dai_3d
Graphics.brightness = 0

end
end
#--------------------------------------------------------------------------
# ● 画面のフェードイン
#--------------------------------------------------------------------------
alias dai_3d_fadein fadein
def fadein(duration)
Graphics.brightness = 255
if @create_3d
create_dai_3d
end
dispose_spriteset_3d
Graphics.brightness = 0
dai_3d_fadein(duration)
end
#--------------------------------------------------------------------------
# ● 場所移動の処理
#--------------------------------------------------------------------------
alias dai_3d_update_transfer_player update_transfer_player
def update_transfer_player
return unless $game_player.transfer?

if $game_switches[0001] == true &&
DAI_3d::MAP_ID.include?($game_player.new_map_id) &&
$game_player.new_map_id != $game_map.map_id

@create_3d = true

end

dai_3d_update_transfer_player
end
#--------------------------------------------------------------------------
# ● 3Dマップスプライトの作成
#--------------------------------------------------------------------------
def create_dai_3d
@spriteset_3d = Spriteset_3D.new if @spriteset_3d == nil
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias dai_3d_update update
def update
dispose_spriteset_3d
@spriteset_3d.update if @spriteset_3d != nil
dai_3d_update
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
alias dai_3d_terminate terminate
def terminate
dai_3d_terminate
@spriteset_3d.dispose if @spriteset_3d != nil
end
#--------------------------------------------------------------------------
# ● 3Dマップスプライトの解放
#--------------------------------------------------------------------------
def dispose_spriteset_3d

unless $game_switches[0001] == true && DAI_3d::MAP_ID.include?($game_map.map_id)
unless @spriteset_3d.nil?
@spriteset_3d.dispose
@spriteset_3d = nil
end
end

end
#--------------------------------------------------------------------------
# ● メッセージウインドウ
#--------------------------------------------------------------------------
def message_window
return @message_window
end

#--------------------------------------------------------------------------
# ● スプライトセット
#--------------------------------------------------------------------------
def spriteset
p "call spriteset"
return @spriteset
end

end

u-kun
記事: 17
登録日時: 2018年4月11日(水) 01:40

Re: RGSS3で落ちる。

投稿記事by u-kun » 2023年12月05日(火) 01:42

Sprite_Baseの33行目で「disposed sprite」のエラーが出ている…のでしょうか?
とりあえず新規プロジェクトに掲載されたスクリプトを導入するとそうなったのでその前提で行くと、
406行目のterminateでdisposeした後に@spriteset_3dをnilにするよう変更してみてください。

コード: 全て選択

alias dai_3d_terminate terminate
def terminate
   dai_3d_terminate
   if @spriteset_3d != nil
      @spriteset_3d.dispose
      @spriteset_3d = nil
   end
end

こんな感じです。

“VX / Ace:質問” へ戻る