Pregunta sobre bgt

37 Nachrichten, 2 Seiten:  1 2 ↖ Zurück zur Themenliste

~msgScore~: +0

1. BOFH ,

Buenas,

supongo que esto no es el lugar adecuado para preguntarlo, pero nada pierdo con ello.
¿Alguien sabe si bgt soporta conexiones a servidores realizados con otro lenguaje que no sea el mismo?
Es que lo he intentado por activa y por pasiva, pero no logro hacer un buen manejo de sonidos con java o C#, y la clase de sonidos 3D que desarrolló Samtupy es la leche para programar cosillas decentes en bgt.
Le preguntaría como ha hecho la parte cliente servidor de survive, pero me va a mandar un poco a tomar viento fresco.

~msgScore~: +0

2. el_pichon,

Las conexiones externas siempre son independientes del lenguaje que se usa, lo importante es lo que se envía y lo que se recibe. Hasta donde yo sé, Sam tiene el servidor de Survive hecho también en bgt.

~msgScore~: +0

3. BOFH ,

Mierda... eso no corre en linux xD

~msgScore~: +0

4. HijoDelTrueno,

Bueno, creo haber leído que el bgt usa UDP en lugar de TCP para conexiones cliente-servidor. Ahora los comandos... habrá que hacer ingeniería inversa.

~msgScore~: +0

5. Martin,

Yo no te recomendaría perder el tiempo con BGT. Es un lenguaje muy limitado y de vez en cuando tiene problemas, en los juegos multijugador.

~msgScore~: +0

6. ryusei-tanaka,

bgt malo por siempre por favor..
c++ piton o algo correcto no bgt por favor..

~msgScore~: +0

7. BOFH ,

BGT para sonidos está muy bien. Tiene unas clases de sonido 3d muy bien hechas. De hecho, el cliente lo puedes desarrollar en bgt y el servidor en python, java o cualquier otro lenguaje.

~msgScore~: +0

8. Exink,

A aquéllos que critican a BGT, yo primero les preguntaría qué opinan de los juegos programados en dicho lenguaje. BeatStar, el mismo Survive, RedSpot, el viyains from beyond... en fin, yo pienso que si el lenguaje te permite hacer lo que necesitas está bien, aunque puede que esté equivocado porque yo de programación sé lo mismo que de chino (a pesar de que conozco ligeramente más de éste idioma). Un saludo.

~msgScore~: +0

9. SM-Casio-Chiptune ,

No es mal lenguaje para nada, solo que es muy limitado y existe gente a la que le gusta trabajar no necesariamente todo en Windows, viste? Más o menos ahí viene la cosa, después si te querés crear un lindo audiojuegos y sin imágenes para Windows ahí sí, metele pa que tenga nomás, no te digo de nada de lo que es programar en Internet porque ahí sí, lo mesmo que de chino sé de eso xd.

~msgScore~: +0

10. BOFH ,

La única pega que le encuentro a bgt es el objeto network. Ojito al ejemplo oficial, que es la polla. si alguien me explica para tontos como funciona, que no lo termino de pillar...

Example 1 (server):
// Create a server that listens on port 10000, and sends back any messages it receives.

network host;

void main()
{
show_game_window("Game Server");
tts_voice voice;
if(host.setup_server(10000, 1, 100)==false)
{
voice.speak_wait("Error. The server could not be set up.");
exit();
}
voice.speak("Welcome to the echo server. This server will accept up to 100 connections, and send back anything it receives.");
network_event event;
while(true)
{
event=host.request();
if(event.type==event_connect)
{
voice.speak_interrupt("Peer number " + event.peer_id + " connected from " + host.get_peer_address(event.peer_id) + ".");
voice.speak("Peers now connected: " + host.connected_peers + ".");
}
if(event.type==event_receive)
{
host.send_unreliable(event.peer_id, event.message, event.channel);
}
if(event.type==event_disconnect)
{
voice.speak_interrupt("Peer number " + event.peer_id + " just disconnected.");
voice.speak("Peers now connected: " + host.connected_peers + ".");
}
if(key_down(KEY_LMENU) and key_pressed(KEY_F4))
{
voice.speak_interrupt("Exiting.");
disconnect_everyone();
// Just in case the voice hasn't finished speaking when this function returns, we wait for it to finish before actually exiting.
while(voice.speaking==true)
{
wait(5);
}
exit();
}
wait(5);
}
}

void disconnect_everyone()
{

/*
This function first gets a list of all connected peers and disconnects them. Then it waits until it has received the same number of disconnect notifications as it sent out disconnect requests, and then returns. This may take some time, however, so we set up a timeout after which we return anyway.

Note that we are not processing messages in this event loop. You will obviously want to do this if you have other connections to manage at the same time.
*/

timer timeout;
uint[] peer_list=host.get_peer_list();
int expected_disconnects=peer_list.length();
for(uint i=0;i < peer_list.length();i++)
{
host.disconnect_peer(peer_list[i]);
}
network_event event;
while(expected_disconnects>0)
{
event=host.request();
if(event.type==event_disconnect)
{
expected_disconnects-=1;
}
if(timeout.elapsed>=1000)
{
break;
}
wait(5);
}
}

