Está en la página 1de 39

CODIGOS DEL

SEMESTRE
DESARROLLO DE
SOFTWARE

De Jesus Rojas Arreguin


5IM5
PRIMER
PARCIAL
Codigo:1.2
Este código define tres clases relacionadas que representan diferentes
tipos de empleados en una empresa: Empleado, Gerente y Obrero.
Clase Empleado:Es una clase abstracta que proporciona la estructura
básica para los empleados.Contiene un método abstracto getSalario(),
que debe ser implementado por las clases hijas.
Clase Gerente (que hereda de Empleado):Adicionalmente al campo
nombre heredado, tiene un campo objetivo que indica si el gerente ha
cumplido sus objetivos.Implementa el método abstracto getSalario(),
que calcula el salario del gerente. Si ha cumplido los objetivos, se
agrega un 10% al salario base de $40,000.
Clase Obrero (también hereda de Empleado):Al igual que Gerente,
tiene un campo adicional horas que indica las horas trabajadas por el
obrero.Implementa el método abstracto getSalario(), que calcula el
salario del obrero multiplicando las horas trabajadas por una tarifa de
$150 por hora.

INICIO DEL CODIGO

(MAIN)

package clase20Sept;

public class EmpleadoAct {


public static void main(String[] args) {
Obrero a=new Obrero("Juan",35);
System.out.println(a.toString());
System.out.println("Salario= " +a.getSalario());
Gerente g= new Gerente("Carlos",true);
System.out.println(g.toString());
System.out.println("Salario= "+g.getSalario());

}
abstract class Empleado {

protected String nombre;


public Empleado() {
nombre = "";
}
public Empleado(String nombre) {
this.nombre = nombre;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
@Override
public String toString() {
return "nombre: " + nombre;
}
abstract public double getSalario();
}
package clase20Sept;
class Gerente extends Empleado {

private boolean objetivo;


public Gerente() {
super();
objetivo = true;
}
public Gerente(String nombre, boolean objetivo) {
super(nombre);
this.objetivo = objetivo;
}

public boolean isObjetivo() {


return objetivo;
}
public void setObjetivo(boolean objetivo) {
this.objetivo = objetivo;
}
public double getSalario() {
double salario = 40000;
if (objetivo == true) {
salario = salario + (salario * 0.1);
} else { }
return salario;
}
@Override
public String toString() {

String s = " " + super.toString();

return s += " " + "Cumplio objetivos: " + objetivo;


}

}
package clase20Sept;

class Obrero extends Empleado {


private int horas;

public Obrero() {
super();
horas = 0;
}
public Obrero(String nombre, int horas) {
super(nombre);
this.horas = horas;

public int getHoras() {


return horas;
}

public void setHoras(int horas) {


this.horas = horas;
}

public double getSalario() {

double salario;

return salario = horas * 150;


}

@Override
public String toString() {
String s = " " + super.toString();
return s += " horas= " + horas;
}
}(FIN DEL PROGRAMA)
(FUNCIONAMIENTO DEL PROGRAMA)
FIRMAS
SEGUNDO
PARCIAL
Codigo:2.5
El funcionamiento del codigo consiste en que al pulsar nosotros con el
mouse en cualquier sitio de nuestro panel,se obtendran las
coordenadas de nuestro click,generando un punto inicial gracias a los
metodos .getX() y .getY(),a partir de ahi podremos usar las flechas del
teclado para en primer instancia,aparecer una linea en la direccion
inicial que nosotros le proporcionemos y posteriormente con las mismas
teclas mover la linea indefinidamente a donde nosotros
deseemos,Ademas si presionamos la letra “F” se cerrara el path y no
nos dejara seguir usando las teclas para mover la linea.

INICIO DEL CODIGO

(MAIN)
package lineasmouse;

import javax.swing.JFrame;

public class Lineas {

public static void main(String[] args) {


JFrame ap = new JFrame("TILIN");
ap.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MiPanel p = new MiPanel();
ap.add(p);
ap.pack();
ap.setVisible(true);
}

}
(CIERRE DE MAIN)
package lineasmouse;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;

public class MiPanel extends JPanel implements


KeyListener,MouseListener,MouseMotionListener{
GeneralPath linea;
private int x,y,px,py;
private boolean para;
public MiPanel() {
para=false;
Linea l=new Linea();
linea=new GeneralPath();
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.addKeyListener(this);
this.setFocusable(true);
this.setPreferredSize(new Dimension(1000, 2000));
this.setBackground(Color.white);
this.setLayout(null);
}
@Override
public void keyTyped(KeyEvent e) {

@Override
public void keyPressed(KeyEvent e) {
int llavey=e.getKeyCode();
Graphics g=this.getGraphics();
g.setColor(Color.red);
linea.moveTo(x, y);
if(para==true){
switch(llavey){
case (KeyEvent.VK_UP):
y-=5;

linea.lineTo(x, y);
System.out.println(y);
repaint();
break;
case (KeyEvent.VK_DOWN):
y+=5;
linea.lineTo(x, y);
System.out.println(y);
repaint();
break;
case (KeyEvent.VK_LEFT):
x-=5;
linea.lineTo(x, y);
System.out.println(x);
repaint();
break;
case (KeyEvent.VK_RIGHT):
x+=5;
linea.lineTo(x, y);
System.out.println(x);
repaint();
break;
case (KeyEvent.VK_F):
para=false;
x=px;
y=py;
repaint();
break;
}
}
}

@Override
public void keyReleased(KeyEvent e) {

@Override
public void mouseClicked(MouseEvent e) {

@Override
//seleccionando punto inicial
public void mousePressed(MouseEvent e) {
para=true;
px=e.getX();
py=e.getY();
x=px;
y=py;
}

@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {

}
@Override
public void mouseExited(MouseEvent e) {

@Override
public void mouseDragged(MouseEvent e) {

@Override
public void mouseMoved(MouseEvent e) {

}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.draw(linea);
repaint();
}
}
class Linea implements Shape{

@Override
public Rectangle getBounds() {

return null;

}
@Override
public Rectangle2D getBounds2D() {
return null;
}
@Override
public boolean contains(double x, double y) {
return false;

}
@Override
public boolean contains(Point2D p) {

return false;
}

@Override
public boolean intersects(double x, double y, double w, double h) {

return false;
}

@Override
public boolean intersects(Rectangle2D r) {
return false;
}

@Override
public boolean contains(double x, double y, double w, double h) {

return false;

@Override
public boolean contains(Rectangle2D r) {

return false;

@Override
public PathIterator getPathIterator(AffineTransform at) {

return null;

}
@Override
public PathIterator getPathIterator(AffineTransform at, double
flatness) {

return null;

(FIN DEL PROGRAMA)

EJECUCION DEL PROGRAMA

La linea se desplazo gracias a las flechas del teclado


y se cerro el camino con la tecla “F”

Aqui se hizo click en el mouse


Codigo:2.6
El funcionamiento del programa consiste en que el usuario como primer
instancia debera de seleccionar que figura geometrica desea utilizar,si
una elipse o un rectangulo(esto gracias al uso de teclado),presionando
“R” en caso de querer rectangulos y “C” en caso de elipse,despues de
esto se desbloqueara la funcion de pintar una linea de figuras
geometricas,ademas de esto se podra pintar de color Azul presionando
la tecla “A” o de verde,presionando la tecla “V”.
INICIO DEL CODIGO

(MAIN)
package olaTilin;

import javax.swing.JFrame;
public class Figuritas {
public static void main(String[] args) {

JFrame marco = new JFrame("ELPEPE");


marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MiPanel z = new MiPanel();
marco.add(z);
marco.pack();
marco.setSize(1000, 1000);

marco.setLocationRelativeTo(null);
marco.setVisible(true);
}
}

(CIERRE DE MAIN)
package olaTilin;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MiPanel extends JPanel implements KeyListener {

public ArrayList<Rectangle2D> Rectangulos;


public ArrayList<Ellipse2D> Circulos;
public ArrayList<Color> Colores;
boolean circ, rect, azul, verde, negro, repetir, rep;
int xC, yC;
int xR, yR;
int z;
public MiPanel() {
this.setFocusable(true);
this.setBackground(Color.white);
this.setLayout(null);
this.addKeyListener(this);
Rectangulos = new ArrayList<>();
Circulos = new ArrayList<>();
Colores = new ArrayList<>();
z = 0;
rect = false;
circ = false;
azul = false;
verde = false;
negro = false;
repetir = false;
xC = 400;
yC = 400;
xR = 400;
yR = 400;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
System.out.println(Colores.size());
if ((verde == true) && (azul == false) && (negro == false)) {
Colores.add(Color.green);
}
if ((azul == true) && (verde == false) && (negro == false)) {
Colores.add(Color.blue);
}
if (((verde == false) || (azul == false)) && (negro == true)) {
Colores.add(Color.black);
}
if (circ) {

for (int i = 1; i < Circulos.size(); i++) {


if (Colores.get(i) == Color.blue) {
g2.setColor(Colores.get(i));
g2.fill(Circulos.get(i));
}
if (Colores.get(i) == Color.green) {
g2.setColor(Colores.get(i));
g2.fill(Circulos.get(i));
}
if (Colores.get(i) == Color.black) {
g2.setColor(Colores.get(i));
g2.draw(Circulos.get(i));
}
}
}
if (rect) {
for (int i = 1; i < Rectangulos.size(); i++) {
if (Colores.get(i) == Color.blue) {
g2.setColor(Colores.get(i));
g2.fill(Rectangulos.get(i));
}
if (Colores.get(i) == Color.green) {
g2.setColor(Colores.get(i));
g2.fill(Rectangulos.get(i));
}
if (Colores.get(i) == Color.black) {
g2.setColor(Colores.get(i));
g2.draw(Rectangulos.get(i));
}
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_R && repetir == false) {
negro = true;
rect = true;
circ = false;
Rectangulos.add(new Rectangle2D.Double(xR, yR, 10, 10));
repaint();
if ((z == 1) || (e.getKeyCode() == KeyEvent.VK_R)) {
repetir = true;
}
}
if (e.getKeyCode() == KeyEvent.VK_C && repetir == false) {
negro = true;
circ = true;
rect = false;
Circulos.add(new Ellipse2D.Double(xC, yC, 10, 10));
repaint();
z = 1;
if ((z == 1) || (e.getKeyCode() == KeyEvent.VK_R)) {
repetir = true;
}
}
if (e.getKeyCode() == KeyEvent.VK_UP) {
if (circ) {
yC -= 10;
Circulos.add(new Ellipse2D.Double(xC, yC, 10, 10));
}
if (rect) {
yR -= 10;
Rectangulos.add(new Rectangle2D.Double(xR, yR, 10, 10));
}
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
if (circ) {
yC += 10;
Circulos.add(new Ellipse2D.Double(xC, yC, 10, 10));
}
if (rect) {
yR += 10;
Rectangulos.add(new Rectangle2D.Double(xR, yR, 10, 10));
}
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
if (circ) {
xC -= 10;
Circulos.add(new Ellipse2D.Double(xC, yC, 10, 10));
}
if (rect) {
xR -= 10;
Rectangulos.add(new Rectangle2D.Double(xR, yR, 10, 10));
}
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
if (circ) {
xC += 10;
Circulos.add(new Ellipse2D.Double(xC, yC, 10, 10));
}
if (rect) {
xR += 10;
Rectangulos.add(new Rectangle2D.Double(xR, yR, 10, 10));
}
repaint();
}
if (e.getKeyCode() == KeyEvent.VK_A) {
negro = false;
azul = true;
verde = false;
}
if (e.getKeyCode() == KeyEvent.VK_V) {
negro = false;
verde = true;
azul = false;
}
}

@Override
public void keyReleased(KeyEvent e) {
}
} (FIN DEL PROGRAMA)
( EJECUCION DEL PROGRAMA)

Se uso la tecla “A” para cambiar de color a azul


Se uso la tecla “V”
para cambiar de
color a verde

Se uso la tecla “C” para definir la figura que se usara

Se uso la tecla “A” para cambiar de color a azul


Se uso la tecla “V”
para cambiar de
color a verde

Se uso la tecla “R” para definir la figura que se usara


FIRMAS
TERCER
PARCIAL
El funcionamiento del programa consiste en tres pelotas,con posiciones
aleatorias que tendran colisiones con la parte superior del panel y con
una barra que podremos mover de derecha a izquierda,estos rebotes
son gracias al metodo .intersects,de nuevo haremos posible el
movimiento de los objetos gracias a un timer,algo adicional es que
colocamos una imagen para que se moviera como si fuera una
pelota(teniendo colisiones igualmente).

INICIO DEL CODIGO

(MAIN)

package MuchoFrio1;

import javax.swing.JFrame;

public class Main {

public static void main(String[] args) {

JFrame marco = new JFrame("ELPEPE");


marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MiPanel p = new MiPanel();
marco.add(p);
marco.pack();
marco.setSize(1000, 1000);

marco.setLocationRelativeTo(null);
marco.setVisible(true);
}

(CIERRE DE MAIN)
package MuchoFrio1;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MiPanel extends JPanel implements KeyListener {

private AffineTransform at, at2, at3;


Shape eli, eli2, eli3;
Rectangle2D r1;
Timer r;
JPanel Panel;
int xE1, xE2, xE3, yE1, yE2, yE3, xR1;
private Image img;
public MiPanel() {

this.setPreferredSize(new Dimension(450, 500));


this.setFocusable(true);
this.setBackground(Color.white);
this.setLayout(null);
this.addKeyListener(this);

Panel = this;
try {
img = ImageIO.read(new File("olta.jpg"));
} catch (IOException ex) {
Logger.getLogger(MiPanel.class.getName()).log(Level.SEVERE,
null, ex);
}
at = new AffineTransform();
at2 = new AffineTransform();
at3 = new AffineTransform();

at.setToTranslation(0, 5);
at2.setToTranslation(0, 5);
at3.setToTranslation(0, 5);

Random random = new Random();

xR1 = 300;
xE1 = random.nextInt(1000 + 1);
xE2 = random.nextInt(1000 + 1);
xE3 = random.nextInt(1000 + 1);

yE1 = random.nextInt(300 + 1);


yE2 = random.nextInt(300 + 1);
yE3 = random.nextInt(300 + 1);

eli = new Ellipse2D.Double(xE1, yE1, 50, 50);


eli2 = new Ellipse2D.Double(xE2, yE2, 50, 50);
eli3 = new Ellipse2D.Double(xE3, yE3, 50, 50);
Timer t = new Timer(10, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

r1 = new Rectangle2D.Double(xR1, 900, 200, 20);

if (eli.intersects(r1)) {

at.setToTranslation(0, -5);
}

if (eli2.intersects(r1)) {

at2.setToTranslation(0, -5);
}
if (eli3.intersects(r1)) {

at3.setToTranslation(0, -5);
}

if (eli.getBounds2D().getY() < 0) {
at.setToTranslation(0, 5);

}
if (eli2.getBounds2D().getY() < 0) {
at2.setToTranslation(0, 5);

}
if (eli3.getBounds2D().getY() < 0) {
at3.setToTranslation(0, 5);

}
repaint();
}
});
t.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;

eli = at.createTransformedShape(eli);
eli2 = at2.createTransformedShape(eli2);
eli3 = at3.createTransformedShape(eli3);

g2.fill(eli);
g2.fill(eli2);
g2.fill(eli3);

g2.fill(r1);

g2.drawImage(img,(int)eli.getBounds().getX()(int)eli.getBounds().getY(),
50, 50, this);
}

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
xR1 += 10;
}

if (e.getKeyCode() == KeyEvent.VK_LEFT) {
xR1 -= 10; }
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
}(FIN DEL PROGRAMA)
(EJECUCION DEL PROGRAMA)
El funcionamiento del programa consiste en una pelota que tendra
colisiones con los bloques que colocamos en la parte superior del
panel,con los bordes del panel y con una barra que podremos
mover de izquierda a derecha para que la pelota no se vaya a la
parte inferior del panel y se pierda,en este caso usamos un timer
para que los objetos se puedan animar.

INICIO DEL CODIGO

(MAIN)
package caroactividad;

import javax.swing.JFrame;

public class CaroActividad {

public static void main(String[] args) {


JFrame marco = new JFrame("TILIN");
marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MiPanel p = new MiPanel();
marco.add(p);
marco.pack();
marco.setLocationRelativeTo(null);
marco.setVisible(true);
}

(CIERRE DE MAIN)
package caroactividad;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;
public class MiPanel extends JPanel implements KeyListener {
private Shape el;
private Rectangle2D r, uno, dos, tres, cuatro, cinco, seis;
private int x, y;
private double xa, ya;
private double g;
private AffineTransform an;
private Timer t;
private Random random;
private JPanel panel;
private boolean one, two, three, four, five, six;
public MiPanel (){
this.setPreferredSize(new Dimension(500, 500));
this.setBackground(Color.WHITE);
this.addKeyListener(this);
this.setFocusable(true);
random = new Random();
panel = this;
x = 150;
y = 460;
uno = new Rectangle2D.Double(20,30,60,60);
dos = new Rectangle2D.Double(100,30,60,60);
tres = new Rectangle2D.Double(180,30,60,60);
cuatro = new Rectangle2D.Double(260,30,60,60);
cinco = new Rectangle2D.Double(340,30,60,60);
seis = new Rectangle2D.Double(420,30,60,60);
el = new Ellipse2D.Double(225,400,50,50);
an = new AffineTransform();
xa = random.nextDouble(10)-10;
ya = random.nextDouble(10)+0;
an.setToTranslation(xa, ya);
t = new Timer(1,new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ((el.getBounds().getX()>=panel.getWidth()-50)||
(el.getBounds().getX()<=0)){
xa = -xa;
}
if ((el.getBounds().getY()<=0)||(el.intersects(r))){
ya = -ya;
}
if (el.intersects(uno)){
if ((el.getBounds().getX()<uno.getBounds().getX())||
(el.getBounds().getX()>uno.getBounds().getX()+50)){
xa = -xa;
}else{
if (el.getBounds().getY()>80){
ya = -ya;
}
}
one = true;
uno = new Rectangle2D.Double(0,0,0,0);
}
if (el.intersects(dos)){
if ((el.getBounds().getX()<dos.getBounds().getX())||
(el.getBounds().getX()>dos.getBounds().getX()+50)){
xa = -xa;
}else{
if (el.getBounds().getY()>80){
ya = -ya;
}
} two = true;
dos = new Rectangle2D.Double(0,0,0,0);
}
if (el.intersects(tres)){
if ((el.getBounds().getX()<tres.getBounds().getX())||
(el.getBounds().getX()>tres.getBounds().getX()+50)){
xa = -xa;
}else{
if (el.getBounds().getY()>80){
ya = -ya; }
}
three = true;
tres = new Rectangle2D.Double(0,0,0,0); }
if (el.intersects(cuatro)){
if ((el.getBounds().getX()<cuatro.getBounds().getX())||
(el.getBounds().getX()>cuatro.getBounds().getX()+50)){
xa = -xa;
}else{
if (el.getBounds().getY()>80){
ya = -ya;
}
}
four = true;
cuatro = new Rectangle2D.Double(0,0,0,0);
}
if (el.intersects(cinco)){
if ((el.getBounds().getX()<cinco.getBounds().getX())||
(el.getBounds().getX()>cinco.getBounds().getX()+50)){
xa = -xa;
}else{
if (el.getBounds().getY()>80){
ya = -ya;
}
}
five = true;
cinco = new Rectangle2D.Double(0,0,0,0);
}
if (el.intersects(seis)){
if ((el.getBounds().getX()<seis.getBounds().getX())||
(el.getBounds().getX()>seis.getBounds().getX()+50)){
xa = -xa;
}else{
if (el.getBounds().getY()>80){
ya = -ya;
}
}
six = true;
seis = new Rectangle2D.Double(0,0,0,0);
}

an.setToTranslation(xa,ya);
repaint();
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
r = new Rectangle2D.Double(x, y, 200, 20);
el = an.createTransformedShape(el);
g2.fill(r);
g2.fill(el);
if (!one) {
g2.fill(uno);
}
if (!two) {
g2.fill(dos);
}
if (!three) {
g2.fill(tres);
}
if (!four) {
g2.fill(cuatro);
}
if (!five) {
g2.fill(cinco);
}
if (!six) {
g2.fill(seis);
}
}
@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
t.start();
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
x -= 30;
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
x += 30;
}
}

@Override
public void keyReleased(KeyEvent e) {

}
}
(FIN DEL PROGRAMA)
(EJECUCION DEL PROGRAMA)

Pelota en posicion inicial

rebote de pelota y eliminacion de bloque


FIRMAS

También podría gustarte