RPG-Maker Quartier
http://forum.rpg2000.4players.de/phpBB3/

Bild / Sprite unter dem Character erschaffen
http://forum.rpg2000.4players.de/phpBB3/viewtopic.php?f=52&t=99091
Seite 1 von 1

Autor:  Rpgkain [ Sa Nov 30, 2013 18:58 ]
Betreff des Beitrags:  Bild / Sprite unter dem Character erschaffen

Hallo, ich Arbeite momentan daran schatten an den charakter zu bekommen, das ganze funktioniert schon ganz gut, allerdings bekomm ich es einfach nicht hin das Schattenbild unter dem Character anzeigen zu lassen.

Momentan ist der Schatten noch ein eigenes Bild... im Picture Ordner.
Ganz grob erschaffe ich ein Bild ja auf folgende weise...
Code:
class examplepicture < Sprite
 
  def initialize viewport= nil
    super viewport
    refresh
  end

  def refresh
  @Picturexyz.dispose if @Picturexyz


 
  @Picturexyz = Sprite.new
  @Picturexyz.bitmap = RPG::Cache.picture("examplepicturexyz")
  @Picturexyz.x = ($game_player.x )
  @Picturexyz.y = ($game_player.y )
  @Picturexyz.z = 0
....



Ich hab versucht und versucht und versucht... wenn ich die Z-coordinate unter 0 setzte ist das Bild ganz weg, aber selbst bei 0 ist es immernoch über dem Character, also muss es irgendwie daran liegen dass Charactere grundlegend unter Bildern sind. Wie bekomme ich das Bild also nun unter den Charakter?


Am besten wäre wenn das Bild sich genauso wie ein Sprite eines herkömmlichen Events verhalten würde, unter anderen Events die unter einem sind, aber über anderen Events die über einem sind. Aber das ist jez erstmal nicht das Problem ;D

Ich habe bereits ein funktionsfähiges (in Verbindung mit einem andren Script namens Pixelmovement) Script was auch echt gut aussieht.. nur der schatten ist über dem eigenen Character -,-
Momentan der Schatten noch ein eigenes Bild, später möchte ich den Schatten anhand des Sprites des Characters berechnen, indem es eben jenen sprite nimmt, schwarz macht und ggf. teilw. Transparent 180 grad der Lichtquelle weg anzeigt... wenn jmd. ideen dazu hat auch gerne posten ;D

Aber erstmal wär mir schon geholfen wenn mir jmd. sagt wie ich das Bild unter den Character kriege^^

Danke

Wenn noch was unklar hist, hier ein Bild, das rotumkringelte istd s Problem, dass der Schatten über Character ist...

Autor:  TheWhiteShadow [ Do Dez 05, 2013 22:25 ]
Betreff des Beitrags:  Re: Bild / Sprite unter dem Character erschaffen

Erst einmal definierst du eine Klasse und leitest diese von Sprite ab. Aber die wird nie als solches benutzt.
Da du die Funktion vom Sprite auch nicht ändern wills, sonden es nur benutzen, macht eine Ableitung der Klasse auch keinen Sinn.


Der Grund, warum deine Grafik nicht unter dem Helden angezeigt wird, ist:
Die Tilemap und alle zugehörigen Sprites befinden sich in einem eigenen viewport.
Das ist wie ein Kontainer für Grafiken.
Außerhalb des Kontainers Kann eine Grafiken nur vor oder hinter dem ganzen Kontainer sein.
Der Kontainer wird (beim XP) in der Klasse Spriteset_Map erstellt.
Die wichtigsten Zeilen wären diese:
Code:
@viewport1 = Viewport.new(0, 0, 640, 480)
...
@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))


Du hast in Zeile 3 bereits den relevanten Konstruktor für ein Sprite stehen. def initialize viewport = nil
Einem Sprite kann bei der Erstellung ein viewport übergeben werden.

p.s. vergiss nicht, dass Spriteset_Map keinen attr_reader für den viewport hat.

mfg TWS

Autor:  Rpgkain [ Fr Dez 06, 2013 14:51 ]
Betreff des Beitrags:  Re: Bild / Sprite unter dem Character erschaffen

Hallo, danke für die Antwort, das mit den Viewports ist mir so ung. bewusst aber ich weis nicht wie ich das ganze einem Viewport übergeben kann

Zitat:
Du hast in Zeile 3 bereits den relevanten Konstruktor für ein Sprite stehen. def initialize viewport = nil
Einem Sprite kann bei der Erstellung ein viewport übergeben werden.


Wie genau würde das aussehen anhand von den Beispielcode oben am besten ^^
... Wie weise ich dem Sprite genau den Viewport zu, welcher benötigt wird um ihn hinter den Charakter anzeigen zu lassen.
Ein einfaches Beispiel würde mir schon sehr helfen mich daran zu orientieren.

:)

Autor:  TheWhiteShadow [ Fr Dez 06, 2013 16:16 ]
Betreff des Beitrags:  Re: Bild / Sprite unter dem Character erschaffen

Einfach im Konstruktor übergeben. Die RGSS macht den Rest.

Code:
@meinSprite = Sprite.new @viewport1


Hier ein paar Beispiele wofür man viewports braucht (ob Sinnvoll oder nicht):

Wenn @viewport1.z = -500 wäre, würden Fenster hinter der Karte angezeigt.
Mit schleife { @viewport1.x1 += 1 } könnte man die ganze Karte aus dem Bild schieben. Für ein Menü vielleicht?

p.s. Es wäre sicher hilfreich die Syntax der Dokumentation zu lernen.
Dort steht: Sprite.new([viewport]) - Die [...] bedeuten, dass der Parameter optional ist.

mfg TWS

Autor:  Rpgkain [ Fr Dez 06, 2013 16:23 ]
Betreff des Beitrags:  Re: Bild / Sprite unter dem Character erschaffen

Code:
class examplepicture < Sprite
 
  def initialize viewport= nil
    super viewport
    refresh
  end

  def refresh
  @Picturexyz.dispose if @Picturexyz


 
  @Picturexyz = Sprite.new(@viewport1)                                             # Das Bild ist immernoch über dem Charakter
  @Picturexyz.bitmap = RPG::Cache.picture("examplepicturexyz")
  @Picturexyz.x = ($game_player.x )
  @Picturexyz.y = ($game_player.y )
  @Picturexyz.z = 0
....


Habe ich schon probiert aber das Bild ist immernoch über dem Charakter, die Dokumentation habe ich mir schon ageschaut aber wie ich es dreh und wende .. irgendetwas mache ich falsch oder entzieht sich meinem Blick^^.



Zur Not ist hier noch eine erste version des Scriptes, für einen besseren überblick, vieleicht schreibst du kurz dazu was ich genau anpassen muss. Für den fall dass ich doof bin am besten so das es funktionsfähig wäre ;D
Verwenden kann man das bisher aber nur mit Pixelmovement... und das Bild ist halt über dem Charakter
Code:
#====================================
#  Kains Dynamic Shadows
#------------------------------------------------------------------------
# Übergebene Variablen:
#
# event_x = Mittelpunkt der Lichtquelle von der X - achse aus (meist: x * 32 + 16)
# event_y = Mittelpunkt der Lichtquelle von der Y - achse aus (meist: y * 32 + 16)
#
#
# leuchtdichte (1 bis oo (sehr große )
#    - leuchtdichte > 1 = Lichtquelle versiegt nur wenig wenn Spieler sich entfernt
#    - leuchtdichte < 1 = Lichquelle versiegt sehr schnell, wenn Spieler sich entfernt
#    - 0 (null) deaktiviert den abnehmenden Schatten, er wird dann immer gleich sichtbar sein.
# candela = Lichtstärke!
#     
#====================================

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Initialisiert Schatten
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


