TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Rick en 07 de Enero de 2021, 13:57:56
-
buenas tardes o noches, necesito una ayuda con mi proyecto porfavor:
estoy haciendo un juego estilo "flappy bird" utilizando CCS Copiler y simulacion en proteus, necesito una guia de como dibujar los obstaculos y que vengan hacia el personaje, que use timer pueda contar el puntaje y un boton de pausa
el codigo que hice hasta ahora es este, me base en un problema del foro, muchas gracias por su atencion
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <HDM64GS12.c>
#include <graphics.c>
#use standard_io(a)
void main () {
signed long x;
signed long y;
signed long d;
x=8;
y=57;
d=6;
glcd_init(ON);
glcd_circle(8,y,5,0,1);
glcd_line(127,40,127,63,1);
while (1){
if(y<=57 & input_state(PIN_A4)==0)
{
glcd_circle(8,y,5,0,1);
glcd_circle(8,y+1,5,0,0);
glcd_line(127,40-1,127,63-1,1);
y--;
}
if(y<57 && input_state(PIN_A4)==1)
{
glcd_circle(8,y,5,0,1);
glcd_circle(8,y-1,5,0,0);
y++;
}
}
}
(https://ibb.co/nmJbZ2D)
https://ibb.co/nmJbZ2D
-
La solucion mas practica, seria...
Tener espacio en memoria para almacenar todos los pixels + algunos mas de altura, editar en memoria, crear tus funciones para creacion de obstaculos, en el cual podes definir abertura y altura del obstaculo.
De ahi en adelante es guardar la posicion del pajaro, entonces... por cada movimiento:
- Borras el pajaro
- Rotas todo el array
- Dibujas el pajaro (En este punto comprobas que el lugar donde estas dibujando NO este ocupado por algun otro 1 del obstaculo. De ser asi tenes las condiciones de colision
- Envias todo seguido al LCD
No creo que te sirva ninguna funcion pre-armada, todo lo demas queda en vos, y con ese micro.... mmm.. buscaria algo mas rapido o que pueda hacer DMA asi liberar al micro del envio de datos.
En resumen: Tenes que borrar todo y volver a dibujar.
-
La solucion mas practica, seria...
Tener espacio en memoria para almacenar todos los pixels + algunos mas de altura, editar en memoria, crear tus funciones para creacion de obstaculos, en el cual podes definir abertura y altura del obstaculo.
De ahi en adelante es guardar la posicion del pajaro, entonces... por cada movimiento:
- Borras el pajaro
- Rotas todo el array
- Dibujas el pajaro (En este punto comprobas que el lugar donde estas dibujando NO este ocupado por algun otro 1 del obstaculo. De ser asi tenes las condiciones de colision
- Envias todo seguido al LCD
No creo que te sirva ninguna funcion pre-armada, todo lo demas queda en vos, y con ese micro.... mmm.. buscaria algo mas rapido o que pueda hacer DMA asi liberar al micro del envio de datos.
En resumen: Tenes que borrar todo y volver a dibujar.
ya logre que el pajaro(o circulo) se pueda mover junto a los obstaculos, lo que aun no me queda claro es como hacer la colicion con los obstáculos y que el programa me vaya mas rápido, avance en esto pero todavia me falta:
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(crystal=4000000)
#include <HDM64GS12.c>
#include <graphics.c>
#use standard_io(a)
const int8 imagen[64][16] ={
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0xC0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x0C , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x03 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x06,
0x00 , 0xC0 , 0x00 , 0x04 , 0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x18,
0x00 , 0x30 , 0x00 , 0x26 , 0xA8 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x60,
0x00 , 0x0C , 0x01 , 0xA6 , 0x68 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x80,
0x00 , 0x03 , 0x01 , 0x65 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x06 , 0x00,
0x00 , 0x00 , 0xCC , 0x50 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x18 , 0x00,
0x00 , 0x00 , 0x30 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xE0 , 0x00,
0x00 , 0x00 , 0xAE , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 , 0x00 , 0x00,
0x00 , 0x00 , 0x2B , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0C , 0x00 , 0x00,
0x00 , 0x02 , 0xE0 , 0xC0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x30 , 0x00 , 0x00,
0x00 , 0x05 , 0x20 , 0x30 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xC0 , 0x00 , 0x00,
0x00 , 0x04 , 0x00 , 0x0C , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x07 , 0x00 , 0x00 , 0x00,
0x00 , 0x0B , 0x00 , 0x03 , 0xFB , 0xF0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x18 , 0x00 , 0x00 , 0x00,
0x00 , 0x1A , 0x00 , 0x03 , 0xFB , 0xFC , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0xFF , 0x00 , 0x00 , 0x00,
0x00 , 0x08 , 0x00 , 0x0F , 0x30 , 0x3F , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0D , 0x81 , 0x00 , 0x00 , 0x00,
0x00 , 0x38 , 0x00 , 0x3C , 0x0C , 0x0F , 0xC0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x36 , 0x01 , 0x00 , 0x00 , 0x00,
0x00 , 0x10 , 0x00 , 0x70 , 0x03 , 0x03 , 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x58 , 0x01 , 0x00 , 0x00 , 0x00,
0x00 , 0x88 , 0x00 , 0xE0 , 0x00 , 0xE1 , 0xF0 , 0x00 , 0x00 , 0x00 , 0x00 , 0xE0 , 0x0D , 0x00 , 0x00 , 0x00,
0x00 , 0x40 , 0x01 , 0xC0 , 0x00 , 0x18 , 0xF8 , 0x00 , 0x00 , 0x00 , 0x03 , 0x80 , 0x33 , 0x00 , 0x00 , 0x00,
0x00 , 0x40 , 0x03 , 0x80 , 0x00 , 0x06 , 0x7C , 0x00 , 0x00 , 0x00 , 0x0C , 0x80 , 0x21 , 0x00 , 0x00 , 0x00,
0x00 , 0xC0 , 0x03 , 0x00 , 0x00 , 0x01 , 0xBE , 0x00 , 0x00 , 0x00 , 0x31 , 0x80 , 0x21 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x07 , 0x00 , 0x00 , 0x00 , 0x7E , 0x00 , 0x00 , 0x00 , 0xC1 , 0x00 , 0x20 , 0x00 , 0x00 , 0x00,
0x01 , 0xC0 , 0x0F , 0x00 , 0x00 , 0x00 , 0x1F , 0x00 , 0x00 , 0x07 , 0xE1 , 0x00 , 0x20 , 0x00 , 0x00 , 0x00,
0x03 , 0x03 , 0xEE , 0x00 , 0x00 , 0x00 , 0x1F , 0x00 , 0x00 , 0x7C , 0x0F , 0xE0 , 0x20 , 0x00 , 0x00 , 0x00,
0x00 , 0x40 , 0x06 , 0x00 , 0x00 , 0x00 , 0x1F , 0x80 , 0x01 , 0xE0 , 0x00 , 0x20 , 0x20 , 0x00 , 0x00 , 0x00,
0x03 , 0xC0 , 0x01 , 0x00 , 0x00 , 0x00 , 0x0F , 0xE0 , 0x03 , 0x80 , 0x00 , 0x20 , 0x20 , 0x00 , 0x00 , 0x00,
0x01 , 0x80 , 0x80 , 0x80 , 0x00 , 0x00 , 0x00 , 0x08 , 0x06 , 0x00 , 0xF0 , 0x20 , 0x20 , 0x00 , 0x00 , 0x00,
0x00 , 0x80 , 0x00 , 0x40 , 0x00 , 0x00 , 0x0F , 0x86 , 0x18 , 0x00 , 0x8E , 0x20 , 0x3E , 0x00 , 0x00 , 0x00,
0x03 , 0x00 , 0x10 , 0x20 , 0x00 , 0x00 , 0x0F , 0x81 , 0xE8 , 0x00 , 0x07 , 0x20 , 0x02 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x18 , 0x10 , 0x00 , 0x03 , 0xFF , 0x83 , 0x70 , 0x00 , 0x84 , 0xA0 , 0x02 , 0xFF , 0xC0 , 0x00,
0x01 , 0x80 , 0x1C , 0x00 , 0x00 , 0x02 , 0x00 , 0x8F , 0xFF , 0x00 , 0x44 , 0x60 , 0x3E , 0x00 , 0x38 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x1E , 0x03 , 0xD0 , 0x01 , 0x00 , 0xC4 , 0x01 , 0x80 , 0x18 , 0x00 , 0x20 , 0x38 , 0x04 , 0x00,
0x02 , 0x40 , 0x0E , 0x00 , 0x20 , 0x01 , 0x03 , 0x84 , 0x01 , 0x60 , 0x06 , 0x00 , 0x40 , 0x44 , 0x02 , 0x00,
0x03 , 0x80 , 0x0F , 0x00 , 0x40 , 0x01 , 0x1C , 0x84 , 0x01 , 0x18 , 0x01 , 0x00 , 0x40 , 0x44 , 0x02 , 0x00,
0x00 , 0xC0 , 0x0F , 0x00 , 0x00 , 0x01 , 0x60 , 0x84 , 0x01 , 0x06 , 0x00 , 0xC0 , 0x20 , 0x84 , 0x02 , 0x00,
0x00 , 0xC0 , 0x07 , 0x80 , 0x00 , 0x01 , 0x80 , 0x84 , 0x01 , 0x01 , 0x80 , 0x20 , 0x3F , 0x04 , 0x02 , 0x00,
0x00 , 0x20 , 0x03 , 0xC0 , 0x10 , 0x07 , 0x00 , 0x84 , 0x01 , 0x00 , 0x70 , 0x10 , 0x20 , 0x08 , 0x02 , 0x00,
0x01 , 0x40 , 0x06 , 0x00 , 0x04 , 0x1F , 0x00 , 0x84 , 0x01 , 0x00 , 0x0C , 0x08 , 0x20 , 0x10 , 0x02 , 0x00,
0x00 , 0x90 , 0x00 , 0x08 , 0x00 , 0x7F , 0x00 , 0x84 , 0x01 , 0xC0 , 0x03 , 0x08 , 0x20 , 0xE0 , 0x02 , 0x00,
0x00 , 0xC0 , 0x04 , 0x1C , 0x03 , 0xFF , 0x00 , 0x84 , 0x01 , 0x20 , 0x00 , 0xC4 , 0x23 , 0x00 , 0x02 , 0x00,
0x00 , 0x68 , 0x02 , 0x1F , 0x0C , 0xFF , 0x00 , 0x84 , 0x01 , 0x08 , 0x00 , 0x34 , 0x38 , 0x1C , 0x02 , 0x00,
0x00 , 0x70 , 0x01 , 0x3F , 0xB0 , 0x7F , 0x00 , 0x84 , 0x01 , 0x06 , 0x00 , 0x0C , 0x20 , 0x24 , 0x02 , 0x00,
0x00 , 0x10 , 0x00 , 0x0F , 0xE0 , 0x7F , 0x00 , 0x84 , 0x01 , 0x01 , 0x00 , 0x07 , 0x40 , 0x44 , 0x02 , 0x00,
0x00 , 0x28 , 0x00 , 0x07 , 0xF8 , 0x3F , 0x00 , 0x84 , 0x01 , 0x00 , 0x00 , 0x04 , 0xC0 , 0x44 , 0x02 , 0x00,
0x00 , 0x03 , 0x00 , 0x0C , 0xF8 , 0x11 , 0x00 , 0x44 , 0x01 , 0xC0 , 0x80 , 0x08 , 0xB0 , 0x44 , 0x02 , 0x00,
0x00 , 0x05 , 0x00 , 0x70 , 0x00 , 0x10 , 0x00 , 0x6C , 0x01 , 0x31 , 0x00 , 0x18 , 0x8C , 0x78 , 0x02 , 0x00,
0x00 , 0x02 , 0x81 , 0x80 , 0x02 , 0x10 , 0x80 , 0x00 , 0x01 , 0x04 , 0x00 , 0x10 , 0x83 , 0x00 , 0x02 , 0x00,
0x00 , 0x04 , 0x46 , 0x00 , 0x00 , 0x00 , 0x80 , 0x00 , 0x01 , 0x00 , 0x00 , 0x20 , 0x80 , 0xC4 , 0x02 , 0x00,
0x00 , 0x01 , 0x58 , 0x00 , 0x00 , 0x48 , 0x40 , 0x04 , 0x01 , 0x00 , 0x00 , 0x80 , 0x40 , 0x3C , 0x02 , 0x00,
0x00 , 0x00 , 0x68 , 0x00 , 0x00 , 0x18 , 0x30 , 0x2B , 0xFF , 0x80 , 0x07 , 0xFF , 0xF0 , 0x7F , 0xFF , 0x00,
0x00 , 0x03 , 0xE6 , 0x00 , 0x00 , 0x00 , 0x0F , 0xC0 , 0x00 , 0x7F , 0xF0 , 0x00 , 0x07 , 0x83 , 0x00 , 0x00,
0x00 , 0x0C , 0x15 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xC0 , 0x00,
0x00 , 0x30 , 0x0D , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x30 , 0x00,
0x00 , 0xC0 , 0x02 , 0x6A , 0x40 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0C , 0x00,
0x03 , 0x00 , 0x00 , 0x32 , 0xC8 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 , 0x00,
0x0C , 0x00 , 0x00 , 0x1A , 0xC8 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xC0,
0x10 , 0x00 , 0x00 , 0x01 , 0x68 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x20,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
};
byte i;
#INT_TIMER0
void timer0_isr(void)
{
clear_interrupt(INT_TIMER0);
set_timer0(61);
i++;
if(i > 9)
{
i = 0;
output_toggle(PIN_B6);
}
}
void glcd_imagen()
{
char i,j;
signed char k;
for( i = 0 ; i < 64 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
for(k=7;k>-1;k--)
{
if( bit_test(imagen[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
}
}
}
}
void main () {
signed long x;
signed long y;
signed long d;
signed long d2;
signed long pause;
x=8;
y=57;
d=127;
d2=127;
pause = 1;
glcd_init(ON);
glcd_imagen();
delay_ms(250);
glcd_fillScreen(0);
while(pause){
while (input_state(PIN_A5)==1){
if(d<=127)
{
glcd_line(d,40,d,63,0);
glcd_line(d-4,40,d-5,63,1);
d--;
}
if(d2<=127)
{
glcd_line(d2,20,d2,1,0);
glcd_line(d2-4,20,d2-5,1,1);
d2--;
}
if(y<=57 & input_state(PIN_A4)==0)
{
glcd_circle(x,y,5,0,1);
glcd_circle(x,y+1,5,0,0);
y--;
}
if(y<57 && input_state(PIN_A4)==1)
{
glcd_circle(x,y,5,0,1);
glcd_circle(x,y-1,5,0,0);
y++;
}
}
}
}
-
ya logre que el pajaro(o circulo) se pueda mover junto a los obstaculos, lo que aun no me queda claro es como hacer la colicion con los obstáculos y que el programa me vaya mas rápido, avance en esto pero todavia me falta:
Creo que no entediste en parte lo que quise explicarte.
1-
Crear una funcion para dibujar el pajaro, esta funcione devuelve un booleano.
Esta funcion solo va a modificar el array de 128x64 bits, es decir de 16 x 8 bytes
Cuando intente modificar algun bit, y estos esten en 1, entonces significa que estan ocupados con obstaculos, por lo tanto vas a devolver un 1 en tu funcion del dibujo del pajarito, para indicar que hubo una colision.
2-
Que vaya mas rapido es un problema, solo podes hacer de varias formas..
- Mejorando las librerias (Creando tu funcion), para que puedas escribir todo continuo, y no bit a bit, sino enviar bytes y bytes. Donde seteas la direccion y tiras todos esos bytes del array al LCD, no hace falta rellenarlo con 0, ya que el array los va a sobreescribir.
- Tener mas velocidad en el micro. Lamentablemente hay ciertos tiempos a respetar, y estos los limitan el micro y el LCD. Pero si el micro es el que se queda detras entonces buscar otro micro.
- Descargar el micro del proceso de actualizar el LCD, usando DMA o alguno otro por el estilo (o si tiene un controlador de LCD mejor), de esa forma, mientras vos haces alguna que otra cosa, el DMA se encarga de actualizar, esto podría llevar a que uses 2 arrays para aprovecharlo al máximo.