Added Gun Bros-like controls to TeeWorlds, implemented SDL_WarpMouse() for relative mouse mode

This commit is contained in:
pelya
2011-03-14 17:33:58 +02:00
parent 5a91ed9723
commit 5a6dfaa863
5 changed files with 96 additions and 29 deletions

View File

@@ -1 +1 @@
ufoai
teeworlds

View File

@@ -1,5 +1,5 @@
# The application settings for Android libSDL port
AppSettingVersion=16
AppSettingVersion=17
LibSdlVersion=1.2
AppName="TeeWorlds"
AppFullName=com.teeworlds
@@ -9,11 +9,12 @@ AppDataDownloadUrl="Game data is 8 Mb|http://sourceforge.net/projects/libsdl-and
SdlVideoResize=n
SdlVideoResizeKeepAspect=n
NeedDepthBuffer=n
SwVideoMode=n
AppUsesMouse=y
AppNeedsTwoButtonMouse=y
AppNeedsArrowKeys=y
AppNeedsTextInput=y
AppUsesJoystick=n
AppUsesJoystick=y
AppHandlesJoystickSensitivity=n
AppUsesMultitouch=n
NonBlockingSwapBuffers=n
@@ -29,6 +30,5 @@ CustomBuildScript=n
AppCflags='-O3'
AppLdflags=''
AppSubdirsBuild=''
AppUseCrystaXToolchain=n
AppCmdline=''
ReadmeText='^You may press "Home" now - the data will be downloaded in background'

View File