class Sprite_Player_Shadow < Sprite
 
  def initialize viewport=nil
    super viewport
    refresh( 0, 0, 1, 1)
  end

  def refresh(event_x, event_y, leuchtdichte, type)
  @Player_Shadow.dispose if @Player_Shadow
 
  if leuchtdichte != 0
  leuchtdichte = 1 / leuchtdichte
  end

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Player event delta = x / y Vektor von Event zu Spieler
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  player_event_x_delta = event_x - $game_player.x
  player_event_y_delta = event_y - $game_player.y
 
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Player event distance = Distanz von Spieler zu Event
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  player_event_distance =  Math.sqrt((player_event_x_delta**2) + (player_event_y_delta**2))
 

 
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Teste ob weitere Berechnungen angestellt werden müssen, um die Performance
#  zu verbessern.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  if 200 -  (player_event_distance * leuchtdichte) >= 0
  shadow_visible = true
  else
  shadow_visible = false
  end
 
  if shadow_visible == true   
   

  @Player_Shadow = Sprite.new
  @Player_Shadow.bitmap = RPG::Cache.picture("Schatten 1")
  @Player_Shadow.z = 0
 
 
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Berechne Sichtbarkeit des Schattens
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  @Player_Shadow.opacity = 200 -  (player_event_distance * leuchtdichte)
   

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Null teiler umgehen! Wenn Distanz nahe 0, dann Winkel 0!
#  Player event angle = Relativer Winkel des Spielers zum Event
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  if player_event_distance <= 0.1
  player_event_angle = 0
  else
  player_event_angle = (Math.asin(player_event_x_delta / player_event_distance)  / ( Math::PI / 180 ))
  end


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Dreht das Bild um, damit der Angelpunkt des Drehwinkels leichter ausgeglichen
# werden kann, deshalb sollte das Bild auch kopfüber gespeichert werden.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  if event_y > $game_player.y
  @Player_Shadow.angle = 180 + player_event_angle
  else
  @Player_Shadow.angle =  - player_event_angle
  end

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Angelpunkt korrektion
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  if  $game_player.x >= event_x and $game_player.y <= event_y
  @Player_Shadow.x =  $game_player.x + (15 * (1 +  player_event_angle / 90)) -0 -  ($game_map.display_x  / 4)
  elsif $game_player.x >= event_x and $game_player.y >= event_y
  @Player_Shadow.x =  $game_player.x - (15 * (1 +  player_event_angle / 90)) -0 -  ($game_map.display_x  / 4)
 
  elsif $game_player.x <= event_x and $game_player.y >= event_y
  @Player_Shadow.x =  $game_player.x - (15 * (1 -  player_event_angle / 90)) -0 -  ($game_map.display_x  / 4)
  else
  @Player_Shadow.x =  $game_player.x + (15 * (1 -  player_event_angle / 90)) -0 -  ($game_map.display_x  / 4)
  end
 
  if  $game_player.x >= event_x and $game_player.y <= event_y
  @Player_Shadow.y =  $game_player.y - (12 * (1 +  player_event_angle / 90)) +5 -  ($game_map.display_y  / 4)
  elsif $game_player.x >= event_x and $game_player.y >= event_y
  @Player_Shadow.y =  $game_player.y - (12 * (1 +  player_event_angle / 90)) +5 -  ($game_map.display_y  / 4)
 
  elsif $game_player.x <= event_x and $game_player.y >= event_y
  @Player_Shadow.y =  $game_player.y - (12 * (1 +  player_event_angle / 90)) +5 - ($game_map.display_y  / 4)
  else
  @Player_Shadow.y =  $game_player.y - (12 * (1 +  player_event_angle / 90)) +5 - ($game_map.display_y  / 4)
  end
 
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Schattenverzerrung
#
#  Type 1 = Lichtquelle auf Character Ebene
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Type 2 = Eingeschränkte Lichtquelle
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

 # if streuwinkelmax >= 90 and streuwinkelmax <= 179
 # streuwinkelmax = streuwinkelmax -180




