{"id":947,"date":"2024-12-07T21:07:58","date_gmt":"2024-12-07T20:07:58","guid":{"rendered":"https:\/\/jorgeturiel.es\/?p=947"},"modified":"2024-12-07T21:09:34","modified_gmt":"2024-12-07T20:09:34","slug":"telepong-con-castle-game-engine-parte-3","status":"publish","type":"post","link":"https:\/\/jorgeturiel.es\/?p=947","title":{"rendered":"TelePong con Castle Game Engine. Parte 3"},"content":{"rendered":"\n<p>En entradas anteriores hab\u00edamos creado un versi\u00f3n funcional de este cl\u00e1sico, aunque se pod\u00eda jugar le faltaban algunos detalles como el sonido, darle un toque m\u00e1s \u00abretro\u00bb a los textos, etc.<\/p>\n\n\n\n<p>Vamos a ver como implementar estas mejoras y algunas m\u00e1s.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">A\u00f1adiendo sonido<\/h2>\n\n\n\n<p>Vamos a a\u00f1adir sonido a nuestro juego. Para ello debemos a\u00f1adir el componente no visual <em>TCastleSound<\/em>. Para ello pulsa con el bot\u00f3n derecho sobre <em>ViewPort<\/em> y a\u00f1ade tres  veces el componente <em>TCastleSound<\/em>, ya que vamos tener tres sonidos.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"742\" height=\"327\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203109.png\" alt=\"\" class=\"wp-image-949\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203109.png 742w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203109-300x132.png 300w\" sizes=\"auto, (max-width: 742px) 100vw, 742px\" \/><\/figure>\n<\/div>\n\n\n<p>Ahora renombra los componentes reci\u00e9n creados con los siguientes nombres:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rebote<\/li>\n\n\n\n<li>PlayerHit<\/li>\n\n\n\n<li>Gol<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"227\" height=\"93\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203001.png\" alt=\"\" class=\"wp-image-950\"\/><\/figure>\n<\/div>\n\n\n<p>Como habr\u00e1s supuesto, cada uno de ellos nos servir\u00e1 para generar un sonido seg\u00fan describe su nombre. Descarga tres sonidos que te gusten, y gu\u00e1rdalos en la carpeta <em>Data<\/em> del proyecto. O bien puedes descargar los sonidos que yo he usado desde <a href=\"https:\/\/github.com\/Blueicaro\/CastleEngineTelepong\/tree\/main\/data\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<p>Ahora hay que asignar cada sonido a su componente. Para ello se usa la propiedad <em>Url<\/em>. Al pulsar sobre los tres puntos se abrir\u00e1 un cuadro de di\u00e1logo y podr\u00e1s seleccionar el archivo.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"472\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203935-1024x472.png\" alt=\"\" class=\"wp-image-951\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203935-1024x472.png 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203935-300x138.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203935-768x354.png 768w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-203935.png 1333w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Guarda el proyecto (puedes pulsar ctrl+s) y ahora en el editor vamos a teclear algo de c\u00f3digo.<\/p>\n\n\n\n<p>A\u00f1ade en la cl\u00e1usula uses la unidad <em>CastleSoundEngine<\/em> y en la secci\u00f3n <em>published<\/em>, a\u00f1ade los tres componentes de sonido que hemos creado.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" > published\n   \/\/a\u00f1ade estos componentes. \n    PlayerHit: TCastleSound;\n    Gol: TCastleSound;\n    Rebote: TCastleSound;          <\/pre><\/div>\n\n\n\n<p>Ahora, cada vez que un jugador golpea la pelota, o bien la pelota rebota en un lado, o se marca un gol, debemos hacer sonar un sonido. Para ello usaremos los eventos de colisi\u00f3n. Para los lados crearemos un evento de colisi\u00f3n com\u00fan.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" >procedure TViewMain.Start;\nvar\n  Body: TCastleRigidBody;\nbegin\n  inherited;\n\n\/\/a\u00f1ade este c\u00f3digo\n\n  \/\/Lado Derecho\n  Body := LadoDerecho.FindBehavior(TCastleRigidBody) as TCastleRigidBody;\n  {$IFDEF FPC}\n  Body.OnCollisionEnter := @ColisionLadoDerecho;\n  {$ELSE}\n  Body.OnCollisionEnter := ColisionLadoDerecho;\n  {$ENDIF}\n\n  \/\/Lado Izqquierdo\n  Body := LadoIzquierdo.FindBehavior(TCastleRigidBody) as TCastleRigidBody;\n  {$IFDEF FPC}\n  Body.OnCollisionEnter := @ColisionLadoIzquierdo;\n  {$ELSE}\n  Body.OnCollisionEnter := ColisionLadoIzquierdo;\n  {$ENDIF}\n\n  Body := LadoSuperior.FindBehavior(TCastleRigidBody) as TCastleRigidBody;\n  {$IFDEF FPC}\n   Body.OnCollisionEnter:=@ColisionParedes;\n  {$ELSE}\n  Body.OnCollisionEnter := ColisionParedes;\n  {$ENDIF}\n\n  Body := LadoInferior.FindBehavior(TCastleRigidBody) as TCastleRigidBody;\n  {$IFDEF FPC}\n   Body.OnCollisionEnter:=@ColisionParedes;\n  {$ELSE}\n  Body.OnCollisionEnter := ColisionParedes;\n  {$ENDIF}\nend;                                     <\/pre><\/div>\n\n\n\n<p>Ahora en el procedimiento <em>ColisionParedes<\/em>, haremos uso del motor de sonidos, y reproduciremos el sonido Rebote.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" >procedure TViewMain.ColisionParedes(const CollisionDetails: TPhysicsCollisionDetails);\nbegin\n  SoundEngine.Play(Rebote);\nend;  <\/pre><\/div>\n\n\n\n<p>En los otros de eventos de colisi\u00f3n a\u00f1ade, tambi\u00e9n, la misma l\u00ednea, pero reproduciendo el sonido correspondiente.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" >procedure TViewMain.ColisionPlayer1(const CollisionDetails: TPhysicsCollisionDetails);\nbegin\n  VelocidadPlayer1 := 0;\n  SoundEngine.Play(PlayerHit);\nend;\n\nprocedure TViewMain.ColisionPlayer2(const CollisionDetails: TPhysicsCollisionDetails);\nbegin\n  VelocidadPlayer2 := 0;\n  SoundEngine.Play(PlayerHit);\nend;    <\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Usando una fuente<\/h2>\n\n\n\n<p>Para darle un aspecto m\u00e1s \u00abretro\u00bb a los textos vamos a usar una fuente. En concreto la fuente <em>DejaVuSans<\/em>. Debes copiarla en la carpeta <em>Data <\/em> del proyecto. La puedes encontrar por internet, o las carpetas de ejemplos de Castle Engine Game, o bien puedes descargarla de <a href=\"https:\/\/github.com\/Blueicaro\/CastleEngineTelepong\/tree\/main\/data\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<p>Ahora a\u00f1ade un componente  no visual <em>TCastleFont<\/em>. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"730\" height=\"318\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205526.png\" alt=\"\" class=\"wp-image-956\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205526.png 730w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205526-300x131.png 300w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/figure>\n\n\n\n<p>Puedes dejar el nombre por defecto, y en su propiedad <em>Url<\/em>, a\u00f1ade la fuente, pulsando sobre los tres puntos, al igual que hicimos con los sonidos.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"490\" height=\"257\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205619.png\" alt=\"\" class=\"wp-image-957\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205619.png 490w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205619-300x157.png 300w\" sizes=\"auto, (max-width: 490px) 100vw, 490px\" \/><\/figure>\n<\/div>\n\n\n<p>Ya, por \u00faltimo en cada componente <em>TCastleLabel<\/em>, en su propiedad <em>CustomFont<\/em>, a\u00f1ade el componente <em>font1<span style=\"text-decoration: underline;\">.<\/span><\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"492\" height=\"450\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205828.png\" alt=\"\" class=\"wp-image-958\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205828.png 492w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2024\/12\/Captura-de-pantalla-2024-12-07-205828-300x274.png 300w\" sizes=\"auto, (max-width: 492px) 100vw, 492px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Conclusiones<\/h2>\n\n\n\n<p>En las tres entradas que hemos dedicado a la creaci\u00f3n de este cl\u00e1sico juego, hemos visto desde como crear un proyecto 2D, el motor de f\u00edsicas, como gestionar colisiones, con reproducir sonidos, y como usar fuentes de tipos de letras. <\/p>\n\n\n\n<p>En resumen tenemos un sencillo juego funcionando sin casi escribir c\u00f3digo.<\/p>\n\n\n\n<p>Al juego, le he a\u00f1adido algunos detalles para terminarlo del todo, como unas funciones de saque, textos indicando las teclas, etc. Puedes descargar el c\u00f3digo completo desde <a href=\"https:\/\/github.com\/Blueicaro\/CastleEngineTelepong\/tree\/main\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<p>Saludos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En entradas anteriores hab\u00edamos creado un versi\u00f3n funcional de este cl\u00e1sico, aunque se pod\u00eda jugar le faltaban algunos detalles como el sonido, darle un toque m\u00e1s \u00abretro\u00bb a los textos, etc. Vamos a ver como implementar estas mejoras y algunas m\u00e1s.<\/p>\n","protected":false},"author":2,"featured_media":893,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[57,56,25,26,48],"tags":[49,23,21,24],"class_list":["post-947","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-castle-game-engine","category-cge","category-pascal","category-programacion","category-videojuegos","tag-castle-game-engine","tag-lazarus","tag-pascal","tag-programacion"],"_links":{"self":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=947"}],"version-history":[{"count":6,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/947\/revisions"}],"predecessor-version":[{"id":959,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/947\/revisions\/959"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/media\/893"}],"wp:attachment":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}