Pokémon Script Project Forum Index

Manuel | Search
 Information des admins 
Si vous désirez parler de PSP ou obtenir du soutient là dessus, merci d'aller faire un tour sur https://pokemonworkshop.com/forum/index.php Imbécile heureux

SpritePlan

 
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Scripts
Previous topic :: Next topic   
Author Message
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Sun 17 May - 12:16 (2009)    Post subject: SpritePlan

Récemment, Lén m'avait demandé un moyen de pouvoir effacer (partiellement ou entièrement) des images qui sortent d'une zone définie.

Il a réussi à le finir avant moi, mais je me suis quand même amusé à terminer ce que j'avais commencé. Voici donc comment est née la nouvelle classe :

SpritePlan


    I) Présentation générale

SpritePlan est une classe que j'ai entièrement créée, et qui a pour objectif de simplifier la vie de ceux qui voudraient voir leurs images disparaitre lorsqu'elles sortent d'une zone précise.

Mais une image valant plus que des milliers d'explications, voici une représentation de ce à quoi sert le SpritePlan :

(image de 320 / 240, échelle de 1/2)

En rouge, votre écran de jeu, c'est à dire la map affichée.
En vert, la zone définie comme étant un SpritePlan. NB : le SpritePlan en lui même est totalement transparent.
En violet, 3 sprites affichés sur le SpritePlan. La partie violet foncé (cf le sprite le plus en bas et le sprite le plus à droite) marque les zones des sprites qui dépassent du SpritePlan. A l'affichage, ces zones seront effacées. Quant au reste des images (les zones en violet clair), elles seront simplement affichées.


    II) Installation

