{"id":258,"date":"2026-03-04T00:42:59","date_gmt":"2026-03-04T00:42:59","guid":{"rendered":"https:\/\/hackcuba.net\/?p=258"},"modified":"2026-03-04T00:42:59","modified_gmt":"2026-03-04T00:42:59","slug":"generacion-de-particulas-ii","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=258","title":{"rendered":"Generaci\u00f3n de part\u00edculas (II)"},"content":{"rendered":"\n<p>En este n\u00famero se contin\u00faa abordando la generaci\u00f3n de part\u00edculas, siguiendo el modelo de programaci\u00f3n orientada a objetos en Flash. Se supone que ya tengamos una nube copiosa derramando agua sobre el terreno. Hab\u00edamos declarado ya, en la clase <code>Drop<\/code>, un comportamiento asociado a tres elementos que no se implementaron en el c\u00f3digo anterior: las instancias del horizonte <code>skyline<\/code>, de la<\/p>\n\n\n\n<!--more-->\n\n\n\n<p> casa <code>house<\/code> y de la chimenea <code>chimney<\/code>. Se trataba de activar mediante <code>play()<\/code> la reproducci\u00f3n de las gotas que colisionaran con dichas instancias. Para ello habr\u00eda que crear dos fotogramas adicionales en <code>drop_symbol<\/code>, que representaran a la gota salpicando. Por supuesto, deteniendo el fotograma inicial para impedir la reproducci\u00f3n autom\u00e1tica de este efecto gr\u00e1fico. Se recomend\u00f3, finalmente, crear el humo generado por la chimenea ubicada encima de la casa; aunque esperamos que se hayan ocupado de convertir en un s\u00edmbolo la l\u00ednea y el relleno del horizonte.<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"\" width=\"20%\"><\/p>\n\n\n\n<p>Rayo de sol<\/p>\n\n\n\n<p>Pues bien, luego de puntualizar estos detalles, pasaremos de la generaci\u00f3n lineal a una un poco m\u00e1s compleja. Hasta el momento hemos tratado con objetos puntuales que siguen una trayectoria unidimensional hasta desvanecerse. Si generamos objetos que necesitan rotar en su instante inicial t=0 y\/o durante su tiempo de vida, debemos recurrir a los conceptos b\u00e1sicos del c\u00e1lculo trigonom\u00e9trico. Comencemos a comprender esto dibujando un relleno sin bordes con forma de tri\u00e1ngulo is\u00f3sceles acostado horizontalmente, donde sus lados tengan 6 veces mayor longitud que la base. Luego convirt\u00e1molos en un MovieClip, donde el registro est\u00e9 ubicando en el punto medio de la base, quedando similar a la figura de la derecha. Quitaremos la instancia de este s\u00edmbolo del escenario y, en la biblioteca, le asignaremos el identificador <code>sunbeam_symbol<\/code> vinculado a la clase <code>Sunbeam<\/code>. Luego creamos otro MovieClip, redondo y amarillo, a cuya instancia la nombraremos <code>sun<\/code>. Con todo listo, pasaremos a la edici\u00f3n de un nuevo documento de ActionScript, que albergar\u00e1 las propiedades y m\u00e9todos de la clase <code>Sunbeam<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: as3; title: ; notranslate\" title=\"\">\nclass Sunbeam extends MovieClip{\n  \/\/ par\u00e1metros\n  var size:Number;\n  var rotation:Number;\n  var sun_object:MovieClip \/\/ Se refiere al Sol\n\n\n  \/\/ funci\u00f3n que retorna un n\u00famero aleatorio entre dos valores extremos\n  function randomize(min_value, max_value) {\n    return (Math.floor(Math.random() * (max_value - min_value + 1)) + min_value);\n  }\n\n\n  \/\/ Constructor\n  public function Sunbeam() {\n    rotation = randomize(1,360);\n    this._x = sun_object._x + (Math.cos((rotation * Math.PI) \/ 180) * (sun_object._width \/ 2));\n    this._y = sun_object._y + (Math.sin((rotation * Math.PI) \/ 180) * (sun_object._width \/ 2));\n    this._xscale = randomize(50,150);\n    this._rotation = rotation;\n  }\n\n\n  \/\/ polimorfismo\n  public function onEnterFrame() {\n    this._xscale -= randomize(1,6);\n    if(this._xscale &lt;= 0){\n      removeMovieClip(this);\n    }\n  }\n}\n<\/pre><\/div>\n\n\n<p>Es necesario enfatizar que las clases deben ser guardadas por separadas en archivos de extensi\u00f3n <code>as<\/code>, con el mismo nombre de la clase que albergan y dentro de la misma carpeta del proyecto para que se acceda a ella autom\u00e1ticamente sin tener que acudir a la directiva <code>#include<\/code>.<\/p>\n\n\n\n<p>Cuando tengamos lista la clase, debemos escribir en el <code>_root<\/code> el siguiente c\u00f3digo para que al reproducir la pel\u00edcula Flash, aparezca un resultado similar al mostrado:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: as3; title: ; notranslate\" title=\"\">\nvar _counter:Number = 0;\nvar _factor:Number = 3; \/\/factor de incremento del total de gotas\n\n\nonEnterFrame = function() {\n  for(var i:Number = 0; i &lt; _factor; i++){\n    attachMovie(&quot;sunbeam_symbol&quot;, &quot;sunbeam&quot; + _counter, getNextHighestDepth(),{sun_object:sun});\n  }\n  _counter += _factor;\n}\n<\/pre><\/div>\n\n\n<p>En el siguiente n\u00famero de la revista analizaremos paso a paso c\u00f3mo generar una part\u00edcula que siga un movimiento oscilatorio sinusoidal, para aquellos que necesiten comenzar desde cero. Mientras tanto, es recomendable visitar los v\u00ednculos propuestos a continuaci\u00f3n para familiarizarse con los fundamentos de la trigonometr\u00eda y el lenguaje Action Script 2.0.<\/p>\n\n\n\n<p>Escrito por ZorphDark<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este n\u00famero se contin\u00faa abordando la generaci\u00f3n de part\u00edculas, siguiendo el modelo de programaci\u00f3n orientada a objetos<\/p>\n","protected":false},"author":2,"featured_media":119,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,36],"tags":[101,88,38],"class_list":["post-258","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigos","category-proyecto-blackhat","tag-actionscript","tag-codigos","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=258"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions"}],"predecessor-version":[{"id":259,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions\/259"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/119"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}