Dear visitor, welcome to RPG Studio - Make your World real. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.
Quoted
Bei 20*15 1-Tile Sprites sind es aber 300 und nicht 2500? Oder überlagerst du die Sprites zusätzlich?
...? Ähm? XD°
Script häng unten dran.
Dachte alle Sprites außerhalb des Bildschirms werden gelöscht? Dadurch dürfte es nicht langsamer werden, als im normalen Spielverlauf? ><
Mit dem Eventcode rufe ich auf einer 50*50-Map immer eine 50er-Reihe Sprite auf:
@>Control Variables: [0001 <Variable>] = 0
@>Loop
_@>Script: a=$game_map.static_object
_: ______: a[$game_variables[3]].setup_til(
_: ______: $game_variables[1],
_: ______: $game_variables[2],
_: ______: :bottom_left,1,32,64,32,32
_: ______: )
_: ______: a[$game_variables[3]].set_graphic(
_: ______: "001-Grassland01")
_@>Control Variables: [0001 <Variable>] += 1
_@>Control Variables: [0003 <Variable>] += 1
_@>Conditional Branch: Variable [0001 <Variable>] == 49
__@>Control Variables: [0002 <Variable>] += 1
__@>Break Loop
__@>
_: Branch End
_@>
: Repeate Above
Das dann 50 mal, dann hat man recht viele Sprite auf der Map, die aber alle nichts bedeuten sollten, solange sie außerhalb des Bildschirms sind.
...dachte ich zumindest XD
Hatte das geschrieben, bevor ich deinen Post gesehen habe:
Habs jetzt so gelößt, funktioniert aber nur für das exakte Gras-Tile XD
Ist aber nicht so schlimm, weil ichs nur für das Grastile brauche. Alle anderen Frucht-Tiles sind exakt 32px breit.
![]() |
Ruby Source code |
1 2 3 4 5 |
elsif @object.anchor == :bottom_mid # Gras self.ox = self.src_rect.width / 2 self.x = ((map_x *126 - $game_map.display_x + 3) / 4) + middlewidth self.oy = self.src_rect.height self.y = ((map_y * 128 - $game_map.display_y + 3) / 4) -@tileheight + 32 + self.src_rect.height |
Falls da einer trotzdem drübergucken mag, gerne XD
Okay, Screens sind angehangen.
Das Grastile wackelt, wenn man drübergeht und es soll mit der Spitze den Spieler überdecken (Prio 0) :)
Aufruf:
![]() |
Ruby Source code |
1 2 3 4 5 6 |
a=$game_map.static_object a[22].setup_til( 16,12,:bottom_mid,0,184,512,48,64 ) a[22].set_graphic( "001-Grassland01") |
Script:
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 |
#============================================================================== # ** Static Object #------------------------------------------------------------------------------ # Ein Sprite, der an einer Stelle einer bestimmten Map geladen wird (kann ein # Tileset-Tile sein oder ein Picture) und dort verbleibt und manipuliert # (angle, opacity) werden kann #============================================================================== #============================================================================== # ** Map_Objekt #============================================================================== class Map_Object #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_reader :map_x attr_reader :map_y attr_reader :anchor attr_reader :priority attr_reader :graphic attr_accessor :opacity attr_reader :angle attr_reader :hue attr_reader :tilestx attr_reader :tilesety attr_reader :tilewidth attr_reader :tileheight attr_reader :pic #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize @map_x = 0 @map_y = 0 @anchor = :top_left @priority = 0 @opacity = 255 @angle = 0 @hue = 0 @graphic = "" @tilestx = 0 @tilesety = 0 @tilewidth = 0 @tileheight = 0 @pic = true end #-------------------------------------------------------------------------- # * Setup Picture # # mapx = Starttile des Bildes X # mapy = Starttile des Bildes Y # anchor = Startpunkt des Bildes (oben links, unten links) # piority = Priority des Bildes (1-5, je nach Tilehöhe) #-------------------------------------------------------------------------- def setup_pic( mapx, mapy, anchor, priority, pic=true ) @map_x = mapx @map_y = mapy @anchor = anchor @priority = priority @pic = pic end #-------------------------------------------------------------------------- # * Setup Tileset # # mapx = Starttile des Bildes X # mapy = Starttile des Bildes Y # anchor = Startpunkt des Bildes (oben links, unten links) # piority = Priority des Bildes (1-5, je nach Tilehöhe) # tilesetx = Startpunkt des Ausschnitts im Tileset x (Pixel) # tilesety = Startpunkt des Ausschnitts im Tileset y (Pixel) # tilewidth = Wieviele Pixel breit # tileheight = Wieviele Pixel hoch #-------------------------------------------------------------------------- def setup_til( mapx, mapy, anchor, priority, tilestx, tilesety, tilewidth, tileheight, pic=false ) @map_x = mapx @map_y = mapy @anchor = anchor @priority = priority @tilestx = tilestx @tilesety = tilesety @tilewidth = tilewidth @tileheight = tileheight @pic = pic end #-------------------------------------------------------------------------- # * Set Graphic # # name :Name der Grafik (Tileset oder Picture) #-------------------------------------------------------------------------- def set_graphic( name ) @graphic = name end #-------------------------------------------------------------------------- # * Screen-Berechnung #-------------------------------------------------------------------------- SCREEN_WIDTH = 640 SCREEN_HEIGHT = 480 #-------------------------------------------------------------------------- # * Start_X #-------------------------------------------------------------------------- def start_x # X-Koordinate des linken Objektrandes in Pixeln: return map_x * 32 end #-------------------------------------------------------------------------- # * Start_Y #-------------------------------------------------------------------------- def start_y # Y-Koordinate des oberen Objektrandes in Pixeln: if anchor == :top_left return map_y * 32 else return map_y * 32 - tileheight + 32 end end #-------------------------------------------------------------------------- # * Screen_Visible? #-------------------------------------------------------------------------- def screen_visible? # Ist der Sprite auf dem Bildschirm sichtbar? return false if graphic.empty? screen_x = start_x - ($game_map.display_x + 3) / 4 return false if screen_x >= SCREEN_WIDTH || (screen_x + tilewidth) <= 0 screen_y = start_y - ($game_map.display_y + 3) / 4 return false if screen_y >= SCREEN_HEIGHT || (screen_y + tileheight) <= 0 return true end end #============================================================================== # ** Game_Map #============================================================================== class Game_Map #-------------------------------------------------------------------------- # * Static_Object #-------------------------------------------------------------------------- def static_object # wenn beim ersten Aufruf von $game_map.static_object der Array noch nicht # mit Werten gefüllt ist, fülle ihn erst mit Start-Werten auf if @static_object == nil @static_object = [] for i in 0..2499 @static_object[i] = Map_Object.new() end end # gib den Array zurück return @static_object end end #============================================================================== # ** Object_Sprite #============================================================================== class Object_Sprite < Sprite attr_reader :already_tilted #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(viewport, map_object) super(viewport) @object = map_object @already_tilted = false if @object.opacity < 255 self.opacity = 100 end update end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update super #-------------------------------------------------------------------------- # Methode Abbrechen, wenn Grafik leer #-------------------------------------------------------------------------- if @object.graphic == "" self.bitmap = nil return # <- Brich die Methode an dieser Stelle ab end # Werte festlegen und errechnen @graphic_name = @object.graphic @tilestx = @object.tilestx @tilesety = @object.tilesety @tilewidth = @object.tilewidth @tileheight = @object.tileheight self.angle = @object.angle opacity = @object.opacity map_x = @object.map_x map_y = @object.map_y map_y2 = @object.map_y -1 map_z = @object.priority middlewidth = @tilewidth / 2 tile_ox = map_x+(middlewidth/32) # Opacity; wenn der Spieler unter dem Sprite ist (nur Bäume und Dächer [top_left) if @object.anchor == :top_left if $game_player.x >= map_x && $game_player.x <= map_x + (@tilewidth / 32) - 1 && $game_player.y >= map_y && $game_player.y <= map_y2 + (@tileheight / 32) - 1 opacity = 100 @object.opacity = opacity else opacity = 255 @object.opacity = opacity end end # Opacity; wenn die Opacity sich ändert if self.opacity > @object.opacity self.opacity -= 10 end if self.opacity < @object.opacity self.opacity += 10 end # Setup; je nachdem welches Setup gewählt wurde if @graphic_name != "" if @object.pic == true self.bitmap = RPG::Cache.picture(@graphic_name) elsif @object.pic == false self.bitmap = RPG::Cache.tileset( @graphic_name ) self.src_rect.set( @tilestx, @tilesety, @tilewidth, @tileheight) end else self.bitmap = nil end # Anchor; je nachdem welcher anchor gewählt wurde if @object.anchor == :top_left # Bäume, Dächer self.x = (map_x * 128 - $game_map.display_x + 3) / 4 self.y = (map_y * 128 - $game_map.display_y + 3) / 4 elsif @object.anchor == :bottom_left # Feldfrüchte self.ox = self.src_rect.width / 2 self.x = ((map_x * 128 - $game_map.display_x + 3) / 4) + middlewidth self.oy = self.src_rect.height self.y = ((map_y * 128 - $game_map.display_y + 3) / 4) -@tileheight + 32 + self.src_rect.height elsif @object.anchor == :bottom_mid # Gras self.ox = self.src_rect.width / 2 self.x = ((map_x *126 - $game_map.display_x + 3) / 4) + middlewidth self.oy = self.src_rect.height self.y = ((map_y * 128 - $game_map.display_y + 3) / 4) -@tileheight + 32 + self.src_rect.height end # Priority, je nachdem welche Priority gewählt wurde if map_z == 0 self.z = self.y + 16 elsif map_z == 1 self.z = self.y + 16 +32 elsif map_z == 2 self.z = self.y + 16 +64 elsif map_z == 3 self.z = self.y + 16 +96 elsif map_z == 4 self.z = self.y + 16 +128 elsif map_z == 5 self.z = self.y + 16 +160 elsif map_z == 6 self.z = self.y + 16 +192 end # Tilt; wenn getiltet wird (nur Gras und Feldfrüchte [bottom_left, bottom_mid] if @object.anchor == :bottom_left || :bottom_mid if @tilt_frames and not @tilt_frames.empty? self.angle = @tilt_frames.shift self.angle += 360 while self.angle < 0 self.angle %= 360 else if !@already_tilted && $game_player.x == tile_ox && $game_player.y == map_y @already_tilted = true # <- Für das nächste Update speichern dass der Sprite schon getiltet wurde case $game_player.direction when 2 then self.tilt_left when 4 then self.tilt_left when 6 then self.tilt_right when 8 then self.tilt_right end end end if @already_tilted && ($game_player.x != tile_ox || $game_player.y != map_y) @already_tilted = false # <- Wenn der Spieler das Feld (wieder) verlassen hat setze die Variable zurück. end end end #def #-------------------------------------------------------------------------- # * Tilt #-------------------------------------------------------------------------- def tilt_left @tilt_frames = [5,10,20,15,10,5,0,-5,-10,0] end def tilt_right @tilt_frames = [-5,-10,-20,-15,-10,-5,0,5,10,0] end end #============================================================================== # ** Spriteset_Map #============================================================================== class Spriteset_Map attr_accessor :map_object_sprites attr_reader :viewport1 alias_method( :aliased_initialize_method, :initialize ) alias_method( :aliased_update_method, :update ) alias_method( :aliased_dispose_method, :dispose ) #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize @map_object_sprites = [] aliased_initialize_method if $game_switches[16] == true for i in 0...$game_map.static_object.length sprite = Object_Sprite.new(@viewport1, $game_map.static_object[i]) @map_object_sprites.push(sprite) end end end #-------------------------------------------------------------------------- # * Dispose #-------------------------------------------------------------------------- def dispose # Nur noch Sprites löschen die noch existieren: for sprite in @map_object_sprites if sprite sprite.dispose end end aliased_dispose_method end #-------------------------------------------------------------------------- # * Update #-------------------------------------------------------------------------- def update for i in 0...@map_object_sprites.length object = $game_map.static_object[i] # Überprüfe ob das Objekt sichtbar sein soll: if object.screen_visible? # Sprite soll angezeigt werden: # - Erstelle einen neuen Sprite falls der alte gelöscht wurde: if !@map_object_sprites[i] @map_object_sprites[i] = Object_Sprite.new(@viewport1, object) end # - Aktualisiere den Sprite @map_object_sprites[i].update else # Sprite soll nicht angezeigt werden: # - Lösche den alten Sprite falls er noch existiert: if @map_object_sprites[i] @map_object_sprites[i].dispose @map_object_sprites[i] = nil end end end # Ursprüngliche Update-Methode: aliased_update_method end end #============================================================================== # ** Interpreter #============================================================================== class Interpreter #-------------------------------------------------------------------------- # * change_opacity # id :ID des objektes # wert :Opacity-Wert #-------------------------------------------------------------------------- def change_opacity(id, wert) static_object = $game_map.static_object if static_object[id].opacity != wert static_object[id].opacity = wert end return true end #-------------------------------------------------------------------------- # * tilt_character # id :ID des objektes # dir :Richtung des tiltens #-------------------------------------------------------------------------- def tilt_character(id, dir='left') #print("tilt_character ", id, ", ", dir) char = get_character(id) if char spriteset = $scene.instance_variable_get(:@spriteset) map_object_sprites = spriteset.instance_variable_get(:@map_object_sprites) sprite = map_object_sprites[ id ] case $game_player.direction when 2 then sprite.tilt_left when 4 then sprite.tilt_left when 6 then sprite.tilt_right when 8 then sprite.tilt_right end end return true end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- alias_method( :aliased_update_method, :update ) def update aliased_update_method end end #============================================================================== # ** Scene_Map #============================================================================== class Scene_Map attr_reader :spriteset end |
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
This post has been edited 1 times, last edit by "Josey" (Sep 7th 2019, 1:36pm)
Quoted
Bei 20*15 1-Tile Sprites sind es aber 300 und nicht 2500? Oder überlagerst du die Sprites zusätzlich?
...? Ähm? XD°
Script häng unten dran.
Dachte alle Sprites außerhalb des Bildschirms werden gelöscht? Dadurch dürfte es nicht langsamer werden, als im normalen Spielverlauf? ><
Mit dem Eventcode rufe ich auf einer 50*50-Map immer eine 50er-Reihe Sprite auf:
@>Control Variables: [0001 <Variable>] = 0
@>Loop
_@>Script: a=$game_map.static_object
_: ______: a[$game_variables[3]].setup_til(
_: ______: $game_variables[1],
_: ______: $game_variables[2],
_: ______: :bottom_left,1,32,64,32,32
_: ______: )
_: ______: a[$game_variables[3]].set_graphic(
_: ______: "001-Grassland01")
_@>Control Variables: [0001 <Variable>] += 1
_@>Control Variables: [0003 <Variable>] += 1
_@>Conditional Branch: Variable [0001 <Variable>] == 49
__@>Control Variables: [0002 <Variable>] += 1
__@>Break Loop
__@>
_: Branch End
_@>
: Repeate Above
Das dann 50 mal, dann hat man recht viele Sprite auf der Map, die aber alle nichts bedeuten sollten, solange sie außerhalb des Bildschirms sind.
...dachte ich zumindest XD
Ahh, wir reden also über eine 50*50 Map. Gut, dann kommen wir auf 2500.
Also, dein Code ist etwas unglücklich. Wenn ich den so übernehme, stockt es wie blöd weil er sich durch deinen Code verschluckt