Pour installer le SpritePlan dans votre projet, il vous suffit de coller le code qui suit dans un nouveau script au dessus de Main :
Code:
#===============================================================================
# SpritePlan cree par Sphinx pour PSP, le 17 mai 2009.
# Credits demandes.
#===============================================================================
class SpritePlan
 
  def initialize(x, y, width, height, speed = 3)
    @sprites = []
    @sprites_name = []
    @width = width
    @height = height
    @x = x
    @y = y
    @speed = speed
  end
 
  def [](no_sprite)
    if @sprites[no_sprite] == nil
      @sprites[no_sprite] = Sprite.new
      @sprites[no_sprite].x = @x
      @sprites[no_sprite].y = @y
    end
    return @sprites[no_sprite]
  end
 
  def []=(no_sprite, nom)
    if @sprites[no_sprite] == nil
      @sprites[no_sprite] = Sprite.new
      @sprites[no_sprite].x = @x
      @sprites[no_sprite].y = @y
    end
    @sprites[no_sprite].bitmap = RPG::Cache.picture(nom)
    @sprites_name[no_sprite] = nom
  end
 
  def wait(frames)
    i = 0
    loop do
      break if i == frames
      i += 1
      Graphics.update
    end
  end
 
  def move_sprite(no_sprite, x, y, speed = @speed)
    if x > 0 or y > 0
      min = [x, y].min
      max = [x, y].max
      speed = 2.0 ** speed
      tempx = @sprites[no_sprite].x
      tempy = @sprites[no_sprite].y
      for i in 0...(max.abs / speed).plancher
        if max == x
          @sprites[no_sprite].x += speed * x.sgn
          if y >= 0
            @sprites[no_sprite].y += ((y * speed / x) * y.sgn).arrondi
          else
            @sprites[no_sprite].y -= ((y * speed / x) * y.sgn).arrondi
          end
        else
          if x >= 0
            @sprites[no_sprite].x += ((x * speed / y) * x.sgn).arrondi
          else
            @sprites[no_sprite].x -= ((x * speed / y) * x.sgn).arrondi
          end
          @sprites[no_sprite].y += speed * y.sgn
        end
        update
        Graphics.update
        wait(2)
      end
    else
      min = [x, y].max
      max = [x, y].min
      speed = 2.0 ** speed
      tempx = @sprites[no_sprite].x
      tempy = @sprites[no_sprite].y
      for i in 0...(max.abs / speed).plancher
        if max == x
          @sprites[no_sprite].x += speed * x.sgn
          if y >= 0
            @sprites[no_sprite].y += ((y * speed / x) * y.sgn).arrondi
          else
            @sprites[no_sprite].y -= ((y * speed / x) * y.sgn).arrondi
          end
        else
          if x >= 0
            @sprites[no_sprite].x += ((x * speed / y) * x.sgn).arrondi
          else
            @sprites[no_sprite].x -= ((x * speed / y) * x.sgn).arrondi
          end
          @sprites[no_sprite].y += speed * y.sgn
        end
        update
        Graphics.update
        wait(2)
      end
    end
    @sprites[no_sprite].x -= (@sprites[no_sprite].x - tempx) - x
    @sprites[no_sprite].y -= (@sprites[no_sprite].y - tempy) - y
    update
  end
 
  def update
    for i in 0... @sprites.size
      @sprites[i].bitmap.dispose
      @sprites[i].bitmap = RPG::Cache.picture(@sprites_name[i])
      # Le sprite est il en dehors du cadre :
      #   par la gauche :
      if @sprites[i].x < @x
        @sprites[i].bitmap.fill_rect(0, 0, @x - @sprites[i].x, @sprites[i].bitmap.height, Color.new(0, 0, 0, 0))
      end
      #   par le haut :
      if @sprites[i].y < @y
        @sprites[i].bitmap.fill_rect(0, 0, @sprites[i].bitmap.width, @y - @sprites[i].y, Color.new(0, 0, 0, 0))
      end
      #   par la droite :
      if @sprites[i].x + @sprites[i].bitmap.width > @x + @width
        @sprites[i].bitmap.fill_rect(@x + @width - @sprites[i].x, 0, (@sprites[i].x + @sprites[i].bitmap.width) - (@x + @width), @sprites[i].bitmap.height, Color.new(0, 0, 0, 0))
      end
      #   par le bas :
      if @sprites[i].y + @sprites[i].bitmap.height > @y + @height
        @sprites[i].bitmap.fill_rect(0, @y + @height - @sprites[i].y, @sprites[i].bitmap.width, (@sprites[i].y + @sprites[i].bitmap.height) - (@y + @height), Color.new(0, 0, 0, 0))
      end
      @sprites[i].update
    end
  end
 
end



    III) Utilisation

Pour utiliser efficacement le spriteplan, il vous suffit de connaitre les quelques commandes suivantes :
Code:
$Votre_Variable = SpritePlan.new(x, y, w, h, spd)

où x et y sont les coordonnées du pixel le plus en haut à gauche du spriteplan, où w et h sont les dimensions horizontale et verticale du spriteplan et où spd est la vitesse par défaut de déplacement des sprites dans le spriteplan.
Pour un spriteplan de 140 pixels de large et 100 de haut, placé à 50 pixels du bord droit et à 20 pixels du bord haut, il vous faudra donc écrire :
Code:
$Votre_Variable = SpritePlan.new(50, 20, 140, 100)

NB : pour la suite des commandes, $Votre_Variable représentera le SpritePlan que je viens de créer ici.
NB2 : ici je n'ai pas précisé la vitesse, elle est en option. Par défaut elle est de 2, soit un déplacement de 4 pixels par frames par défaut. Si j'avais mis une vitesse de 1, ca aurait été 2 pixels par frames, si j'avais mis 3, ca aurait été 8 pixels par frames. Je vous conseille de rester à 2 ou 3, les déplacements peuvent ne plus paraître aussi fluides au delà.

Pour créer un sprite dans votre spriteplan, rien de plus simple !
Il vous suffit de mettre
Code:
$Votre_Variable[NoSprite] = "NOM_FICHIER"

