PDA

Ver la Versión Completa : Novato solicita ayuda..Juego en Delphi


j_flores3000
14-11-2007, 22:44:48
: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 (http://www.clubdelphi.com/foros/guiaestilo.php).

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
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):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 (http://www.clubdelphi.com/foros/showthread.php?t=49474). 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/showpost.php?p=215645&postcount=76

Delphius
16-11-2007, 03:41:42
j_flores3000 (http://www.clubdelphi.com/foros/member.php?u=23166),
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 (http://www.clubdelphi.com/foros/showthread.php?p=247365#post247365) 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:

((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:

((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

((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

((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:(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
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
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
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
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/22/912849/TRABAJO%20FINAL.zip

alexxx
26-12-2007, 09:57:19
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/22/912849/TRABAJO%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/22/912849/TRABAJO%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
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:

Caral
26-12-2007, 16:42:25
Hola
Muy simpático el juego.
Coloca un componente Updow un edit mas y un boton.
En el edit le pones en text 50, sera el minimo.
En el updow le pones en increment 5, para que valla de 5 en 5, en Min 50 y en max 250.
El Updow en eventos:
Associate: Edit2
Aqui pongo el codigo completo, asi lo veras mejor.

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

case key of
vk_left:
image2.Left:=image2.Left-8;
vk_right:
image2.Left:=image2.left+8;
vk_up:
begin
timer2.Interval:=10;
image3.Visible:=true;
image3.Left:=image2.Left+30;
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.left:=image1.left+10;
w:=image1.left;
x:=image1.left+104;
y:=image1.top;
z:=image1.top+40;
if image1.left>500 then
image1.left:=0;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
image1.Visible:=true;
image3.Top:=image3.top-5;
image3.Visible:=true;
if image3.Top<image1.top then
begin
timer2.interval:=0;
image3.Visible:=false;
image3.Top:=376;
image4.Visible:=false;
end;
if (image3.top>=y) and (image3.top<=z) then
if (image3.left>=w) and (image3.left<=x) then
begin
image1.Left:=0;
image4.Visible:=true;
image4.Top:=image3.Top-15;
image4.Left:=image3.Left-10;
image1.Visible:=false;

s:=s+10;
str((s+0),p);
edit1.text:=p;
If Edit1.Text = '200' then
begin
Timer1.Enabled:= False;
Showmessage('gano');
Button1.Enabled:= true;
Edit1.Text := '0';
s:= 0;
end;
end;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
timer1.interval:= StrToInt(Edit2.Text);
end;

procedure TForm1.UpDown1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
timer1.interval:= UpDown1.Increment;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Edit2.Enabled:= True;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
Edit2.Enabled:= False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:= True;
Button1.Enabled:= false;
end;

end.
Saludos

alexxx
08-04-2008, 18:08:20
Q tal hace unos dias recien me entere q aprobe el curso con 15 (puntaje maximo 1 a 20)
gracias amigos me salvaron de una muerte segura en mi casa...:D
suerte y espero sigan ayudando a mas personas q lo necesiten... ;)

Celta
14-07-2010, 03:15:19
hola a todos mi pregunta es como crear varios misiles grasias ..

Caral
14-07-2010, 04:25:44
Hola
Aqui estabamos... (http://www.clubdelphi.com/foros/showthread.php?p=370308#post370308)
Saludos

Ñuño Martínez
14-07-2010, 19:10:33
hola a todos mi pregunta es como crear varios misiles grasias ..

Pues creándolos... En serio... De veras... Que no te miento... Si no, bájate las fuentes de Allegro.pas (http://allegro-pas.sf.net/) y mira el código fuente.