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.
parent
8570a9cca5
commit
ae5cbb9b4e
1
Makefile
1
Makefile
|
@ -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.
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue