Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Novato solicita ayuda..Juego en Delphi (https://www.clubdelphi.com/foros/showthread.php?t=50336)

j_flores3000 14-11-2007 22:44:48

Novato solicita ayuda..Juego en Delphi
 
:o:cool::DHola a todos. como ya aclare soy un novato en delphi. tengo que crear un juego para la escuela (1º año). la cuestion es que ya tengo todo armado. el juego se trata de un aviion que se va moviendo y cada vez que apreto espacio sale el misil para destruir a otros aviones. lo que no puedo hacer es que cuando apreto espacio ( esto lo se hacer vk_space) salga el misil del lugar donde este el avion que puede ser en cualquier lado....por favor ayudenme.:):mad::p;):rolleyes::confused:

jhonny 14-11-2007 22:50:23

Para hacer dicho avión hiciste alguna clase llamada TAvion o algo asi?

Si es asi, pues me imagino que debes tener algunas propiedades que indiquen la poscición en la que esta el avión y solo seria cuestión de crear un metodo dentro de la clase que dispare dicho cohete dependiendo de dichas propiedades.

Delphius 14-11-2007 22:55:16

Hola j_flores3000,
Bienvenido a Clubdelphi.

Como eres nuevo te recomiendo una leída a la guia de estilo.

Con respecto a tu problema. ¿Podrías por favor profundizar tu explicación y darnos mayores detalles?
Tu problema debe ser analizado desde dos puntos de vistas: lógico y de interfaz ¿en que área tienes problemas (aunque lo más seguro es que sea ambas)?

¿Cómo mueves el avión?¿Se trata de TImage con la figura del avión?¿Cómo estás representando el misíl?
¿El misil debe obedecer el principio de la físíca (caída libre)? ¿O se trata de los fantasiosos misiles laser que van derechito?
Debido a que no aportas detalles no puedo indicarte nada, te pido que tengas la amabilidad de explicar mejor tu problema. Y por favor, muestra parte del código para poder entenderte.

j_flores3000 14-11-2007 22:59:11

Re::
 
Al avion lo hice con TImage y el misil con un TLabel.
me ayudarias un poco???
gracias...
si el misil es uno magic que sale derecho... te muestro mi codigo

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Avion: TImage;
RDisparo: TTimer;
Misil: TLabel;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure MisilClick(Sender: TObject);
procedure RDisparoTimer(Sender: TObject);


private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1 : TForm1;
//A_Arriba : boolean;
//A_Abajo : boolean;
//A_Izq : boolean;
//A_Der : boolean;
X_Avion : integer;
Y_Avion : integer;
Disparo : boolean;

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin

ShowCursor(True);
VertScrollBar.Visible := False;
HorzScrollBar.Visible := False;
Color := clAqua;
//BorderStyle := bsNone;


//Ubicar Avion

Y_Avion := (ClientWidth div 2) - (Avion.Width div 2);
Avion.Top := Y_Avion;
avion.Left := 0;

end;



procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin

case Key of

vk_up : Avion.Top := Avion.Top -5;
vk_down : Avion.Top := Avion.Top +5;
vk_left : Avion.left := Avion.left -5;
vk_right : Avion.left := Avion.left +5;
vk_escape : Close;
vk_space : disparo := true;
end;

end;

procedure TForm1.RDisparoTimer(Sender: TObject);
begin


if disparo then begin
Misil.Visible := True;
Misil.Left := Misil.Left +5;


end;

end;

procedure TForm1.MisilClick(Sender: TObject);
begin

Misil.Top := Avion.Top +20;
Misil.Left := Avion.Left +100;

end;

end.

Delphius 14-11-2007 23:13:09

flores3000,
Por lo que veo, puede que haya estos problemas:
1. Sólo se verá un sólo disparo
2. La velocidad del misil
3. Considerar el impacto contra el objetivo
4. Evitar que se pase de los bordes

Ahora no puedo analizar con profundidad el código, debo ausentarme por unas horas. Como te dije antes, si puedes profundizar más sobre el tema hazlo. Hay cosas que considerar que no están en la explicación inicial, sería muy útil que cuanto más detalles des a conocer sobre el juego y de tus problemas va a ser más fácil ayudarte.

Saludos,

Ñuño Martínez 15-11-2007 01:34:20

