Pokémon Script Project Index du Forum

S’enregistrer | Rechercher | Connexion
 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

Picture

 
Poster un nouveau sujet   Répondre au sujet    Pokémon Script Project Index du Forum -> Game Making -> Ressources techniques -> Scripts
Sujet précédent :: Sujet suivant   
Auteur Message
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Mar 2 Sep - 12:37 (2014)    Sujet du message: Picture

Bonjour, suite à une idée qui me trottait dans la tête concernant la collision des sprites, il m'est pris l'idée folle de vouloir créer un script en ruby qui gère ça.
Du coup, bah si ça peut servir à quelq'un, je vous en fait cadeau !

Code:
class Picture < Sprite 
   
  attr_reader:collision_zone_table 
 
  if(method_defined?(:ox=)) 
    undef :ox=, :oy=, :zoom_x=, :zoom_y=, :src_rect=, :angle= 
  end 
 
  def src_rect 
    return super.clone
  end 
 
  def bitmap=(new_bitmap) 
    super(new_bitmap) 
    if(new_bitmap) 
      make_collision_table 
    else 
      @collision_zone_table=nil 
    end 
  end 
 
  def make_collision_table 
    if @collision_zone_table 
      @collision_zone_table.clear 
    else 
      @collision_zone_table=Array.new 
    end 
     
    self.bitmap.height.times do |y| 
      self.bitmap.width.times do |x| 
        @collision_zone_table.push([x,y]) if self.bitmap.get_pixel(x,y).alpha>64 
      end 
    end 
  end 
   
  def contact_type(picture) 
    ct=picture.collision_zone_table 
    return 2 unless @collision_zone_table and ct 
    #>A retravailler entièrement ! 
    front = false 
    collision = false 
    _x=self.x-picture.x #>En théorie les minis tableaux devraient être par rapport au bitmap donc ct[id][0]+pic.x == self.ct[id][0]+self.x <= ct[id][0] == self.ct[id][0]+self.x-pic.x 
    _y=self.y-picture.y   
    arr=[nil,nil] 
    @collision_zone_table.each do |i| 
      arr[0]=_x+i[0] 
      arr[1]=_y+i[1] 
      collision=ct.include?(arr) 
      break if collision 
    end 
    #>Faudra optimiser cette partie 
#=begin 
    for i in 0.. @collision_zone_table.size-1 
      if picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y]) or 
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x,@collision_zone_table[i][1]+self.y+1]) or 
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y]) or 
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x,@collision_zone_table[i][1]+self.y-1]) or 
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y-1]) or 
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y+1]) or 
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y+1]) or 
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y-1]) 
        front = true 
      end 
    end 
#=end 
    if collision 
      return 0 
    elsif front
      return 1 
    else 
      return 2 
    end 
  end 
   
end



C'est une sous classe de Sprite, elle fonctionne de la même façon à l'exception du fait qu'il n'y a pas besoin de rajouter l'attribut .bitmap.
ex:
@p = Picture.new(chemin dossier si nécessaire+nom du fichier, viewport (pas obligatoire))
@p.x = @p.y = ...etc comme un sprite

