From b4b1195a0b863c60431cd880d6aeff079e5c3878 Mon Sep 17 00:00:00 2001 From: Adam Greenwood-Byrne Date: Tue, 23 Mar 2021 21:48:50 +0000 Subject: [PATCH] Added mouse support to examples/wgt22.c and examples/wgt60.c --- part12-wgt/examples/wgt22.c | 25 +++++++++++++++---------- part12-wgt/examples/wgt60.c | 13 +++++++++++-- part12-wgt/mouse.c | 34 ++++++++++++++++++++++++++++++++-- part12-wgt/wgt.h | 1 + 4 files changed, 59 insertions(+), 14 deletions(-) diff --git a/part12-wgt/examples/wgt22.c b/part12-wgt/examples/wgt22.c index 572f6ce..8ff5b56 100644 --- a/part12-wgt/examples/wgt22.c +++ b/part12-wgt/examples/wgt22.c @@ -1,5 +1,6 @@ #include "wgtspr.h" #include "include/mem.h" +#include "include/multicore.h" // ######## REQUIRED FUNCTIONS ######## @@ -49,6 +50,9 @@ void wgt22() mem_init(); vga256 (); /* Initializes WGT system */ + start_core2(minit); // Start the comms engine (core 2) + while (!comms_up); // Wait for comms up + extern unsigned char _binary_bin_invader_spr_start[]; wloadsprites (palette, &_binary_bin_invader_spr_start[0], sprites, 0, SPRITES_IN_FILE); /* load first 50 sprites */ @@ -61,16 +65,14 @@ void wgt22() Sprite number, x coord, y coord, sprite number in array of sprites Therefore sprite #1 would be displayed at 160,150 with sprite 1 in the array */ - spriteon (1, 160, 150, 1); /* turn on any sprites */ - spriteon (2, 10, 100, 3); /* you need */ + spriteon (1, 160, 100, 1); /* turn on any sprites */ + spriteon (2, 10, 100, 3); /* you need */ /* This move will go left 1, for 300 times, and right 1 for 300 times, and repeat */ - movex (2, "(1,300,0)(-1,300,0)R"); - movexon (2); - movex (1, "(1,150,0)(-1,150,0)R"); /* set up any movement */ - movexon (1); /* or animation needed */ + movex (2, "(1,300,0)(-1,300,0)R"); /* set up any movement */ + movexon (2); /* or animation needed */ /* This animation will animate sprite 2 through a sequence of sprites in the sprite array and keep repeating. */ @@ -89,6 +91,7 @@ void wgt22() wfreesprites (sprites, 0, SPRITES_IN_FILE); /* free memory */ + mdeinit(); deinitialize_sprites (); } @@ -96,10 +99,12 @@ void looper (void) { erase_sprites (); /* clear the sprites */ - /* any direct sprite movements must be placed */ - /* between erase_sprites and draw_sprites */ - /* notice how sprites #1 and #2 move and animates on their own now! - You don't need to change anything to make them move! */ + s[1].x = mx; /* any direct sprite movements must be placed */ + s[1].y = my; /* between erase_sprites and draw_sprites */ + /* This will set sprite one's coordinate to the mouse + coordinates. Move it around! */ + /* notice how sprite #2 moves and animates on its own now! + You don't need to change anything to make it move! */ draw_sprites (1); /* draw them back on */ wait_msec(0x3E9F); /* Try removing this to see how fast the diff --git a/part12-wgt/examples/wgt60.c b/part12-wgt/examples/wgt60.c index 6c0f4c0..ea59a8b 100644 --- a/part12-wgt/examples/wgt60.c +++ b/part12-wgt/examples/wgt60.c @@ -1,5 +1,6 @@ #include "wgtspr.h" #include "include/mem.h" +#include "include/multicore.h" // ######## REQUIRED FUNCTIONS ######## @@ -70,6 +71,9 @@ void wgt60() mem_init(); vga256 (); /* Initializes WGT system */ + start_core2(minit); // Start the comms engine (core 2) + while (!comms_up); // Wait for comms up + wtexttransparent (TEXTFGBG); /* Turn foreground and background on */ extern unsigned char _binary_bin_break_spr_start[]; @@ -110,6 +114,8 @@ void wgt60() spriteon (0, 160, 150, 1); /* Turn on our sprites */ spriteon (1, 160, 100, 2); + msetbounds (50, 129, 245, 179); /* Limit mouse movement */ + xsp = 1.1; /* Set initial ball speeds */ ysp = 1.3; @@ -122,15 +128,18 @@ void wgt60() looper (); } while (1); /* Until the right mouse button is clicked */ + mdeinit(); deinitialize_sprites (); /* Deinit the sprite system */ } void looper(void) { - // wretrace (); /* Time our updates to the vertical retrace */ - wait_msec(0x3E9F); + wait_msec(0x411B); erase_sprites (); /* Clear sprites from sprite screen */ + s[0].x = mx; /* Set paddle position to mouse position */ + s[0].y = my; + if (lx > 267) /* Is ball bouncing off right wall? */ { dobounce (); diff --git a/part12-wgt/mouse.c b/part12-wgt/mouse.c index 292baa3..57c5f8a 100644 --- a/part12-wgt/mouse.c +++ b/part12-wgt/mouse.c @@ -33,6 +33,10 @@ int but; int mx; int my; +/* Mouse boundaries */ +int mbx1, mby1; +int mbx2, mby2; + void hci_poll2(unsigned char byte) { switch (poll_state) { @@ -178,8 +182,30 @@ void acl_poll() } } +void msetbounds (short x1, short y1, short x2, short y2) +{ + if (x1 < WGT_SYS.xres && x1 >= 0) { + if (x2 < WGT_SYS.xres && x2 >= x1) { + if (y1 < WGT_SYS.yres && y1 >= 0) { + if (y2 < WGT_SYS.yres && y2 >= y1) { + mbx1 = x1; + mbx2 = x2; + mby1 = y1; + mby2 = y2; + } + } + } + } +} + void msetxy (short x, short y) { + if (x < mbx1) x = mbx1; + if (y < mby1) y = mby1; + + if (x > mbx2) x = mbx2; + if (y > mby2) y = mby2; + mx = x; my = y; } @@ -218,8 +244,12 @@ void minit() // Subscribe to updates sendACLsubscribe(connection_handle); - mx = 160; - my = 100; + mx = WGT_SYS.xres / 2; + my = WGT_SYS.yres / 2; + mbx1 = 0; + mby1 = 0; + mbx2 = WGT_SYS.xres; + mby2 = WGT_SYS.yres; but = 0; comms_up = 1; diff --git a/part12-wgt/wgt.h b/part12-wgt/wgt.h index 03b64f3..e2bba1e 100644 --- a/part12-wgt/wgt.h +++ b/part12-wgt/wgt.h @@ -155,3 +155,4 @@ void wbezier (tpolypoint *rawpts, short numraw, tpolypoint *curvepts, short numc void minit(); void mdeinit(); void msetxy (short x, short y); +void msetbounds (short x1, short y1, short x2, short y2);