Me ha costado, pero lo he encontrado (para ello he tenido que reproducir lo que creo que has hecho):
Código Delphi [-]
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
                              Shift: TShiftState);
begin
   case Key of
  ......
    vk_space  : disparo    := true;
  end;
end;

procedure TForm1.RDisparoTimer(Sender: TObject);
begin
  if disparo then
  begin
    Misil.Visible := True;
    Misil.Left    :=  Misil.Left +5;
  end;
end;

procedure TForm1.MisilClick(Sender: TObject);
begin
  Misil.Top     := Avion.Top +20;
  Misil.Left    := Avion.Left +100;
end;

Veamos: por un lado le estás diciendo que si pulsas la barra espaciadora, "Disparo" es cierto. Luego le dices que si "Disparo" es cierto, entonces mueva la etiqueta misil cada X tiempo. Para terminar le dices que, si pulsas con el ratón sobre la etiqueta entonces mueva dicha etiqueta cerca del avión.

La cuestión es que no le dices dónde ha de ponerse el misil cuando disparas, sino cuando pulsas la etiqueta, que no es visible y, encima, se mueve. Por eso "no lo ves".

Un aviso, por si te interesa: el enfoque que le estás dando no es correcto, ya que los componentes que utilizas están preparados para hacer ventanas con botones, iconos y etiquetas, no para hacer juegos y menos para hacer juegos interactivos. Ya sé que es por cuestiones de estudios, pero si de verdad te interesa hacer juegos, echa un vistazo a este hilo. Te prevengo que el ejemplo es muy diferente a lo que estás haciendo.

seoane 15-11-2007 15:30:43

Aquí tienes otro ejemplo de juego MUY simple, pero entretenido :D

http://www.clubdelphi.com/foros/show...5&postcount=76

Delphius 16-11-2007 03:41:42

1 Archivos Adjunto(s)
j_flores3000,
Estuve unos minutos libre y bueno hice una demo algo similar a lo que tu necesitarías. Es un poquito más complicada pero creo que con lo que puedas ver del código notarás que lo simple puede ser complejo... considero que trates de entender no el código sino la lógica que es donde está el verdadero problema de tu aplicativo.

Y como te dijo Ñuño, si en alguna oportunidad decides probar dedicarte al mundo de los videos juegos puedes optar por emplear alegro.pas

Si tienes dudas aqui estaremos.

Saludos,

Delphius 21-11-2007 06:40:19

Hola j_flores3000,
Veo en otro hilo que pides ayuda. El tema lo puedes Y DEBES seguir tratando aquí ¿Porqué no pasaste por aqui y preguntaste?
¿Entendiste mi ejemplo? ¿Es demasiado complicado?

¿Porque no te tomas el tiempo suficiente para explicarte? Brindanos la mayor cantidad de información posible. ¿Lograste avanzar el algo? ¿Que estuviste probando?

Si no veo interés de tu parte por querer explicarte no creo que lleguemos a comprenderte.

La colisión se produce cuando dos (o más) elementos se chocan. O dicho de otro modo cuando desean ocupar una misma posición. Independientemente de si al menos uno de los objetos que intervienen en la colisión es inmovil, la colisión se cumple en base una condición:
La posición X e Y de en todo o parte de un objeto A es la misma posición X e Y de en todo o parte de un objeto B.

Por ejemplo un objeto A tiene un tamaño de 30x10, que está en posición [0,30] y un objeto B de tamaño 20x10 está en la posición [10,30] ¿Colisionan?
SI. Porque el objeto A ocupa las coordenadas [0,30], [30,10], [0,40] y [30,40] y el objeto B ocupa las coordenadas [10,30], [30,30], [10,40] y [30,40] Se observa que el objeto B invade casi la totalidad del objeto A, de hecho la única zona libre de A es la parte izquierda.
¿Como se obtienen estas coordenadas?
Sabiendo el largo y Alto de un objeto y la coordenada respecto a la posición de origen.

Las propiedades Left y Top del TImage, o de cualquier control ubican a dicho elemento respecto al origen del form. El eje y está invertido, en vez de subir (como el cartesiano), va bajando. La idea es que sabiendo su posición y su ancho se puede determinar cualquiera punto de sus esquinas:

Coordenada_Largo_x = Left + width
Coordenada_Alto_y = Top + Height

Entonces habrá colisión entre dos objetos (en este caso simple) cuando las coordenadas entre el largo y el ancho de los objetos sean concidentes. esto puede verse en el código que te expongo:

Código Delphi [-]
((ImgMisil.Left + ImgMisil.Width) >= ImgEnemigo.Left) AND
    ((ImgMisil.Top >= ImgEnemigo.Top) AND
    ((ImgMisil.Top + ImgMisil.Height) <=
    (ImgEnemigo.Top + ImgEnemigo.Height)))

La explicación es como sigue:
Código Delphi [-]
((ImgMisil.Left + ImgMisil.Width) >= ImgEnemigo.Left)
Verifico que la posición x del enemigo esté comprendida en la coordenada_largo_x del misil. Es decir si hay colisión sobre el EJE X
Código Delphi [-]
((ImgMisil.Top >= ImgEnemigo.Top)
Verifico que la posición y del enemigo esté comprendida en la posición y del misil. Es decir si hay colisión sobre el EJE Y

Código Delphi [-]
((ImgMisil.Top + ImgMisil.Height) <=
(ImgEnemigo.Top + ImgEnemigo.Height)))
Me aseguro que el alto del misil (coordenada_alto_y) sea coincidente con el alto del enemigo (coordenada_alto_y). La condición anterior es NECESESARIA pero no suficiente. Ya que puede darse el caso de que el misil haya pasado por debajo del enemigo.

Mi código puede mejorarse, seguro que si. No es el más bello... pero la idea y mi intensión no es de llenarte de código y de comentarios. Sino forzarte a ver el problema desde el punto de la lógica (es a propósito la ausencia de comentarios), que tu logres ver al problema no como una necesidad de programación y centrado en el código. Si te ha costado más de lo normal, mis disculpas. No medí la dificultad del problema.

Tu problema no es de codificación sino de lógica. Los juegos tienen más de lógica y matemática que cualquier otra cosa. Y Sabiendo que te estas iniciando, te recomiendo que entrenes y practiques más sobre este aspecto y no tanto en el código. La mayoría de los ejercicios que te darán en clases tienen mucho de lógica, algoritmos matemáticos... la idea no es aprenderse un lenguaje en produndidad, sino entrenar al cerebro a pensar abstractamente, comprender el problema y encontrar la manera de representarlo en la programación.

Considero que si te explicas bien te podremos ser de ayuda. No se de que otro modo explicarte cuando hay colisión. Si no me entiendes... disculpa, a veces no me se explicar.

Saludos,

Ñuño Martínez 21-11-2007 16:01:44

Compañero [Delphius], has olvidado hacer un esquema para ilustrarlo mejor:
Código:

(x,y)
  +----------+
  |          |
  |          |
  |      +---------------------+
  |      |  |                |
  |      |  |                |
  +------|---+ (x + w, y + h)  |
        |                    |
        |                    |
        |                    |
        +---------------------+

Donde (x, y) es la posición del objeto y (w, h) es su ancho y su alto respectivamente (width, height).

Delphius 21-11-2007 16:09:15

Pues si... queda mejor;)... no se me ocurrió hacerle un ejemplo visual.

Ahora espero que j_flores3000 no tome mal mis comentarios. Y que considere oportuno explicar mejor su problema.

Saludos,

j_flores3000 21-11-2007 19:19:20

Gracias...Solo Gracias
 
Hola amigos...agradezco sus respuestas muy buenas!!! ya termine el juego y lo aprobe con diez. gracias por todo...

jhonny 21-11-2007 19:24:38

Cita:

Empezado por j_flores3000 (Mensaje 247517)
Hola amigos...agradezco sus respuestas muy buenas!!! ya termine el juego y lo aprobe con diez. gracias por todo...

Bueno Jenny, sería chevere que nos mostraras el jueguito, seguramente nos divertiriamos un rato jugando :).

j_flores3000 21-11-2007 19:48:46

Cita:

Empezado por jhonny (Mensaje 247520)
Bueno Jenny, sería chevere que nos mostraras el jueguito, seguramente nos divertiriamos un rato jugando :).

CHe jhonny me llamo Juan...Y mi apellido es flores!!!...ya les paso el game!