où NoSprite est le numéro qu'aura votre sprite (>> ca peut être 0, 1, ou 2, comme ca peut être 544110 et plus... Clin d'œil foireux) et où "NOM_FICHIER" est le nom de votre fichier qui sera utilisé pour le sprite, sans extension et entre "".
NB : l'image doit IMPERATIVEMENT se trouver dans le dossier Graphics/Pictures/ !
NB2 : le sprite aura pour coordonnées 0, 0 (par rapport au SpritePlan, et non à votre écran.)

Pour accéder à un spritre, il suffit de faire
Code:
$Votre_Variable[NoSprite]

où NoSprite est le numéro de votre sprite.
NB : si vous n'avez jamais défini le sprite n° NoSprite, ce n'est pas grave, ca créera un sprite entièrement vide. Autrement dit, ca ne buggera pas, mais ca ne fera rien non plus Clin d'œil foireux
NB2 : la commande pour créer un sprite ne permet pas de le positionner dès le départ, mais vous pouvez le faire très facilement avec :
Code:
$Votre_Variable[NoSprite].x = X
$Votre_Variable[NoSprite].y = Y

où X et Y sont les coordonnées de votre sprite.

Si vous avez besoin de mettre à jour votre spriteplan (par exemple pour effacer la partie d'un sprite dont vous avez défini manuellement les coordonnées et qui risque de dépasser du spriteplan)
Code:
$Votre_Variable.update


Pour déplacer un sprite sur votre spriteplan, il suffit de mettre :
Code:
$Votre_Variable.move_sprite(NoSprite, x, y, spd)

où NoSprite est le n° de votre sprite, où x est le nombre de pixels dont le sprite doit se déplacer (déplacement horizontal) (x > 0 : déplacement vers la droite, x < 0 : déplacement vers la gauche), où y est le nombre de pixels dont le sprite doit se déplacer (déplacement vertical) (y > 0 : déplacement vers le bas, y < 0 : déplacement vers le haut) et où spd représente la vitesse du déplacement. Si cette option n'est pas précisée, alors c'est la vitesse par défaut du spriteplan qui sera utilisée.
NB : cette commande déplace le sprite de (2vitesse) pixels par frame. Autrement dit, il n'est pas utile pour vous de créer une boucle qui servirait à déplacer le sprite petit à petit, mais si la vitesse est trop élevée, le déplacement perdra son effet de fluidité.


    IV) Intérêt du SpritePlan

Le SpritePlan a été créé pour permettre aux makers de simplifier leurs interfaces. Désormais, si un sprite sort de la zone délimitée pour leur interface, le maker n'aura plus à se préoccuper de ce que ca rendra, il lui suffira de délimiter un spriteplan pour que le sprite disparaisse tout seul.


    V) LMDLF (le mot de la fin)

J'espère que ca pourra vous être utile, perso je pense que si j'en ai besoin à l'avenir je ne manquerai pas de l'utiliser ^o^
Comme d'hab : n'oubliez pas les crédits si vous utilisez ce script Clin d'œil foireux


Last edited by Sphinx on Sat 23 May - 11:16 (2009); edited 3 times in total
Back to top
Publicité






PostPosted: Sun 17 May - 12:16 (2009)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
Speed
Ex-staff


Joined: 04 Jan 2008
Posts: 1,701
Localisation: Marseille (13)
Masculin

PostPosted: Sun 17 May - 14:50 (2009)    Post subject: SpritePlan

Très intéressant =D

On peut s'en servir pour un brouillard de guerre, non ?
Back to top
PiVa
Guest





PostPosted: Sun 17 May - 15:03 (2009)    Post subject: SpritePlan

Non. Comment tu veux faire disparaitre les évents, xD ?
Back to top
Speed
Ex-staff


Joined: 04 Jan 2008
Posts: 1,701
Localisation: Marseille (13)
Masculin

PostPosted: Sun 17 May - 16:21 (2009)    Post subject: SpritePlan

Ahaaaa... Euh... Petit bug de ma part, je sais pas pourquoi j'ai mit ça.
Back to top
Lén
Ex-staff


Joined: 11 Jan 2009
Posts: 1,725
Localisation: Aix
Masculin

PostPosted: Sun 17 May - 17:21 (2009)    Post subject: SpritePlan

Speed wrote:

Très intéressant =D

On peut s'en servir pour un brouillard de guerre, non ?



Pour ça, tu devrai plutôt mettre plein de FOG sur la map qu'il se collent mais ne se superposent pas, et quand le héros est proche, l'effacer et tu verra ce qu'il y a en dessous!


Sphinx: J'aime beaucoup la manière dont tu as realisé ça ! C'est pas très ressemblant a celui que j'ai fait moi, du fait que tu ai tout automatisé ! je prefere personnelement avoir le pouvoir sur tout (vitesse de déplacement etc). mais en tout cas ton script a toi est bien propre comparé au mien !!
Encore bravo !
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Sun 17 May - 17:42 (2009)    Post subject: SpritePlan

>> ca n'agit que sur les sprites appartenant au spriteplan bien sur Clin d'œil foireux


NB : un sprite extérieur ne pourra pas être inclu au spriteplan (en tout cas pas sans modifier légèrement ce script, et je ne l'ai pas intégré parce c'est aussi simple d'inclure le sprite dans le spriteplan) et donc ne pourra pas bénéficier des effets du spriteplan.


PS : @lén >> je peux inclure une donnée de vitesse quelque part, mais je ne l'avais pas fait en pensant que ce n'était pas indispensable =) Mais ca s'inclurait très vite, ce n'est pas une grande modification =)
Back to top
Lén
Ex-staff


Joined: 11 Jan 2009
Posts: 1,725
Localisation: Aix
Masculin

PostPosted: Sun 17 May - 18:47 (2009)    Post subject: SpritePlan

 J'ai pas voulu l'avouer, mais c'est surtout une histoire de flemme de remplacer ce que j'ai déjà par ton script bien qu'il soit plus propre ^^.

 
Quote:
 PS : @lén >> je peux inclure une donnée de vitesse quelque part, mais je ne l'avais pas fait en pensant que ce n'était pas indispensable =)
Mais ca s'inclurait très vite, ce n'est pas une grande modification =)
 
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Mon 18 May - 22:47 (2009)    Post subject: SpritePlan

Clin d'œil foireux pas de pbs lol


mais je vais quand même envisager la notion de vitesse modulable... Car à la réflexion, selon l'interface qu'on souhaite obtenir, la vitesse peut varier, hors le spriteplan ne le permet pas encore ^o^'

edit : >> effacer les sprites qui sortent du champ du spriteplan Clin d'œil foireux les rendre invisibles, en somme =)


reedit : ajout de la possibilité de préciser la vitesse de déplacement Clin d'œil foireux (j'édite de suite le premier post pour le mettre à jour)

rereedit : correction d'un bug graphique important, les sprites ne se déplacaient pas correctement lorsque les valeurs X et Y du déplacement n'étaient pas du même signe. Mise à jour du 1° post effectuée
Back to top
Giratinaprimal
Membre


Joined: 08 Oct 2010
Posts: 69
Renégat
Localisation: ???
Masculin

PostPosted: Wed 7 Sep - 16:47 (2011)    Post subject: SpritePlan

J'ai SyntaxError ici :


Code:
  def [](no_sprite)
    if @sprites[no_sprite] == nil
      @sprites[no_sprite] = Sprite.new
      @sprites[no_sprite].x = @x
      @sprites[no_sprite].y = @y
    end
    return @sprites[no_sprite] #Ici, SyntaxError#
  end
  
  def []=(no_sprite, nom)
    if @sprites[no_sprite] == nil
      @sprites[no_sprite] = Sprite.new
      @sprites[no_sprite].x = @x






Ce bug m'empêche d'utiliser le système d'échanges online de Sphinx.
Help !
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Scripts All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  

Index | Free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Thème par Thomas et l'équipe de la refonte PSP 2012 (version 1.0)