Il y a une nouvelle méthode:contact_type(nom de l'image)
En gros, si vous faite : (suite de l'exemple)
@p.contact_type(image2)

Cela retourne le type de contact entre l'image @p et l'image 2 spécifiée entre parenthèse.
Si ça retourne 0, il y a collision (une partie de l'image se trouve sur la seconde)
Si ça retourne 1, les deux images se frôle, sans se toucher (front)
Si ça retourne 2, il n'y a aucun contact entre les deux images.

Juste une chose, pour chaque Picture, il faut une image représentant la zone de collision nommée "Nom de l'image+_collision_zone", dedant la zone de collision doit être en noir et le reste en blanc. Voilà Imbécile heureux

Ce genre de script est très pratique pour des jeux de plateforme exigeant des collisions précises.

Je suis sûr que Yuri me trouvera de nombreuses critiques sur mon script, mais il fonctionne très bien en tout cas.


Dernière édition par Zohran le Mar 2 Sep - 17:25 (2014); édité 14 fois
Revenir en haut
Publicité






MessagePosté le: Mar 2 Sep - 12:37 (2014)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Mar 2 Sep - 12:44 (2014)    Sujet du message: Picture

Tout ce que j'ai à dire c'est de le bannir de vos projet comme Sprite_Plan et d'autres scripts sur consommateur inutiles de temps d'exécution (qui fait que vos projet ramment).
(Sinon, oui, il y a plein de choses à redire mais j'ai pas trop envie de me lancer là dedans sinon autant réécrire tout le script.)
Revenir en haut
Facebook Twitter
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Mar 2 Sep - 12:47 (2014)    Sujet du message: Picture

Nuri Yuri a écrit:
Tout ce que j'ai à dire c'est de le bannir de vos projet comme Sprite_Plan et d'autres scripts sur consommateur inutiles de temps d'exécution (qui fait que vos projet ramment).
(Sinon, oui, il y a plein de choses à redire mais j'ai pas trop envie de me lancer là dedans sinon autant réécrire tout le script.)


Sprite_Plan? D'autres script? Tu parles de quelles scripts là?

Tu penses que mon script consomme beaucoup de temps d’exécution ou pas?

PS: Je viens de remarquer un truc agaçant, certains symbole ne passe pas sur PSP, du coup le script a des erreurs à cause de ça... Va falloir que je fournisse une version txt je crois :/
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Mar 2 Sep - 13:17 (2014)    Sujet du message: Picture

Ton script consomme trop de temps d'exécution, ne fonctionne pas bien avec les sprites zoomé, ayant une origine différente de zero, ayant un src_rect différent du paramètre par défauts ou ayant un angle de rotation.

Sur PSP tout passe sauf que le moteur de balise script provoque des bugs.
Revenir en haut
Facebook Twitter
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Mar 2 Sep - 13:30 (2014)    Sujet du message: Picture

Oui, c'est vrai pour les sprites zoomé.
Effectivement, ça consomme trop, je viens de le tester, le problème c'est l'update...
La mise à jour de la table consomme trop, je sais pas comment contourner le problème du coup .. :/

J'ai mis à jour le script, il consomme déjà beaucoup moins, mais la vérification du type de contact consomme trop, je ne sais pas comment améliorer ça, j'ai besoin des lumières de Yuri...
Revenir en haut
og_loc-TATOO
Membre


Inscrit le: 11 Oct 2009
Messages: 3 383
Sailor Maniac
Localisation: noitasilacol

MessagePosté le: Mar 2 Sep - 14:34 (2014)    Sujet du message: Picture

Je me disait bien que tu arriverais par cette méthode, elle est utilisé sur rmxp de base.
Enfin, je ne l'ai jamais utilisé, je l'ai trouvé trop compliqué pour une feignasse comme moi T_T
Revenir en haut
TouzaxA
Membre


Inscrit le: 27 Juil 2012
Messages: 2 669

MessagePosté le: Mar 2 Sep - 14:47 (2014)    Sujet du message: Picture

Pour l'update, tu peux décider de créer un paramètre supplémentaire pour l'update de la table.

Genre le constructeur, ce serait Picture.new(string path, bool update?).
Revenir en haut
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Mar 2 Sep - 16:09 (2014)    Sujet du message: Picture

TouzaxA a écrit:
Pour l'update, tu peux décider de créer un paramètre supplémentaire pour l'update de la table.

Genre le constructeur, ce serait Picture.new(string path, bool update?).

Je crois que j'ai rien pigé x)

og_loc-TATOO a écrit:
Je me disait bien que tu arriverais par cette méthode, elle est utilisé sur rmxp de base.
Enfin, je ne l'ai jamais utilisé, je l'ai trouvé trop compliqué pour une feignasse comme moi T_T

Ah je savais pas !

Bizarre, depuis que j'ai mis à jour le script, la méthode contact_type me retourne constamment 2, je fais que *** en ce moment T_T
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Mar 2 Sep - 16:49 (2014)    Sujet du message: Picture

Déjà, t'as pas besoins de masque => Les collisions sont uniquement dues au fait qu'il y a des parties invisibles de l'image donc tu peux simplement check quand l'alpha de la couleur récupérée du bitmap d'origine est bonne (>64 par exemple pour avoir une certaine marge).

Code:
class Picture < Sprite
 
  attr_reader:collision_zone_table

  #>Suppression des attributs qui font que ça marche pas
  if(method_defined?(:ox=))
    undef :ox=, :oy=, :zoom_x=, :zoom_y=, :src_rect=, :angle=
  end

  #>On empêche la modification implicite du Src_rect par la méthode set du rect crée.
  def src_rect
    rect=super
    return Rect.new(rect.x, rect.y, rect.width, rect.height) #>J'ai pas vérifié .clone mais si ça marche faut faire super.clone c'est plus rapide
  end

  def bitmap=(new_bitmap)
    super(new_bitmap)
    if(new_bitmap)
      make_collision_table
    else
      @collision_zone_table=nil
    end
  end

  def make_collision_table
    if @collision_zone_table
      @collision_zone_table.clear
    else
      @collision_zone_table=Array.new
    end
   
    self.bitmap.height.times do |y|
      self.bitmap.width.times do |x|
        @collision_zone_table.push([x,y]) if self.bitmap.get_pixel(x,y).alpha>64
      end
    end
  end
 
  def contact_type(picture)
    ct=picture.collision_zone_table
    return 2 unless @collision_zone_table and ct
    #>A retravailler entièrement !
    front = false
    collision = false
    _x=self.x-picture.x #>En théorie les minis tableaux devraient être par rapport au bitmap donc ct[id][0]+pic.x == self.ct[id][0]+self.x <= ct[id][0] == self.ct[id][0]+self.x-pic.x
    _y=self.y-picture.y
    arr=[nil,nil]
    @collision_zone_table.each do |i|
      arr[0]=_x+i[0]
      arr[1]=_y+i[1]
      collision=ct.include?(arr)
      break if collision
    end
    #>Faudra optimiser cette partie
=begin
    for i in 0.. @collision_zone_table.size-1
      if picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y]) or
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x,@collision_zone_table[i][1]+self.y+1]) or
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y]) or
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x,@collision_zone_table[i][1]+self.y-1]) or
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y-1]) or
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y+1]) or
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y+1]) or
        picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y-1])
        front = true
      end
    end