#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Type 3 = Deckenbeleuchtung z.B. Laterne
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
 
  if type == 3 #and player_event_distance >= 20
  @Player_Shadow.zoom_y  =  0 +  (1*(player_event_distance/100)) #Teiler schränkt Schattenverzerrung ein.
  end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
 
    # Test variable - kann gelöscht werden
    $winkel = player_event_angle
   
 
  end # Ende der Anti-Lagg If-Verknüpfung
 
  end

  def dispose
  @Player_Shadow.dispose
  end

end


Autor:  TheWhiteShadow [ Sa Dez 07, 2013 0:35 ]
Betreff des Beitrags:  Re: Bild / Sprite unter dem Character erschaffen

Du verwendest ja immer noch dieselbe Klasse wie vorher und definiert wird bei dir @viewport1 auch nie. Also ist die Variable immer nil.
Da Sprite.new und Sprite.new nil identisch sind, hat sich bei deinem Code auch nichts verändert.

Du musst dir erst den viewport aus dem Spriteset_Map holen und dann dem Sprite übergeben.
Dazu musst du der Klasse ein attr_reader geben, damit die Variable zugreifbar ist.
Anschließend brauchst du noch ne Referenz auf die Instanz der Klasse.
Die ist in der Scene_Map.
Dort machst du in etwa das gleiche.
Danach kannst du dein Sprite erstellen: Sprite.new($scene.spriteset.viewport1)

Einfacher wäre es direkt in der Klasse Spriteset_Map zu arbeiten.
Du musst auch kein vorhandenen Code editeren. Einfach ne Klasse erstellen, die Spriteset_Map reicht aus. Damit wird die vorhandene Klasse erweitert.

Außerdem wirkt es, als wenn du meine Beiträge nur zur hälfte verstehst. Du solltest dich erst einmal an die Grundlagen machen.

Autor:  Rpgkain [ Sa Dez 07, 2013 22:37 ]
Betreff des Beitrags:  Re: Bild / Sprite unter dem Character erschaffen

Hallo, danke für die Antworten.
Ja, ich verstehe ung. so was du meinst, ich habe allerdings auch noch nicht soviel erfahrung mit ruby, deshalb hoffe ich dass du rücksicht mit mir hast, wenn ich alles verstehen würde was du vor schlägst dann hätte ich das Problem ja längst von alleine lösen können.
Es harpert bei mit der praktischen Umsetzung.
Ich möchte deine Gedult nicht strapazieren aber ein richtiges Code Beispiel (vollständiger code der zu verändernden stellen) würde mir sehr helfen, wie ich schon oben geschrieben habe.
Daran könnte ich mich orientieren und auch was lernen.
Aus den schnippseln kann ich mir zwar etwas zusammenreimen aber das ganze nicht so richtig umsetzten... auch mit der Dokumentation komme ich nicht weiter.
Bitte ein simples aber vollständiges Beispiel ! :love:

Danke soweit schonmal für deine Mühen.

Autor:  TheWhiteShadow [ Mi Dez 18, 2013 17:04 ]
Betreff des Beitrags:  Re: Bild / Sprite unter dem Character erschaffen

Leider bin ich schon länger nicht mehr so drin, dass ich sagen könnte ich skripte eben in 5 min was.

Dafür hab ich das Skript aus meinem Spiel LoM. Dort wird ein zweites Bild dafür benutzt ein Outline-Charakter hinter Bäumen zu zeichnen.
Ich hab versucht die unnötigen Stellen zu löschen, ist aber vermutlich noch was über. Du musst dir die entsprechenden Stellen vermutlich rauspicken.

Code:
#==============================================================================
# ** Sprite_Character
#------------------------------------------------------------------------------
#  This sprite is used to display the character.It observes the Game_Character
#  class and automatically changes sprite conditions.
#==============================================================================

