repeat(score=0)
{
texto="Para visitar la comunidad Game Maker, presiona [url=https://www.comunidadgm.org]Aquí[/url]"
//lector
argument1=texto
code=0
str_code=""
et_ap=0
et_cp=0
url_p=0
url_length=0
contenido_p=0
contenido_length=0
length=string_length(argument1)
for(i=1;i<=length;i+=1)
{
str_ram=string_copy(argument1,i,1)
if(str_ram="[" && code=0){code=1;et_ap=i}
if(code=3){
if(str_ram="["){code=4;str_code="";et_cp=i}else{contenido_length+=1}}
if(code=2){
if(str_ram="]"){code=3;str_code="";contenido_p=i+1}else{url_length+=1}}
if(code=1){
str_code+=str_ram
if(str_code="[url="){code=2;url_p=i+1;str_code=""}}
}
etiqueta_a=string_copy(texto,et_ap,5)
etiqueta_c=string_copy(texto,et_cp,6)
url_x=string_copy(texto,url_p,url_length)
contenido_x=string_copy(texto,contenido_p,contenido_length)
score=1
}
//botones
if(keyboard_check(113)){game_restart()}
//dibujo
dy=0
dx=0
txt=texto
txt="Texto: "+string(txt)
draw_text(dx,dy,txt)
dy+=40;if(dy>room_height-20){dy=0;dx+=100}
txt=etiqueta_a
txt="Etiqueta de apertura: "+string(etiqueta_a)
draw_text(dx,dy,txt)
dy+=20;if(dy>room_height-20){dy=0;dx+=100}
txt=etiqueta_c
txt="Etiqueta de cierre: "+string(txt)
draw_text(dx,dy,txt)
dy+=20;if(dy>room_height-20){dy=0;dx+=100}
txt=url_x
txt="Dirección web: "+string(url_x)
draw_text(dx,dy,txt)
dy+=20;if(dy>room_height-20){dy=0;dx+=100}
txt=contenido_x
txt="Contenido o texto a mostrar: "+string(txt)
draw_text(dx,dy,txt)
dy+=20;if(dy>room_height-20){dy=0;dx+=100}
pp_create()
pp_inicio()
pp_mando(vk_left,vk_up,vk_right,vk_down,ord("Z"))
pp_movimientos(5,0.75,0.25,1,5.5,1,-2)
//Nombre del script: pp_creacion
//Este script es para el evento create o creación
//Variables para script pp_movimientos
//pp_movimientos(velocidad,aceleracion,friccion,gravedad,salto,techo,object_type)
pp_velocidad=0 //Velocidad horizontal máxima a alcanzar.
pp_aceleracion=0 //Aceleración o incremento de la pp_velocidad horizontal.
pp_friccion=0 //Fricción o rose que disminuye la pp_velocidad horizontal.
pp_gravedad=0 //Gravedad con la que los objetos son atraídos hacia abajo.
pp_salto=0 //Fuerza de salto o pp_velocidad inicial ascendente.
pp_techo=0 //Interacción con el techo; puede tener cuatro valores: 0 para que tarde un poco en bajar, 1 para colisionar normalmente, 2 para rebotar, 3 para pegarse al techo dejando presionada la tecla de salto.
pp_tipo_objeto=0//Tipo de objeto con el cual se puede colisionar. se puede colocar lo siguiente: -1 para objetos solidos, -2 para todos los objetos y tambien se pueden colocar el nombre o numero de objeto para especificar al objeto.
//variables de dirección y salto
pp_d=1 //dirección inicial que tendrá el objeto: 1 derecha y -1 izquierda.
pp_vxpre=0// pp_velocidad x previa, o movimiento horizontal sin analizar.
pp_vs=0//pp_velocidad vertical
control=0 //para controlar el movimiento del personaje
//INDISPENSABLE PARA script pp_movimientos
pp_movimientos_numero=0 //Contador de scripts movimiento
pp_boton_izquierda=0
pp_boton_arriba=0
pp_boton_derecha=0
pp_boton_abajo=0
pp_boton_salto_pressed=0
pp_boton_salto=0
//INDISPENSABLES PARA script pp_mando
pp_mando_numero=0//Contador de scripts pp_mando
//INDISPENSABLES PARA pp_sprites
pp_sprite_diry=1
pp_sprite_movimientox=0
pp_sprite_movimientoy=0
//INDISPENSABLE PARA pp_sprite y pp_movimiento
pp_estado="suelo"
pp_estado2="parado"
pp_colina=0//para las colinas
//resbalarse en colinas
pp_aceleracion_colina=0
pre_colina=0
v_colina=0
//Nombre del script: pp_libre
//Este script lo requiere el script pp_movimientos.
//pp_libre(x,y,tipo_objeto): para determinar si un tipo de objeto se encuenta en un lugar, En tipo_objeto puedes usar -1 para solidos, -2 para todos y el nombre de un objeto.
//Este script cumple la función de detectar objetos al igual que las funciones meeting, free y empty. Es indispensable para controlar el tipo de objeto a detectar.
{
libre_object=argument2 //Detectando tipo de objeto
pre_return=0 //Preparando la salida del script
if(libre_object>=0){pre_return+=(place_meeting(argument0,argument1,libre_object)=0)}//Verificando si se ha indicado objeto
pre_return+=place_free(argument0,argument1)*(libre_object=-1)//Verificando si el objeto es solido
pre_return+=place_empty(argument0,argument1)*(libre_object<=-2)//Verificando a cualquier objeto
return pre_return //Devolviendo resultado.
}
//Este código presentaba errores en Html5 pero se remplazó la siguiente función
//pre_return+=(place_meeting(argument0,argument1,argument2)=0)*(libre_object>=0)
//se reemplazó por esta:
//if(libre_object>=0){pre_return+=(place_meeting(argument0,argument1,libre_object)=0)}
//Nombre del script: pp_inicio
//Este script debe ser el primero en el evento step.
//Es indispensable para contar a los diferentes scripts.
//para los scripts input
pp_mando_numero=0 //numero de scripts input que se van ejecutando por step.
pp_movimientos_numero=0 //numero de scripts movements que se van ejecutando por step.
//Nombre del script: pp_mando
//Este script se coloca en el evento step debajo del script pp_inicio
//Se emplea para definir las teclas a usar.
//Estructura
//pp_mando(pp_boton_izquierda,pp_boton_arriba,pp_boton_derecha,pp_boton_abajo,boton_salto)
//Ejemplo de uso:
//pp_mando(ord("A"),ord("W"),ord("D"),ord("S"),ord("M"))
//pp_mando(vk_left,vk_up,vk_right,vk_down,ord("X"))
//pp_mando(100,104,102,98,ord("X"))
pp_mando_numero+=1; //contando los scripts pp_mando.
if(pp_mando_numero=1){//Para evitar errores por muchos scrpts pp_mando
//botones a usar
pp_boton_izquierda=keyboard_check(argument0)
pp_boton_arriba=keyboard_check(argument1)
pp_boton_derecha=keyboard_check(argument2)
pp_boton_abajo=keyboard_check(argument3)
pp_boton_salto_pressed=(pp_boton_salto=0)*keyboard_check(argument4)
pp_boton_salto=keyboard_check(argument4)
}
//Nombre del script: pp_movimientos
//Se coloca en el evento step o paso, debajo de pp_mando.
//Estructura:
//pp_movimientos(velocidad,aceleracion,friccion,gravedad,salto,techo,tipo_objeto)
//Ejemplo de uso:
//Normal: pp_movimientos(5,1,0.5,1,5.5,1,-2)
//Hielo: pp_movimientos(5,0.4,0.1,1,5.5,1,-2)
//Gravedad de luna: pp_movimientos(3,0.4,0.08,0.29,2.2,1,-2)
pp_movimientos_numero+=1 ;//sumando cada script movements.
if(pp_movimientos_numero=1) //garantizando el uso de un solo script movement para evitar errores.
{
/////////////////////////ADMINISTRADOR DE ARGUMENTOS
pp_velocidad=argument0; //Velocidad X máxima, o velocidad horizontal máxima.
pp_aceleracion=argument1; //Aceleracion del movimiento x, o movimiento horizontal.
pp_friccion=argument2; //Fricción del movimiento horizontal
pp_gravedad=argument3 //Gravedad, o velocidad vertical positiva.
pp_fuerza_salto=argument4 //Fuerza de salto o velocidad inicial ascendente
pp_techo=argument5 //Techo: tipo de choque con techo
pp_tipo_objeto=argument6 //detectando el tipo de objeto con el cual colisionar
//condiciones para estar agachado según mario world 1 snes
if((pp_estado="suelo")&&(pp_boton_abajo)){pp_estado2="agachado"}
if((pp_estado2="agachado")&&(pp_estado="suelo")&&(pp_boton_abajo=0)){pp_estado2="parado"}
if(pp_colina!=0){pp_estado2="parado"}
//condiciones para permitir el caminar segun mario bros world 1 snes
condicion1=(pp_estado="no_suelo")
condicion2=(pp_estado="suelo" && pp_estado2="parado")
//condiciones para resbalarse en colina
condicion4=(pp_estado="suelo")*pp_libre(x-3,y+1,pp_tipo_objeto)*(pp_libre(x,y+2,pp_tipo_objeto)=0)
condicion3=(pp_estado="suelo")*pp_libre(x+3,y+1,pp_tipo_objeto)*(pp_libre(x,y+2,pp_tipo_objeto)=0)
pp_colina=0
if(condicion4){pp_colina=-1}
if(condicion3){pp_colina=1}
pp_aceleracion_colina=abs(pp_colina)
////////////////////////MOVIMIENTO X O MOVIMIENTO HORIZONTAL
//pp_velocidad=argument0; //Velocidad X máxima, o pp_velocidad horizontal máxima.
//pp_aceleracion=argument1; //Aceleracion del movimiento x, o movimiento horizontal.
//pp_friccion=argument2; //Fricción del movimiento horizontal
control=(pp_boton_izquierda+pp_boton_derecha=1) //Permite el movimiento horizontal solo cuando una sola de las teclas son presionadas.
if(control){pp_d=1-2*pp_boton_izquierda} //Permite el cambio de la dirección. 1 para derecha y -1 para izquierda.
if(control && (condicion1||condicion2)){pp_vxpre+=pp_aceleracion*pp_d} //relacionando la velocidad con la direccion.
if((control=0)&&(condicion3 || condicion4)){pp_vxpre+=((pp_colina=1)-(pp_colina=-1))*((pp_aceleracion_colina)+(pp_aceleracion_colina*2*pp_boton_abajo))} //Mover a estar en una colina
if(pp_vxpre>pp_velocidad){pp_vxpre=pp_velocidad}//limitando la velocidad
if(pp_vxpre<-pp_velocidad){pp_vxpre=-pp_velocidad}//limitando la velocidad negativa
if(abs(pp_vxpre)){pp_vxpre-=sign(pp_vxpre)*pp_friccion}//reduciendo la velocidad con la fricción
if((pp_vxpre<pp_friccion) && (pp_vxpre>-pp_friccion)){pp_vxpre=0}//Evitando errores: Haciendo la velocidad cero cuando esté proxima a cero.
///CALCULANDO EL MOVIMIENTO X DEFINITIVO.
xdef=0 //movimiento X, definitivo sin colisiones. Por calcularse.
for(i=1;i<=abs(pp_vxpre) && pp_libre(x+i*sign(pp_vxpre),y,pp_tipo_objeto);i+=1){xdef+=sign(pp_vxpre)}//Calculando y comprobando que el movimiento x no presentará colisiones. Si resentare colisiones entonces será reducido hasta llegar a cero.
x+=xdef //Movimiento X, final.
///////////////////////////////MOVIMIENTO Y O MOVIMIENTO VERTICAL
//Determinar si hay un suelo
pp_estado="no_suelo" //permitir salto cuando exista suelo a los pies.
for(i=1;i<=1+floor(abs(pp_vxpre)*2) && (pp_estado="no_suelo") && (pp_vs>=0);i+=1){if(pp_libre(x,y+i,pp_tipo_objeto)=0){pp_estado="suelo";pp_vs=0;y+=i-1}}
//pp_gravedad=argument3 //pp_gravedad, o velocidad vertical positiva.
//para permitir el salto cuando las condiciones estén dadas
if(pp_boton_salto_pressed && (pp_estado="suelo") && (pp_vs>=0)){pp_salto=pp_fuerza_salto} //Condiciones para generar la acción de salto.
pp_salto=pp_salto-pp_gravedad //disminuyendo impulso de salto con la gravedad.
if(pp_salto<=0)pp_salto=0 //para evitar que el salto produzca errores.
pp_vs+=pp_gravedad-pp_salto //relacionando salto y gravedad.
//CHOQUE CON EL TECHO
//pp_techo=argument5
//al chocar con el techo
cx=0
cx=(pp_libre(x,y-1,pp_tipo_objeto)=0)
if(cx){//cuando hayga un techo a la cabeza
if((pp_techo=1) && (pp_vs<0)){pp_vs=0} //para colisionar normalmente
if((pp_techo=2) && (pp_vs<0)){pp_vs=pp_vs*-1} //para rebotar
if((pp_techo=3) && pp_boton_salto){pp_vs=0} //para pegarse al techo
}
//MOVIMIENTO Y DEFINITIVO
ydef=0 //movimiento Y, definitivo sin colisiones. Por calcularse.
for(i=1;i<=abs(pp_vs) && pp_libre(x,y+i*sign(pp_vs),pp_tipo_objeto);i+=1){ydef+=sign(pp_vs)}//CORRECTOR DE MOVIMIENTO VERTICAL. Este sistema verifica que el movimiento a dar esté libre de colisión, de lo contrario lo vá reduciendo hasta que no exista colisión.
y+=ydef //movimiento Y, final.
/////////////////////////////////SUBIR COLINAS
repeat(floor(abs(pp_vxpre))*(abs(pp_vxpre)>1)){ //se repite el siguiente código para acelerar la subida de una colina
libre_y=0// El espacio libre a la cabeza del personaje
for(i=1;i<=2 && pp_libre(x,y-i,pp_tipo_objeto);i+=1){libre_y+=1}
libre_y2=0// El espacio libre delante del personaje
for(i=0;i<=libre_y && pp_libre(x+sign(pp_vxpre),y-libre_y+i,pp_tipo_objeto);i+=1){libre_y2+=1}
libre_y+=(libre_y>0) //salto minimo
libre_y-=libre_y2 //Al salto total le restamos el espacio libre que tenemos adelante para poder hacer un salto exacto
c3=pp_libre(x+sign(pp_vxpre),y-libre_y,pp_tipo_objeto)
c4=pp_libre(x+sign(pp_vxpre),y-1,pp_tipo_objeto)
c5=(pp_libre(x+sign(pp_vxpre),y,pp_tipo_objeto)=0)
c6=pp_libre(x,y-1,pp_tipo_objeto)
if((c3 || c4) && c5 && abs(pp_vxpre) && c6){y-=pp_libre(x,y-1,pp_tipo_objeto)+pp_libre(x,y-2,pp_tipo_objeto)*(libre_y=2);if(abs(pp_vxpre)>1.5){x+=sign(pp_vxpre)*pp_libre(x+sign(pp_vxpre),y,pp_tipo_objeto)}}
}
}//fin if(pp_movimientos_numero=1)
//Nombre del script: pp_sprite_
//pp_sprite_(parado,caminando,saltando,cayendo,agachado,mirando_arriba,resbalandose,frenando)
pp_sprite_direccion=argument0
pp_sprite_parado=argument1
pp_sprite_caminando=argument2
pp_sprite_saltando=argument3
pp_sprite_cayendo=argument4
pp_sprite_agachado=argument5
pp_sprite_mirando_arriba=argument6
pp_sprite_resbalandose=argument7
pp_sprite_frenando=argument8
pp_sprite_return=0
if(x=xprevious){pp_sprite_movimientox=0}else{pp_sprite_movimientox=1}
if(y=yprevious){pp_estadoy=0}else{pp_estadoy=1}
if(y>yprevious){pp_sprite_diry=1}
if(y<yprevious){pp_sprite_diry=-1}
//CUANDO ESTÁ EN EL SUELO
if(pp_estado="suelo"){
//Cuando está estático en el suelo
if(pp_sprite_movimientox=0){pp_sprite_return=pp_sprite_parado}
//si esta en el suelo y se está moviento
if(pp_sprite_movimientox=1){
pp_sprite_return=pp_sprite_caminando;//si esta caminando
if((sign(pp_vxpre)!=pp_d)*(pp_colina=0)){pp_sprite_return=pp_sprite_frenando}//si esta frenandose
}
//CUANDO MIRA HACIA ARRIBA
if((pp_sprite_movimientox=0)&& pp_boton_arriba){pp_sprite_return=pp_sprite_mirando_arriba}
//RESBALANDOSE
if((pp_colina!=0)&&(control=0)&&(pp_boton_abajo)){pp_sprite_return=pp_sprite_resbalandose}
}
//CUANDO NO TIENE NADA BAJO LOS PIES
if(pp_estado="no_suelo"){
//Cuando saltando y subiendo
if(pp_sprite_diry=-1){pp_sprite_return=pp_sprite_saltando}
//si esta en el suelo y se está moviento
if(pp_sprite_diry=1){pp_sprite_return=pp_sprite_cayendo}
}
//CUANDO ESTÁ AGACHADO
if(pp_estado2="agachado")
{
pp_sprite_return=pp_sprite_agachado
}
if(pp_sprite_direccion!=0)
{
if(pp_sprite_direccion=pp_d){sprite_index=pp_sprite_return}
}
else
{sprite_index=pp_sprite_return;image_xscale=pp_d}//para usar image_xscale
image_speed=0.4
pp_techo: Interacción con el techo; puede tener cuatro valores: 0 para que tarde un poco en bajar. 1 para colisionar normalmente. 2 para rebotar. 3 para pegarse al techo dejando presionada la tecla de salto. |
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Comentarios</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<!--Código html-->
<div id="divContenedor">
<div id="divCabecera">
Comentarios públicos
</div>
<div id="divContenedorFormulario">
<input id="inputnombre" type="text" placeholder="Nombre:" maxlength=25>
</br>
<textarea id="idtextarea"name="textarea" placeholder="Tu comentario"></textarea>
</br>
<button id="idbutton" onclick="botonClick()">Enviar</button>
</div>
<div id="contenedorComentarios"></div>
</div>
<!--Código JavaScript-->
<?php
// comprobar si tenemos los parametros en la URL
if (isset($_GET["inputnombre"]) && isset($_GET["idtextarea"]))
{
$idtextarea = $_GET["idtextarea"];
$inputnombre = $_GET["inputnombre"];
$ip_add = $_SERVER['REMOTE_ADDR'];
$DateAndTime = date('m-d-Y h:i:s a', time());
$nombreArchivo="comentarios.json";
if(!file_exists($nombreArchivo))
{
$file = fopen($nombreArchivo, "w");
fclose($file);
}
$data = file_get_contents($nombreArchivo);
$products = json_decode($data, true);
$arrayCantidad = count($products);
$arrayNuevo = array("ip"=>$ip_add,"fecha"=>$DateAndTime,"nombre"=>$inputnombre,"comentario"=>$idtextarea);
if($arrayCantidad==0)
{
$products=$arrayNuevo;
$stringJson = json_encode($products);
$stringJson = "[".$stringJson."]";
}
else
{
array_push($products,$arrayNuevo);
$stringJson = json_encode($products);
}
$nombreArchivo="comentarios.json";
$file = fopen($nombreArchivo, "w");
fwrite($file,$stringJson);
fclose($file);
}
?>
<?php
//Leer archivo Json
$nombreArchivo="comentarios.json";
if(!file_exists($nombreArchivo))
{
$file = fopen($nombreArchivo, "w");
fclose($file);
}
$data = file_get_contents($nombreArchivo);
$products = json_decode($data, true);
$stringJson = json_encode($products);
?>
<script>
//Pasar Json a objeto
var textoJson =`<?php echo $data;?>`;
var comentarios = JSON.parse(textoJson);
</script>
<script src="main.js"></script>
<script>
function botonClick(){
var inputnombre = document.getElementById("inputnombre").value;
var idtextarea = document.getElementById("idtextarea").value;
var saltox = String.fromCodePoint(10);
idtextarea = idtextarea.replace(new RegExp(saltox,"g"), '<br/>');
idtextarea = idtextarea.replace(/"/g,"''");
var texto = JSON.stringify(comentarios);
window.location.href = window.location.href + `?inputnombre=${inputnombre}&&idtextarea=${idtextarea}`;
}
</script>
</body>
</html>
var contenedorComentarios = document.getElementById("contenedorComentarios");
var comentariosCantidad = Object.keys(comentarios).length;
for(var i=0; i<comentariosCantidad; i+=1)
{
var numero_ASD = ((comentariosCantidad-1)-i);
var propiedadString_ASD = ((comentariosCantidad-1)-i);
var propiedad_ASD = comentarios[propiedadString_ASD];
var nombre_ASD = propiedad_ASD.nombre;
var comentario_ASD = propiedad_ASD.comentario;
var fecha_ASD = propiedad_ASD.fecha;
contenedorComentarios.innerHTML += `
<div class="divCajaComentario">
<div class="divCabezaComentario">
<div class="divComentarioNombre">
${nombre_ASD}
</div>
<div class="divComentarioFecha">
${fecha_ASD}
</div>
</div>
<div class="divContenidoComentario">
${comentario_ASD}
</div>
</div>`;
}
body{
background: black;
color: white;
}
#divVariables{
position: absolute;
bottom: 0px;
left: 0px;
background: red;
color: black;
width: 128px;
}
#divContenedor{
padding-bottom: 10px;
width: 90vw;
height: auto;
background: #192126;
margin: 0px auto;
border-radius: 5px;
}
#divCabecera{
padding: 5px;
font-size: 20px;
background: #151828;
text-align: center;
border-radius: 5px;
}
#divContenedorFormulario{
padding: 5px;
text-align: left;
height: 40%;
margin: 0px auto;
margin-top: 20px;
background: #293654;
border-radius: 5px;
width: 75%;
}
#inputnombre{
margin: 2px;
padding: 5px;
background: #384872;
border: 1px solid #293654;
border-radius: 5px;
color: white;
}
#idtextarea{
margin: 2px;
padding: 5px;
background: #384872;
border: 1px solid #293654;
border-radius: 5px;
color: white;
width: 95%;
height: auto;
resize:none;
}
#idbutton{
background: #347974;
border: none;
border-radius: 5px;
margin: 2px;
color: white;
padding: 5px;
text-align: center;
text-decoration: none;
display: inline-block;
}
#idbutton:hover{
background: #399969;
}
.divCajaComentario{
margin: 0px auto;
margin-top: 20px;
width: 75%;
height: auto;
border-radius: 5px;
background: #384872;
padding: 5px;
}
.divCabezaComentario{
margin-bottom: 1px;
padding: 5px;
width: calc(100%-20px);
height: 20%;
background: #293654;
border-radius: 5px;
display: flex;
flex-direction: row;
}
.divComentarioNombre{
width: 60%;
}
.divComentarioFecha{
width: 40%;
display: inline-block;
text-align: right;
}
.divContenidoComentario{
width: calc(100%-20px);
height: 60%;
padding: 10px;
padding-top: 5px;
padding-bottom: 5px;
border-radius: 5px;
}
@media (orientation: portrait) {
.divCajaComentario{
width: 90%;
}
#divContenedorFormulario{
width: 90%;
}
}