• Login

Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

81

Saturday, September 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


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:
Spoiler

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
highlight to read
Josey has attached the following images:
  • Grastile.png
  • 001-Grassland01.png
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: 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)


82

Sunday, September 8th 2019, 3:38pm

Hi,

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:

Spoiler

Attachment 24180Attachment 24181
highlight to read

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
und

Ruby Source code

1
$game_map.height - 1
natürlich eleganter. Probiere das gerne aus. Dir wird sofort die Geschwindigkeit auffallen. Dann erstelle ein neues Event und nehme folgenden Code:

Spoiler
Attachment 24183
Code dazu:

Ruby Source code

1
2
3
4
5
6
7
8
9
10
a=$game_map.static_object
for x in 0..$game_map.width-1
for y in 0..$game_map.height-1
a[$game_variables[3]].set_graphic(
"001-Grassland01")
a[$game_variables[3]].setup_til(
x,y,:bottom_left,1,32,64,32,32)
$game_variables[3] += 1
end
end 
highlight to read

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)


Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

83

Sunday, September 8th 2019, 7:15pm

Gut, da hast du was optimiert, dass ich leider im Spiel so gar nicht brauche XD°
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
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

84

Sunday, September 8th 2019, 7:47pm

Also normal ist das nicht, in beiden Fällen.
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.

Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

85

Sunday, September 8th 2019, 10:11pm

Nee, das Projekt war neu.
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 :)
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

86

Sunday, September 8th 2019, 11:26pm

Kannst du das Projekt, wo du nur die 30 FPS erreichst, hier zur Verfügung stellen?
Würde mich interessieren wie es bei mir läuft. Entweder passt irgendwas nicht, dein PC ist lahm
oder Hintergrundprozesse ziehen bei dir Leistung runter.

Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

87

Monday, September 9th 2019, 12:37am

Klar XD
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.
Josey has attached the following file:
  • Test - Kopie.rar (427.9 kB - 2 times downloaded - latest: Sep 9th 2019, 6:08pm)
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

88

Monday, September 9th 2019, 6:14pm

Hab es gerade probiert. Läuft bei mir mit ca. 38 FPS, wenn die Sprites gezeichnet werden.
Ansonsten läuft es mit 39/40 FPS, wie üblich.

:search:

Evtl. hast du tatsächlich unnötige Hintergrundprozesse am Laufen :D.
Oder einen uralt PC.

Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

89

Monday, September 9th 2019, 11:21pm

Oder beides XD

Okay, dann danke bis hierhin, ich hab glaub ich alles, was ich brauche. Jetzt baue ich das ins System und schau, obs funktioniert XD
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Send private message

90

Monday, September 9th 2019, 11:46pm

Huhu,

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. :)

Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

91

Tuesday, September 10th 2019, 12:18am

Das klingt gut. Wenn das noch geht, würde es die FPS noch ein bisschen verbessern.
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?
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Send private message

92

Wednesday, September 18th 2019, 1:07am

Soo...
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.
Spoiler

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
highlight to read


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). :)
Spoiler

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
highlight to read

This post has been edited 4 times, last edit by "Irrlicht" (Sep 24th 2019, 12:24pm)


Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

93

Thursday, September 19th 2019, 10:16pm

OMG, es ist wunderschön XD
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

Spoiler

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
highlight to read

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?
Josey has attached the following image:
  • Tile.png
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: 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)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Send private message

94

Friday, September 20th 2019, 12:09pm

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)


Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

95

Sunday, September 22nd 2019, 8:20pm

Wenn der anchor für ein Sprite festgelegt ist, bleibt er auch so.
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
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: 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)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Send private message

96

Tuesday, September 24th 2019, 12:15pm

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).
Spoiler
Das Löschen aus der Tabelle passiert in der Methode "update_object_table_placement".
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).
highlight to read


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:
Spoiler

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
highlight to read
Wenn sich ein Objekt geändert hatte hat das Spriteset bisher alle sichtbaren Sprites gelöscht und an der Stelle neue erstellt. Jetzt sollten nur noch Sprites gelöscht/erstellt werden wenn das zugehörige Objekt verschwunden/neu auf dem Bildschirm erschienen ist.
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.

Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

97

Tuesday, September 24th 2019, 9:32pm

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. :)
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: 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)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Send private message

98

Saturday, September 28th 2019, 6:35pm

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.


Seit ein paar Versionen habe ich wieder ein bisschen FPS-Einbußen, so runter bis 31 manchmal.
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).
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.


Funktioniert, ich hoffe, es ist die richtige Stelle :P
Oder gäbe es da eine bessere?
Die Lösung funktioniert auf alle Fälle.

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:
Spoiler

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
highlight to read



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.

Josey

Storyteller

  • "Josey" started this thread

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

99

Sunday, September 29th 2019, 1:48am

Ah, sorry- mit "obs noch klappt" hatte ich gemeint, ob die Sprites immer noch außerhalb des Bildschirms unsichtbar sind, aber natürlich sind sie, man siehts an den FPS XD

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
Notfalldiscord: Hier klicken


  • 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:
      Bild
      Bild
      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
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (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! :heart_full: :*
      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 ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • 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
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: 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
      :rmxp: 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
      :rmxp: 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
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

Social bookmarks