class Sprite_Character < RPG_Sprite
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :character                # character
  attr_accessor :sub_sprite               # sub_sprite
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     viewport  : viewport
  #     character : character (Game_Character)
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    #@time = 0
    @sub_sprite = Sprite.new(viewport)
    update
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    @sub_sprite.update
    # If tile ID, file name, or hue are different from current ones
    if @tile_id != @character.tile_id or
       @character_name != @character.character_name or
       @character_hue != @character.character_hue
      # Remember tile ID, file name, and hue
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      # If tile ID value is valid
      if @character.use_picture == true
        self.bitmap = RPG::Cache.picture(@character.character_name)
        #self.src_rect.set(0, 0, bitmap.width, bitmap.height)
        self.ox = bitmap.width / 2
        self.oy = bitmap.height / 2
      elsif @tile_id >= 384
        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue)
        self.src_rect.set(0, 0, 32, 32)
        self.ox = 16
        self.oy = 32
        # If tile ID value is invalid
      else
        self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue)
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
          self.ox = @cw / 2
          self.oy = @ch
      end
    end
    if @tile_id == 0 and @character.use_picture == false and
       @sub_graphic_name != @character.sub_graphic_name
      @sub_graphic_name = @character.sub_graphic_name
      @sub_sprite.bitmap = RPG::Cache.character(@character.sub_graphic_name, 0)
      @sub_sprite.ox = @cw / 2#bitmap.width / 2
      @sub_sprite.oy = @ch#bitmap.height / 2
    end
    # Set visible situation
    self.visible = (not @character.transparent)
    # If graphic is character
    if @tile_id == 0 and not @character.use_picture
        # Set rectangular transfer
        sx = @character.pattern * @cw
        sy = (@character.direction - 2) / 2 * @ch
      end
      self.src_rect.set(sx, sy, @cw, @ch)
      @sub_sprite.src_rect.set(sx, sy, @cw, @ch)
    end
    # Set sprite coordinates
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
    # Set sprite coordinates
    @sub_sprite.x = self.x
    @sub_sprite.y = self.y
    @sub_sprite.z = self.z <-- Hier muss evtl. noch -1 addiert werden.
    # Set opacity level, blend method, and bush depth
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    # Animation
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true, @character.ani_repeat)
      @character.animation_id = 0
    end
  end
end


Die folgenden Schnippsel sind nur Auszüge aus den Klassen. Du musst die Zeilen entsprechend einsetzten.

Code:
class Game_Character
  attr_accessor :sub_graphic_name
  def initialize
@sub_graphic_name = ""
end
end


Code:
# Die Zeile muss irgendwo in Game_Player stehen die refresh-Methode eigent sich gut, da dort auch die Charakter-Grafik gesetzt wird. Alternativ siehe unten.
@sub_graphic_name = "schatten.png"


Wenn es soweit geklapp hat kannst du aus einem Skript-Event heraus auch $game_player.sub_graphic_name = "neuer_schatten.png" schreiben um einen Schatten zu setzten ("" fürs löschen).
Das geht dann auch mit jedem anderen Charakter/Event.

mfg TWS

Autor:  Rpgkain [ So Dez 22, 2013 21:57 ]
Betreff des Beitrags:  Re: Bild / Sprite unter dem Character erschaffen

Hallo, danke für die ganzen Antworten, ich konnte das Problem lösen, der Grund warum es oftmals nicht geklappt hat war das Pixelmovement script welche die meisten Klassen überschrieben hat die ich bearbeitet habe.

letztlich habe ich das Beispiel mit $scene.spriteset.viewport1 anwenden können.

Wichtig ist das ganze durch diese If bedingung einzuschließen:

Code:
if $scene.is_a?(Scene_Map)
  @Player_Shadow = Sprite.new($scene.spriteset.viewport1)
....
end


Sonst geht garnichts, wär mir das vorher bewusst gewesen hätte es schon vor einer ewigkeit geklappt...^^

Nächtster Schritt wäre es dann jedem Event einen Schatten zu geben, dazu Orientier ich mich an deinem Scrip, vielen Dank dafür.
Schwierig wird es nur dass ich das ganze mit Pixelmovement abstimmen muss, ein script mit über 7000 Code Zeilen. >.<

Vielen Dank

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/