@@ -108,7 +108,8 @@ static int first_free_texture;
static int memory_usage = 0;
static int active_texture = -1;
static SDL_Surface *screen_surface;
extern SDL_Surface *EC_screen_surface;
SDL_Surface *EC_screen_surface = NULL;
static const unsigned char null_texture_data[] = {
0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff,
@@ -291,6 +292,9 @@ static void add_vertices(int count)
flush();
}
extern SDL_Joystick * EC_joystick;
SDL_Joystick * EC_joystick = NULL;
static int try_init()
{
const SDL_VideoInfo *info;
@@ -311,50 +315,56 @@ static int try_init()
if( ! SDL_ANDROID_GetScreenKeyboardRedefinedByUser() )
{
// Disable DPAD
SDL_Rect pos = {0, 0, 0, 0};
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &pos);
SDL_Rect pos;
// Rope button in lower-right
pos.x = screen_width;
pos.y = screen_height;
pos.w = screen_width / 6;
pos.h = pos.w * 2 / 3;
pos.h = screen_height * 3 / 5;
pos.w = pos.h;
pos.x -= pos.w;
pos.y -= pos.h;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, &pos);
// Move and jump buttons overlapped in lower-left
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &pos);
// Move buttons overlapped in lower-left
pos.x = 0;
pos.y = screen_height;
pos.w = screen_width / 8;
pos.h = pos.w*1.5;
pos.h = screen_height / 2;
pos.w = pos.h / 2;
pos.y -= pos.h;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, &pos);
pos.x += pos.w;
// Jump button overlaps move buttons
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, &pos);
pos.w *= 2;
pos.h = pos.w*2/3;
pos.h = pos.w/2;
pos.x = 0;
pos.y -= pos.h/2;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, &pos);
// Rope button below jump button
pos.y = 0;
pos.h = pos.h * 2 / 3;
pos.y = screen_height - pos.h;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, &pos);
// weapprev weapnext buttons
pos.x = screen_width;
pos.y = screen_height / 6;
pos.w = screen_width / 10;
pos.y = 0;
pos.w = screen_width / 8;
pos.h = pos.w;
pos.x -= pos.w;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_5, &pos);
pos.x = 0;
pos.x -= pos.w;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_4, &pos);
@@ -400,13 +410,26 @@ static int try_init()
SDL_WM_SetCaption("Teeworlds", "Teeworlds");
/* create window */
screen_surface = SDL_SetVideoMode(screen_width, screen_height, 0, flags);
if(screen_surface == NULL)
EC_screen_surface = SDL_SetVideoMode(screen_width, screen_height, 0, flags);
if(EC_screen_surface == NULL)
{
dbg_msg("gfx", "unable to set video mode: %s", SDL_GetError());
return -1;
}
#ifdef ANDROID
dbg_msg("gfx", "Number of joysticks: %d", SDL_NumJoysticks());
if(SDL_NumJoysticks() > 0)
{
dbg_msg("gfx", "Joystick 0: %s", SDL_JoystickName(0));
EC_joystick = SDL_JoystickOpen(0);
if( EC_joystick )
dbg_msg("gfx", "Opened joystick 0, numaxes %d numbuttons %d", SDL_JoystickNumAxes(EC_joystick), SDL_JoystickNumButtons(EC_joystick));
else
dbg_msg("gfx", "Error opening joystick 0");
SDL_JoystickEventState(SDL_ENABLE);
}
#endif
return 0;
}
@@ -463,7 +486,11 @@ int gfx_init()
if(config.cl_eventthread)
systems |= SDL_INIT_EVENTTHREAD;
#ifdef ANDROID
systems |= SDL_INIT_JOYSTICK;
#endif
if(SDL_Init(systems) < 0)
{
dbg_msg("gfx", "unable to init SDL: %s", SDL_GetError());

View File

@@ -6,6 +6,8 @@
#include <engine/e_client_interface.h>
#include <engine/e_config.h>
#include <android/log.h>
static struct
{
unsigned char presses;
@@ -20,6 +22,11 @@ static int input_grabbed = 0;
static unsigned int last_release = 0;
static unsigned int release_delta = -1;
extern SDL_Joystick * EC_joystick;
extern SDL_Surface *EC_screen_surface;
static void add_event(char c, int key, int flags);
void inp_mouse_relative(int *x, int *y)
{
int nx = 0, ny = 0;
@@ -51,6 +58,23 @@ void inp_warp_mouse(int x, int y)
SDL_WarpMouse(x,y);
}
int inp_process_joystick()
{
if( !EC_joystick || !EC_screen_surface )
return 0;
int jx = SDL_JoystickGetAxis(EC_joystick, 0);
int jy = SDL_JoystickGetAxis(EC_joystick, 1);
if( abs(jx) > 10 && abs(jy) > 10 )
{
jx = (jx + 32768) * EC_screen_surface->w / 65536;
jy = (jy + 32768) * EC_screen_surface->h / 65536;
SDL_WarpMouse(jx,jy);
SDL_PumpEvents();
return 1;
}
return 0;
}
enum
{
INPUT_BUFFER_SIZE=32
@@ -144,6 +168,8 @@ int inp_key_was_pressed(int key) { return input_state[input_current^1][key]; }
int inp_key_down(int key) { return inp_key_pressed(key)&&!inp_key_was_pressed(key); }
int inp_button_pressed(int button) { return input_state[input_current][button]; }
static int oldjoy = 0;
void inp_update()
{
int i;
@@ -168,6 +194,7 @@ void inp_update()
/* these states must always be updated manually because they are not in the GetKeyState from SDL */
i = SDL_GetMouseState(NULL, NULL);
int joy = inp_process_joystick();
if(i&SDL_BUTTON(1)) input_state[input_current][KEY_MOUSE_1] = 1; /* 1 is left */
if(i&SDL_BUTTON(3)) input_state[input_current][KEY_MOUSE_2] = 1; /* 3 is right */
if(i&SDL_BUTTON(2)) input_state[input_current][KEY_MOUSE_3] = 1; /* 2 is middle */
@@ -175,7 +202,7 @@ void inp_update()
if(i&SDL_BUTTON(5)) input_state[input_current][KEY_MOUSE_5] = 1;
if(i&SDL_BUTTON(6)) input_state[input_current][KEY_MOUSE_6] = 1;
if(i&SDL_BUTTON(7)) input_state[input_current][KEY_MOUSE_7] = 1;
if(i&SDL_BUTTON(8)) input_state[input_current][KEY_MOUSE_8] = 1;
if(i&SDL_BUTTON(8)) input_state[input_current][KEY_MOUSE_8] = 1;
{
SDL_Event event;
@@ -221,6 +248,9 @@ void inp_update()
/* other messages */
case SDL_QUIT:
#ifdef ANDROID
case SDL_VIDEORESIZE:
#endif
/* TODO: cleaner exit */
exit(0);
break;
@@ -236,5 +266,17 @@ void inp_update()
}
}
if(joy && !input_state[input_current][KEY_MOUSE_1])
{
input_count[input_current][KEY_MOUSE_1].presses++;
add_event(0, KEY_MOUSE_1, INPFLAG_PRESS);
}
if(!joy && oldjoy && !(i&SDL_BUTTON(1)))
{
input_count[input_current][KEY_MOUSE_1].presses++;
add_event(0, KEY_MOUSE_1, INPFLAG_RELEASE);
}
oldjoy = joy;
}
}

View File

@@ -635,12 +635,10 @@ void SDL_ANDROID_WarpMouse(int x, int y)
}
else
{
//__android_log_print(ANDROID_LOG_INFO, "libSDL", "SDL_ANDROID_WarpMouse(): %dx%d rel %dx%d old %dx%d", x, y, relativeMovementX, relativeMovementY, oldMouseX, oldMouseY);
relativeMovementX -= oldMouseX-x;
relativeMovementY -= oldMouseY-y;
SDL_ANDROID_MainThreadPushMouseMotion(x, y);
// TODO: test and enable it
/*
relativeMovementX = x;
relativeMovementY = y;
*/
}
};