JXJ 01-12-2007 22:23:24

y el juego}???????????

alexxx 26-12-2007 09:54:15

por favor Ayuda urgente!!!
 
q tal eh leido aki q manejan algo similar al problema q yo tengo no domino el programa este el delphi por eso necesito q me ayuden porq sino reprovare mi curso... el problema q tengo es q me han dejado un jueguito de trabajo q ya lo tengo hecho pero me han pedido q le aumente algunas cosillas mas q son:
poner una opcion q aumente o disminuya la velocidad del avion a eleccion de cada uno y otra q el puntaje cuando llegue a una cantidad determinada por ejemplo 100 aparesca un aviso q diga ganaste! y salga un boton para aceptar y se cierre el programa o el juego. solo me falta eso si fueran tan amables de ayudarme les estare eternamente agradecido mi ultimo dia para presentar este trabajo es mañana miercoles 26/12/07 todo el dia, por favor ruego me ayuden porq es de vida o muerte............................:(
aki dejo el juego para q lo miren y entiendan mi explicacion pesa un poco asi q lo subi a otro sitio ahi tienen la url para bajarlo espero puedan construirlo esas dos cosas q me faltan...........................:(

http://www.fileden.com/files/2007/3/...JO%20FINAL.zip

alexxx 26-12-2007 09:57:19

por favor Ayuda urgente respondan!!!!
 
por favor Ayuda urgente!!!
q tal eh leido aki q manejan algo similar al problema q yo tengo no domino el programa este el delphi por eso necesito q me ayuden porq sino reprovare mi curso... el problema q tengo es q me han dejado un jueguito de trabajo q ya lo tengo hecho pero me han pedido q le aumente algunas cosillas mas q son:
poner una opcion q aumente o disminuya la velocidad del avion a eleccion de cada uno y otra q el puntaje cuando llegue a una cantidad determinada por ejemplo 100 aparesca un aviso q diga ganaste! y salga un boton para aceptar y se cierre el programa o el juego. solo me falta eso si fueran tan amables de ayudarme les estare eternamente agradecido mi ultimo dia para presentar este trabajo es mañana miercoles 26/12/07 todo el dia, por favor ruego me ayuden porq es de vida o muerte............................:(
aki dejo el juego para q lo miren y entiendan mi explicacion pesa un poco asi q lo subi a otro sitio ahi tienen la url para bajarlo espero puedan construirlo esas dos cosas q me faltan...........................:(


http://www.fileden.com/files/2007/3/...JO%20FINAL.zip

alexxx 26-12-2007 09:58:42

q tal eh leido aki q manejan algo similar al problema q yo tengo no domino el programa este el delphi por eso necesito q me ayuden porq sino reprovare mi curso... el problema q tengo es q me han dejado un jueguito de trabajo q ya lo tengo hecho pero me han pedido q le aumente algunas cosillas mas q son:
poner una opcion q aumente o disminuya la velocidad del avion a eleccion de cada uno y otra q el puntaje cuando llegue a una cantidad determinada por ejemplo 100 aparesca un aviso q diga ganaste! y salga un boton para aceptar y se cierre el programa o el juego. solo me falta eso si fueran tan amables de ayudarme les estare eternamente agradecido mi ultimo dia para presentar este trabajo es mañana miercoles 26/12/07 todo el dia, por favor ruego me ayuden porq es de vida o muerte............................
aki dejo el juego para q lo miren y entiendan mi explicacion pesa un poco asi q lo subi a otro sitio ahi tienen la url para bajarlo espero puedan construirlo esas dos cosas q me faltan...........................

http://www.fileden.com/files/2007/3/...37;20FINAL.zip

fjcg02 26-12-2007 10:33:59

Hola alexxxx,
tanto como que es de vida o muerte ....

Lo más que ocurrirá será que suspenderás la asignatura :D.

Imagino que estarás comiendote el código de lo que tienes porque sino, lo llevas chungo.

Saludos

alexxx 26-12-2007 15:41:36

alexxx
 
q tal segun lo q tengo entendido lo q me falta es algo simple pero q yo no puedo deducir o entender aun.... podran ayudarme???:confused:


La franja horaria es GMT +2. Ahora son las 01:40:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi