dxruby64 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +14 -0
  3. data/README-ja.md +125 -0
  4. data/README.md +120 -0
  5. data/lib/31/dxruby.so +0 -0
  6. data/lib/32/dxruby.so +0 -0
  7. data/lib/33/dxruby.so +0 -0
  8. data/lib/34/dxruby.so +0 -0
  9. data/lib/dxruby.rb +2 -0
  10. data/sample/classic_sample/8_puzzle.rb +55 -0
  11. data/sample/classic_sample/block_destroy.rb +161 -0
  12. data/sample/classic_sample/block_fall.rb +194 -0
  13. data/sample/classic_sample/data.png +0 -0
  14. data/sample/classic_sample/dot.rb +80 -0
  15. data/sample/classic_sample/drawtile.rb +173 -0
  16. data/sample/classic_sample/flight.rb +75 -0
  17. data/sample/classic_sample/hitrangeview.rb +66 -0
  18. data/sample/classic_sample/mapedit.rb +270 -0
  19. data/sample/classic_sample/meiro.rb +106 -0
  20. data/sample/classic_sample/minsample.rb +14 -0
  21. data/sample/classic_sample/race.rb +119 -0
  22. data/sample/classic_sample/readme_sample.txt +42 -0
  23. data/sample/classic_sample/sample.rb +110 -0
  24. data/sample/classic_sample/soundeffect.rb +46 -0
  25. data/sample/new_sample/biyo.rb +25 -0
  26. data/sample/new_sample/image/enemy1.png +0 -0
  27. data/sample/new_sample/image/enemy1bomb.png +0 -0
  28. data/sample/new_sample/image/enemy2.png +0 -0
  29. data/sample/new_sample/image/enemy2bomb.png +0 -0
  30. data/sample/new_sample/image/enemyshot1.png +0 -0
  31. data/sample/new_sample/image/enemyshot2.png +0 -0
  32. data/sample/new_sample/image/maptile.png +0 -0
  33. data/sample/new_sample/image/myship.png +0 -0
  34. data/sample/new_sample/image/myshot.png +0 -0
  35. data/sample/new_sample/iraira.rb +49 -0
  36. data/sample/new_sample/laser2.rb +292 -0
  37. data/sample/new_sample/raycast.rb +249 -0
  38. data/sample/new_sample/readme_sample.txt +27 -0
  39. data/sample/new_sample/rubima.rb +597 -0
  40. data/sample/new_sample/ruby.png +0 -0
  41. data/sample/new_sample/slg.rb +82 -0
  42. data/sample/new_sample/sprite_animation.rb +133 -0
  43. data/sample/new_sample/sprite_collision1.rb +216 -0
  44. data/sample/new_sample/sprite_collision2.rb +93 -0
  45. data/sample/new_sample/sprite_simple.rb +65 -0
  46. data/sample/new_sample2/ImageFont.dat +0 -0
  47. data/sample/new_sample2/ImageFont.dat.png +0 -0
  48. data/sample/new_sample2/autocall.rb +24 -0
  49. data/sample/new_sample2/effecttest.rb +136 -0
  50. data/sample/new_sample2/fibersprite.rb +89 -0
  51. data/sample/new_sample2/hitrange.rb +133 -0
  52. data/sample/new_sample2/hlstest.rb +27 -0
  53. data/sample/new_sample2/mapedit_perlin.rb +291 -0
  54. data/sample/new_sample2/noise.rb +33 -0
  55. data/sample/new_sample2/particle.rb +220 -0
  56. data/sample/new_sample2/readme_sample.txt +29 -0
  57. data/sample/new_sample2/scenetest.rb +200 -0
  58. data/sample/new_sample2/scenetest2.rb +120 -0
  59. data/sample/scroll_sample/map.dat +32 -0
  60. data/sample/scroll_sample/map.rb +77 -0
  61. data/sample/scroll_sample/map_sub.dat +32 -0
  62. data/sample/scroll_sample/mapedit.rb +102 -0
  63. data/sample/scroll_sample/readme_sample.txt +24 -0
  64. data/sample/scroll_sample/scroll1.rb +108 -0
  65. data/sample/scroll_sample/scroll2.rb +149 -0
  66. data/sample/scroll_sample/scroll3.rb +148 -0
  67. data/sample/scroll_sample/simple.rb +13 -0
  68. data/sample/shader_sample/Shader/Flash.rb +93 -0
  69. data/sample/shader_sample/Shader/RasterScroll.rb +71 -0
  70. data/sample/shader_sample/Shader/RgssSprite.rb +143 -0
  71. data/sample/shader_sample/Shader/Transition.rb +108 -0
  72. data/sample/shader_sample/bgimage/BG00a1_80.jpg +0 -0
  73. data/sample/shader_sample/bgimage/BG10a_80.jpg +0 -0
  74. data/sample/shader_sample/bgimage/BG13a_80.jpg +0 -0
  75. data/sample/shader_sample/bgimage/BG32a.jpg +0 -0
  76. data/sample/shader_sample/bgimage/BG42a.jpg +0 -0
  77. data/sample/shader_sample/bgimage/course.png +0 -0
  78. data/sample/shader_sample/bgimage/image1.png +0 -0
  79. data/sample/shader_sample/bgimage/world_map2.png +0 -0
  80. data/sample/shader_sample/fan.rb +53 -0
  81. data/sample/shader_sample/image/enemy1.png +0 -0
  82. data/sample/shader_sample/image/enemy2.png +0 -0
  83. data/sample/shader_sample/image/maptile.png +0 -0
  84. data/sample/shader_sample/readme_sample.txt +43 -0
  85. data/sample/shader_sample/rule//343/203/201/343/202/247/343/203/203/343/202/253/343/203/274.png +0 -0
  86. data/sample/shader_sample/rule//345/217/263/346/270/246/345/267/273/343/201/215.png +0 -0
  87. data/sample/shader_sample/rule//346/250/252/343/203/226/343/203/251/343/202/244/343/203/263/343/203/211.png +0 -0
  88. data/sample/shader_sample/sample_blur.rb +112 -0
  89. data/sample/shader_sample/sample_divide.rb +91 -0
  90. data/sample/shader_sample/sample_flash.rb +54 -0
  91. data/sample/shader_sample/sample_lens.rb +65 -0
  92. data/sample/shader_sample/sample_mapping.rb +50 -0
  93. data/sample/shader_sample/sample_rasterscroll.rb +48 -0
  94. data/sample/shader_sample/sample_rgsssprite.rb +41 -0
  95. data/sample/shader_sample/sample_spehari.rb +50 -0
  96. data/sample/shader_sample/sample_sphere.rb +66 -0
  97. data/sample/shader_sample/sample_transition.rb +62 -0
  98. data/sample/shader_sample/sample_vertexshader.rb +223 -0
  99. data/sample/shader_sample/sample_wingman.rb +47 -0
  100. data/sample/shader_sample/turn_transition.rb +74 -0
  101. metadata +141 -0