Example 2 (client):
// Create a client that connects to a server, and gathers some statistics about the connection.

network host;

void main()
{
show_game_window("Game Client");
tts_voice voice;
uint server_id=0; // This is used to store the ID of the remote peer that will be our server.
if(host.setup_client(1, 1)==false)
{
voice.speak_wait("Error. The client could not be set up.");
exit();
}
voice.speak("Client started.");
voice.speak("Please enter the IP address or host name that you wish to connect to.");
string address=input_box("Address", "Please enter the host name or address to connect to.");
if(address=="")
{
voice.speak_interrupt_wait("Exiting.");
exit();
}
voice.speak_interrupt("Connecting, please wait.");
host.connect(address, 10000);
network_event event;

// In this loop, we just wait for either a connect or disconnect event as this is always the first thing that we'll get.

while(true)
{
event=host.request();
if(event.type==event_connect)
{
voice.speak_interrupt("The connection to " + host.get_peer_address(event.peer_id) + " succeeded!");
server_id=event.peer_id;
break;
}
if(event.type==event_disconnect)
{
voice.speak_interrupt_wait("The connection to " + host.get_peer_address(event.peer_id) + " failed. Exiting.");
exit();
}
if(key_down(KEY_LMENU) and key_pressed(KEY_F4))
{
host.destroy();
voice.speak_interrupt_wait("Exiting.");
exit();
}
wait(5);
}

/*
Since we got here, we know that we have an active connection and can begin gathering statistics. We do this by sending roughly 30 packets per second, for 10 seconds. Then, we disconnect and speak the statistics.
*/

timer message_trigger;
timer total_time;
int sent_messages=0;
int received_messages=0;
while(true)
{
event=host.request();
if(event.type==event_disconnect)
{
host.destroy();
voice.speak_interrupt_wait("The server died. Exiting.");
exit();
}
if(event.type==event_receive)
{
received_messages+=1;
}
if(message_trigger.elapsed>=33)
{
message_trigger.restart();
host.send_unreliable(server_id, "Hello!", 0);
sent_messages+=1;
}
if(total_time.elapsed>=10000)
{
// The statistics are gathered, so we speak them.
voice.speak_interrupt("Statistics: Messages sent, " + sent_messages + ". Messages received, " + received_messages + ". Average round trip time, " + host.get_peer_average_round_trip_time(server_id) + " milliseconds. Exiting.");
disconnect_everyone();

/*
Just in case the voice hasn't finished speaking when this function returns, we wait for it to finish before actually exiting. We also allow the user to press alt+f4 since the message is pretty long.
*/
while(voice.speaking==true)
{
if(key_down(KEY_LMENU) and key_pressed(KEY_F4))
{
break;
}
wait(5);
}
exit();
}
if(key_down(KEY_LMENU) and key_pressed(KEY_F4))
{
voice.speak_interrupt("Exiting.");
disconnect_everyone();
// Just in case the voice hasn't finished speaking when this function returns, we wait for it to finish before actually exiting.
while(voice.speaking==true)
{
wait(5);
}
exit();
}
wait(5);
}
}

void disconnect_everyone()
{

/* This is the exact same function as the one found in the server, as it works equally well for both.

This function first gets a list of all connected peers and disconnects them. Then it waits until it has received the same number of disconnect notifications as it sent out disconnect requests, and then returns. This may take some time, however, so we set up a timeout after which we return anyway.

Note that we are not processing messages in this event loop. You will obviously want to do this if you have other connections to manage at the same time.
*/

timer timeout;
uint[] peer_list=host.get_peer_list();
int expected_disconnects=peer_list.length();
for(uint i=0;i < peer_list.length();i++)
{
host.disconnect_peer(peer_list[i]);
}
network_event event;
while(expected_disconnects>0)
{
event=host.request();
if(event.type==event_disconnect)
{
expected_disconnects-=1;
}
if(timeout.elapsed>=1000)
{
break;
}
wait(5);
}
}

~msgScore~: +0

11. el_pichon,

Vale, me he leído sólo el servidor, que tiene tela. Si tienes experiencia con el manejo de sockets y conexiones, se entiende. Eso sí, es una forma antinatural de trabajar con la red, el resto de programas usan sockets de otra forma, incluyendo C por muy procedimental que sea.
Dicho esto, pregunto: qué pasa con los threads? bgt tiene threads? Si no es así, tiene una grandísima desventaja con respecto a otros lenguajes.

~msgScore~: +0

12. Martin,

Hola, para el amigo que preguntó que se pensava de juegos como el survive, reed spot o beat star, yo le diría que se ponga analizar primero. Si te pones a pensar, estás comparando dos tipos de juego distintos, uno, se conecta a internet para enviar datos básicos a un servidor, y los otros dos interactúan de forma, como decirlo, más directa, y en tiempo real.
A caso no te a pasado de estár jugando a survive the wild o a cualquier otro juego así y se te a cerrado inesperadamente o a tirado algún error de conexión? esto puede que sea problema del servidor o de tu conexión a internet, pero también existe la posibilidad de que esto ocurra por el lenguaje, el tan mimado y querido BGT. Además, seamos realistas, este lenguaje es puro script aún, y tiene una desventaja muy grande, si quieres desarrollar juegos para otro sistema que no sea Windows, no lo puedes usar.

