Hi everyone,
I need your help. I'm trying to make a puzzle game which shows a 44 picture with 1 empty field. If you click on a neighboring tile, it will slide it to the empty space. Right now, I'm just using the tutorial field, trying to display a 320320 picture. It works, but a little part of the picture is shifted. Anyone knows why that could be?
Also, instead of painting the whole picture in one piece, I would like to make it in 16 parts(4*4), can anyone tell me a good way how to cut up the picture without putting up 16 pictures?
Thanks in advance!
// IMPORTANT: LCDWIKI_KBV LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
//This program is a demo of how to show a bmp picture from SD card.
//Set the pins to the correct ones for your development shield or breakout board.
//the 16bit mode only use in Mega.you must modify the mode in the file of lcd_mode.h
//when using the BREAKOUT BOARD only and using these 16 data lines to the LCD,
//pin usage as follow:
// CS CD WR RD RST D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15
//Arduino Mega 40 38 39 43 41 37 36 35 34 33 32 31 30 22 23 24 25 26 27 28 29
// TP_IRQ MOSI MISO TP_CS EX_CLK
//Arduino Mega 44 51 50 53 52
//when using the BREAKOUT BOARD only and using these 8 data lines to the LCD,
//pin usage as follow:
// CS CD WR RD RST D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15
//Arduino Mega 40 38 39 43 41 37 36 35 34 33 32 31 30 / / / / / / / /
// TP_IRQ MOSI MISO TP_CS EX_CLK
//Arduino Mega 44 51 50 53 52
//Remember to set the pins to suit your display module!
/**********************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
**********************************************************************************/
#include <SD.h>
#include <SPI.h>
#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_KBV.h> //Hardware-specific library
//the definiens of 8bit mode as follow:
//if the IC model is known or the modules is unreadable,you can use this constructed function
LCDWIKI_KBV my_lcd(ILI9488,40,38,39,43,41); //model,cs,cd,wr,rd,reset
//if the IC model is not known and the modules is readable,you can use this constructed function
//LCDWIKI_KBV my_lcd(320,480,40,38,39,43,41);//width,height,cs,cd,wr,rd,reset
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define PIXEL_NUMBER 320//(my_lcd.Get_Display_Width())
#define FILE_NUMBER 4
#define FILE_NAME_SIZE_MAX 20
uint32_t bmp_offset = 0;
uint16_t s_width = 320;//my_lcd.Get_Display_Width();
uint16_t s_heigh = 320;//my_lcd.Get_Display_Height();
//int16_t PIXEL_NUMBER;
char file_name[FILE_NUMBER][FILE_NAME_SIZE_MAX];
uint16_t read_16(File fp)
{
uint8_t low;
uint16_t high;
low = fp.read();
high = fp.read();
return (high<<8)|low;
}
uint32_t read_32(File fp)
{
uint16_t low;
uint32_t high;
low = read_16(fp);
high = read_16(fp);
return (high<<8)|low;
}
bool analysis_bpm_header(File fp)
{
if(read_16(fp) != 0x4D42)
{
return false;
}
//get bpm size
read_32(fp);
//get creator information
read_32(fp);
//get offset information
bmp_offset = read_32(fp);
//get DIB infomation
read_32(fp);
//get width and heigh information
uint32_t bpm_width = read_32(fp);
uint32_t bpm_heigh = read_32(fp);
if((bpm_width != s_width) || (bpm_heigh != s_heigh))
{
return false;
}
if(read_16(fp) != 1)
{
return false;
}
read_16(fp);
if(read_32(fp) != 0)
{
return false;
}
return true;
}
void draw_bmp_picture(File fp)
{
uint16_t i,j,k,l,m=0;
uint8_t bpm_data[PIXEL_NUMBER*3] = {0};
uint16_t bpm_color[PIXEL_NUMBER];
fp.seek(bmp_offset);
for(i = 0;i < s_heigh;i++)
{
for(j = 0;j<s_width/PIXEL_NUMBER;j++)
{
m = 0;
fp.read(bpm_data,PIXEL_NUMBER*3);
for(k = 0;k<PIXEL_NUMBER;k++)
{
bpm_color[k]= my_lcd.Color_To_565(bpm_data[m+2], bpm_data[m+1], bpm_data[m+0]);
m +=3;
}
for(l = 0;l<PIXEL_NUMBER;l++)
{
my_lcd.Set_Draw_color(bpm_color[l]);
my_lcd.Draw_Pixel(j*PIXEL_NUMBER+l,i);
}
}
}
}
void setup()
{
Serial.begin(9600);
my_lcd.Init_LCD();
my_lcd.Fill_Screen(BLUE);
//s_width = my_lcd.Get_Display_Width();
//s_heigh = my_lcd.Get_Display_Height();
//PIXEL_NUMBER = my_lcd.Get_Display_Width()/4;
if(PIXEL_NUMBER == 60)
{
strcpy(file_name[0],"flower.bmp");
strcpy(file_name[1],"tiger.bmp");
strcpy(file_name[2],"tree.bmp");
strcpy(file_name[3],"RedRose.bmp");
}
else
{
strcpy(file_name[0],"01.bmp");
strcpy(file_name[1],"02.bmp");
strcpy(file_name[2],"03.bmp");
strcpy(file_name[3],"04.bmp");
}
//Init SD_Card
pinMode(48, OUTPUT);
if (!SD.begin(48))
{
my_lcd.Set_Text_Back_colour(BLUE);
my_lcd.Set_Text_colour(WHITE);
my_lcd.Set_Text_Size(1);
my_lcd.Print_String("SD Card Init fail!",0,0);
}
}
void loop()
{
int i = 0;
File bmp_file;
for(i = 0;i<FILE_NUMBER;i++)
{
bmp_file = SD.open(file_name[i]);
if(!bmp_file)
{
my_lcd.Set_Text_Back_colour(BLUE);
my_lcd.Set_Text_colour(WHITE);
my_lcd.Set_Text_Size(1);
my_lcd.Print_String("didnt find BMPimage!",0,10);
while(1);
}
// if(!analysis_bpm_header(bmp_file))
// {
// my_lcd.Set_Text_Back_colour(BLUE);
// my_lcd.Set_Text_colour(WHITE);
// my_lcd.Set_Text_Size(1);
// my_lcd.Print_String("bad bmp picture!",0,0);
// return;
// }
draw_bmp_picture(bmp_file);
bmp_file.close();
delay(2000);
}
}