=end
    if collision
      return 0
    elsif front #>Si collision est pas vérifié avant, c'est évident que !collision est vérifié
      return 1
    else
      return 2
    end
  end
 
end


Faut vérifier tout ça mais j'imagine que ça devrait fonctionner.
Le principe est d'optimiser le code et supprimer ce qui gène (Si le vin te gène dans ton travail, supprimes le travail).
Revenir en haut
Facebook Twitter
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Mar 2 Sep - 16:59 (2014)    Sujet du message: Picture

Eh bien merci Yuri, faut que je test ce script. En tout cas, rien qu'en voyant ce code, j'ai un packet de questions à poser, tu utilises plein de méthode que je ne maitrise pas :/
Je t'ai mis en gras ce que j'aimerais comprendre (fais pas attention au smiley, c'est à cause de la synthaxe):

class Picture < Sprite

attr_reader:collision_zone_table

#>Suppression des attributs qui font que ça marche pas
if(method_defined?(Bouche extensiblex=))
undef Bouche extensiblex=, Bouche extensibley=, :zoom_x=, :zoom_y=, :src_rect=, :angle=
end

#>On empêche la modification implicite du Src_rect par la méthode set du rect crée.
def src_rect
rect=super
return Rect.new(rect.x, rect.y, rect.width, rect.height) #>J'ai pas vérifié .clone mais si ça marche faut faire super.clone c'est plus rapide
end

def bitmap=(new_bitmap)
super(new_bitmap)
if(new_bitmap)
make_collision_table
else
@collision_zone_table=nil
end
end

def make_collision_table
if @collision_zone_table
@collision_zone_table.clear
else
@collision_zone_table=Array.new
end

self.bitmap.height.times do |y|
self.bitmap.width.times do |x|

@collision_zone_table.push([x,y]) if self.bitmap.get_pixel(x,y).alpha>64
end
end
end

def contact_type(picture)
ct=picture.collision_zone_table
return 2 unless @collision_zone_table and ct
#>A retravailler entièrement !
front = false
collision = false
_x=self.x-picture.x #>En théorie les minis tableaux devraient être par rapport au bitmap donc ct[id][0]+pic.x == self.ct[id][0]+self.x <= ct[id][0] == self.ct[id][0]+self.x-pic.x
_y=self.y-picture.y
arr=[nil,nil]
@collision_zone_table.each do |i|
arr[0]=_x+i[0]
arr[1]=_y+i[1]
collision=ct.include?(arr)
break if collision
end
#>Faudra optimiser cette partie
=begin
for i in 0.. @collision_zone_table.size-1
if picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y]) or
picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x,@collision_zone_table[i][1]+self.y+1]) or
picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y]) or
picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x,@collision_zone_table[i][1]+self.y-1]) or
picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y-1]) or
picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y+1]) or
picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x+1,@collision_zone_table[i][1]+self.y+1]) or
picture.collision_zone_table.include?([@collision_zone_table[i][0]+self.x-1,@collision_zone_table[i][1]+self.y-1])
front = true
end
end
=end
if collision
return 0
elsif front #>Si collision est pas vérifié avant, c'est évident que !collision est vérifié
return 1
else
return 2
end
end

