赞 | 0 |
VIP | 11 |
好人卡 | 1 |
积分 | 1 |
经验 | 5947 |
最后登录 | 2013-7-22 |
在线时间 | 111 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 111 小时
- 注册时间
- 2012-4-21
- 帖子
- 299
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 晚安世界 于 2012-7-2 15:50 编辑
伪·3D脚本最近出现了建筑物无法显示的问题(注:此脚本并非我原创,我只是告诉大家如何设置其中要显示的建筑物而已,作者发布时并未说明这个问题。)
就是明明已经设置了建筑物,在执行游戏测试时却显示不出来。
解决方法是:
打开数据库——图块。然后调到地形标志——将要显示的建筑改为1
如下
然后就可以正常显示了。
伪3D脚本如下- #克蓝娜德 CNGAMES
- =begin
- 把下面的字符加到你的地图名里面
- [W3D] - 使用伪3D 如果你不填的话 就木有效果
- [#XX] - XX = 叉叉范围是0-89之间 惯例用了我给你的伪3D看到这个是不是有违和感
- [-X] - X = 这个X的范围是0或者1 0为显示两面墙 1为仅显示
- 法线正面的墙(只是个概念伪3D肿么会有法线,也就是正面朝着你的墙)
- 如果你不写[#XX]或者[-X]就会使用默认的
- 默认参数为:
- [#XX] = [#45]
- [-X] = [-1]
- =end
- class Game_System
- alias initialize_W3D initialize
-
- attr_reader :factor
- attr_reader :correct
-
- attr_reader :scroll_y
- attr_reader :distance
- attr_reader :angle
- attr_reader :height
- attr_reader :columns
- attr_reader :filter
- attr_reader :zoom
- attr_accessor :new_zoom
- attr_accessor :hidewalls
- attr_accessor :hide
- attr_accessor :new_angle
- attr_accessor :need_refresh
- attr_accessor :coord
- def initialize
- initialize_W3D
- @zoom = 1.00
- @scroll_y = 256#相机与角色的距离
- @height = 1 #地图原件的高度,建议不要改 除非你做特殊效果
- @columns = 8 #伪3D图块的质量,值为8或者16。如果场景不大可以用16。
- #针对纵面 8的话图块边缘锯齿比较大,流畅。16边缘锯齿较小,卡。
- @filter = 2*32 #纵向墙的高度设定(如果增加高度 不要忘了在上面加上标志)
- @hidewalls = 1 #这个就是默认的双面还是单面墙显示的值,值为0或1。
- @distance = 480#焦距 玩过相机的人都知道 值不要太低,默认为480,不要低于256。
- #焦距值越高看到纵面的墙壁面积就越少,越低看到的墙壁面积就越多。
- @hide = 90#角色与原件距离的Y坐标的值,用于遮挡角色时半透明。
- #一个原件为32像素所以值至少为33 不然低于33 你脸贴到墙上墙都不会管你。
- self.angle = 45 #摄像机角度
- #以上属性均可在游戏中更改,用事件页第三页的脚本调用 格式为:
- #$game_system.(属性) = value(值)
- #举个例子:
- #$game_system.zoom = 1.5 #(1.5为放大150%)
- #或者
- #$game_system.columns = 8
-
- #以下为内部使用,请勿随意更改
- @new_angle = false
- @need_refresh = false
- @new_zoom = false
- @coord = nil
- end
-
- #部分脚本基于Neo Mode07。
- def zoom=(n)
- if @zoom != n
- @new_zoom = true
- end
- @zoom = n
- end
-
- def refresh(x,y)
- @coord = [x,y]
- end
-
- def screen2W3D_y(y)
- y *= @zoom
- return @scroll_y + (@cd * y) / (@distance - y * @sinus)
- end
-
- def screen2map_y(y)
- return ((@distance * (@scroll_y - y) / @zoom /
- (@dif - y * @sinus) + @scroll_y))
- end
-
- def screen2zoom(y)
- return (y * @factor + @correct) * @zoom
- end
-
- def angle=(n)
- @angle = n
- @cosinus = Math.cos(Math::PI * (@angle / 180.0))
- @sinus = Math.sin(Math::PI * (@angle / 180.0))
- @cd = @cosinus * @distance
- @ys = @scroll_y * @sinus
- @dif = @ys - @cd
-
- z0 = @distance / (@distance + @scroll_y * @sinus)
- h0 = (-@distance * @scroll_y * @cosinus) /
- (@distance + @scroll_y * @sinus) + @scroll_y
- @factor = (1.0 - z0) / (@scroll_y - h0)
- @correct = 1.0 - @scroll_y * @factor
- @new_angle = true
- end
-
- def distance=(n)
- @distance = n
- self.angle = @angle
- end
-
- def height=(n)
- @height = n
- @need_refresh = true
- end
-
- def columns=(n)
- @columns = n
- @need_refresh = true
- end
- end
- $data_maps = load_data("Data/MapInfos.rxdata")
- class W3DTilemap
- attr_reader :autotiles
- attr_accessor :tileset
- attr_accessor :priorities
-
- def initialize(vp)
- @viewport = vp
- @horizontal = {}
- @vertical = {}
- @tileset = nil
- @map_data = nil
- @priorities = nil
- @bitmap = Bitmap.new(1,1)
- @sprites = []
- @autotiles = []
- refresh
- end
-
- def refresh(sprites=true)
- @height = $game_system.height
- @columns = $game_system.columns
- @scroll_y = $game_system.scroll_y
- @filter = $game_system.filter
- @ox = -1
- @oy = -1
- if sprites
- w = nil
- @sprites.each{ |w|
- w.dispose}
- @sprites = []
- for i in 0...(@scroll_y / @height)
- @sprites[i] = Sprite.new(@viewport)
- @sprites[i].y = i * @height
- end
- for i in (@scroll_y / @height)...(((480-@scroll_y) / 2 + @scroll_y) /
- @height)
- @sprites[i] = Sprite.new(@viewport)
- @sprites[i].y = i * @height * 2 - @scroll_y
- end
- end
- @sprites.each {|w|
- w.zoom_x = $game_system.screen2zoom(w.y+1)
- if w.zoom_x > 1
- w.zoom_y = w.zoom_x
- end
- w.x = 320
- }
- if sprites
- unless @map_data.nil?
- refresh_bitmap
- end
- end
- end
-
- def terrain=(n)
- @terrain = n
- end
-
- def tileset=(bitmap)
- @tileset = bitmap
- end
-
- def ox=(n)
- return if @ox == n
- @ox = n
- dif = (@oy + @scroll_y)
- ox = n + 320
- w = nil
- i = nil
- a = nil
- z = nil
- erase = nil
-
- @sprites.each{ |w|
- w.ox = ox}
-
- @horizontal.each{ |i, a|
- new_y = $game_system.screen2W3D_y(i - dif)
- z = $game_system.screen2zoom(new_y)
- erase = (a[0].y - 256).between?(1,$game_system.hide)
- a.each{ |w|
- w.x = 320 + z * (w.map_x - ox)
- if erase and 28 >= (ox - w.map_x).abs
- w.opacity = 100
- else
- w.opacity = 255
- end
- }
- }
-
- @vertical.each{ |i, a|
- new_y = $game_system.screen2W3D_y(i - dif)
- z = $game_system.screen2zoom(new_y)
- erase = (a[0].map_y % 6 != 0)
- a.each{ |w|
- if erase and (w.map_x - ox).abs < @filter
- w.jump = true
- w.visible = false
- next
- end
- w.jump = false
- if w.visible
- if w.visible = (ox*w.side >= w.map_x*w.side)
- w.x = 320 + z * (w.map_x - ox)
- end
- elsif w.visible = (ox*w.side >= w.map_x*w.side)
- w.y = new_y
- w.x = 320 + z * (w.map_x - ox)
- w.zoom_y = z
- end
- }
- }
- end
-
- def oy=(n)
- return if @oy == n
- @oy = n
- ox320 = @ox + 320
- dif = (n + @scroll_y)
- w = nil
- i = nil
- a = nil
- z = nil
- mz = nil
- new_y = nil
- erase = nil
-
- @sprites.each{ |w|
- w.src_rect.y = $game_system.screen2map_y(w.y+1).round + @oy
- }
-
- @horizontal.each{ |i, a|
- new_y = $game_system.screen2W3D_y(i - dif)
- z = $game_system.screen2zoom(new_y)
- erase = (a[0].y - 256).between?(1,$game_system.hide)
- a.each{ |w|
- w.y = new_y
- w.x = 320 + (z * (w.map_x - ox320))
- w.zoom_x = (w.zoom_y = z + 0.04)
- if erase and 28 >= (ox320 - w.map_x).abs
- w.opacity = 100
- else
- w.opacity = 255
- end
- }
- }
-
- @vertical.each{ |i, a|
- new_y = $game_system.screen2W3D_y(i - dif)
- z = $game_system.screen2zoom(new_y)
- mz = [z,1].max
- a.each { |w|
- if w.visible
- w.y = new_y
- w.x = 320 + z * (w.map_x - ox320)
- w.zoom_y = z
- w.zoom_x = mz
- end
- }
- }
- end
-
- def map_data=(data)
- @map_data = data
- refresh_bitmap
- end
-
- def refresh_bitmap
- @terrain = $game_map.terrain_tags if @terrain.nil?
- @horizontal.each{ |i, c|
- c.each{ |w|
- w.dispose}}
- @vertical.each{ |i, c|
- c.each{ |w|
- w.dispose}}
- @horizontal.clear
- @vertical.clear
-
- @bitmap.dispose
- @bitmap = Bitmap.new(@map_data.xsize*32,@map_data.ysize*32)
-
- rect = Rect.new(0,0,32,32)
- source = Rect.new(0,0,32,32)
- i = 0
- x = 0
- y = 0
- z = 0
- data = nil
- wall = nil
- for x in 0...@map_data.xsize
- for y in 0...@map_data.ysize
- rect.x = x*32
- rect.y = y*32
- source.x = ((@map_data[x,y,0] - 384) % 8) * 32
- source.y = ((@map_data[x,y,0] - 384) / 8) * 32
- @bitmap.stretch_blt(rect,@tileset,source)
- for z in 0..2
- data = @map_data[x,y,z]
- if @terrain[data] == 2
- if @terrain[@map_data[[x+1,@map_data.xsize-1].min,y,z].to_i] != 2
- for i in 0...@columns
- wall = SWall.new(@viewport,@columns)
- wall.map_x = x * 32 + 32
- wall.map_y = y * 32 + (@columns-i) * 32 / @columns
- wall.bitmap = @tileset
- wall.z = wall.map_y
- wall.side = 1 * $game_system.hidewalls
- wall.set_src(@terrain, data, i)
- wall.ox = 32 / @columns / 2 - 1
- if @vertical.key?(wall.map_y)
- @vertical[wall.map_y].push(wall)
- else
- @vertical[wall.map_y] = [wall]
- end
- end
- end
- if @terrain[@map_data[[x-1,0].max,y,z].to_i] != 2
- for i in 0...@columns
- wall = SWall.new(@viewport,@columns)
- wall.map_x = x * 32
- wall.map_y = y * 32 + (@columns-i) * 32 / @columns
- wall.bitmap = @tileset
- wall.mirror = true
- wall.set_src(@terrain, data, i)
- wall.z = wall.map_y
- wall.side = -1 * $game_system.hidewalls
- wall.ox = 32 / @columns / 2
- if @vertical.key?(wall.map_y)
- @vertical[wall.map_y].push(wall)
- else
- @vertical[wall.map_y] = [wall]
- end
- end
- end
- end
- if @terrain[data] == 1 and
- (y+1 == @map_data.ysize or
- @map_data[x,y+1,z] != data + 8)
- wall = Wall.new(@viewport,1,@map_data)
- wall.map_x = x * 32 + 16
- wall.map_y = y * 32 + 32 + 1
- wall.real_y = y
- wall.bitmap = @tileset
- wall.set_src(@terrain, data)
- wall.ox = 15
- wall.z = wall.map_y
- if @horizontal.key?(wall.map_y)
- @horizontal[wall.map_y].push(wall)
- else
- @horizontal[wall.map_y] = [wall]
- end
- end
- end
- end
- end
- for i in [email protected]
- @sprites[i].bitmap = @bitmap
- @sprites[i].src_rect.set(0,i,@bitmap.width,@height)
- if i >= @scroll_y / @height
- @sprites[i].src_rect.height *= 2
- end
- end
- end
-
- def update
- if $game_system.coord
- x = $game_system.coord[0]
- y = $game_system.coord[1]
- source = Rect.new(0,0,32,32)
- rect = Rect.new(x*32,y*32,32,32)
- for z in 0..2
- if not [1,2].include?(@terrain[@map_data[x,y,z]])
- source.x = ((@map_data[x,y,z] - 384) % 8) * 32
- source.y = ((@map_data[x,y,z] - 384) / 8) * 32
- @bitmap.stretch_blt(rect,@tileset,source)
- end
- end
- $game_system.coord = nil
- end
-
- if $game_system.need_refresh
- $game_system.new_angle = false
- $game_system.need_refresh = false
- refresh
- return
- end
- if $game_system.new_zoom
- $game_system.new_zoom = false
- refresh(false)
- return
- end
- if $game_system.new_angle
- @sprites.each {|w|
- w.zoom_x = $game_system.screen2zoom(w.y+1)
- if w.zoom_x > 1
- w.zoom_y = w.zoom_x
- end
- w.x = 320
- }
- x = @ox
- y = @oy
- @ox += 1
- @oy += 1
- self.ox = x
- self.oy = y
- $game_system.new_angle = false
- end
- end
-
- def dispose
- @horizontal.each{ |i, c|
- c.each{ |w|
- w.dispose}}
- @vertical.each{ |i, c|
- c.each{ |w|
- w.dispose}}
- @sprites.each{ |w|
- w.dispose}
- @bitmap.dispose
- end
- end
- class Wall < Sprite
- attr_accessor :map_x
- attr_accessor :map_y
- attr_accessor :real_y
- attr_accessor :side
- attr_accessor :jump
- attr_accessor :height
- def initialize(vp,spalten,data=nil)
- super(vp)
- @data = data
- @spalten = spalten
- @jump = false
- @real_y = 0
- @map_x = 0
- @map_y = 0
- @side = 0
- self.x = 320
- self.z = 100
- @blick = true
- end
-
- def set_src(terrain,tile,i=0)
- height = 1
- while terrain[tile - height * 8].to_i == 1
- height += 1
- end
- self.src_rect.set(
- ((tile % 8) * 32) + 32 / @spalten * i,
- ((tile - 384) / 8 - height + 1) * 32,
- 32 / @spalten,
- 32 * height)
- self.oy = height * 32 - 1
- @height = height
- end
- end
- class SWall < Wall
- def set_src(terrain,tile,i)
- super
- self.src_rect.height -= 32
- self.oy -= 32
- end
- end
- class Game_Map
- attr_reader :W3D
-
- alias scroll_down_W3D scroll_down
- alias scroll_left_W3D scroll_left
- alias scroll_right_W3D scroll_right
- alias scroll_up_W3D scroll_up
- alias setup_W3D setup
-
- def scroll_down(distance)
- if $game_map.W3D
- @display_y += distance
- else
- scroll_down_W3D(distance)
- end
- end
-
- def scroll_left(distance)
- if $game_map.W3D
- @display_x -= distance
- else
- scroll_left_W3D(distance)
- end
- end
-
- def scroll_right(distance)
- if $game_map.W3D
- @display_x += distance
- else
- scroll_right_W3D(distance)
- end
- end
-
- def scroll_up(distance)
- if $game_map.W3D
- @display_y -= distance
- else
- scroll_up_W3D(distance)
- end
- end
-
- def name
- return $data_maps[@map_id].name
- end
-
- def setup(id)
- setup_W3D(id)
- @W3D = false
- for part in self.name.split("[")
- case part
- when /#(.*)\]/
- $game_system.angle = $1.to_i
- when "W3D]"
- @W3D = true
- when /-(.*)\]/
- $game_system.hidewalls = $1.to_i
- end
- end
- end
- end
- class Game_Character
- alias screen_z_W3D screen_z
- def screen_z(height = 0)
- if $game_map.W3D
- if @always_on_top
- return $game_map.height * 32 + 10
- end
- return @real_y / 4 + 33
- else
- screen_z_W3D(height)
- end
- end
- end
- class Game_Player
- alias center_W3D center
- def center(x, y)
- if $game_map.W3D
- $game_map.display_x = x * 128 - CENTER_X
- $game_map.display_y = y * 128 - CENTER_Y
- else
- center_W3D(x, y)
- end
- end
- end
- class Sprite_Character
- alias update_W3D update
- def update
- update_W3D
- return unless $game_map.W3D
- self.y = $game_system.screen2W3D_y(self.y - $game_system.scroll_y)
- self.zoom_x = self.zoom_y = $game_system.screen2zoom(self.y)
- self.x = 320 + (self.zoom_x * (self.x - 320))
- end
- end
- class Spriteset_Map
- def initialize
- @viewport1 = Viewport.new(0, 0, 640, 480)
- @viewport2 = Viewport.new(0, 0, 640, 480)
- @viewport3 = Viewport.new(0, 0, 640, 480)
- @viewport2.z = 200
- @viewport3.z = 5000
- if $game_map.W3D
- @tilemap = W3DTilemap.new(@viewport1)
- @tilemap.terrain = $game_map.terrain_tags
- else
- @tilemap = Tilemap.new(@viewport1)
- end
- @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
- for i in 0..6
- autotile_name = $game_map.autotile_names[i]
- @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
- end
- @tilemap.map_data = $game_map.data
- @tilemap.priorities = $game_map.priorities
- @panorama = Plane.new(@viewport1)
- @panorama.z = -1000
- @fog = Plane.new(@viewport1)
- @fog.z = 3000
- @character_sprites = []
- for i in $game_map.events.keys.sort
- sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
- @character_sprites.push(sprite)
- end
- @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
- @weather = RPG::Weather.new(@viewport1)
- @picture_sprites = []
- for i in 1..50
- @picture_sprites.push(Sprite_Picture.new(@viewport2,
- $game_screen.pictures[i]))
- end
- @timer_sprite = Sprite_Timer.new
- update
- end
- ###########重定义update 更改远景图更新速度 直接复制默认的 顺着箭头往下走
- def update
- # 远景与现在的情况有差异发生的情况下 ↓
- if @panorama_name != $game_map.panorama_name or# ↓
- @panorama_hue != $game_map.panorama_hue# ↓
- @panorama_name = $game_map.panorama_name# ↓
- @panorama_hue = $game_map.panorama_hue# ↓
- if @panorama.bitmap != nil# ↓
- @panorama.bitmap.dispose# ↓
- @panorama.bitmap = nil# ↓
- end
- if @panorama_name != ""# ↓
- @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
- end
- Graphics.frame_reset# ↓
- end
- # 雾与现在的情况有差异的情况下 ↓
- if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue# ↓
- @fog_name = $game_map.fog_name# ↓
- @fog_hue = $game_map.fog_hue# ↓
- if @fog.bitmap != nil# ↓
- @fog.bitmap.dispose# ↓
- @fog.bitmap = nil# ↓
- end
- if @fog_name != ""
- @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)# ↓
- end
- Graphics.frame_reset# ↓
- end
- # 刷新元件地图
- @tilemap.ox = $game_map.display_x / 4# ↓
- @tilemap.oy = $game_map.display_y / 4# ↓
- @tilemap.update
- # 刷新远景平面# ↓
- @panorama.ox = $game_map.display_x / 8 #这里更改X速度 ←
- @panorama.oy = $game_map.display_y * 0 #这里更改Y速度 ←
- # 刷新雾平面
- @fog.zoom_x = $game_map.fog_zoom / 100.0
- @fog.zoom_y = $game_map.fog_zoom / 100.0
- @fog.opacity = $game_map.fog_opacity
- @fog.blend_type = $game_map.fog_blend_type
- @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
- @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
- @fog.tone = $game_map.fog_tone
- # 刷新角色活动块
- for sprite in @character_sprites
- sprite.update
- end
- # 刷新天候图形
- @weather.type = $game_screen.weather_type
- @weather.max = $game_screen.weather_max
- @weather.ox = $game_map.display_x / 4
- @weather.oy = $game_map.display_y / 4
- @weather.update
- # 刷新图片
- for sprite in @picture_sprites
- sprite.update
- end
- # 刷新计时器块
- @timer_sprite.update
- # 设置画面的色调与震动位置
- @viewport1.tone = $game_screen.tone
- @viewport1.ox = $game_screen.shake
- # 设置画面的闪烁色
- @viewport3.color = $game_screen.flash_color
- # 刷新显示端口
- @viewport1.update
- @viewport3.update
- end
- end
复制代码 下面来两张效果截图:
‘‘──晚安世界于2012-6-9 12:50补充以下内容:
回复的有木有
’’
|
评分
-
查看全部评分
|