Tile editor becoming more functional. Set and id input now use the SpinnerElement type that only takes numerical input, increments or decrements via up/down keys, and runs its callback after any change. Currently loaded set's spritesheet shows in the right-hand side of the screen, resizing the screen accordingly. This spritesheet preview will be used as a way to load tile data visually rather than via tile ids.

master
kts 2014-01-15 00:28:23 -08:00
parent 8570a9cca5
commit ae5cbb9b4e
10 changed files with 442 additions and 74 deletions

View File

@ -39,6 +39,7 @@ clean:
rm -f pack_tiles
rm -f pack_data
cd test && make clean
cd tile_editor && make clean
pack_tiles: pack_tiles.c
$(CC) pack_tiles.c -o pack_tiles

Binary file not shown.

View File

@ -1,9 +1,9 @@
CC = gcc
CFLAGS = -Wall -c -g
LFLAGS = -lSDL -lSDL_image
LFLAGS = -lX11 -lSDL -lSDL_image
BINARY = TILE_EDITOR
OBJS = main.o sdl.o elements.o font.o
OBJS = main.o helper.o sdl.o elements.o font.o
$(BINARY): $(OBJS)
$(CC) $(OBJS) $(LFLAGS) -o tile_editor
@ -20,5 +20,8 @@ font.o: font.c
elements.o: elements.c elements.h
$(CC) $(CFLAGS) -c elements.c
helper.o: helper.c helper.h
$(CC) $(CFLAGS) -c helper.c
clean:
rm -f tile_editor *.o

View File

@ -1,6 +1,7 @@
#ifndef ASSETS_H
#define ASSETS_H
/* globals */
int g_gfx; // 0 = not loaded, 1 = loaded
int g_set;
int g_id;
float g_scale_x;

View File

