Sunteți pe pagina 1din 9

UNIVERSIDAD CENTRAL DEL ECUADOR

FACULTAD DE INGENIERÍA CIENCIAS FÍSICAS Y MATEMÁTICA

INGENIERÍA EN COMPUTACIÓN GRÁFICA

Asignatura: FÍSICA PARA VIDEOJUEGOS I


Nombres: JOSSELYN CHAQUINGA, JUAN MOYA
Fecha: 10/05/2017

INFORME JUEGO PONG

INTRODUCCIÓN

El presente proyecto presenta la realización del videojuego Pong, el cual fue el


primer videojuego de la primera generación de videoconsolas publicado por Atari, creado
por Nolan Bushnell y lanzado el 29 de noviembre de 1972. Pong está basado en el
deporte de tenis de mesa. Pong es un juego de deportes en dos dimensiones que simula
un tenis de mesa. El jugador controla en el juego una paleta moviéndola verticalmente en
la parte izquierda de la pantalla, y puede competir tanto contra un oponente controlado
por computadora, como con otro jugador humano que controla una segunda paleta en la
parte opuesta. Los jugadores pueden usar las paletas para pegarle a la pelota hacia un
lado u otro. El objetivo consiste en que uno de los jugadores consiga más puntos que el
oponente al finalizar el juego. Estos puntos se obtienen cuando el jugador adversario falla
al devolver la pelota.

OBJETIVO
Desarrollar el videojuego Pong en Visual C##, aplicando conocimientos de Física, como
son los Vectores, MRU y MRUA

OBJETIVOS ESPECÍFICOS
 Adquirir la destreza de desarrollar videojuegos a la manera antigua
 Aprender el funcionamiento de las colisiones para desarrollar el videojuego
 Aprender a crear librerías y utilizarlas de manera adecuada
MARCO TEÓRICO
VECTORES

(MARTINEZ, 2009) Un vector es todo segmento de recta dirigido en el espacio. Cada vector posee

unas características que son:

 Origen: Es el punto exacto sobre el que actúa el vector.


 Módulo: Es la longitud o tamaño del vector.
 Dirección: Viene dada por la orientación en el espacio de la recta que lo contiene.
 Sentido: Se indica mediante una punta de flecha situada en el extremo del vector,
indicando hacia qué lado de la línea de acción se dirige el vector.

Hay que tener muy en cuenta el sistema de referencia de los vectores, que estará
formado por un origen y tres ejes perpendiculares. Este sistema de referencia permite
fijar la posición de un punto cualquiera con exactitud.

El sistema de referencia que usaremos, como norma general, es el Sistema de


Coordenadas Cartesianas.

MAGNITUDES ESCALARES

Son aquellas en las que las medidas quedan expresadas por medio de un número y la
correspondiente unidad. Ejemplo de ello son las siguientes magnitudes, entre otras:

 Masa
 Temperatura
 Presión
 Densidad

MAGNITUDES VECTORIALES

Son magnitudes que para estar determinadas precisan de un valor numérico, una
dirección, un sentido y un punto de aplicación.

Vector: Un vector es la expresión que proporciona la medida de cualquier magnitud


vectorial. Podemos considerarlo como un segmento orientado, en el que cabe distinguir:

 Un origen o punto de aplicación: A.


 Un extremo: B.
 Una dirección: la de la recta que lo contiene.
 Un sentido: indicado por la punta de flecha en B.
 Un módulo, indicativo de la longitud del segmento AB.
SUMA Y RESTA DE VECTORES

La suma de dos vectores libres es otro vector libre que se determina de la siguiente
forma:
Se sitúa el punto de aplicación de uno de ellos sobre el extremo del otro; el vector suma
es el vector que tiene su origen en el origen del primero y su extremo en el extremo del
segundo.
Por tanto, el vector suma de dos vectores coincide con una de las diagonales, la
"saliente", del paralelogramo que puede formarse con los vectores que se suman; la otra
diagonal representa la resta de dichos vectores.

Para efectuar sumas o restas de tres o más vectores, el proceso es idéntico. Basta con
aplicar la propiedad asociativa.
El vector que se obtiene al sumar o restar varios vectores se le denomina resultante.

PRODUCTO DE UN VECTOR POR UN ESCALAR

El resultado de multiplicar un escalar k por un vector v, expresado analíticamente por kv,


es otro vector con las siguientes características:

1. Tiene la misma dirección que v.


2. Su sentido coincide con el de v, si k es un número positivo, y es el opuesto, si k es
un número negativo.
3. El módulo es k veces la longitud que representa el módulo de v. ( Si k es 0 el
resultado es el vector nulo).

Analíticamente, tenemos que multiplicar el escalar por cada una de las coordenadas del
vector.

M.R.U
Un cuerpo realiza un movimiento rectilíneo uniforme cuando su trayectoria es una línea
recta y su velocidad es constante. Esto implica que recorre distancias iguales en tiempos
iguales.
ECUACIONES DE M.R.U.

Las ecuaciones del movimiento rectilíneo uniforme son:


x=x0+v⋅t

v=v0=cte

a=0

 x, x0: La posición del cuerpo en un instante dado (x) y en el instante inicial (x0). Su
unidad en el Sistema Internacional (S.I.) es el metro (m)
 v,v0: La velocidad del cuerpo en un instante dado (v) y en el instante inicial (v0). Su
unidad en el Sistema Internacional (S.I.) es el metro por segundo (m/s)
 a: La aceleración del cuerpo. Su unidad de medida en el Sistema Internacional
(S.I.) es el metro por segundo al cuadrado (m/s2)

MRUA
Un cuerpo realiza un movimiento (M.R.U.A.) o (M.R.U.V.) cuando su trayectoria es una
línea recta y su aceleración es constante. Esto implica que la velocidad aumenta o
disminuye su módulo de manera uniforme.
La aceleración es responsable de que cambie el módulo de la velocidad (también llamado
celeridad o rapidez), se le denomina aceleración tangencial.

ECUACIONES DEL M.R.U.A.


Velocidad (m/s): cambia de manera uniforme y su ecuación es:
v=vo+a⋅t
 v0 es la velocidad inicial.
 a es la aceleración que tiene el cuerpo.
 t es el intervalo de tiempo en el que se estudia el movimiento.

Posición (m):se calcula mediante la siguiente expresión

x=xo+vot+1/2at2

 xo es la posición inicial.
 vo es la velocidad inicial.
 a es la aceleración.
 t es el intervalo de tiempo en el que se estudia el movimiento.
Aceleración (m/s2): su valor permanece constante y distinto de cero

a=cte

 a>0, la velocidad aumenta su valor y se dice que el cuerpo está acelerando.


 a<0, la velocidad disminuye su valor y se dice que el cuerpo está frenando.

CÓDIGO DEL PROYECTO


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ClassLibrary1;
using System.Media;
// el cero de las coordenadas en bitmap esta en la parte superior izquierda
// y el y es hacia abajo
namespace VideoJuego
{
public partial class Form1 : Form
{

bool enabled = true;


float time = 0;
float x = 0, y=150;
float px =400, py =150, ay =350f, vx=500f, vy=-100; //para que baje a positiva
Bitmap fondo, texture, raqueta,raquetaL,raqueta1,pelota1;
Vector2 P, Vo, A,Vo2;
Vector2 PR , PL,RYP;
int contador1 = 0;
int contador = 0;
int contador2 = 3;
int contador3 = 0;
String gameOver = "GAME OVER";
String gameOver1 = " ";

public Form1()
{
P = new Vector2(px, py);
Vo = new Vector2(vx, vy);
Vo2 = new Vector2(10,-150);
A = new Vector2(0, ay);
PR = new Vector2(750,150 );
PL = new Vector2(10, 150);
RYP = new Vector2(100, 150);
Inicialize();
LoadContent();
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)


{
Application.Exit();
}

private void button2_Click(object sender, EventArgs e)


{
if (enabled)
{
enabled = false;
this.button2.Text = "Pause";
this.timer1.Enabled = true;
}
else
{
enabled = true;
this.button2.Text = "Play";
this.timer1.Enabled = false;
}
}

private void pictureBox1_Click(object sender, EventArgs e)


{
}
private void timer1_Tick(object sender, EventArgs e)
{
float deltaTime = Convert.ToSingle(this.timer1.Interval) / 1000f;
float tiempoLimite=30.00f;
time += deltaTime;
this.label1.Text = "t=" + time.ToString();
Update(deltaTime);
Draw();

}
private void Inicialize(){//pone todos los objetos al inicio del juego
InicializaFondo();
InicializaRaqueta();
InicializaRaquetaL();
InicializaTexture();// es la pelota
InicializaRaquetayPelota();
}

private void button3_Click(object sender, EventArgs e)


{
if (PL.Y <= 400)//BAJA RAQUETA
{
PL = new Vector2(PL.X, PL.Y + 100);
}
}
private void button4_Click(object sender, EventArgs e)
{
if (PL.Y >= 50)//SUBE RAQUETA IZQ
{
PL = new Vector2(PL.X, PL.Y - 100);
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void label4_Click(object sender, EventArgs e)
{
}
private void label5_Click(object sender, EventArgs e)
{
}
private void label3_Click(object sender, EventArgs e)
{
}
private void button5_Click(object sender, EventArgs e)
{
if (PR.Y <= 400)//BAJA RAQUETA DERECHA
{
PR = new Vector2(PR.X, PR.Y + 100);
}
}
private void button6_Click(object sender, EventArgs e)
{
if (PR.Y >= 50)//SUBE RAQUETA DERECHA
{
PR = new Vector2(PR.X, PR.Y -100);
}
}
private void LoadContent()
{
}
private void Update(float deltaTime)
{
//x += 1f;
//y += 1.5f;
float dt = deltaTime;
//t = time;
//x += vx * dt;
//y += vy*dt+0.5f*ay*dt*dt;
//vy += ay*dt
//colision con la pared de arriba
if (P.Y <= 0)
{
Vo = new Vector2(Vo.X, -Vo.Y);
// contador2++;
}
//colision con la pared de abajo
if ( fondo.Height- texture.Height-25<=P.Y)
{
Vo = new Vector2(Vo.X, -Vo.Y);
//contador3++;
}

//colision con la pared izquierda


if (fondo.Width-texture.Width <= P.X)
{
Vo = new Vector2(-Vo.X, Vo.Y);
//contador1++;

contador1++;

//this.label2.Text = (gameOver);

P = new Vector2(42, 200);


PL = new Vector2(10, 150);
enabled = true;
this.button2.Text = "Play";
this.timer1.Enabled = false;
// Vo = new Vector2(-Vo.X, Vo.Y);

}
// colision con la pared derecha
if (P.X <= 0)
{
Vo = new Vector2(-Vo.X, Vo.Y);
contador++;
//this.label2.Text = (gameOver);

P = new Vector2(42, 200);


PL = new Vector2(10, 150);
enabled = true;

this.button2.Text = "Play";
this.timer1.Enabled = false;
// this.label2.Text = (gameOver1);
//Vo2= new Vector2(10, -150);
}
//predice la nueva posicion de la particula en el tiempo t+dt
//colision raqueta derecha
if (700<= P.X &&(PR.Y -5 <= P.Y && PR.Y + 155 >= P.Y))
//if ((raqueta.Width-texture.Width<P.Y))
{
Vo = new Vector2(-Vo.X, Vo.Y);
// contador++;

}
//colision raqueta izquierda
//if (P.X <= 400 && (PR.Y - 5 <= P.Y && PR.Y + 155 > P.Y))
if (P.X< 40 && (PL.Y-5<=P.Y && PL.Y+155>P.Y))
{
Vo = new Vector2(-Vo.X, Vo.Y);
}
int suma = 0;
int suma1 = 0;
suma = contador;
suma1 = contador1;
this.label4.Text = "PUNTAJE 1: "+suma.ToString();
this.label5.Text = "PUNTAJE 2: " + suma1.ToString();
if (suma == contador2 || suma1==contador2)
{
this.label2.Text = (gameOver);
}
//MRUA
// P += Vo*dt+0.5f*A*dt*dt;
// P += Vo * (t + dt) + 0.5f * A * (t + dt) * (t + dt);
// Vo += A * dt;
// Vo2 += A * dt;
////MRU
P += Vo * dt ;
}

private void Draw()//coloca en la pantalla los dibujos

{
Bitmap I = new Bitmap(fondo);//variable interna que se convierte en global
Graphics g = Graphics.FromImage(I);
g.DrawImage(texture, P.ToPoint());//transforma el vector p a un punto
g.DrawImage(raqueta, PR.ToPoint());
g.DrawImage(raquetaL, PL.ToPoint());
// g.DrawImage(pelota1, RYP.ToPoint());

this.pictureBox1.Image = I;
}

private void label1_Click(object sender, EventArgs e)


{
}
private void InicializaFondo()//escenario estatico
{
fondo = new Bitmap(800, 600);
raqueta = new Bitmap(700, 250);
Graphics g = Graphics.FromImage(fondo);
g.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(0, 0, fondo.Width, fondo.Height));
SolidBrush color = new SolidBrush(Color.Red),
c2 = new SolidBrush(Color.Yellow),
c3 = new SolidBrush(Color.Green),
c4 = new SolidBrush(Color.Blue),
c5 = new SolidBrush(Color.White);//cuadrado amarillo con fondo rojo
Pen lapiz = new Pen(color,2);
Pen lapiz1 = new Pen(c5, 2);//tamano por defecto tiene espesor 1
//g.FillRectangle(c2, new Rectangle(400, 0, 50, 150));
//g.FillRectangle(c2, new Rectangle(400, 0, 50, 150));
// g.FillRectangle(c3, new Rectangle(700, 250, 30, 150));//interior del rectangulo
// g.DrawRectangle(lapiz1, new Rectangle(700, 250, 30,150));//x, y,ancho, alto
g.DrawRectangle(lapiz, new Rectangle(400,0,2,659));//x, y,ancho, alto
}

private void InicializaTexture()


{
texture= new Bitmap(50, 50);
Graphics g = Graphics.FromImage(texture);
Rectangle rectangle = new Rectangle(0, 0, texture.Width, texture.Height);
g.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0, 0)), rectangle);

g.FillEllipse(new SolidBrush(Color.Salmon), rectangle);


}

private void InicializaRaqueta()


{
raqueta = new Bitmap(30,150);
Graphics g = Graphics.FromImage(raqueta);
Rectangle rectangle = new Rectangle(0, 0, raqueta.Width, raqueta.Height);
g.FillRectangle(new SolidBrush(Color.SkyBlue), rectangle);

// g.FillEllipse(new SolidBrush(Color.White), rectangle);


}
private void InicializaRaquetaL()
{
raquetaL = new Bitmap(30, 150);
Graphics g = Graphics.FromImage(raquetaL);
Rectangle rectangle = new Rectangle(0, 0, raquetaL.Width, raquetaL.Height);
g.FillRectangle(new SolidBrush(Color.SkyBlue), rectangle);

// g.FillEllipse(new SolidBrush(Color.White), rectangle);


}

private void InicializaRaquetayPelota()


{

//pelota1= new Bitmap(50, 50);


//Graphics g = Graphics.FromImage(pelota1);
//Rectangle rectangle = new Rectangle(0, 0,pelota1.Width,pelota1.Height);
//g.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0, 0)), rectangle);

//g.FillEllipse(new SolidBrush(Color.White), rectangle);


}
private void label2_Click(object sender, EventArgs e)
{
//String gameOver = "GAME OVER";

//this.label2.Text = gameOver;

}
}
}

BIBLIOGRAFÍA

 FISICALAB. (s.f.). FISICALAB. Obtenido de MOVIMIENTO RECTILÍNEO UNIFORME: https://www.fisicalab.com/apartado/mru#contenidos


 FISICALAB. (s.f.). MOVIMIENTO RECTILÍNEO UNIFORMENTE VARIADO. Obtenido de FISICALAB: https://www.fisicalab.com/apartado/mrua#contenidos
 HIPERTEXTUAL. (s.f.). HIPERTEXTUAL. Obtenido de HISTORIA DE LA TECNOLOGÍA: https://hipertextual.com/2011/08/pong-videojuego-creo-industria
 MARTINEZ, M. (29 de MARZO de 2009). FÍSICA. Obtenido de VECTORES: http://marinamachuca.blogspot.com/2009/03/evaluacion.html
 PDF. (s.f.). PDF. Obtenido de DEFINICIÓN DE VECTORES: http://tochtli.fisica.uson.mx/electro/vectores/definici%C3%B3n_de_vectores.htm

S-ar putea să vă placă și