@@ -0,0 +1,89 @@
1
+ require 'dxruby'
2
+
3
+ module FiberSprite
4
+ def initialize(x=0,y=0,image=nil)
5
+ super
6
+ @fiber = Fiber.new do
7
+ self.fiber_proc
8
+ end
9
+ end
10
+
11
+ def update
12
+ @fiber.resume
13
+ super
14
+ end
15
+
16
+ def wait(t=1)
17
+ t.times {Fiber.yield}
18
+ end
19
+
20
+ def add_x(x, t=1)
21
+ t.times {self.x += x;Fiber.yield}
22
+ end
23
+
24
+ def add_y(y, t=1)
25
+ t.times {self.y += y;Fiber.yield}
26
+ end
27
+ end
28
+
29
+ class Enemy < Sprite
30
+ include FiberSprite
31
+
32
+ @@image = Image.load_tiles("new_sample/image/enemy2.png", 4, 1)
33
+
34
+ def self.objects=(ary)
35
+ @@objects = ary
36
+ end
37
+
38
+ def initialize(x=0, y=0)
39
+ super(x, y, @@image[0])
40
+ @angle = 90
41
+ end
42
+
43
+ def fire(angle)
44
+ @@objects << Shot.new(self.x+20, self.y+@@image[0].height/2+20, angle)
45
+ @@objects << Shot.new(self.x+108, self.y+@@image[0].height/2+20, angle)
46
+ end
47
+
48
+ def fiber_proc
49
+ loop do
50
+ fire(@angle)
51
+ @angle += 15
52
+ wait 5
53
+ end
54
+ end
55
+ end
56
+
57
+ class Shot < Sprite
58
+ @@image = Image.load("new_sample/image/enemyshot2.png")
59
+
60
+ def self.objects=(ary)
61
+ @@objects = ary
62
+ end
63
+
64
+ def initialize(x=0, y=0, angle=0)
65
+ super(x-@@image.width/2, y-@@image.height/2, @@image)
66
+ @dx = Math.cos(angle / 180.0 * Math::PI) * 3.5
67
+ @dy = Math.sin(angle / 180.0 * Math::PI) * 3.5
68
+ end
69
+
70
+ def update
71
+ self.x += @dx
72
+ self.y += @dy
73
+ if self.x < -@@image.width or self.x > 640 or self.y < -@@image.height or self.y > 480
74
+ vanish
75
+ end
76
+ end
77
+ end
78
+
79
+ objs = []
80
+ Enemy.objects = objs
81
+ Shot.objects = objs
82
+
83
+ objs << Enemy.new(260,160)
84
+
85
+ Window.loop do
86
+ Sprite.update(objs)
87
+ Sprite.draw(objs)
88
+ Sprite.clean(objs)
89
+ end
@@ -0,0 +1,133 @@
1
+ require 'dxruby'
2
+
3
+ module HitRange
4
+ def draw
5
+ super
6
+ if self.visible and self.collision_enable and !self.vanished?
7
+ if @hitrange_image == nil or @hitrange_collision != self.collision or
8
+ @hitrange_image_width != self.image.width or
9
+ @hitrange_image_height != self.image.height
10
+
11
+ @hitrange_image_width = self.image.width
12
+ @hitrange_image_height = self.image.height
13
+
14
+ @hitrange_image.dispose if @hitrange_image != nil
15
+
16
+ color = [255, 255, 255, 0]
17
+ color_fill = [100, 255, 255, 0]
18
+
19
+ if self.collision == nil
20
+ @hitrange_collision = nil
21
+ @hitrange_image = Image.new(self.image.width, self.image.height)
22
+ @hitrange_image.box_fill(0, 0, @hitrange_image.width-1, @hitrange_image.height-1, color_fill)
23
+ @hitrange_image.box(0, 0, @hitrange_image.width-1, @hitrange_image.height-1, color)
24
+ @hitrange_x = @hitrange_y = 0
25
+ else
26
+ @hitrange_collision = []
27
+ self.collision.each do |v|
28
+ if v === Array
29
+ @hitrange_collision << v.dup
30
+ else
31
+ @hitrange_collision << v
32
+ end
33
+ end
34
+ temp = self.collision
35
+ temp = [temp] if temp[0].class != Array
36
+
37
+ x1 = y1 = 0
38
+ x2 = y2 = 0
39
+ temp.each do |col|
40
+ case col.size
41
+ when 2 # point
42
+ x1 = [x1, col[0]].min
43
+ y1 = [y1, col[1]].min
44
+ x2 = [x2, col[0]].max
45
+ y2 = [y2, col[1]].max
46
+ when 3 # circle
47
+ x1 = [x1, col[0] - col[2]].min
48
+ y1 = [y1, col[1] - col[2]].min
49
+ x2 = [x2, col[0] + col[2]].max
50
+ y2 = [y2, col[1] + col[2]].max
51
+ when 4 # box
52
+ x1 = [x1, col[0], col[2]].min
53
+ y1 = [y1, col[1], col[3]].min
54
+ x2 = [x2, col[0], col[2]].max
55
+ y2 = [y2, col[1], col[3]].max
56
+ when 6 # triangle
57
+ x1 = [x1, col[0], col[2], col[4]].min
58
+ y1 = [y1, col[1], col[3], col[5]].min
59
+ x2 = [x2, col[0], col[2], col[4]].max
60
+ y2 = [y2, col[1], col[3], col[5]].max
61
+ end
62
+ end
63
+
64
+ @hitrange_image = Image.new(x2 - x1 + 1, y2 - y1 + 1)
65
+ @hitrange_x = x = x1
66
+ @hitrange_y = y = y1
67
+
68
+ temp.each do |col|
69
+ case col.size
70
+ when 2 # point
71
+ @hitrange_image[col[0] - x, col[1] - y] = color
72
+ when 3 # circle
73
+ @hitrange_image.circle_fill(col[0] - x, col[1] - y, col[2], color_fill)
74
+ @hitrange_image.circle(col[0] - x, col[1] - y, col[2], color)
75
+ when 4 # box
76
+ @hitrange_image.box_fill(col[0] - x, col[1] - y, col[2] - x, col[3] - y, color_fill)
77
+ @hitrange_image.box(col[0] - x, col[1] - y, col[2] - x, col[3] - y, color)
78
+ when 6 # triangle
79
+ @hitrange_image.triangle_fill(col[0] - x, col[1] - y, col[2] - x, col[3] - y, col[4] - x, col[5] - y, color_fill)
80
+ @hitrange_image.triangle(col[0] - x, col[1] - y, col[2] - x, col[3] - y, col[4] - x, col[5] - y, color)
81
+ end
82
+ end
83
+
84
+ end
85
+ end
86
+
87
+ hash = {}
88
+ if self.collision_sync
89
+ hash[:scale_x] = self.scale_x
90
+ hash[:scale_y] = self.scale_y
91
+ hash[:center_x] = self.center_x - @hitrange_x
92
+ hash[:center_y] = self.center_y - @hitrange_y
93
+ hash[:angle] = self.angle
94
+ end
95
+ hash[:z] = self.z + 1
96
+
97
+ ox = oy = 0
98
+ if self.offset_sync
99
+ ox = self.center_x
100
+ oy = self.center_y
101
+ end
102
+
103
+ target = self.target ? self.target : Window
104
+
105
+ target.draw_ex(self.x - ox + @hitrange_x, self.y - oy + @hitrange_y, @hitrange_image, hash)
106
+ end
107
+ end
108
+ end
109
+
110
+
111
+
112
+ if __FILE__ == $0
113
+ class TestSprite < Sprite
114
+ include HitRange
115
+ end
116
+
117
+ s = TestSprite.new(100,100)
118
+ s.image = Image.new(100,100,C_BLUE)
119
+ s.offset_sync=true
120
+ s.center_x = 0
121
+ s.center_y = 0
122
+
123
+ y = 90
124
+ Window.loop do
125
+ y += Input.y
126
+ s.collision = [10,10,90,0,50,y]
127
+ s.angle += 1
128
+ s.draw
129
+ end
130
+ end
131
+
132
+
133
+
@@ -0,0 +1,27 @@
1
+ require 'dxruby'
2
+
3
+ image = Image.load("./shader_sample/bgimage/BG10a_80.jpg")
4
+ Window.width, Window.height = 800, 600
5
+ Window.mag_filter = TEXF_POINT
6
+
7
+ hue = 0
8
+ luminance = 0
9
+ saturation = 0
10
+
11
+ Window.loop do
12
+ hue += Input.y*5
13
+ saturation += Input.x
14
+ if Input.key_down?(K_Z)
15
+ luminance -= 1
16
+ end
17
+ if Input.key_down?(K_X)
18
+ luminance += 1
19
+ end
20
+
21
+ img = image.change_hls(hue, luminance, saturation)
22
+ img.delayed_dispose
23
+ Window.draw(0,0,img)
24
+ end
25
+
26
+
27
+
@@ -0,0 +1,291 @@
1
+ #!ruby -Ks
2
+ # DXRuby 簡易マップエディタ
3
+ require 'dxruby'
4
+
5
+ # マップデータ
6
+ map=[
7
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
8
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
9
+ [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
10
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
11
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1],
12
+ [0, 0, 0, 0, 1, 4, 4, 4, 4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 1, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1],
13
+ [2, 2, 2, 2, 1, 1, 4, 4, 4, 4, 0, 0, 0, 0, 0, 4, 4, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 3, 1, 1, 1, 1],
14
+ [2, 2, 2, 1, 2, 1, 1, 4, 4, 4, 4, 0, 0, 0, 0, 4, 4, 4, 1, 1, 1, 1, 3, 3, 3, 3, 1, 3, 1, 3, 1, 1],
15
+ [2, 2, 2, 1, 1, 1, 1, 1, 4, 4, 4, 0, 0, 0, 0, 0, 4, 4, 1, 1, 1, 1, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1],
16
+ [2, 2, 2, 2, 2, 2, 1, 1, 4, 4, 4, 0, 0, 0, 0, 0, 4, 4, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 1],
17
+ [1, 2, 2, 2, 2, 2, 2, 1, 4, 4, 4, 0, 0, 0, 0, 0, 4, 4, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1],
18
+ [1, 1, 1, 2, 2, 1, 2, 1, 4, 4, 4, 0, 0, 0, 0, 0, 4, 4, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3],
19
+ [1, 1, 2, 1, 2, 2, 1, 4, 4, 4, 0, 0, 0, 0, 0, 0, 4, 4, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3],
20
+ [1, 1, 1, 2, 2, 1, 4, 4, 4, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3],
21
+ [1, 1, 1, 2, 1, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3],
22
+ [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3],
23
+ [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1],
24
+ [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 4, 1, 4, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
25
+ [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
26
+ [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 4, 4, 4, 4, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
27
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 4, 4, 4, 4, 4, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1],
28
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
29
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 4, 4, 4, 1, 4, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1],
30
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 4, 4, 4, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1],
31
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0],
32
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0],
33
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 0, 0, 0],
34
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0],
35
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0],
36
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
37
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
38
+ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]
39
+ ]
40
+ takasa=[
41
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
42
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
43
+ [3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
44
+ [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
45
+ [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3],
46
+ [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 3, 3, 3, 3, 3],
47
+ [4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 3, 3, 3, 3],
48
+ [4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 7, 7, 8, 7, 3, 3, 3],
49
+ [4, 3, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 6, 7, 8, 8, 6, 3, 3],
50
+ [3, 6, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5, 6, 6, 8, 9, 6, 5, 3],
51
+ [4, 5, 3, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 5, 6, 6, 8, 7, 6, 6, 3],
52
+ [3, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 6, 5],
53
+ [3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5, 6, 6, 6, 5],
54
+ [3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5],
55
+ [3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5],
56
+ [3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5],
57
+ [3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4],
58
+ [3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 4],
59
+ [3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 4],
60
+ [3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 3],
61
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3],
62
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3],
63
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3],
64
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3],
65
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2],
66
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2],
67
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2],
68
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2],
69
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
70
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
71
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
72
+ [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3]
73
+ ]
74
+ Image.perlin_seed(1.hash)
75
+
76
+ 32.times do |y|
77
+ 32.times do |x|
78
+ c = Image.octave_perlin_noise(x / 32.0, y / 32.0, 20.5, 8, 0.8)
79
+ t = ((c-0.5) * 60 + 6).to_i
80
+ takasa[y][x] = t
81
+ map[y][x] = t < 4 ? 4 : (t > 7 ? 3 : (t == 4 ? 4 : 1))
82
+ map[y][x] = t == 7 ? 2 : map[y][x]
83
+ end
84
+ end
85
+
86
+ # 絵のデータを作る
87
+ mapimage = Array.new(5) {Image.new(32, 32)}
88
+ for i in 0..7 do # ひし形に地面を描く
89
+ mapimage[0].line(15 - i * 2, i + 16, 16 + i * 2, i + 16, [100, 100, 200]) # 水
90
+ mapimage[0].line(15 - i * 2, 31 - i, 16 + i * 2, 31 - i, [100, 100, 200])
91
+ mapimage[0][15 - i * 2, i + 16] = [0, 0, 0]
92
+ mapimage[0][16 + i * 2, i + 16] = [0, 0, 0]
93
+ for j in 1..3 do
94
+ mapimage[j].line(15 - i * 2, i + 16, 16 + i * 2, i + 16, [50, 200, 50]) # 平地
95
+ mapimage[j].line(15 - i * 2, 31 - i, 16 + i * 2, 31 - i, [50, 200, 50])
96
+ mapimage[j][15 - i * 2, i + 16] = [0, 0, 0]
97
+ mapimage[j][16 + i * 2, i + 16] = [0, 0, 0]
98
+ end
99
+ mapimage[4].line(15 - i * 2, i + 16, 16 + i * 2, i + 16, [200, 200, 150]) # 砂地
100
+ mapimage[4].line(15 - i * 2, 31 - i, 16 + i * 2, 31 - i, [200, 200, 150])
101
+ mapimage[4][15 - i * 2, i + 16] = [0, 0, 0]
102
+ mapimage[4][16 + i * 2, i + 16] = [0, 0, 0]
103
+ end
104
+ mapimage[2].boxFill(13, 16, 18, 26, [200, 50, 50]) # 木
105
+ mapimage[2].line(13, 16, 13, 26, [0, 0, 0])
106
+ mapimage[2].line(18, 16, 18, 26, [0, 0, 0])
107
+ mapimage[2].circleFill(16, 8, 8, [0, 255, 0])
108
+ mapimage[2].circle(16, 8, 8, [0, 0, 0])
109
+ for i in 1..24 do # 山
110
+ mapimage[3].line(15 - i*2/4, i, 16 + i*2/4, i, [200, 100, 100])
111
+ mapimage[3][15 - i*2/4, i] = [0, 0, 0]
112
+ mapimage[3][16 + i*2/4, i] = [0, 0, 0]
113
+ end
114
+ # 地面のサイド画像を作る
115
+ sideimage = Array.new(5) {Image.new(32, 16)}
116
+ for i in 0..15 do
117
+ sideimage[0].line(i, i / 2, i, i / 2 + 8, [60, 60, 180]) # 水
118
+ sideimage[0].line(31 - i, i / 2, 31 - i, i / 2 + 8, [130, 130, 200])
119
+ for j in 1..3 do
120
+ sideimage[j].line(i, i / 2, i, i / 2 + 8, [40, 150, 40]) # 水以外
121
+ sideimage[j].line(31 - i, i / 2, 31 - i, i / 2 + 8, [100, 220, 100])
122
+ end
123
+ sideimage[4].line(i, i / 2, i, i / 2 + 8, [150, 150, 120]) # 砂地
124
+ sideimage[4].line(31 - i, i / 2, 31 - i, i / 2 + 8, [220, 220, 170])
125
+ end
126
+ wakuimage = Image.new(36, 36, [255, 255, 255]). # 選択枠
127
+ boxFill(2, 2, 33, 33, [0, 0, 0])
128
+ blackimage = Image.new(128, 480, [0, 0, 0]) # 右側背景
129
+
130
+ select = 0
131
+
132
+ # クリック位置判定関数
133
+ def check(x, y, map, takasa)
134
+ # 手前から検索するために逆順
135
+ 31.downto(0) do |i|
136
+ 31.downto(0) do |j|
137
+ # ひし形の中にあるかを調べる
138
+ if ((j * 16 - i * 16 + 176 - x)/2).abs + (j * 8 + i * 8 - takasa[i][j]*8 + 24 - y).abs < 9 then
139
+ return [i, j]
140
+ end
141
+ end
142
+ end
143
+ return nil
144
+ end
145
+
146
+ # メインループ
147
+ Window.loop do
148
+
149
+ # マウスクリック
150
+ if Input.mouseDown?(M_LBUTTON) or Input.mouseDown?(M_RBUTTON) then
151
+ x, y = Input.mousePosX, Input.mousePosY
152
+ if x >= 512 then # 右のほうなら
153
+ for i in 0..mapimage.size-1
154
+ if x >= 560 and x < 592 and y >= i * 64 + 64 and y < i * 64 + 96 then
155
+ select = i
156
+ break
157
+ end
158
+ end
159
+ else # 左のほうなら
160
+ if x > 0 and y > 0 and y < 480 then
161
+ if Input.keyDown?(K_LSHIFT) then
162
+ if Input.mousePush?(M_LBUTTON) then # シフト左クリックで地面を上げる
163
+ temp = check(x, y, map, takasa)
164
+ if temp != nil then
165
+ takasa[temp[0]][temp[1]] += 1 if takasa[temp[0]][temp[1]] < 10
166
+ end
167
+ end
168
+ if Input.mousePush?(M_RBUTTON) then # シフト右クリックで地面を下げる
169
+ temp = check(x, y, map, takasa)
170
+ if temp != nil then
171
+ takasa[temp[0]][temp[1]] -= 1 if takasa[temp[0]][temp[1]] > 0
172
+ end
173
+ end
174
+ else
175
+ if Input.mouseDown?(M_LBUTTON) then # 左クリックはマップチップセット
176
+ temp = check(x, y, map, takasa)
177
+ if temp != nil then
178
+ map[temp[0]][temp[1]] = select
179
+ end
180
+ end
181
+ if Input.mouseDown?(M_RBUTTON) then # 右クリックでスポイト機能
182
+ temp = check(x, y, map, takasa)
183
+ if temp != nil then
184
+ select = map[temp[0]][temp[1]]
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+
192
+ # カーソルキーの左右
193
+ if Input.keyPush?(K_RIGHT) then # 右回転
194
+ map = map.transpose
195
+ takasa = takasa.transpose
196
+ map.each do |d|
197
+ d.reverse!
198
+ end
199
+ takasa.each do |d|
200
+ d.reverse!
201
+ end
202
+ end
203
+ if Input.keyPush?(K_LEFT) then # 左回転
204
+ 3.times do
205
+ map = map.transpose
206
+ takasa = takasa.transpose
207
+ map.each do |d|
208
+ d.reverse!
209
+ end
210
+ takasa.each do |d|
211
+ d.reverse!
212
+ end
213
+ end
214
+ end
215
+
216
+ # マップ全体描画
217
+ for i in 0..30 do
218
+ for j in 0..30 do
219
+ z = 0
220
+ tmp = takasa[i][j]
221
+ if takasa[i][j+1] < tmp or takasa[i+1][j] < tmp then
222
+ tmp2 = takasa[i][j+1] > takasa[i+1][j] ? takasa[i+1][j] : takasa[i][j+1]
223
+ z = tmp2 * 8
224
+ (tmp - tmp2).times do # 高さ分、サイド画像を描画するループ
225
+ Window.draw(j * 16 - i * 16 + 160, j * 8 + i * 8 - z + 16, sideimage[map[i][j]])
226
+ z = z + 8
227
+ end
228
+ else
229
+ z = takasa[i][j] * 8
230
+ end
231
+ Window.draw(j * 16 - i * 16 + 160, j * 8 + i * 8 - z, mapimage[map[i][j]])
232
+ if takasa[i][j] < 4
233
+ Window.draw_alpha(j * 16 - i * 16 + 160, j * 8 + i * 8 - 32, mapimage[0], 192)
234
+ end
235
+ end
236
+ end
237
+ for i in 0..31 do
238
+ z = 0
239
+ takasa[i][31].times do # 高さ分、サイド画像を描画するループ
240
+ Window.draw(31 * 16 - i * 16 + 160, 31 * 8 + i * 8 - z + 16, sideimage[map[i][31]])
241
+ z = z + 8
242
+ end
243
+ Window.draw(31 * 16 - i * 16 + 160, 31 * 8 + i * 8 - z, mapimage[map[i][31]])
244
+ if takasa[i][31] < 4
245
+ Window.draw_alpha(31 * 16 - i * 16 + 160, 31 * 8 + i * 8 - 32, mapimage[0], 192)
246
+ end
247
+ end
248
+ for j in 0..31 do
249
+ z = 0
250
+ takasa[31][j].times do # 高さ分、サイド画像を描画するループ
251
+ Window.draw(j * 16 - 31 * 16 + 160, j * 8 + 31 * 8 - z + 16, sideimage[map[31][j]])
252
+ z = z + 8
253
+ end
254
+ Window.draw(j * 16 - 31 * 16 + 160, j * 8 + 31 * 8 - z, mapimage[map[31][j]])
255
+ if takasa[31][j] < 4
256
+ Window.draw_alpha(j * 16 - 31 * 16 + 160, j * 8 + 31 * 8 - 32, mapimage[0], 192)
257
+ end
258
+ end
259
+
260
+ # 右側背景描画
261
+ Window.draw(512, 0, blackimage)
262
+
263
+ # 選択枠描画
264
+ Window.draw(558, select * 64 + 62, wakuimage)
265
+
266
+ # マップチップ描画
267
+ mapimage.each_with_index do |m, i|
268
+ Window.draw(560, i * 64 + 64, m)
269
+ end
270
+
271
+ # 画面データクリア
272
+ if Input.keyPush?(K_C) then
273
+ map = Array.new(32) { [1] * 32 }
274
+ takasa = Array.new(32) { [3] * 32 }
275
+ end
276
+
277
+ # マップデータ出力
278
+ if Input.keyPush?(K_ESCAPE) then
279
+ s1 = "map=[\n"
280
+ s2 = "takasa=[\n"
281
+ for i in 0..30 do
282
+ s1 = s1 + map[i].inspect + ",\n"
283
+ s2 = s2 + takasa[i].inspect + ",\n"
284
+ end
285
+ s1 = s1 + map[31].inspect + "\n]\n"
286
+ s2 = s2 + takasa[31].inspect + "\n]\n"
287
+ print s1
288
+ print s2
289
+ break
290
+ end
291
+ end
@@ -0,0 +1,33 @@
1
+ require 'dxruby'
2
+
3
+ Window.width = 300
4
+ Window.height = 300
5
+
6
+ bg = Image.new(300,300,C_BLUE)
7
+ image = Image.new(300,900)
8
+ repeat_x = 3
9
+ repeat_y = 9
10
+ octave = 5
11
+ subsistence = 0.4
12
+ w = 1/image.width.to_f*repeat_x
13
+ h = 1/image.height.to_f*repeat_y
14
+
15
+ Image.perlin_seed(1.hash)
16
+
17
+ image.height.times do |y|
18
+ image.width.times do |x|
19
+ c = (Image.octave_perlin_noise(x*w,
20
+ y*h,
21
+ 1, octave, subsistence, repeat_x, repeat_y) * 255 - 70) * 2.2
22
+ image[x, y] = [c>255?255:c, 255, 255, 255] if c>0
23
+ end
24
+ end
25
+ y = 0
26
+ Window.loop do
27
+ Window.draw(0,0,bg)
28
+ Window.draw_tile(0,0,[[0]], [image], nil, y, nil, nil)
29
+ y-=5
30
+ break if Input.key_push?(K_ESCAPE)
31
+ end
32
+
33
+