@ -2,6 +2,8 @@
#include <stddef.h> // for that NULL
#include <stdlib.h> // for dat malloc
#include <string.h> // memcpy
#include <limits.h> // INT_MAX, etc.
#include "helper.h"
struct Element *newElement(int type) {
struct Element *element = malloc(sizeof(struct Element));
@ -10,7 +12,6 @@ struct Element *newElement(int type) {
element->next = NULL;
element->callback = NULL;
element->user = NULL;
char *test;
switch(type) {
case TYPE_BUTTON:
element->data = malloc(sizeof(struct ButtonElement));
@ -18,6 +19,14 @@ struct Element *newElement(int type) {
((struct ButtonElement*)element->data)->string = malloc(1);
((struct ButtonElement*)element->data)->string[0] = '\0';
break;
case TYPE_SPINNER:
element->data = malloc(sizeof(struct SpinnerElement));
((struct SpinnerElement*)element->data)->length = 0;
((struct SpinnerElement*)element->data)->string = malloc(1);
((struct SpinnerElement*)element->data)->string[0] = '\0';
((struct SpinnerElement*)element->data)->size = 3;
((struct SpinnerElement*)element->data)->cursor = 0;
break;
case TYPE_TEXT:
element->data = malloc(sizeof(struct TextElement));
((struct TextElement*)element->data)->length = 0;
@ -53,6 +62,10 @@ void freeElement(struct Element *element) {
free(((struct ButtonElement*)element->data)->string);
free(element->data);
break;
case TYPE_SPINNER:
free(((struct SpinnerElement*)element->data)->string);
free(element->data);
break;
case TYPE_TEXT:
free(((struct TextElement*)element->data)->string);
free(element->data);
@ -81,6 +94,13 @@ int setElementText(struct Element *element, const char *string) {
memcpy(((struct ButtonElement*)element->data)->string, string, length+1);
((struct ButtonElement*)element->data)->length = length;
break;
case TYPE_SPINNER:
((struct SpinnerElement*)element->data)->string = realloc(((struct SpinnerElement*)element->data)->string, length+1);
if (((struct SpinnerElement*)element->data)->string == NULL)
return -3;
memcpy(((struct SpinnerElement*)element->data)->string, string, length+1);
((struct SpinnerElement*)element->data)->length = length;
break;
case TYPE_TEXT:
((struct TextElement*)element->data)->string = realloc(((struct TextElement*)element->data)->string, length+1);
if (((struct TextElement*)element->data)->string == NULL)
@ -131,6 +151,21 @@ int setElementText(struct Element *element, const char *string) {
return -1;
}
int setElementValue(struct Element *element, int value) {
char value_string[128];
switch(element->type) {
case TYPE_SPINNER:
((struct SpinnerElement*)element->data)->value = value;
itoa(value, value_string, 10);
setElementText(element, value_string);
return 0;
break;
default:
return -2;
break;
}
return -1;
}
int setElementPosition(struct Element *element, int x, int y) {
element->x = x;
@ -148,6 +183,9 @@ int setElementSize(struct Element *element, int size) {
case TYPE_TEXT_INPUT:
((struct TextInputElement*)element->data)->size = size;
break;
case TYPE_SPINNER:
((struct SpinnerElement*)element->data)->size = size;
break;
default:
break;
}
@ -172,7 +210,7 @@ int setElementImage(struct Element *element, void *image, int width, int height)
/* dynamic setting ops */
int handleInputElement(struct Element *element, int ch) {
printf("got %d, want %d\n", ch, '\b');
printf("got %d\n", ch);
if (element->type == TYPE_TEXT_INPUT) {
switch (ch) {
case 0:
@ -187,6 +225,11 @@ printf("got %d, want %d\n", ch, '\b');
((struct TextInputElement*)element->data)->cursor++;
}
break;
case 13: // enter
if (element->callback != NULL) {
element->callback();
}
break;
case '\b':
case 127:
if (((struct TextInputElement*)element->data)->cursor > 0) {
@ -218,9 +261,9 @@ printf("got %d, want %d\n", ch, '\b');
break;
default:
if (((struct TextInputElement*)element->data)->cursor < ((struct TextInputElement*)element->data)->size) {
printf("cursor: %d, length: %d, string: \"%s\"\n", ((struct TextInputElement*)element->data)->cursor, ((struct TextInputElement*)element->data)->length, ((struct TextInputElement*)element->data)->string);
//printf("cursor: %d, length: %d, string: \"%s\"\n", ((struct TextInputElement*)element->data)->cursor, ((struct TextInputElement*)element->data)->length, ((struct TextInputElement*)element->data)->string);
if (((struct TextInputElement*)element->data)->cursor < ((struct TextInputElement*)element->data)->length) {
printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string);
//printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string);
((struct TextInputElement*)element->data)->length++;
int offset = ((struct TextInputElement*)element->data)->cursor;
char temp_string[256];
@ -240,21 +283,143 @@ printf("got %d, want %d\n", ch, '\b');
}
((struct TextInputElement*)element->data)->string[i] = '\0';
} else {
printf("cursor: %d, length: %d, size: %d, string: \"%s\"\n", ((struct TextInputElement*)element->data)->cursor, ((struct TextInputElement*)element->data)->length, ((struct TextInputElement*)element->data)->size, ((struct TextInputElement*)element->data)->string);
//printf("cursor: %d, length: %d, size: %d, string: \"%s\"\n", ((struct TextInputElement*)element->data)->cursor, ((struct TextInputElement*)element->data)->length, ((struct TextInputElement*)element->data)->size, ((struct TextInputElement*)element->data)->string);
((struct TextInputElement*)element->data)->length++;
((struct TextInputElement*)element->data)->string = realloc(((struct TextInputElement*)element->data)->string, ((struct TextInputElement*)element->data)->length+1);
((struct TextInputElement*)element->data)->string[((struct TextInputElement*)element->data)->cursor++] = ch;
((struct TextInputElement*)element->data)->string[((struct TextInputElement*)element->data)->cursor] = '\0';
printf("max size is %d, cursor is at %d\n", ((struct TextInputElement*)element->data)->size, ((struct TextInputElement*)element->data)->cursor);
printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string);
//printf("max size is %d, cursor is at %d\n", ((struct TextInputElement*)element->data)->size, ((struct TextInputElement*)element->data)->cursor);
//printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string);
}
}
break;
}
return 0;
} else if (element->type == TYPE_SPINNER) {
switch (ch) {
case 0:
break;
case 276: // left
if (((struct SpinnerElement*)element->data)->cursor > 0) {
((struct SpinnerElement*)element->data)->cursor--;
}
break;
case 275: // right
if (((struct SpinnerElement*)element->data)->cursor < ((struct SpinnerElement*)element->data)->length) {
((struct SpinnerElement*)element->data)->cursor++;
}
break;
case 273: // up
if (((struct SpinnerElement*)element->data)->value < INT_MAX) {
char temp_string[256];
itoa(((struct SpinnerElement*)element->data)->value+1, temp_string, 10);
if (((struct SpinnerElement*)element->data)->value+1 >= 0) {
if (strlen(temp_string) <= ((struct SpinnerElement*)element->data)->size) {
setElementValue(element, ((struct SpinnerElement*)element->data)->value+1);
}
} else {
if (strlen(temp_string) <= ((struct SpinnerElement*)element->data)->size+1) {
setElementValue(element, ((struct SpinnerElement*)element->data)->value+1);
}
}
}
if (element->callback != NULL) {
element->callback();
}
break;
case 274: // down
if (((struct SpinnerElement*)element->data)->value > INT_MIN) {
char temp_string[256];
itoa(((struct SpinnerElement*)element->data)->value-1, temp_string, 10);
if (((struct SpinnerElement*)element->data)->value-1 >= 0) {
if (strlen(temp_string) <= ((struct SpinnerElement*)element->data)->size) {
setElementValue(element, ((struct SpinnerElement*)element->data)->value-1);
}
} else {
// +1 size due to negative sign, rendering must render width as size + 1 as well!
if (strlen(temp_string) <= ((struct SpinnerElement*)element->data)->size+1) {
setElementValue(element, ((struct SpinnerElement*)element->data)->value-1);
}
}
}
if (element->callback != NULL) {
element->callback();
}
break;
case 13: // enter
if (element->callback != NULL) {
element->callback();
}
break;
case '\b':
case 127:
if (((struct SpinnerElement*)element->data)->cursor > 0) {
if (((struct SpinnerElement*)element->data)->cursor < ((struct SpinnerElement*)element->data)->length) {
((struct SpinnerElement*)element->data)->length--;
int offset = ((struct SpinnerElement*)element->data)->cursor;
char temp_string[256];
int i = offset;
int temp_offset = 0;
while(((struct SpinnerElement*)element->data)->string[i] != '\0') {
temp_string[temp_offset++] = ((struct SpinnerElement*)element->data)->string[i];
i++;
}
temp_string[temp_offset] = '\0';
// let's readd the end of the string after added char
((struct SpinnerElement*)element->data)->cursor--;
i = offset-1;
temp_offset = 0;
while (temp_string[temp_offset] != '\0') {
((struct SpinnerElement*)element->data)->string[i++] = temp_string[temp_offset++];
}
((struct SpinnerElement*)element->data)->string[i] = '\0';
} else {
((struct SpinnerElement*)element->data)->cursor--;
((struct SpinnerElement*)element->data)->length--;
((struct SpinnerElement*)element->data)->string[((struct SpinnerElement*)element->data)->cursor] = '\0';
}
}
setElementValue(element, atoi(((struct SpinnerElement*)element->data)->string));
break;
default:
if ((ch >= 48 && ch <= 57) || ch == 45) {
if (((struct SpinnerElement*)element->data)->cursor < ((struct SpinnerElement*)element->data)->size) {
if (((struct SpinnerElement*)element->data)->cursor < ((struct SpinnerElement*)element->data)->length) {
((struct SpinnerElement*)element->data)->length++;
int offset = ((struct SpinnerElement*)element->data)->cursor;
char temp_string[256];
int i = offset;
int temp_offset = 0;
while(((struct SpinnerElement*)element->data)->string[i] != '\0') {
temp_string[temp_offset++] = ((struct SpinnerElement*)element->data)->string[i];
i++;
}
temp_string[temp_offset] = '\0';
((struct SpinnerElement*)element->data)->string[((struct SpinnerElement*)element->data)->cursor++] = ch;
// let's readd the end of the string after added char
i = offset+1;
temp_offset = 0;
while (temp_string[temp_offset] != '\0') {
((struct SpinnerElement*)element->data)->string[i++] = temp_string[temp_offset++];
}
((struct SpinnerElement*)element->data)->string[i] = '\0';
} else {
((struct SpinnerElement*)element->data)->length++;
((struct SpinnerElement*)element->data)->string = realloc(((struct SpinnerElement*)element->data)->string, ((struct SpinnerElement*)element->data)->length+1);
((struct SpinnerElement*)element->data)->string[((struct SpinnerElement*)element->data)->cursor++] = ch;
((struct SpinnerElement*)element->data)->string[((struct SpinnerElement*)element->data)->cursor] = '\0';
}
}
setElementValue(element, atoi(((struct SpinnerElement*)element->data)->string));
printf("got number\n");
}
break;
}
} else {
return -1;
}
return 1;
}
/* gettin' operations */
@ -267,6 +432,9 @@ const char *getElementText(struct Element *element) {
case TYPE_TEXT:
return ((struct TextElement*)element->data)->string;
break;
case TYPE_SPINNER:
return ((struct SpinnerElement*)element->data)->string;
break;
case TYPE_BUTTON:
return ((struct ButtonElement*)element->data)->string;
break;

View File

@ -22,18 +22,28 @@ struct Element {
};
struct Element *newElement(int type);
void freeElement(struct Element *element);
/* element type structs and such */
#define TYPE_TEXT 0
#define TYPE_BUTTON 1
#define TYPE_TEXT_INPUT 2
#define TYPE_IMAGE 3
#define TYPE_SPINNER 4
struct ButtonElement {
int length;
char *string;
};
struct SpinnerElement {
int size;
int cursor;
int length;
char *string;
int value;
};
struct TextElement {
int length;
char *string;
@ -57,6 +67,7 @@ int setElementPosition(struct Element *element, int x, int y);
int setElementCallback(struct Element *element, void(*callback));
int setElementSize(struct Element *element, int size);
int setElementImage(struct Element *element, void *image, int width, int height);
int setElementValue(struct Element *element, int value);
const char *getElementText(struct Element *element);
int handleInputElement(struct Element *element, int ch);

View File

@ -0,0 +1,46 @@
#include "helper.h"
/**
* C++ version 0.4 char* style "itoa":
* Written by Lukás Chmela
* Released under GPLv3.
*/
char* itoa(int value, char* result, int base) {
// check that the base if valid
if (base < 2 || base > 36) { *result = '\0'; return result; }
char* ptr = result, *ptr1 = result, tmp_char;
int tmp_value;
do {
tmp_value = value;
value /= base;
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
} while ( value );
// Apply negative sign
if (tmp_value < 0) *ptr++ = '-';
*ptr-- = '\0';
while(ptr1 < ptr) {
tmp_char = *ptr;
*ptr--= *ptr1;
*ptr1++ = tmp_char;
}
return result;
}
#if __APPLE__ | _WIN32 | _WIN64
char * strndup (const char *s, size_t n) {
char *result;
size_t len = strlen (s);
if (n < len)
len = n;
result = (char *) malloc (len + 1);
if (!result)
return 0;
result[len] = '\0';
return (char *) memcpy (result, s, len);
}
#endif

View File

@ -0,0 +1,14 @@
#ifndef HELPER_H
#define HELPER_H
#include <stdlib.h>
#include <string.h>
/**
* C++ version 0.4 char* style "itoa":
* Written by Lukás Chmela
* Released under GPLv3.
*/
char* itoa(int value, char* result, int base);
#if __APPLE__ | _WIN32 | _WIN64
char * strndup (const char *s, size_t n);
#endif
#endif

View File

@ -4,6 +4,9 @@
#else
#include <SDL_image.h>
#endif
#include <SDL/SDL_syswm.h> // for wm hints
#include <unistd.h> // for getcwd
#include "stubs.h"
@ -18,13 +21,16 @@ int interfaceInit() {
// Enable Unicode, for later text input
SDL_EnableUNICODE(SDL_ENABLE);
// Set up our SDL Window
if ((screen = SDL_SetVideoMode(320, 480, 32, SDL_SWSURFACE|SDL_DOUBLEBUF|SDL_RESIZABLE)) == NULL) {
if ((screen = SDL_SetVideoMode(320, 480, 32, SDL_SWSURFACE|SDL_DOUBLEBUF)) == NULL) {
return -1;
}
SDL_WM_SetCaption("Tile Editor", NULL);
menu_area = SDL_CreateRGBSurface(screen->flags, screen->w, 104, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
tile_area_rect.y = 104;
tile_area = SDL_CreateRGBSurface(screen->flags, screen->w, 384, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
SDL_WM_SetCaption("TS:Tile Editor", NULL);
menu_area = SDL_CreateRGBSurface(screen->flags, 320, 112, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
tile_area_rect.y = 112;
tile_area = SDL_CreateRGBSurface(screen->flags, 320, 392, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
sprite_area_rect.x = 320;
sprite_area = SDL_CreateRGBSurface(screen->flags, 320, screen->h, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
loadFont(&font, font_images, font_images_length, 8, 8);
@ -35,113 +41,116 @@ int interfaceInit() {
// load up our elements
button_quit = newElement(TYPE_BUTTON);
setElementText(button_quit, "QUIT");
setElementPosition(button_quit, screen->w - getElementWidth(button_quit)-2, 2);
//setElementPosition(button_quit, screen->w - getElementWidth(button_quit)-2, 2);
setElementPosition(button_quit, menu_area->w - getElementWidth(button_quit)-2, 2+font.height*2);
setElementCallback(button_quit, &Quit);
addElement(button_quit, menu_area);
text_console = newElement(TYPE_TEXT);
setElementPosition(text_console, 0, 0);
//setElementPosition(text_console, 0, 2+font.height*2);
setElementPosition(text_console, 0, 2);
addElement(text_console, menu_area);
/* graphics input */
text_graphics = newElement(TYPE_TEXT);
setElementText(text_graphics, "graphics:");
setElementPosition(text_graphics, 2, 2 + font.height*3);
setElementPosition(text_graphics, 2, 2 + font.height*4);
addElement(text_graphics, menu_area);
input_graphics = newElement(TYPE_TEXT_INPUT);
setElementPosition(input_graphics, getElementWidth(text_graphics) + font.width + 4, 2 + font.height*3);
setElementPosition(input_graphics, getElementWidth(text_graphics) + font.width + 4, 2 + font.height*4);
setElementCallback(input_graphics, &loadGraphicsCallback);
setElementSize(input_graphics, 16);
addElement(input_graphics, menu_area);
button_graphics = newElement(TYPE_BUTTON);
setElementText(button_graphics, "load");
setElementPosition(button_graphics, getElementWidth(text_graphics) + getElementWidth(input_graphics) + (font.width*2) + 4, 2 + font.height*3);
setElementPosition(button_graphics, getElementWidth(text_graphics) + getElementWidth(input_graphics) + (font.width*2) + 4, 2 + font.height*4);
setElementCallback(button_graphics, &loadGraphicsCallback);
addElement(button_graphics, menu_area);
/* tileset data input */
text_data = newElement(TYPE_TEXT);
setElementText(text_data, "data: ");
setElementPosition(text_data, 2, 2 + font.height*5);
setElementPosition(text_data, 2, 2 + font.height*6);
addElement(text_data, menu_area);
input_data = newElement(TYPE_TEXT_INPUT);
setElementPosition(input_data, getElementWidth(text_data) + font.width + 4, 2 + font.height*5);
setElementPosition(input_data, getElementWidth(text_data) + font.width + 4, 2 + font.height*6);
setElementCallback(input_data, &loadDataCallback);
setElementSize(input_data, 16);
addElement(input_data, menu_area);
button_data = newElement(TYPE_BUTTON);
setElementText(button_data, "load");
setElementPosition(button_data, getElementWidth(text_data) + getElementWidth(input_data) + (font.width*2) + 4, 2 + font.height*5);
setElementPosition(button_data, getElementWidth(text_data) + getElementWidth(input_data) + (font.width*2) + 4, 2 + font.height*6);
setElementCallback(button_data, &loadDataCallback);
addElement(button_data, menu_area);
button_data_save = newElement(TYPE_BUTTON);
setElementText(button_data_save, "save");
setElementPosition(button_data_save, getElementWidth(text_data) + getElementWidth(input_data) + getElementWidth(button_data) + (font.width*3) + 4, 2 + font.height*5);
setElementPosition(button_data_save, getElementWidth(text_data) + getElementWidth(input_data) + getElementWidth(button_data) + (font.width*3) + 4, 2 + font.height*6);
setElementCallback(button_data_save, &saveDataCallback);
addElement(button_data_save, menu_area);
/* set input */
text_set = newElement(TYPE_TEXT);
setElementText(text_set, "set:");
setElementPosition(text_set, 2, 2 + font.height*8);
setElementPosition(text_set, 2, 2 + font.height*9);
addElement(text_set, menu_area);
input_set = newElement(TYPE_TEXT_INPUT);
setElementPosition(input_set, getElementWidth(text_set) + font.width + 4, 2 + font.height*8);
g_set = 1;
input_set = newElement(TYPE_SPINNER);
setElementPosition(input_set, getElementWidth(text_set) + font.width + 4, 2 + font.height*9);
setElementCallback(input_set, &setSetCallback);
setElementSize(input_set, 3);
setElementText(input_set, "0");
setElementValue(input_set, 1);
addElement(input_set, menu_area);
button_set = newElement(TYPE_BUTTON);
/*button_set = newElement(TYPE_BUTTON);
setElementText(button_set, "ok");
setElementPosition(button_set, getElementWidth(text_set) + getElementWidth(input_set) + (font.width*2) + 4, 2 + font.height*8);
setElementPosition(button_set, getElementWidth(text_set) + getElementWidth(input_set) + (font.width*2) + 4, 2 + font.height*9);
setElementCallback(button_set, &setSetCallback);
addElement(button_set, menu_area);
addElement(button_set, menu_area);*/
/* tile id input */
text_id = newElement(TYPE_TEXT);
setElementText(text_id, "id: ");
setElementPosition(text_id, 2, 2 + font.height*10);
setElementPosition(text_id, 2, 2 + font.height*11);
addElement(text_id, menu_area);
input_id = newElement(TYPE_TEXT_INPUT);
setElementPosition(input_id, getElementWidth(text_id) + font.width + 4, 2 + font.height*10);
g_id = 0;
/*input_id = newElement(TYPE_TEXT_INPUT);
setElementPosition(input_id, getElementWidth(text_id) + font.width + 4, 2 + font.height*11);
setElementCallback(input_id, &setIdCallback);
setElementSize(input_id, 3);
setElementText(input_id, "0");
addElement(input_id, menu_area);*/
input_id = newElement(TYPE_SPINNER);
setElementPosition(input_id, getElementWidth(text_id) + font.width + 4, 2 + font.height*11);
setElementCallback(input_id, &setIdCallback);
setElementSize(input_id, 3);
setElementValue(input_id, 0);
addElement(input_id, menu_area);
button_id = newElement(TYPE_BUTTON);
/*button_id = newElement(TYPE_BUTTON);
setElementText(button_id, "ok");
setElementPosition(button_id, getElementWidth(text_id) + getElementWidth(input_id) + (font.width*2) + 4, 2 + font.height*10);
setElementPosition(button_id, getElementWidth(text_id) + getElementWidth(input_id) + (font.width*2) + 4, 2 + font.height*11);
setElementCallback(button_id, &setIdCallback);
addElement(button_id, menu_area);
addElement(button_id, menu_area);*/
SDL_FillRect(menu_area, NULL, SDL_MapRGB(menu_area->format, 8, 16, 12));
image_tile = newElement(TYPE_IMAGE);
setElementPosition(image_tile, getElementWidth(button_id) + getElementWidth(text_id) + getElementWidth(input_id) + (font.width*3) + 4, 2 + font.height*8);
//setElementPosition(image_tile, getElementWidth(button_id) + getElementWidth(text_id) + getElementWidth(input_id) + (font.width*3) + 4, 2 + font.height*9);
setElementPosition(image_tile, getElementWidth(text_set) + getElementWidth(input_set) + (font.width*3) + 4, 2 + font.height*9);
setElementCallback(image_tile, &showSpritesheet);
SDL_Surface *tile_surface = SDL_CreateRGBSurface(menu_area->flags, 32, 32, menu_area->format->BitsPerPixel, menu_area->format->Rmask, menu_area->format->Gmask, menu_area->format->Bmask, menu_area->format->Amask);
setElementImage(image_tile, tile_surface, 32, 32);
addElement(image_tile, menu_area);
drawElement(button_quit);
drawElement(text_graphics);
drawElement(input_graphics);
drawElement(button_graphics);
drawElement(text_data);
drawElement(input_data);
drawElement(button_data);
drawElement(button_data_save);
drawElement(text_set);
drawElement(input_set);
drawElement(button_set);
drawElement(text_id);
drawElement(input_id);
drawElement(button_id);
drawElement(image_tile);
drawElements();
char cwd[128];
getcwd(cwd, sizeof(cwd));
printConsole(cwd);
@ -152,7 +161,6 @@ int interfaceInit() {
SDL_BlitSurface(menu_area, NULL, screen, NULL);
/* now load up our tile area stuff */
printf("hurr\n");
text_name = newElement(TYPE_TEXT);
setElementText(text_name, "...... name ......");
setElementPosition(text_name, 2, 2);
@ -208,25 +216,16 @@ int interfaceLoop() {
void interfaceClose() {
SDL_FreeSurface(screen);
freeElement(button_quit);
freeElement(text_console);
freeElement(text_graphics);
freeElement(input_graphics);
freeElement(button_graphics);
freeElement(text_data);
freeElement(input_data);
freeElement(button_data);
freeElement(button_data_save);
freeElement(text_set);
freeElement(input_set);
freeElement(button_set);
freeElement(text_id);
freeElement(input_id);
freeElement(button_id);
freeElement(text_name);
freeElement(text_value);
SDL_FreeSurface(((struct ImageElement*)image_tile->data)->image);
freeElement(image_tile);
struct Element *t_element = first_element;
while (t_element) {
struct Element *next_element = t_element->next;
if (t_element->type == TYPE_IMAGE) {
if (((struct ImageElement*)t_element->data)->image)
SDL_FreeSurface(((struct ImageElement*)t_element->data)->image);
}
freeElement(t_element);
t_element = next_element;
}
SDL_Quit();
}
@ -249,6 +248,15 @@ void addElement(struct Element *element, SDL_Surface *surface) {
element->user = surface;
}
void drawElements() {
struct Element *t_element = first_element;
while (t_element->next != NULL) {
drawElement(t_element);
t_element = t_element->next;
}
drawElement(t_element);
}
/* drawing functions */
void drawElement(const struct Element *element) {
if (element != NULL) {
@ -279,6 +287,29 @@ void drawElement(const struct Element *element) {
drawString(&font, element->user, element->x+2, element->y+2, ((struct ButtonElement*)element->data)->string);
}
break;
case TYPE_SPINNER:
get_rect_son.x = element->x-1;
get_rect_son.y = element->y-1;
get_rect_son.w = font.width * ((((struct SpinnerElement*)element->data)->size)+1) + 4;
get_rect_son.h = font.height + 4;
if (element->state == STATE_FOCUS) {
SDL_FillRect(element->user, &get_rect_son, SDL_MapRGB(((SDL_Surface*)element->user)->format, 128, 128, 200));
} else {
SDL_FillRect(element->user, &get_rect_son, SDL_MapRGB(((SDL_Surface*)element->user)->format, 48, 48, 64));
}
get_rect_son.x = element->x;
get_rect_son.y = element->y;
get_rect_son.w = font.width * ((((struct SpinnerElement*)element->data)->size)+1) + 2;
get_rect_son.h = font.height + 2;
SDL_FillRect(element->user, &get_rect_son, SDL_MapRGB(((SDL_Surface*)element->user)->format, 32, 32, 48));
// draw string
drawString(&font, element->user, element->x+1, element->y+1, ((struct SpinnerElement*)element->data)->string);
get_rect_son.x = element->x + (font.width * ((struct SpinnerElement*)element->data)->cursor);
get_rect_son.y = element->y+1;
get_rect_son.w = 2;
get_rect_son.h = font.height;
SDL_FillRect(element->user, &get_rect_son, SDL_MapRGB(((SDL_Surface*)element->user)->format, 128, 128, 200));
break;
case TYPE_TEXT:
get_rect_son.w = (font.width * ((struct TextElement*)element->data)->length) + 2;
get_rect_son.h = font.height + 2;
@ -347,6 +378,8 @@ int getElementWidth(const struct Element* element) {
case TYPE_TEXT:
return (font.width * ((struct TextElement*)element->data)->length) + 2;
break;
case TYPE_SPINNER:
return font.width * (((struct SpinnerElement*)element->data)->size+1) + 4;
case TYPE_BUTTON:
return (font.width * ((struct ButtonElement*)element->data)->length) + 4;
break;
@ -414,6 +447,19 @@ void handleMouseDown(const SDL_MouseButtonEvent *event) {
t_y = element->y-1;
printf("coll: %dx%d from %dx%d to %dx%d\n", event->x, event->y, t_x, t_y, t_w, t_h);
break;
case TYPE_SPINNER:
t_w = element->x-1 + (font.width * (((struct SpinnerElement*)element->data)->size+1)) + 4;
t_h = element->y-1 + font.height + 4;
t_x = element->x-1;
t_y = element->y-1;
printf("coll: %dx%d from %dx%d to %dx%d\n", event->x, event->y, t_x, t_y, t_w, t_h);
break;
case TYPE_IMAGE:
t_w = element->x + ((struct ImageElement*)element->data)->width;
t_h = element->y + ((struct ImageElement*)element->data)->height;
t_x = element->x;
t_y = element->y;
break;
}
if ((t_x <= event->x && t_w >= event->x) && (t_y <= event->y && t_h >= event->y)) {
element->state = STATE_PRESSED;
@ -452,14 +498,28 @@ void handleMouseUp(const SDL_MouseButtonEvent *event) {
t_x = last_element->x-1;
t_y = last_element->y-1;
break;
case TYPE_SPINNER:
t_w = last_element->x-1 + font.width * (((struct SpinnerElement*)last_element->data)->size+1) + 4;
t_h = last_element->y-1 + font.height + 4;
t_x = last_element->x-1;
t_y = last_element->y-1;
break;
case TYPE_IMAGE:
t_w = last_element->x + ((struct ImageElement*)last_element->data)->width;
t_h = last_element->y + ((struct ImageElement*)last_element->data)->height;
t_x = last_element->x;
t_y = last_element->y;
break;
}
last_element->state = STATE_NORMAL;
drawElement(last_element);
if ((t_x <= event->x && t_w >= event->x) && (t_y <= event->y && t_h >= event->y)) {
if (last_element->callback != NULL) {
last_element->callback();
if (last_element->type != TYPE_TEXT_INPUT && last_element->type != TYPE_SPINNER) {
last_element->callback();
}
}
if (last_element->type == TYPE_TEXT_INPUT) {
if (last_element->type == TYPE_TEXT_INPUT || last_element->type == TYPE_SPINNER) {
focus_element = last_element;
focus_element->state = STATE_FOCUS;
printf("focused on element!\n");
@ -551,7 +611,11 @@ void loadGraphicsCallback() {
return;
}
sprintf(temp_2, "OK, graphics loaded successfully");
g_gfx = 1;
printConsole(temp_2);
reloadImagePreview();
showSpritesheet();
}
void loadDataCallback() {
@ -563,14 +627,19 @@ void saveDataCallback() {
}
void setSetCallback() {
if (g_gfx != 1)
return;
char temp[16];
sprintf(temp, "OK: using set %s", getElementText(input_set));
printConsole(temp);
g_set = atoi(getElementText(input_set));
reloadImagePreview();
showSpritesheet();
}
void setIdCallback() {
if (g_gfx != 1)
return;
char temp[16];
sprintf(temp, "OK: using id %s", getElementText(input_id));
printConsole(temp);
@ -578,6 +647,56 @@ void setIdCallback() {
reloadImagePreview();
}
void showSpritesheet() {
struct Spritesheet *spritesheet;
switch (g_set) {
case PLAYER:
spritesheet = &player_sprites;
break;
case FLOOR:
spritesheet = &floor_sprites;
break;
case WALL:
spritesheet = &wall_sprites;
break;
case DOOR:
spritesheet = &door_sprites;
break;
case ITEM:
spritesheet = &item_sprites;
break;
case EQUIP:
spritesheet = &equip_sprites;
break;
case NPC:
spritesheet = &npc_sprites;
break;
default:
return;
break;
}
screen = SDL_SetVideoMode(320+spritesheet->spritesheet->w, 480, 32, SDL_SWSURFACE|SDL_DOUBLEBUF);
int rows = spritesheet->spritesheet->h / spritesheet->height;
int i, j = 0;
Uint32 color_a = SDL_MapRGB(screen->format, 95, 95, 128);
Uint32 color_b = SDL_MapRGB(screen->format, 128, 128, 95);
while (i < spritesheet->columns) {
j = 0;
while (j < rows) {
SDL_Rect sprite_rect = { i*spritesheet->width, j*spritesheet->height, spritesheet->width, spritesheet->height};
SDL_FillRect(sprite_area, &sprite_rect, (((j+i) & 1) == 1 ? color_a : color_b));
j++;
}
i++;
}
//SDL_FillRect(sprite_area, &spritesheet_rect, SDL_MapRGB(screen->format, 95, 95, 128));
SDL_BlitSurface(spritesheet->spritesheet, NULL, sprite_area, NULL);
SDL_BlitSurface(sprite_area, NULL, screen, &sprite_area_rect);
}
void reloadImagePreview() {
struct Spritesheet *spritesheet;
switch (g_set) {
@ -606,6 +725,7 @@ void reloadImagePreview() {
return;
break;
}
/* now load small preview of tile */
int y_offset = g_id / spritesheet->columns;
int x_offset = g_id - (y_offset * spritesheet->columns);

View File

@ -5,7 +5,9 @@
SDL_Surface* screen;
SDL_Surface* menu_area;
SDL_Surface* tile_area;
SDL_Surface* sprite_area;
SDL_Rect tile_area_rect;
SDL_Rect sprite_area_rect;
SDL_Rect update_rect;
@ -45,6 +47,7 @@ int loadSpritesheetFromFile(struct Spritesheet *spritesheet, char *file_name, in
void freeSpritesheet(struct Spritesheet *spritesheet);
void drawElement(const struct Element *element);
void drawElements();
void clearElement(const struct Element *element);
void addElement(struct Element *element, SDL_Surface *surface);
@ -63,6 +66,7 @@ void saveDataCallback();
void setSetCallback();
void setIdCallback();
void showSpritesheet();
void reloadImagePreview();
void printConsole(const char *string);