~msgScore~: +0

13. unknown_brain ,

no es por nada...
pero arriba el bgt!
y no me digan que sise programar...
porque no se ni...
nada de nada
xd

~msgScore~: +0

14. BOFH ,

controlas por peerIds. Dependiendo del peerId que te envíe la petición así actúas, o puedes enbiar a un peerId específico.

~msgScore~: +0

15. Exink,

Pero las desconexiones no sólo se deben al lenguaje en sí sino al servidor sobre las que ocurren, según tengo entendido.

~msgScore~: +0

16. Martin,

el servidor de survive the wild está hecho en BGT. Es lo mismo.

~msgScore~: +0

17. BOFH ,

Martin, perdona pero ahí estás hablando demasiado. No tienes y yo tampoco de hecho, idea de dónde se ejecuta survive. No sabes si se cae por que el servidor tiene inestavilidad o por que el ordenador que lo aloja pierde conexión a la red, o por que se va la luz. Ahí estás criticando sin fundamento.

~msgScore~: +0

18. HijoDelTrueno,

Pues lo dicho, el server de stw es un servidor bgt, ya que es mas fácil desarrollar algo así en bgt que en otro lenguaje.

Las conexiones en bgt van por UDP.

Creo que python-twisted sería bueno para hacer un server que imite su funcionamiento, con todas esas clases preescrita desde las que podés eredar.

@haldito12 deja de hacer el ridículo xDDD

Saludos.

~msgScore~: +0

19. BOFH ,

La putada de hacer un servidor en bgt es que solo y solo se ejecuta en windows. Y mi servidor dedicado usa debian. Si supiese como demonios se envían los eventos que recibe el cliente desde otro lenguaje de forma que lo entienda no me complicaba la existencia, lo haría en java que controlo más.

~msgScore~: +0

20. el_pichon,

Muy seguro te veo cuando afirmas que bgt usa UDP única y exclusivamente. ¿Desde cuándo UDP tiene eventos explícitos de conexión y desconexión?
Por otro lado, BOFH... ¿has pensado la idea de instalar Wine en tu debian y ejecutar el servidor?

~msgScore~: +0

21. HijoDelTrueno,

No se como es que funciona, pero leí en la documentación oficial que va por udp, lo prometo xD

~msgScore~: +0

22. unknown_brain ,

uuuuy
creo que alguien me dijo... +
algo

~msgScore~: +0

23. BOFH ,

Usa UDP y TCP. Me estoy empollando el objeto network a saco. ya tengo algo que hace el intento de intentar ser un servidor.

~msgScore~: +0

24. HijoDelTrueno,

hace el intento de intentar hacer el intento de intentar... recursividad infinita

~msgScore~: +0

25. BOFH ,

xDDDD
Hablando de recursividad, ¿existe en bgt?

~msgScore~: +0

26. HijoDelTrueno,

existe en todo lenguaje de programación que yo conozca, salvo cobol.

~msgScore~: +0

27. BOFH ,

No la di en el instituto, la profesora decía que no se usaba para nada, al igual que los treaths, y ahora en la empresa lo estoy aprendiendo a marchas forzadas. Tengo que investigar el concepto.

~msgScore~: +0

28. el_pichon,

Concepto de recursividad: tenemos 1 o más casos base, y 1 o más casos recursivos. Vamos a ver un ejemplo sencillo que nos permita hallar el factorial de un número.
El factorial consiste en multiplicar ese número por todos los que tiene debajo, hasta llegar a 1.
public static long factorial(long n){
if (n==1){ //caso base
return n;
}else{ //caso recursivo
return n*factorial(n-1);
}
}

~msgScore~: +0

29. BOFH ,

Pero eso llama infinitamente a factorial, ¿no se podría caer en un bucle infinito?
n=100;
factorial(100)
no es igual a 1, así que...
nfactorial(99)
n no es igual a 1, así que n
factorial(98)
...
Acabaría quedando
n*factorial(1)=1;

~msgScore~: +0

30. el_pichon,

No no, la secuencia sería la siguiente:
factorial(100)=100factorial(99)
factorial(99)=99
factorial(98)
...
factorial(2)=2*factorial(1)
factorial(1)=1 (caso base)
Generas una pila de llamadas, que podría resultar en un desbordamiento y un posible error de ejecución, pero jamás un bucle infinito. En el caso recursivo, cada función devuelve el resultado de multiplicar el parámetro por el resultado que te devuelva la función al llamarla con un número más bajo. En el caso base, devuelves simplemente lo mismo que entra.

~msgScore~: +0

37 Nachrichten, 2 Seiten:  1 2 ↖ Zurück zur Themenliste

Auf das Thema antworten

Sie müssen angemeldet sein, um posten zu können

Passwort vergessen? Benutzerkonto erstellen