Ich war so frei und habe die Variable 3 als Index für das Array der Objekte genommen. Variable 1 und 2 sind x und y Koordinaten.
Eine ordentliche Event Lösung sieht so aus:
Die 49 habe beispielsweise genommen, weil 50*50 Map. Damit es flexibler ist, wäre hier eine Condition über Script mit
![]() |
Ruby Source code |
1 |
$game_map.width - 1 |
![]() |
Ruby Source code |
1 |
$game_map.height - 1 |
Noch mal probieren und staunen.
Was lernen wir daraus? Für diese Art von Iteration direkt zu RGSS greifen, ist viiiieeel schneller als der Interpreter. Ach ja... in beiden Fällen läuft es bei mir flüssig mit ca. 38 FPS. Die Sprites außerhalb des Bildschirms werden auch sauber entfernt. Darfst du aber gerne selber nachvollziehen. Gehe dafür in Zeile 120 und ersetze den Block für screen_visible? damit:
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#-------------------------------------------------------------------------- # * Screen_Visible? #-------------------------------------------------------------------------- def screen_visible? # Ist der Sprite auf dem Bildschirm sichtbar? return false if graphic.empty? range = 1 screen_x = start_x - ($game_map.display_x + 3) / 4 return false if screen_x >= SCREEN_WIDTH - range * 32 || (screen_x + tilewidth) <= range * 32 screen_y = start_y - ($game_map.display_y + 3) / 4 return false if screen_y >= SCREEN_HEIGHT - range * 32 || (screen_y + tileheight) <= range * 32 return true end end |
Mit range stellst du ein, wie viele Tiles vom Bildschirmrand weg die Sichtbarkeit beeinflusst wird.
This post has been edited 2 times, last edit by "schM0ggi" (Sep 8th 2019, 4:00pm)
Ich hab das nur gebastelt, um zu schauen, ab wann die FPS runtergehen, deswegen hab ich immer nur eine Reihe auf einmal aufgerufen, und hab zugesehen, wie die FPS runtergehen XD
Ich hab tatsächlich aber auch auf einer normalen Map mit wenigen Events schwankend FPS von 32-39 Oo
Das ist nicht normal, oder?
Wenn ich die 2500 Sprites aufgerufen habe, dann gibt er mir schwankend zwischen 15-25 FPS aus, vermutlich weil das Script ständig aufruft, welche Sprites zu sehen sind?
Selbst wenn ich bei range 64 einstelle, zeigt mir F2 nur 30FPS.
Aber zumindest hab ichs jetzt gesehen, tatsächlich, die Sprites werden gelöscht und hergestellt, kuhl XD
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
Der XP Maker läuft ohne Änderung mit 40 FPS.
Das heißt, in meinem Fall laufen Games in der Regel
mit 39/40 FPS, es sei denn ein Projekt hat ein Knick im Code.
Ein frisches Projekt mit deinem Script, auf einer 50*50 Map und einem Array
mit 2500 Objekten und den zusätzlichen Sprites, wobei ja nur die
gezeichnet und aktualisiert werden, welche auch sichtbar sind, läuft mit 38/39 FPS.
Ich habe auch selber getestet und geschaut wann die FPS langsam runter gehen.
Dazu habe ich die Abfrage für die Sichtbarkeit ausgeschaltet und ihn alles aktualisieren lassen.
Ab 400-500 Sprites stürzen die FPS ab bis zur Unspielbarkeit, je mehr Sprites dazu kommen.
Möglicherweise hast du andere Scripte und Event Code, wo was nicht rund läuft.
Am Besten ein frisches Projekt öffnen und nach und nach jedes System dazu nehmen und beobachten.
Ich gehe jetzt mal nicht davon aus, dass du einen uralt PC hast.
Ich hab zur Sicherheit mal alle Events gelöscht, außer das, dass ich brauchte.
Dadurch bekam ich zumidnest 36-39 FPS.
Ist mein Laptop zu alt? XD
Danke fürs probieren :)
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
Die ganzen Events sind von früheren Tests übrig.
Also meistens hab ich da so 36-39 FPS
Sobald ich den Aluxes oben links (der am linken Rand) zweimal angeklickt habe, und die 2500 Sprites da sind, gehts runter auf um die 20 FPS.
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
Okay, dann danke bis hierhin, ich hab glaub ich alles, was ich brauche. Jetzt baue ich das ins System und schau, obs funktioniert XD
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
Im Moment werden die Sprites zwar gelöscht, aber alle Map-Objekte werden bisher immernoch mit jedem Frame darauf überprüft ob sie auf dem Bildschirm sind und einen Sprite brauchen (in der Spriteset_Map - update Methode). An der Stelle lässt sich die Lösung definitiv noch optimieren.
Eine einfache Möglichkeit wäre seltener zu prüfen, zum Beispiel nur wenn sich die Karte um ein weiteres Tile bewegt hat. Dafür bräuchtest du zusätzliche Variablen in Spriteset_Map um deine alte Position zu speichern und sie mit der aktuellen Position zu vergleichen.
Allerdings müsstest du auch die Methode anpassen die bestimmt ob ein Objekt in Sichtweite ist (screen_visible? in deiner Map_Object Klasse) und die Bereichsabfrage um einen entsprechenden Puffer ergänzen.
Eine weitere Möglichkeit wäre die Map-Objekte in irgendeiner Form vorzusortieren, sodass nicht jedes Objekt einzeln geprüft werden muss.
Eine Möglichkeit wäre etwa eine Tabelle anzulegen um deine Map-Objekte auf einzelne Kartenabschnitte aufzuteilen. Spriteset_Map müsste dann nur die Objekte in den sichtbaren Kartenabschnitten überprüfen.
Deine Map_Object - Klasse würde damit vermutlich etwas komplexer, da du mit jedem Koordinaten/Größenwechsel eines Objekts auch die Tabelle aktualisieren müsstest.
(Leider im Moment keine ausführlichere Erklärung zur Hand, hoffe es hilft trotzdem irgendwem irgendwie

Wird bei Bedarf noch ergänzt.

Die erste Methode hilft da vermutlich wenig, weil die Ruckler ja eh in Bewegung auftauchen. Aber die zweite Methode interessiert mich und klingt umsetzbar:
Die Map-Objekte haben feste Orte. So wäre Sprite1 immer an Koordinate 8/4, Sprite 2 bei 9/4, Sprite 3 bei 10/4, usw. Wenn dort grad kein Baum oder Gras wächst, bleibt der Sprite leer. Das ganze ist als sauberes Gitter aufgebaut, also unter 1 kommt 76, dann 151, usw (das Raster ist 75 Tiles breit, nicht alle davon können besetzt werden, abr ein sauberes Raster ist leichter zu kontrollieren)
Hilft das irgendwie? XD
Das mit dem Größenwechsel verstehe ich noch nicht. Die Sprite sind nicht immer gleich groß, meinst du das?
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
Hatte eig. nur versucht eine einfache Tabelle umzusetzen, leider ist das Ganze ein bischen explodiert...
Die Lösung ist leider bisher auch noch nicht wirklich optimal, aber grundsätzlich sollte sie funktionieren.
Leider ist sie vermutlich auch ein bischen groß geworden um sie gerade schnell in einem Post zu erklären. Das Script enthält ein paar Kommentare wozu die einzelnen Abschnitte gedacht sind, aber für eine genauere Erklärung müsste ich nochmal darauf zurück kommen (hoffentlich diesmal nicht mit über einer Woche Verspätung

Teil 1:
- Änderungen an deinen schon bestehenden Klassen. Die Map-Objekt-Klasse hat weiterhin die (neuen) Methoden start_x und start_y, die die Position des oberen-linken Pixels deines Map-Objekts angeben. Wenn du irgendwann mal weitere Werte für "anchor" einbaust müsstest du diese Methoden vermutlich nochmal anpassen damit das Script die Objekte richtig einordnet.
- Die static_object - Methode aus deinem Script wurde minimal erweitert und ersetzt.
- Die Methoden aus der Spriteset_Map - Klasse wurden nochmal ersetzt.
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
class Map_Object # - Erweiterte Methoden für die Map-Objekte: # Alle Methoden die die Position/Größe des Sprites verändern können müssen # nun auch die Objekt-Tabelle aktualisieren. # Dazu gehört auch set_graphic, da Objekte mit leerer Grafik wie # "nicht vorhanden" behandelt werden können. alias_method(:setup_pic_aliased_for_objecttable, :setup_pic) def setup_pic(*args) setup_pic_aliased_for_objecttable(*args) update_object_table_placement end alias_method(:setup_til_aliased_for_objecttable, :setup_til) def setup_til(*args) setup_til_aliased_for_objecttable(*args) update_object_table_placement end alias_method(:set_graphic_aliased_for_objecttable, :set_graphic) def set_graphic(*args) set_graphic_aliased_for_objecttable(*args) update_object_table_placement end # - Neue Methoden für die Map-Objekte: # Erlaubt das Zuweisen einer Objekt-Tabelle in die sich das Map-Objekt # eintragen kann um das Aussortieren zu erleichtern. # - update_object_table_placement dient dazu die Position des Map-Objekts # in der Tabelle zu aktualisieren. # - start_x und start_y bestimmen die Position des oberen linken Pixels # des Objekts auf der Map. Muss bei Bedarf angepasst werden. # - bounds fasst Position und Größe in einem Rechteck zusammen. Dieses # bestimmt wann ein Objekt als "im Bildschirmbereich" erkannt wird. def object_table=(table) @object_table.remove(self) if @object_table @object_table = table update_object_table_placement end def update_object_table_placement return unless @object_table graphic.empty? ? @object_table.remove(self) : @object_table.place(self) end def bounds return Rect.new(start_x, start_y, tilewidth, tileheight) end def start_x # X-Koordinate des linken Objektrandes in Pixeln: return map_x * 32 end def start_y # Y-Koordinate des oberen Objektrandes in Pixeln: if anchor == :top_left return map_y * 32 else return map_y * 32 - tileheight + 32 end end end class Game_Map # - Geänderte static_object - Methode. # Wenn ein neues Map-Objekt erstellt wird wird ihm nun auch die # Objekt-Tabelle zugewiesen in die es sich eintragen kann. # - Die Map verwaltet nun neben dem Array mit Map-Objekten auch eine # zugehörige Map-Objekt-Tabelle um Objekte schneller zu finden. # @object_table ||= Map_Object_Table.new # hat hier einen ähnlichen Effekt wie # if !@object_table # @object_table = Map_Object_Table.new # end # und erstellt die Tabelle sobald sie das erste Mal benötigt wird. def static_object # wenn beim ersten Aufruf von $game_map.static_object der Array noch nicht # mit Werten gefüllt ist, fülle ihn erst mit Start-Werten auf if @static_object == nil @static_object = [] for i in 0..2499 @static_object[i] = Map_Object.new() @static_object[i].object_table = self.object_table end end # gib den Array zurück return @static_object end def object_table @object_table ||= Map_Object_Table.new end end class Spriteset_Map # - Geänderte Spriteset-Methoden: # Die bereits geänderten Methoden im Spriteset wurden nocheinmal # überarbeitet. Die Map-Objekt-Sprites werden nun in einem eigenen # Spriteset verwaltet. (Dieser Schritt ist nicht unbedingt notwendig, # das was nun Spriteset_MapObjects tut könnte man auch in die # Spriteset_Map - Klasse integrieren) def initialize aliased_initialize_method @map_objects = Spriteset_MapObjects.new(@viewport1) end def update aliased_update_method @map_objects.update if @map_objects end def dispose aliased_dispose_method @map_objects.dispose if @map_objects end end |
Teil 2:
Ich bin mir noch nicht sicher wie gut/schlecht der Code ist, hatte jedenfalls nicht wirklich gut geplant...
Der Teil enthält zusätzliche neue Hilfsklassen und Methoden.
Der Code ist vermutlich ein bischen unübersichtlich, aber wenn das Script im Grunde funktioniert kann man ja nochmal darauf zurückkommen. Leider nur seehr grobe Kommentare welcher Teil für was benutzt wird, kann bei Bedarf später nochmal ausführlicher schreiben wie der Code funktioniert (sofern man ihn nicht lieber ersetzen mag).

![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
# - Map-Objekt-Tabelle: # Diese Klasse bietet Methoden für ein (hoffentlich) schnelleres Auswählen # der Map-Objekte in einem beliebigen Kartenausschnitt: # - Die Methoden place / remove aktualisieren die Position eines # Objekts oder löschen es aus der Tabelle. # - Mit objects_in_area können alle Objekte erfasst werden die sich etwa # im Bildschirmbereich befinden. # - Mit exclusive_objects können alle Objekte erfasst werden die in einem # Bereich neu hinzugekommen/verschwunden sind wenn sich der Bildschirmbereich # nur wenig bewegt hat. class Map_Object_Table def initialize(section_size = 128) @sections = [] @object_bounds = {} @section_size = section_size @mod_count = 0 end def on_change @mod_count += 1 end def iterate_sections(rect) sx1 = rect.x / @section_size sx2 = (rect.x + rect.width - 1) / @section_size sy1 = rect.y / @section_size sy2 = (rect.y + rect.height - 1) / @section_size sx1.upto(sx2) { |sx| sy1.upto(sy2) { |sy| @sections[sx] ||= [] @sections[sx][sy] ||= [] yield @sections[sx][sy] } } end def added_objects_in_slice(slice, rest) return objects_in_area(slice).select { |object| !@object_bounds[object].overlap?(rest) } end def version return @mod_count end def clear return if @object_bounds.empty? @sections.clear @object_bounds.clear on_change end def place(object) remove(object) bounds_rect = object.bounds return unless bounds_rect @object_bounds[object] = bounds_rect iterate_sections(bounds_rect) { |section| section.push(object) } on_change end def remove(object) bounds_rect = @object_bounds[object] return unless bounds_rect @object_bounds.delete(object) iterate_sections(bounds_rect) { |section| section.delete(object) } on_change end def objects_in_area(rect) result = [] iterate_sections(rect) { |section| result.concat(section) } return result.uniq.select { |object| @object_bounds[object].overlap?(rect) } end def exclusive_objects(new_rect, old_rect) if !new_rect.overlap?(old_rect) return added_objects_in_slice(new_rect, old_rect) else result = [] rest = new_rect if rest.x < old_rect.x left_slice, rest = rest.cut_horizontally(old_rect.x) result.concat(added_objects_in_slice(left_slice, rest)) end if rest.end_x > old_rect.end_x rest, right_slice = rest.cut_horizontally(old_rect.end_x) result.concat(added_objects_in_slice(right_slice, rest)) end if rest.y < old_rect.y top_slice, rest = rest.cut_vertically(old_rect.y) result.concat(added_objects_in_slice(top_slice, rest)) end if rest.end_y > old_rect.end_y rest, bottom_slice = rest.cut_vertically(old_rect.end_y) result.concat(added_objects_in_slice(bottom_slice, rest)) end return result end end end # - Spriteset_MapObjects # Diese Klasse übernimmt die Funktion von Spriteset_Map wenn es um das # Verwalten der Object-Sprites geht. # - update aktualisiert alle sichtbaren Sprites (und erstellt/löscht) # - dispose löscht alle Sprites wenn die Map verlassen wird. class Spriteset_MapObjects def initialize(viewport) @viewport = viewport @sprites = {} refresh_object_sprites end def object_table $game_map.object_table end def visible_area x = $game_map.display_x / 4 - (@viewport ? @viewport.ox : 0) y = $game_map.display_y / 4 - (@viewport ? @viewport.oy : 0) w = @viewport ? @viewport.rect.width : 640 h = @viewport ? @viewport.rect.height : 480 return Rect.new(x, y, w, h) end def refresh_object_sprites if @last_version != object_table.version @last_version = object_table.version @last_area = visible_area old_objects = @sprites.keys new_objects = object_table.objects_in_area(@last_area) dispose_sprites(old_objects - new_objects) create_sprites(new_objects - old_objects) elsif @last_area != visible_area new_area = visible_area dispose_sprites(object_table.exclusive_objects(@last_area, new_area)) create_sprites(object_table.exclusive_objects(new_area, @last_area)) @last_area = new_area end end def dispose_sprites(objects) objects.each { |object| @sprites[object].dispose if @sprites[object] @sprites.delete(object) } end def create_sprites(objects) objects.each { |object| @sprites[object] ||= Object_Sprite.new(@viewport, object) } end def update refresh_object_sprites @sprites.each_value { |sprite| sprite.update } end def dispose @sprites.each_value { |sprite| sprite.dispose } end end # - Rect # Die Rect-Klasse fasst eine Startposition, Breite und Höhe in einem Objekt # zusammen. Sie wird hier um ein paar Methoden erweitert um im Rest des # Skripts ein paar Zeilen zu sparen: # - overlap? bestimmt ob sich zwei Rechtecke überlagern (zum Beispiel # der Bereich eines Map-Objekts und der Bildschirmbereich) # - end_x / end_y bestimmen die (ausschließliche) Endpositionen des Rechtecks # - cut_horizontally / cut_vertically teilen ein Rechteck an einer # gegebenen Position in zwei Teile auf. (Wird in der Map-Objekt-Tabelle # in exclusive_objects verwendet um die Unterschiede zwischen den zwei # Bereichen herauszufiltern) class Rect def overlap?(rect) return rect.x < end_x && rect.end_x > x && rect.y < end_y && rect.end_y > y end def end_x x + width end def end_y y + height end def cut_horizontally(position) cut_x = (position < x) ? x : (position > end_x) ? end_x : position rect1 = Rect.new(x, y, cut_x - x, height) rect2 = Rect.new(cut_x, y, end_x - cut_x, height) return rect1, rect2 end def cut_vertically(position) cut_y = (position < y) ? y : (position > end_y) ? end_y : position rect1 = Rect.new(x, y, width, cut_y - y) rect2 = Rect.new(x, cut_y, width, end_y - cut_y) return rect1, rect2 end end |
This post has been edited 4 times, last edit by "Irrlicht" (Sep 24th 2019, 12:24pm)
Die FPS brechen gar nicht mehr ein! :D Das Spiel läuft flüssig, auch mit 2500 Sprites! Das verändert alles! *______________* SO VIELE MÖGLICHKEITEN!!!
Vielen Dank! :D
Ich hab start_y kontrolliert, auch mit dem neuen Anchor "bottom_mid" passt der.
Aber ich hab gesehen, dass ich meinen Sprite doch noch umstellen muss, weil es das ganze Tile sein sollte, sonst habe ich einen schwarzen Rand. Ich kriegs nicht hin, dass immer schön mittig gesetzt wird, egal, wie breit das Tile ist. Kannst du mir da bei der Berechnung helfen? ><
Das ist der neue Anchor (bottom_mid):
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Anchor; je nachdem welcher anchor gewählt wurde if @object.anchor == :top_left # Bäume, Dächer self.x = (map_x * 128 - $game_map.display_x + 3) / 4 self.y = (map_y * 128 - $game_map.display_y + 3) / 4 elsif @object.anchor == :bottom_left # Feldfrüchte self.ox = self.src_rect.width / 2 self.x = ((map_x * 128 - $game_map.display_x + 3) / 4) + middlewidth self.oy = self.src_rect.height self.y = ((map_y * 128 - $game_map.display_y + 3) / 4) -@tileheight + 32 + self.src_rect.height elsif @object.anchor == :bottom_mid # Gras self.ox = self.src_rect.width / 2 # [Was kommt hierhin? ><] self.x = ((map_x * 128 - $game_map.display_x + 3) / 4) #[Was kommt hierhin? :<] self.oy = self.src_rect.height self.y = ((map_y * 128 - $game_map.display_y + 3) / 4) -@tileheight + 32 + self.src_rect.height end |
Ich habe einiges ausprobiert. Wenn ich self.x = ((map_x * 128 - $game_map.display_x + 3) / 4) + middlewidth - 32 schreibe, ist das Gras zwar an der richtigen Stelle, aber das ist auch nicht dynamisch.
Also, was ich versuche:
Egal wie breit oder hoch der Sprite ist, wenn ich sage x = 5 und y = 5 dann soll die unterste Mitte auf 5/5 liegen (wenn der Sprite zB 96*64 ist, wie das Gras, soll es so aussehen, wie im Anhang, das gelbe Kreuz ist die Koordinate die ich angebe)
Ich komm nicht klar, da was dynamisches zu machen, dass jeden Sprite an die Position rückt. ._.
Edit: Der Tilt ist nochmal ein anderes Thema, das krieg ich hin XD
Ich glaub ich habs, guckt mal bitte einer? @_@
Zeile 275 und 328ff
Ab Zeile 383 hab ich noch am Tilt-Anchor rumgespielt (das "Orginal" ist drüber). So passt das für mein Spiel gut, denke ich. Das Oeginal behalte ich aber noch, falls ichs später doch noch brauche.
Zeile 255, Switch eingefügt
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 |
#============================================================================== # ** Static Object #------------------------------------------------------------------------------ # Ein Sprite, der an einer Stelle einer bestimmten Map geladen wird (kann ein # Tileset-Tile sein oder ein Picture) und dort verbleibt und manipuliert # (angle, opacity) werden kann # Danke an Irrlicht, Playm und schM0ggi! Ohne euch, wär das nix geworden! #============================================================================== #============================================================================== # ** Map_Objekt #============================================================================== class Map_Object #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_reader :map_x attr_reader :map_y attr_reader :anchor attr_reader :priority attr_reader :graphic attr_accessor :opacity attr_reader :angle attr_reader :hue attr_reader :tilestx attr_reader :tilesety attr_reader :tilewidth attr_reader :tileheight attr_reader :pic # - Erweiterte Methoden für die Map-Objekte (setup/set): # Alle Methoden die die Position/Größe des Sprites verändern können, müssen # nun auch die Objekt-Tabelle aktualisieren. # Dazu gehört auch set_graphic, da Objekte mit leerer Grafik wie # "nicht vorhanden" behandelt werden können. #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize @map_x = 0 @map_y = 0 @anchor = :top_left @priority = 0 @opacity = 255 @angle = 0 @hue = 0 @graphic = "" @tilestx = 0 @tilesety = 0 @tilewidth = 0 @tileheight = 0 @pic = true end #-------------------------------------------------------------------------- # * Setup Picture # # mapx = Starttile des Bildes X # mapy = Starttile des Bildes Y # anchor = Startpunkt des Bildes (oben links, unten links) # piority = Priority des Bildes (1-5, je nach Tilehöhe) #-------------------------------------------------------------------------- def setup_pic( mapx, mapy, anchor, priority, pic=true ) @map_x = mapx @map_y = mapy @anchor = anchor @priority = priority @pic = pic end alias_method(:setup_pic_aliased_for_objecttable, :setup_pic) def setup_pic(*args) setup_pic_aliased_for_objecttable(*args) update_object_table_placement end #-------------------------------------------------------------------------- # * Setup Tileset # # mapx = Starttile des Bildes X # mapy = Starttile des Bildes Y # anchor = Startpunkt des Bildes (oben links, unten links) # piority = Priority des Bildes (1-5, je nach Tilehöhe) # tilesetx = Startpunkt des Ausschnitts im Tileset x (Pixel) # tilesety = Startpunkt des Ausschnitts im Tileset y (Pixel) # tilewidth = Wieviele Pixel breit # tileheight = Wieviele Pixel hoch #-------------------------------------------------------------------------- def setup_til( mapx, mapy, anchor, priority, tilestx, tilesety, tilewidth, tileheight, pic=false ) @map_x = mapx @map_y = mapy @anchor = anchor @priority = priority @tilestx = tilestx @tilesety = tilesety @tilewidth = tilewidth @tileheight = tileheight @pic = pic end alias_method(:setup_til_aliased_for_objecttable, :setup_til) def setup_til(*args) setup_til_aliased_for_objecttable(*args) update_object_table_placement end #-------------------------------------------------------------------------- # * Set Graphic # # name :Name der Grafik (Tileset oder Picture) #-------------------------------------------------------------------------- def set_graphic( name ) @graphic = name end alias_method(:set_graphic_aliased_for_objecttable, :set_graphic) def set_graphic(*args) set_graphic_aliased_for_objecttable(*args) update_object_table_placement end #-------------------------------------------------------------------------- # * Screen-Berechnung #-------------------------------------------------------------------------- SCREEN_WIDTH = 640 SCREEN_HEIGHT = 480 #-------------------------------------------------------------------------- # * Object_Table # Erlaubt das Zuweisen einer Objekt-Tabelle in die sich das Map-Objekt # eintragen kann um das Aussortieren zu erleichtern. #-------------------------------------------------------------------------- def object_table=(table) @object_table.remove(self) if @object_table @object_table = table update_object_table_placement end #-------------------------------------------------------------------------- # * Update_Object_Table_Placement # update_object_table_placement dient dazu die Position des Map-Objekts # in der Tabelle zu aktualisieren. #-------------------------------------------------------------------------- def update_object_table_placement return unless @object_table graphic.empty? ? @object_table.remove(self) : @object_table.place(self) end #-------------------------------------------------------------------------- # * Bounds # bounds fasst Position und Größe in einem Rechteck zusammen. Dieses # bestimmt wann ein Objekt als "im Bildschirmbereich" erkannt wird. #-------------------------------------------------------------------------- def bounds return Rect.new(start_x, start_y, tilewidth, tileheight) end #-------------------------------------------------------------------------- # * Start_X # start_x und start_y bestimmen die Position des oberen linken Pixels # des Objekts auf der Map. Muss bei Bedarf angepasst werden. #-------------------------------------------------------------------------- def start_x # X-Koordinate des linken Objektrandes in Pixeln: return map_x * 32 end #-------------------------------------------------------------------------- # * Start_Y # start_x und start_y bestimmen die Position des oberen linken Pixels # des Objekts auf der Map. Muss bei Bedarf angepasst werden. #-------------------------------------------------------------------------- def start_y # Y-Koordinate des oberen Objektrandes in Pixeln: if anchor == :top_left return map_y * 32 else return map_y * 32 - tileheight + 32 end end #-------------------------------------------------------------------------- # * Screen_Visible? #-------------------------------------------------------------------------- def screen_visible? # Ist der Sprite auf dem Bildschirm sichtbar? return false if graphic.empty? screen_x = start_x - ($game_map.display_x + 3) / 4 return false if screen_x >= SCREEN_WIDTH || (screen_x + tilewidth) <= 0 screen_y = start_y - ($game_map.display_y + 3) / 4 return false if screen_y >= SCREEN_HEIGHT || (screen_y + tileheight) <= 0 return true end end #============================================================================== # ** Game_Map #============================================================================== class Game_Map #-------------------------------------------------------------------------- # * Static_Object # Wenn ein neues Map-Objekt erstellt wird wird ihm nun auch die # Objekt-Tabelle zugewiesen in die es sich eintragen kann. #-------------------------------------------------------------------------- def static_object # wenn beim ersten Aufruf von $game_map.static_object der Array noch nicht # mit Werten gefüllt ist, fülle ihn erst mit Start-Werten auf if @static_object == nil @static_object = [] for i in 0..2499 @static_object[i] = Map_Object.new() @static_object[i].object_table = self.object_table end end # gib den Array zurück return @static_object end #-------------------------------------------------------------------------- # * Object_Table # Die Map verwaltet nun neben dem Array mit Map-Objekten auch eine # zugehörige Map-Objekt-Tabelle um Objekte schneller zu finden. # @object_table ||= Map_Object_Table.new # hat hier einen ähnlichen Effekt wie # if !@object_table # @object_table = Map_Object_Table.new # end # und erstellt die Tabelle sobald sie das erste Mal benötigt wird. #-------------------------------------------------------------------------- def object_table @object_table ||= Map_Object_Table.new end end #============================================================================== # ** Object_Sprite #============================================================================== class Object_Sprite < Sprite attr_reader :already_tilted #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(viewport, map_object) super(viewport) @object = map_object @already_tilted = false if @object.opacity < 255 self.opacity = 100 end update end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update super #-------------------------------------------------------------------------- # Methode Abbrechen, wenn Grafik leer #-------------------------------------------------------------------------- if @object.graphic == "" || $game_switches[16] == false self.bitmap = nil return # <- Brich die Methode an dieser Stelle ab end #-------------------------------------------------------------------------- # Werte festlegen und errechnen #-------------------------------------------------------------------------- @graphic_name = @object.graphic @tilestx = @object.tilestx @tilesety = @object.tilesety @tilewidth = @object.tilewidth @tileheight = @object.tileheight self.angle = @object.angle opacity = @object.opacity map_x = @object.map_x map_y = @object.map_y map_y2 = @object.map_y -1 map_z = @object.priority middlewidth = @tilewidth / 2 wert_für_mid = @tilewidth / 32 # tile_ox = map_x+(middlewidth/32) #-------------------------------------------------------------------------- # Opacity; wenn der Spieler unter dem Sprite ist # (nur Bäume und Dächer [top_left) #-------------------------------------------------------------------------- if @object.anchor == :top_left if $game_player.x >= map_x && $game_player.x <= map_x + (@tilewidth / 32) - 1 && $game_player.y >= map_y && $game_player.y <= map_y2 + (@tileheight / 32) - 1 opacity = 100 @object.opacity = opacity else opacity = 255 @object.opacity = opacity end end #-------------------------------------------------------------------------- # Opacity; wenn die Opacity sich ändert #-------------------------------------------------------------------------- if self.opacity > @object.opacity self.opacity -= 10 end if self.opacity < @object.opacity self.opacity += 10 end #-------------------------------------------------------------------------- # Setup; je nachdem welches Setup gewählt wurde #-------------------------------------------------------------------------- if @graphic_name != "" if @object.pic == true self.bitmap = RPG::Cache.picture(@graphic_name) elsif @object.pic == false self.bitmap = RPG::Cache.tileset( @graphic_name ) self.src_rect.set( @tilestx, @tilesety, @tilewidth, @tileheight) end else self.bitmap = nil end #-------------------------------------------------------------------------- # Anchor; je nachdem welcher anchor gewählt wurde #-------------------------------------------------------------------------- if @object.anchor == :top_left # Bäume, Dächer self.x = (map_x * 128 - $game_map.display_x + 3) / 4 self.y = (map_y * 128 - $game_map.display_y + 3) / 4 elsif @object.anchor == :bottom_left # ? self.ox = self.src_rect.width / 2 self.x = ((map_x * 128 - $game_map.display_x + 3) / 4) + middlewidth self.oy = self.src_rect.height self.y = ((map_y * 128 - $game_map.display_y + 3) / 4) -@tileheight + 32 + self.src_rect.height elsif @object.anchor == :bottom_mid # Gras + Feldfrüchte self.ox = self.src_rect.width / 2 a = self.ox/wert_für_mid self.x = ((map_x * 128 - $game_map.display_x + 3) / 4) + a self.oy = self.src_rect.height self.y = ((map_y * 128 - $game_map.display_y + 3) / 4) -@tileheight + 32 + self.src_rect.height $game_variables[21] = map_x $game_variables[22] = map_y $game_variables[23] = self.x $game_variables[24] = self.y end #-------------------------------------------------------------------------- # Priority, je nachdem welche Priority gewählt wurde #-------------------------------------------------------------------------- if map_z == 0 self.z = self.y + 16 elsif map_z == 1 self.z = self.y + 16 +32 elsif map_z == 2 self.z = self.y + 16 +64 elsif map_z == 3 self.z = self.y + 16 +96 elsif map_z == 4 self.z = self.y + 16 +128 elsif map_z == 5 self.z = self.y + 16 +160 elsif map_z == 6 self.z = self.y + 16 +192 end #-------------------------------------------------------------------------- # Tilt; wenn getiltet wird (nur Gras und Feldfrüchte [bottom_left, bottom_mid] #-------------------------------------------------------------------------- # if @object.anchor == :bottom_left # if @tilt_frames and not @tilt_frames.empty? # self.angle = @tilt_frames.shift # self.angle += 360 while self.angle < 0 # self.angle %= 360 # else # if !@already_tilted && $game_player.x == tile_ox && $game_player.y == map_y # @already_tilted = true # <- Für das nächste Update speichern dass der Sprite schon getiltet wurde # case $game_player.direction # when 2 then self.tilt_left # when 4 then self.tilt_left # when 6 then self.tilt_right # when 8 then self.tilt_right # end # end # end # if @already_tilted && ($game_player.x != tile_ox || $game_player.y != map_y) # @already_tilted = false # <- Wenn der Spieler das Feld (wieder) verlassen hat setze die Variable zurück. # end # end if @object.anchor == :bottom_mid || @object.anchor == :bottom_left if @tilt_frames and not @tilt_frames.empty? self.angle = @tilt_frames.shift self.angle += 360 while self.angle < 0 self.angle %= 360 else if !@already_tilted && $game_player.x == map_x && $game_player.y == map_y @already_tilted = true # <- Für das nächste Update speichern dass der Sprite schon getiltet wurde case $game_player.direction when 2 then self.tilt_left when 4 then self.tilt_left when 6 then self.tilt_right when 8 then self.tilt_right end end end if @already_tilted && ($game_player.x != map_x || $game_player.y != map_y) @already_tilted = false # <- Wenn der Spieler das Feld (wieder) verlassen hat setze die Variable zurück. end end end #def #-------------------------------------------------------------------------- # * Tilt_Definition #-------------------------------------------------------------------------- def tilt_left @tilt_frames = [5,10,20,15,10,5,0,-5,-10,0] end def tilt_right @tilt_frames = [-5,-10,-20,-15,-10,-5,0,5,10,0] end end #============================================================================== # ** Spriteset_Map #============================================================================== class Spriteset_Map attr_accessor :map_object_sprites attr_reader :viewport1 alias_method( :aliased_initialize_method, :initialize ) alias_method( :aliased_update_method, :update ) alias_method( :aliased_dispose_method, :dispose ) # - Geänderte Spriteset-Methoden: # Die bereits geänderten Methoden im Spriteset wurden nocheinmal # überarbeitet. Die Map-Objekt-Sprites werden nun in einem eigenen # Spriteset verwaltet. (Dieser Schritt ist nicht unbedingt notwendig, # das was nun Spriteset_MapObjects tut könnte man auch in die # Spriteset_Map - Klasse integrieren) #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize aliased_initialize_method @map_objects = Spriteset_MapObjects.new(@viewport1) end #-------------------------------------------------------------------------- # * Dispose #-------------------------------------------------------------------------- def dispose aliased_dispose_method @map_objects.dispose if @map_objects end #-------------------------------------------------------------------------- # * Update #-------------------------------------------------------------------------- def update aliased_update_method @map_objects.update if @map_objects end end #============================================================================== # ** Interpreter #============================================================================== class Interpreter #-------------------------------------------------------------------------- # * change_opacity # id :ID des objektes # wert :Opacity-Wert #-------------------------------------------------------------------------- def change_opacity(id, wert) static_object = $game_map.static_object if static_object[id].opacity != wert static_object[id].opacity = wert end return true end #-------------------------------------------------------------------------- # * tilt_character # id :ID des objektes # dir :Richtung des tiltens #-------------------------------------------------------------------------- def tilt_character(id, dir='left') #print("tilt_character ", id, ", ", dir) char = get_character(id) if char spriteset = $scene.instance_variable_get(:@spriteset) map_object_sprites = spriteset.instance_variable_get(:@map_object_sprites) sprite = map_object_sprites[ id ] case $game_player.direction when 2 then sprite.tilt_left when 4 then sprite.tilt_left when 6 then sprite.tilt_right when 8 then sprite.tilt_right end end return true end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- alias_method( :aliased_update_method, :update ) def update aliased_update_method end end #============================================================================== # ** Scene_Map #============================================================================== class Scene_Map attr_reader :spriteset end #============================================================================== # ** Map_Object_Table # Diese Klasse bietet Methoden für ein (hoffentlich) schnelleres Auswählen # der Map-Objekte in einem beliebigen Kartenausschnitt #============================================================================== class Map_Object_Table #-------------------------------------------------------------------------- # * Initialize #-------------------------------------------------------------------------- def initialize(section_size = 128) @sections = [] @object_bounds = {} @section_size = section_size @mod_count = 0 end #-------------------------------------------------------------------------- # * On_Change #-------------------------------------------------------------------------- def on_change @mod_count += 1 end #-------------------------------------------------------------------------- # * Iterate_Sektions #-------------------------------------------------------------------------- def iterate_sections(rect) sx1 = rect.x / @section_size sx2 = (rect.x + rect.width - 1) / @section_size sy1 = rect.y / @section_size sy2 = (rect.y + rect.height - 1) / @section_size sx1.upto(sx2) { |sx| sy1.upto(sy2) { |sy| @sections[sx] ||= [] @sections[sx][sy] ||= [] yield @sections[sx][sy] } } end #-------------------------------------------------------------------------- # * Addet_Objects_In_Slice #-------------------------------------------------------------------------- def added_objects_in_slice(slice, rest) return objects_in_area(slice).select { |object| !@object_bounds[object].overlap?(rest) } end #-------------------------------------------------------------------------- # * Version #-------------------------------------------------------------------------- def version return @mod_count end #-------------------------------------------------------------------------- # * Clear #-------------------------------------------------------------------------- def clear return if @object_bounds.empty? @sections.clear @object_bounds.clear on_change end #-------------------------------------------------------------------------- # * Place # Die Methoden place / remove aktualisieren die Position eines # Objekts oder löschen es aus der Tabelle. #-------------------------------------------------------------------------- def place(object) remove(object) bounds_rect = object.bounds return unless bounds_rect @object_bounds[object] = bounds_rect iterate_sections(bounds_rect) { |section| section.push(object) } on_change end #-------------------------------------------------------------------------- # * Remove # Die Methoden place / remove aktualisieren die Position eines # Objekts oder löschen es aus der Tabelle. #-------------------------------------------------------------------------- def remove(object) bounds_rect = @object_bounds[object] return unless bounds_rect @object_bounds.delete(object) iterate_sections(bounds_rect) { |section| section.delete(object) } on_change end #-------------------------------------------------------------------------- # * Objects_In_Area # Mit objects_in_area können alle Objekte erfasst werden die sich etwa # im Bildschirmbereich befinden. #-------------------------------------------------------------------------- def objects_in_area(rect) result = [] iterate_sections(rect) { |section| result.concat(section) } return result.uniq.select { |object| @object_bounds[object].overlap?(rect) } end #-------------------------------------------------------------------------- # * Exclusive_Objects # Mit exclusive_objects können alle Objekte erfasst werden die in einem # Bereich neu hinzugekommen/verschwunden sind wenn sich der # Bildschirmbereich nur wenig bewegt hat. #-------------------------------------------------------------------------- def exclusive_objects(new_rect, old_rect) if !old_rect || !new_rect.overlap?(old_rect) return objects_in_area(new_rect) else result = [] rest = new_rect if rest.x < old_rect.x left_slice, rest = rest.cut_horizontally(old_rect.x) result.concat(added_objects_in_slice(left_slice, rest)) end if rest.end_x > old_rect.end_x rest, right_slice = rest.cut_horizontally(old_rect.end_x) result.concat(added_objects_in_slice(right_slice, rest)) end if rest.y < old_rect.y top_slice, rest = rest.cut_vertically(old_rect.y) result.concat(added_objects_in_slice(top_slice, rest)) end if rest.end_y > old_rect.end_y rest, bottom_slice = rest.cut_vertically(old_rect.end_y) result.concat(added_objects_in_slice(bottom_slice, rest)) end return result end end end #============================================================================== # ** Spriteset_MapObjects # Diese Klasse übernimmt die Funktion von Spriteset_Map wenn es um das # Verwalten der Object-Sprites geht. #============================================================================== class Spriteset_MapObjects #-------------------------------------------------------------------------- # * Initialze #-------------------------------------------------------------------------- def initialize(viewport) @viewport = viewport @sprites = {} refresh_object_sprites end #-------------------------------------------------------------------------- # * Object_Table #-------------------------------------------------------------------------- def object_table $game_map.object_table end #-------------------------------------------------------------------------- # * Visible_Area #-------------------------------------------------------------------------- def visible_area x = $game_map.display_x / 4 - (@viewport ? @viewport.ox : 0) y = $game_map.display_y / 4 - (@viewport ? @viewport.oy : 0) w = @viewport ? @viewport.rect.width : 640 h = @viewport ? @viewport.rect.height : 480 return Rect.new(x, y, w, h) end #-------------------------------------------------------------------------- # * Refresh_Object_Sprites #-------------------------------------------------------------------------- def refresh_object_sprites if @last_version != object_table.version @last_version = object_table.version @last_area = visible_area dispose_sprites(@sprites.keys) create_sprites(object_table.objects_in_area(@last_area)) elsif @last_area != visible_area new_area = visible_area dispose_sprites(object_table.exclusive_objects(@last_area, new_area)) create_sprites(object_table.exclusive_objects(new_area, @last_area)) @last_area = new_area end end #-------------------------------------------------------------------------- # * Dispose_Sprites #-------------------------------------------------------------------------- def dispose_sprites(objects) objects.each { |object| @sprites[object].dispose if @sprites[object] @sprites.delete(object) } end #-------------------------------------------------------------------------- # * Create_Sprites #-------------------------------------------------------------------------- def create_sprites(objects) objects.each { |object| @sprites[object] ||= Object_Sprite.new(@viewport, object) } end #-------------------------------------------------------------------------- # * Update # update aktualisiert alle sichtbaren Sprites (und erstellt/löscht) #-------------------------------------------------------------------------- def update refresh_object_sprites @sprites.each_value { |sprite| sprite.update } end #-------------------------------------------------------------------------- # * Dispose # dispose löscht alle Sprites wenn die Map verlassen wird. #-------------------------------------------------------------------------- def dispose @sprites.each_value { |sprite| sprite.dispose } end end #============================================================================== # ** Rect # Die Rect-Klasse fasst eine Startposition, Breite und Höhe in einem Objekt # zusammen. Sie wird hier um ein paar Methoden erweitert um im Rest des # Skripts ein paar Zeilen zu sparen: #============================================================================== class Rect #-------------------------------------------------------------------------- # * Overlap? # overlap? bestimmt ob sich zwei Rechtecke überlagern (zum Beispiel # der Bereich eines Map-Objekts und der Bildschirmbereich) #-------------------------------------------------------------------------- def overlap?(rect) return rect.x < end_x && rect.end_x > x && rect.y < end_y && rect.end_y > y end #-------------------------------------------------------------------------- # * End_X # end_x / end_y bestimmen die (ausschließliche) Endpositionen des Rechtecks #-------------------------------------------------------------------------- def end_x x + width end #-------------------------------------------------------------------------- # * End_Y # end_x / end_y bestimmen die (ausschließliche) Endpositionen des Rechtecks #-------------------------------------------------------------------------- def end_y y + height end #-------------------------------------------------------------------------- # * Cut_Horizontally # cut_horizontally / cut_vertically teilen ein Rechteck an einer # gegebenen Position in zwei Teile auf. (Wird in der Map-Objekt-Tabelle # in exclusive_objects verwendet um die Unterschiede zwischen den zwei # Bereichen herauszufiltern) #-------------------------------------------------------------------------- def cut_horizontally(position) cut_x = (position < x) ? x : (position > end_x) ? end_x : position rect1 = Rect.new(x, y, cut_x - x, height) rect2 = Rect.new(position, y, end_x - cut_x, height) return rect1, rect2 end #-------------------------------------------------------------------------- # * Cut_Vertically # cut_horizontally / cut_vertically teilen ein Rechteck an einer # gegebenen Position in zwei Teile auf. (Wird in der Map-Objekt-Tabelle # in exclusive_objects verwendet um die Unterschiede zwischen den zwei # Bereichen herauszufiltern) #-------------------------------------------------------------------------- def cut_vertically(position) cut_y = (position < y) ? y : (position > end_y) ? end_y : position rect1 = Rect.new(x, y, width, cut_y - y) rect2 = Rect.new(x, position, width, end_y - cut_y) return rect1, rect2 end end |
Edit: Code aufgeräumt @_@
Bugreport: Wenn ich auf einem tiltbaren Objekt stehe, und ins Menü und wieder rausgehe, tiltet es nochmal. Kann ich das irgednwie verhindern? ><
Es liegt hieran:
![]() |
Ruby Source code |
1 2 3 |
if @already_tilted && ($game_player.x != map_x || $game_player.y != map_y) @already_tilted = false # <- Wenn der Spieler das Feld (wieder) verlassen hat setze die Variable zurück. end |
Wenn ich im Menü bin, ist der Player ja nicht mehr auf den Koordinaten XD
Ich müsste also noch ne Abfrage reinstellen, ob er noch auf deiner Map ist, damit already_tilted nicht auf false gestellt werden kann, während ein Menü aufgerufen wird. Oder gibts ne bessere Lösung?
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
This post has been edited 4 times, last edit by "Josey" (Sep 19th 2019, 10:12pm)
Ich glaub ich habs, guckt mal bitte einer? @_@
In dem Fall sollte sich die untere Mitte deines Sprites in der unteren Mitte des entsprechenden Tiles befinden (sodass wenn der Sprite ein Tile groß ist er genau da liegt wo er vorher auch schon lag; und wenn er größer ist er entsprechend über die Seiten bzw. den oberen Rand hinausragt).
Mit
self.x = (map_x * 128 - $game_map.display_x + 3) / 4
würde der Ausgangspunkt des Sprites auf der oberen-linken Ecke des Tiles liegen. Um ihn auf die untere Mitte zu verschieben müsstest du ihn entsprechend um 16 Pixel nach rechts und 32 Pixel nach unten verschieben.
Genau das scheint dein Code hier auch zu tun (a ist am Ende ja immer 16).
Ich weiß nicht ob sich dein "anchor" während des Spiels ändern kann, im Moment könnte dein Sprite in seiner Animation einfrieren wenn du "anchor" auf "top_left" setzt während der Sprite noch tiltet.
Bugreport: Wenn ich auf einem tiltbaren Objekt stehe, und ins Menü und wieder rausgehe, tiltet es nochmal. Kann ich das irgednwie verhindern?
Der Spieler befindet sich tatsächlich auch im Menü noch auf seiner Position. Das Problem ist dass beim Menüaufruf alle Sprites des Map-Bildschirms gelöscht (und durch die Menüfenster ersetzt) werden. Kehrt der Spieler auf den Mapbildschirm zurück werden an der Stelle neue, noch nicht getiltete Sprites erstellt.
Eine einfache Möglichkeit das zu beheben wäre neue Object_Sprites als "bereits getiltet" zu markieren (in der "initialize" - Methode).
Ein möglicher Nachteil wäre dass deine Sprites auch dann nicht tilten wenn sich der Spieler aus einer anderen Map (oder auch großer Entfernung) auf sie teleportiert.
Eine Alternative wäre die "already_tilted" Variable vom Sprite in dein Map-Objekt zu verschieben wo ihr Wert nicht mit dem Sprite verloren geht.
Hatte in Teil 2 oben nochmal 3 Methoden
Map_Object_Table # exclusive_objects
Rect # cut_horizontally
Rect # cut_vertically
korrigiert (auch wenn die Änderungen im Moment keine Auswirkungen haben).
This post has been edited 1 times, last edit by "Irrlicht" (Sep 20th 2019, 5:20pm)
Die Sprites sind entweder Bäume und Dächer (top_left, können durchsichtig werden, aber nicht tilten) Feldfrüchte (bottom_left) oder Gras (bottom_mid) (können beide tilten, aber nicht durchsichtig werden). Der einfachheit halber werd ich bottom_left jetzt aussortierten und Feldfrüchte, sowie Gras mit bottom_mid starten, bottom_mid macht das ja, wie du schreibst, ganz selbstständig, egal, wie breit der Sprite ist (32 oder 64 oder 96), er setzt ihn sauber auf die Mitte >< Ich muss nur drauf achten, das der Sprite durch 32 tilebar ist, das krieg ich aber hin XD
Dass es beim Porten nicht wackelt, ist richtig so, das finde ich okay XD
Dann würd ich die already_tiltet Variable zu "true" ändern, das passt so super! :D
(deine Verbesserungen habe ich eingepflegt XD)
Danke! :D
Voll wichitge Frage:
Wie lösche ich ein Sprite jetzt? XD
Ich krieg mit den alten Befehlen ständig fehlermeldungen o_o
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
This post has been edited 1 times, last edit by "Josey" (Sep 22nd 2019, 8:20pm)
Ich muss nur drauf achten, das der Sprite durch 32 tilebar ist
tilebar? xD
Kommt darauf an, bei 64 Pixeln würde der Sprite ein halbes Tile in beide Richtungen überstehen.
Voll wichitge Frage:
Wie lösche ich ein Sprite jetzt? XD
Die einfachste Möglichkeit an der Stelle wäre deinem Map-Objekt "" als Grafik zu geben. Damit würde mit dem aktuellen Stand deines Scripts auch der zugehörige Sprite gelöscht (Leere Grafik -> Objekt löscht sich aus der Tabelle -> Spriteset findet eine Änderung und löscht den Sprite).
Die zweite Zeile
graphic.empty? ? @object_table.remove(self) : @object_table.place(self)
ist an der Stelle eine andere Schreibweise für
![]() |
Ruby Source code |
1 2 3 4 5 |
if graphic == "" @object_table.remove(self) # <- ...dann lösche das Objekt aus der Tabelle else @object_table.place(self) # <- ...sonst aktualisiere die Position des Objekts in der Tabelle end |
Jedes Mal wenn ein Objekt in der Tabelle bewegt oder gelöscht wird ändert sich die "version" der Tabelle. Die Version wird im Spriteset mit jedem Update mit der vorherign Version verglichen (in der "refresh_object_sprites" Methode von Spriteset_MapObjects).
Ich denke das Problem ist dass die Sprites jetzt etwas anders verwaltet werden und @map_object_sprites nicht mehr benutzt wird. An der Stelle müsstest du nun auf @map_objects zugreifen, welches auch kein Array mehr ist (siehe Änderungen an Spriteset_Map im aktuellen Script).
Grundsätzlich bringt es dir aber vermutlich auch nicht mehr so viel direkt auf die Sprites zuzugreifen. Das Spriteset erstellt neue Sprites die in den Sichtbereich kommen nun selbst, d.h. selbst wenn du einen Sprite löschen wolltest würde er vermutlich neu erstellt werden sobald das Objekt wieder in den Bildschirmbereich kommt.
Ich hatte im letzten Script vergessen dass die Map-Objekte mit einem Switch deaktiviert werden sollten, aber du scheinst dafür schon eine Lösung gefunden zu haben.

Ansonsten müsstest du vermutlich noch die "start_x" Methode von Map_Object an den "bottom_mid" anchor anpassen (bisher geht die Methode davon aus dass das Objekt am linken Rand des Tiles beginnt. Jetzt befindet sich aber die Mitte des Objekts ( -tilewidth / 2 ) in der Mitte des Tiles ( +16 )).
Noch eine Anpassung der Methode Spriteset_MapObject # refresh_object_sprites:
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def refresh_object_sprites if @last_version != object_table.version @last_version = object_table.version @last_area = visible_area old_objects = @sprites.keys new_objects = object_table.objects_in_area(@last_area) dispose_sprites(old_objects - new_objects) create_sprites(new_objects - old_objects) elsif @last_area != visible_area new_area = visible_area dispose_sprites(object_table.exclusive_objects(@last_area, new_area)) create_sprites(object_table.exclusive_objects(new_area, @last_area)) @last_area = new_area end end |
Eigentlich nur dafür da um zu verhindern dass bei einer Änderung alle Sprites ihr tilten abbrechen, da gerade das Thema aufkam.

Die Methode "screen_visible?" und die Konstanten SCREEN_WIDTH und SCREEN_HEIGHT aus dem ursprünglichen Vorschlag solltest du übrigens nicht mehr brauchen.
Wird evtl. später ergänzt.
Quoted
tilebar? xD
Man XD
Okay, die Grafik einfach auf "" zu setzen funktioniert o.o
Danke XD
Dachte, dass der Sprite dann noch irgendwie da wäre.
Okay, das hab ich eingepflegt und "screen_visible?" entfernt. Wie kann ich sicher sein, obs immer noch klappt? o.o
Seit ein paar Versionen habe ich wieder ein bisschen FPS-Einbußen, so runter bis 31 manchmal. Aber es geht zumindest nicht mehr bis 20 runter :3
Im Moment habe ich keine Bugs oder ähnliches gefunden, es scheint alles zu funktionieren! :D
Ja, den Switch hab ich dreist hier eingebaut:
![]() |
Ruby Source code |
1 2 3 4 5 6 7 |
#-------------------------------------------------------------------------- # Methode Abbrechen, wenn Grafik leer #-------------------------------------------------------------------------- if @object.graphic == "" || $game_switches[16] == false self.bitmap = nil return # <- Brich die Methode an dieser Stelle ab end |
XD
Die Methode wird einfach konstant abgebrochen, wenn der Switch false ist. Funktioniert, ich hoffe, es ist die richtige Stelle :P
Oder gäbe es da eine bessere?
Wegen "start_x": Da scheint es keine Probleme zu geben o.o
Ich benutze folgenden Scriptcall:
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 |
a=$game_map.static_object for x in 2..$game_map.width-2 for y in 2..$game_map.height-2 a[$game_variables[3]].set_graphic( "001-Grassland01") a[$game_variables[3]].setup_til( x,y,:bottom_mid,0,160,512,64,64) $game_variables[3] += 1 end end |
Und die Grastiles werden alle angezeigt, sie ragten links und rechts drüber, aber es scheint kein Problem zu sein. :)
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.
This post has been edited 2 times, last edit by "Josey" (Sep 24th 2019, 9:32pm)
Wie kann ich sicher sein, obs immer noch klappt? o.o
In diesem Fall wurde die Methode nur verwendet um beim updaten des Spritesets zu bestimmen welche Sprites auf dem Bildschirm waren. Die Stelle wurde mittlerweile ersetzt, sofern du die Methode nicht mittlerweile noch woanders verwendet hast.
Wenn du dir nicht sicher bist kannst du die Methode natürlich noch in einem anderen Script behalten und vielleicht verändern dass sie eine Warnung ausgibt wenn sie doch nochmal unerwartet aufgerufen wurde.
Auch wenn es keine absolute Garantie ist dass sie Methode nicht mehr verwendet wird kannst du mit Ctrl+Shift+F deine Scripts nach "screen_visible?" durchsuchen.
Die Lösung ließe sich sicher auch noch etwas weiter optimieren. Deine Update-Methode enthält immernoch einige Aufrufe die vermutlich nur sehr selten gebraucht werden und theoretisch nicht 12000 Mal pro Sekunde aufgerufen werden müssten (Könnte man z.B. in eine andere Methode verschieben die nur bei Bedarf zusätzlich zur update-Methode aufgerufen wird, wenn die update-Methode überhaupt noch notwendig ist).Seit ein paar Versionen habe ich wieder ein bisschen FPS-Einbußen, so runter bis 31 manchmal.
Allerdings habe ich grad keine Schätzung wie viel Zeit tatsächlich durch die Object_Sprite-update-Methode verloren geht und wie viel das Spiel bei 300 Sprites zum Zeichnen des Bildschirms braucht.
Die Lösung funktioniert auf alle Fälle.Funktioniert, ich hoffe, es ist die richtige Stelle :P
Oder gäbe es da eine bessere?
Aber ja, ich hätte die Abfrage vermutlich in das Spriteset verschoben (wie auch schon in deiner ursprünglichen Fassung).
Im Moment werden alle "sichtbaren" Sprites trotz allem erstellt, nur sind sie unsichtbar und ihre update-Methode wird vorzeitig abgebrochen. Im Spriteset könntest du verhindern dass die Sprites überhaupt erst existieren, z.B.:
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 |
class Spriteset_Map def initialize aliased_initialize_method # --- Erstelle Objekt-Sprites nur wenn Switch aktiv ist: if $game_switches[16] == true @map_objects = Spriteset_MapObjects.new(@viewport1) end end end |
Alternativ kannst du die Abfrage auch in die update-Methode verschieben, das hätte den Vorteil dass du nicht erst ein neues Spriteset brauchst bevor der Switch Wirkung zeigt:
![]() |
Ruby Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Spriteset_Map def initialize aliased_initialize_method # <Erstellen der Object_Sprites passiert hier in der update-Methode> end def update aliased_update_method # Aktualisiere die Map-Objekt-Sprites abhängig von Switch 16: if $game_switches[16] == true if @map_objects == nil @map_objects = Spriteset_MapObjects.new(@viewport1) end @map_objects.update else if @map_objects != nil @map_objects.dispose @map_objects = nil end end end end |
Wegen "start_x": Da scheint es keine Probleme zu geben o.o
Könnte sein dass du in deiner jetzigen Version noch was geändert hattest was ich nicht bemerkt hatte, ich hatte es bei mir mit einem größeren Objekt getestet:
![]() |
Source code |
1 2 3 4 5 |
$game_map.static_object[0]. setup_til(25, 10, :bottom_mid, 1, 0*32, 15*32, 8*32, 10*32) $game_map.static_object[0]. set_graphic("002-Woods01") |
Wenn ich mich dem Objekt von links näher ploppt es etwas zu spät ins Bild.
Die FPS-Einbrüche kommen nur während ich mich bewege und nur, wenn der ganze Bildschirm voll ist. Ich glaube, in der Bewegung sind alle Aufrufe wichtig?
Switch-Position: Ich hab dann jetzt deine Version für den Switch genommen, klingt logischer XD
Zu "start_x": Du hast recht, bei so großen Sachen, klappts nicht. Im Moment ist das aber nicht schlimm, mit bottom_mid rufe ich nur das Gras (maximal 96*64) und Feldfrüchte (32*64) auf. Ich notiers mir aber, danke! :D Große Objekte wie Häuerdächer werden mit "top_left" aufgerufen :3
-
Joseys Wuselei
-
Meine Story - Pausiert
Lust auf Abenteuer?
So richtig mit Selbstbestimmung?
Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
"Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
Hier die Antwort:
Hier könnt ihr euren Lieblingschar wählen ;D
Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt. -
Meine Arbeiten
-
Meine Fähigkeiten
Maker:XP
Pixeln:
Mappen:
Eventen:
Scripten:
Komponieren:
-
(Mein) Autismus
Ich bin im autistischen Sprektrum-
sollte ich mich komisch verhalten, oder unhöflich wirken
(oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
ist das nicht beabsichtigt.
Josey. Epicgarantie.
Nehmt das bloß nicht ernst! D: -
Meine Welt
Mein Ehemann Kain!:*
Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
Er verdient einfach einen Platz () in meiner Signatur! XD
-
Mein Support
Der In-Game-Charset-Generator!
Erstelle Random-NPCs mit Charsetteilen!
Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
Bastelt mal Banner! : D
-
Meine beendeten Contests
[Pixelcontest] Rund um den Kürbis
Abstimmung
Siegerehrung
Das Wunder der Berge
Abstimmung
Siegerehrung -
Meine Contests
Ein Schreibcontest in Arbeit! : D
-
-
Joseys Spiele
-
Endless Ending
-
Scripted Desaster
Scripted Desaster
("nicht ganz so ernstes Projekt")
Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.
Das bedeutet doch Spaß... -
Pokémon EV
Pokemon EV
("Zeitvertreib nebenbei - Kreatief-Helfer")
Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
Ist inzwischen alles schonmal dagewesen. XD -
Lost Island
Harvest Moon - Lost Island
(Arbeitstitel, "Eventtechnik-Projekt")
Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
Das Spiel ist ein Harvest Moon Abklatsch. XD
Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
-
-
Joseys Fortschritt
-
Endless Ending
Story: 60%
Charas: 20%
Maps: 01%
Zeichnungen: 05%
Grafiken: 30%
Scripte: 70%
Musik: 00%
...ist nicht viel, huh? ^^° -
Scripted Desaster
Story: 10%
Charas: 60%
Maps: 30%
Zeichnungen: 01%
Grafiken: 60%
Scripte: 70%
Musik: 00%
Gut Ding... -
Pokemon EV
Story: 60%
Charas: 10%
Maps: 00%
Zeichnungen: 00%
Grafiken: 80%
Scripte: 90%
Musik: 70%
Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht... -
Lost Island
Story: 100%
Charas: 10%
Maps: 90%
Zeichnungen: 00%
Grafiken: 60%
Scripte: 90%
Musik: 00%
Das macht richtig Spaß XD
-
-
Huiii
Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

Similar threads
-
Skript-Anfragen »
-
[Offen] MapTeleporter (Mar 10th 2018, 1:52pm)
-
Skript-Anfragen »
-
Maps als Layer benutzen (Dec 9th 2016, 3:35pm)
-
Skript-Anfragen »
-
Multidrop + Battle Report Kompatibilität (Nov 13th 2014, 5:42pm)
-
Archiv Jobbörse »
-
Suche Grafiker für RPG Tiles... NEUES SPIEL (May 5th 2011, 11:46am)
-
Skript-Anfragen »
-
Kleinere Tilesets (Mar 23rd 2009, 8:30pm)