end

C'est drôle mais plus j'utilise ce script et plus je me rend compte qu'il manque de méthode supplémentaire pour faciliter son utilisation :/
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Mar 2 Sep - 17:39 (2014)    Sujet du message: Picture

method_defined? c'est une méthode des classes qui te permettent de savoir si une méthode est définie dans la classe.
Le = tu peux le mettre dans un symbole, c'est une exception particulière à Ruby. Globalement, il est capable de déterminer (uniquement avec "=" et "[]") si tu veux un nom ou utiliser l'opérateur. (Pour le reste c'est pas possible.)

entier.times do |variable| c'est la version propre et largement plus optimisée (autant en vitesse qu'en consommation de mémoire) de for variable in 0...entier.

@collision_zone_table.each do |i| Si tu sais pas pourquoi j'utilise jamais for, c'est parce qu'en réalité for en Ruby c'est le pire mensonge du monde. Dans tous les langages correctes (hormis Ruby et peut être python) for est destiné à réaliser une itération conditionnelle d'un point A à un point B. En Ruby, for c'est juste pour appeler la fonction each d'un objet alors je vais pas me mentir car d'une l'écriture de for en Ruby est juste pas belle à voir et de deux c'est plus explicite :
for variable in object = object.each do |variable| (Si t'es pas convaincu : http://puu.sh/biutU/e254b47458.png )
Revenir en haut
Facebook Twitter
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Mar 2 Sep - 17:44 (2014)    Sujet du message: Picture

D'accord, merci. J'ai compris Imbécile heureux

C'est vrai que les boucles for i in.. sont très gourmandes...

Par contre je viens de me rendre compte en utilisant le script qu'il tire beaucoup encore en FPS, en plus il n'est pas très pratique d'utilisation... j'ai essayé de faire un script rapide où l'on déplace un bonhomme avec les touches directionnelles. Interdire la collision, c'est facile, par contre autoriser le déplacement si il y a juste front, c'est un autre problème... Bouche extensible Par ce que ça dépend de quel côté ça frôle Noob devant Nyuky
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Mar 2 Sep - 18:07 (2014)    Sujet du message: Picture

C'est inutile de chercher à faire avec des formes complexes : le joueur ne le remarque même pas.
Tu met un rayon et plus de problèmes avec les collisions.
Revenir en haut
Facebook Twitter
Zohran
Support Technique
Support Technique


Inscrit le: 14 Mai 2011
Messages: 906
Localisation: France
Masculin

MessagePosté le: Mar 2 Sep - 21:12 (2014)    Sujet du message: Picture

Nuri Yuri a écrit:
C'est inutile de chercher à faire avec des formes complexes : le joueur ne le remarque même pas.
Tu met un rayon et plus de problèmes avec les collisions.

Oui, je crois que je vais lâcher ce système. C'est dommage, parce que moi qui aime la précision, je trouve ça frustrant :/
Mais c'est vraiment s'embêter pour pas grand chose. En tout, d'un point de vue technique, c'est quand même formateur de faire ce genre de script.
Revenir en haut
Nuri Yuri
Administrateur
Administrateur


Inscrit le: 15 Oct 2008
Messages: 6 383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

MessagePosté le: Mer 3 Sep - 18:23 (2014)    Sujet du message: Picture

La précision n'existe pas, ce n'est qu'un truc vrai dans des modèles formels.
Revenir en haut
Facebook Twitter
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 02:06 (2017)    Sujet du message: Picture

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Pokémon Script Project Index du Forum -> Game Making -> Ressources techniques -> Scripts Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  

Index | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | 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)
Traduction par : phpBB-fr.com