Explorar el Código

gamepad example now shows up to 4 gamepads

Karl Zylinski hace 3 meses
padre
commit
dce8392328
Se han modificado 4 ficheros con 78 adiciones y 39 borrados
  1. 62 38
      examples/gamepad/gamepad.odin
  2. 4 0
      karl2d.odin
  3. 2 1
      window_interface.odin
  4. 10 0
      window_win32.odin

+ 62 - 38
examples/gamepad/gamepad.odin

@@ -1,58 +1,82 @@
 package karl2d_gamepad_example
 
 import k2 "../.."
+import "core:fmt"
 import "core:log"
 
-Vec2 :: [2]f32
+gamepad_demo :: proc(gamepad: k2.Gamepad_Index, offset: k2.Vec2) {
+	if !k2.is_gamepad_active(gamepad) {
+		title := fmt.tprintf("Gamepad: %v (not connected)", gamepad + 1)
+		ts := k2.measure_text(title, 30)
+		k2.draw_text(title, offset + {250, 60} - {ts.x/2, 0}, 30, k2.WHITE)
+		return
+	}
 
-button_color :: proc(button: k2.Gamepad_Button, active := k2.WHITE, inactive := k2.GRAY) -> k2.Color {
-	return k2.gamepad_button_is_held(0, button) ? active : inactive
-}
+	title := fmt.tprintf("Gamepad: %v", gamepad + 1)
+	ts := k2.measure_text(title, 30)
+	k2.draw_text(title, offset + {250, 60} - {ts.x/2, 0}, 30, k2.WHITE)
+
+	button_color :: proc(
+		gamepad: k2.Gamepad_Index,
+		button: k2.Gamepad_Button,
+		active := k2.WHITE,
+		inactive := k2.GRAY,
+	) -> k2.Color {
+		return k2.gamepad_button_is_held(gamepad, button) ? active : inactive
+	}
 
-main :: proc() {
-	context.logger = log.create_console_logger()
-	k2.init(500, 300, "Karl2D Gamepad Demo")
-	k2.set_window_position(300, 100)
+	g := gamepad
+	o := offset
+	k2.draw_circle(o + {120, 120}, 10, button_color(g, .Left_Face_Up))
+	k2.draw_circle(o + {120, 160}, 10, button_color(g, .Left_Face_Down))
+	k2.draw_circle(o + {100, 140}, 10, button_color(g, .Left_Face_Left))
+	k2.draw_circle(o + {140, 140}, 10, button_color(g, .Left_Face_Right))
 
-	for !k2.shutdown_wanted() {
-		k2.process_events()
-		k2.clear(k2.BLACK)
+	k2.draw_circle(o + {320+50, 120}, 10, button_color(g, .Right_Face_Up))
+	k2.draw_circle(o + {320+50, 160}, 10, button_color(g, .Right_Face_Down))
+	k2.draw_circle(o + {300+50, 140}, 10, button_color(g, .Right_Face_Left))
+	k2.draw_circle(o + {340+50, 140}, 10, button_color(g, .Right_Face_Right))
 
-		k2.draw_circle({120, 120}, 10, button_color(.Left_Face_Up))
-		k2.draw_circle({120, 160}, 10, button_color(.Left_Face_Down))
-		k2.draw_circle({100, 140}, 10, button_color(.Left_Face_Left))
-		k2.draw_circle({140, 140}, 10, button_color(.Left_Face_Right))
+	k2.draw_rect_vec(o + {250 - 30, 140}, {20, 10}, button_color(g, .Middle_Face_Left))
+	k2.draw_rect_vec(o + {250 + 10, 140}, {20, 10}, button_color(g, .Middle_Face_Right))
 
-		k2.draw_circle({320+50, 120}, 10, button_color(.Right_Face_Up))
-		k2.draw_circle({320+50, 160}, 10, button_color(.Right_Face_Down))
-		k2.draw_circle({300+50, 140}, 10, button_color(.Right_Face_Left))
-		k2.draw_circle({340+50, 140}, 10, button_color(.Right_Face_Right))
+	left_stick := k2.Vec2 {
+		k2.get_gamepad_axis(gamepad, .Left_Stick_X),
+		k2.get_gamepad_axis(gamepad, .Left_Stick_Y),
+	}
 
-		k2.draw_rect_vec({250 - 30, 140}, {20, 10}, button_color(.Middle_Face_Left))
-		k2.draw_rect_vec({250 + 10, 140}, {20, 10}, button_color(.Middle_Face_Right))
+	right_stick := k2.Vec2 {
+		k2.get_gamepad_axis(gamepad, .Right_Stick_X),
+		k2.get_gamepad_axis(gamepad, .Right_Stick_Y),
+	}
 
-		left_stick := Vec2 {
-			k2.get_gamepad_axis(0, .Left_Stick_X),
-			k2.get_gamepad_axis(0, .Left_Stick_Y),
-		}
+	left_trigger  := k2.get_gamepad_axis(gamepad, .Left_Trigger)
+	right_trigger := k2.get_gamepad_axis(gamepad, .Right_Trigger)
 
-		right_stick := Vec2 {
-			k2.get_gamepad_axis(0, .Right_Stick_X),
-			k2.get_gamepad_axis(0, .Right_Stick_Y),
-		}
+	k2.set_gamepad_vibration(gamepad, left_trigger, right_trigger)
 
-		left_trigger  := k2.get_gamepad_axis(0, .Left_Trigger)
-		right_trigger := k2.get_gamepad_axis(0, .Right_Trigger)
+	k2.draw_rect_vec(o + {80, 50}, {20, 10}, button_color(g, .Left_Shoulder))
+	k2.draw_rect_vec(o + {50, 50} + {0, left_trigger * 20}, {20, 10}, button_color(g, .Left_Trigger, k2.WHITE, k2.GRAY))
 
-		k2.set_gamepad_vibration(0, left_trigger, right_trigger)
+	k2.draw_rect_vec(o + {420, 50}, {20, 10}, button_color(g, .Right_Shoulder))
+	k2.draw_rect_vec(o + {450, 50} + {0, right_trigger * 20}, {20, 10}, button_color(g, .Right_Trigger, k2.WHITE, k2.GRAY))
+	k2.draw_circle(o + {200, 200} + 20 * left_stick, 20, button_color(g, .Left_Stick_Press, k2.WHITE, k2.GRAY))
+	k2.draw_circle(o + {300, 200} + 20 * right_stick, 20, button_color(g, .Right_Stick_Press, k2.WHITE, k2.GRAY))
+}
 
-		k2.draw_rect_vec({80, 50}, {20, 10}, button_color(.Left_Shoulder))
-		k2.draw_rect_vec({50, 50} + {0, left_trigger * 20}, {20, 10}, button_color(.Left_Trigger, k2.WHITE, k2.GRAY))
+main :: proc() {
+	context.logger = log.create_console_logger()
+	k2.init(1000, 600, "Karl2D Gamepad Demo")
+	k2.set_window_position(300, 100)
+
+	for !k2.shutdown_wanted() {
+		k2.process_events()
+		k2.clear(k2.BLACK)
 
-		k2.draw_rect_vec({420, 50}, {20, 10}, button_color(.Right_Shoulder))
-		k2.draw_rect_vec({450, 50} + {0, right_trigger * 20}, {20, 10}, button_color(.Right_Trigger, k2.WHITE, k2.GRAY))
-		k2.draw_circle({200, 200} + 20 * left_stick, 20, button_color(.Left_Stick_Press, k2.WHITE, k2.GRAY))
-		k2.draw_circle({300, 200} + 20 * right_stick, 20, button_color(.Right_Stick_Press, k2.WHITE, k2.GRAY))
+		gamepad_demo(0, {0, 0})
+		gamepad_demo(1, {500, 0})
+		gamepad_demo(2, {0, 300})
+		gamepad_demo(3, {500, 300})
 
 		k2.present()
 		free_all(context.temp_allocator)

+ 4 - 0
karl2d.odin

@@ -358,6 +358,10 @@ get_mouse_delta :: proc() -> Vec2 {
 	return s.mouse_delta
 }
 
+is_gamepad_active :: proc(gamepad: Gamepad_Index) -> bool {
+	return win.is_gamepad_active(gamepad)
+}
+
 gamepad_button_went_down :: proc(gamepad: Gamepad_Index, button: Gamepad_Button) -> bool {
 	if gamepad < 0 || gamepad >= MAX_GAMEPADS {
 		return false

+ 2 - 1
window_interface.odin

@@ -17,7 +17,8 @@ Window_Interface :: struct {
 	get_height: proc() -> int,
 	get_window_scale: proc() -> f32,
 	set_flags: proc(flags: Window_Flags),
-	
+
+	is_gamepad_active: proc(gamepad: int) -> bool,
 	get_gamepad_axis: proc(gamepad: int, axis: Gamepad_Axis) -> f32,
 	set_gamepad_vibration: proc(gamepad: int, left: f32, right: f32),
 

+ 10 - 0
window_win32.odin

@@ -18,6 +18,7 @@ WINDOW_INTERFACE_WIN32 :: Window_Interface {
 	set_size = win32_set_size,
 	get_window_scale = win32_get_window_scale,
 	set_flags = win32_set_flags,
+	is_gamepad_active = win32_is_gamepad_active,
 	get_gamepad_axis = win32_get_gamepad_axis,
 	set_gamepad_vibration = win32_set_gamepad_vibration,
 
@@ -205,6 +206,15 @@ win32_set_flags :: proc(flags: Window_Flags) {
 	win32.SetWindowLongW(s.hwnd, win32.GWL_STYLE, i32(style))
 }
 
+win32_is_gamepad_active :: proc(gamepad: int) -> bool {
+	if gamepad < 0 || gamepad >= MAX_GAMEPADS {
+		return false
+	}
+
+	gp_state: win32.XINPUT_STATE
+	return win32.XInputGetState(win32.XUSER(gamepad), &gp_state) == .SUCCESS
+}
+
 win32_get_gamepad_axis :: proc(gamepad: int, axis: Gamepad_Axis) -> f32 {
 	if gamepad < 0 || gamepad >= MAX_GAMEPADS {
 		return 0