mirror of
https://git.planet-casio.com/Slyvtt/Collab_RPG.git
synced 2024-12-28 04:23:42 +01:00
implementation of map change during gameplay by crossing map borders
This commit is contained in:
parent
272d60b0aa
commit
cb24bee3f8
3 changed files with 34 additions and 8 deletions
|
@ -32,11 +32,11 @@ extern Map *worldRPG[];
|
|||
/* Game data (defined in "game.h")*/
|
||||
Game game = {
|
||||
NULL,
|
||||
{10*PXSIZE, 48*PXSIZE, 0, 0, 0, 0, 100, SPEED},
|
||||
{10*PXSIZE, 48*PXSIZE, 0, 0, 10*PXSIZE, 48*PXSIZE, 100, SPEED},
|
||||
false, false, false, 0
|
||||
|
||||
/* debug variables*/
|
||||
, false, false
|
||||
, false, true
|
||||
};
|
||||
|
||||
/* screen capture management code */
|
||||
|
@ -93,7 +93,7 @@ int main(void) {
|
|||
}
|
||||
timer_start(timer);
|
||||
|
||||
game.map_level = worldRPG[2];
|
||||
game.map_level = worldRPG[0];
|
||||
|
||||
|
||||
#if USB_FEATURE
|
||||
|
|
|
@ -199,7 +199,7 @@ short int get_tile(Game *game, int x, int y, int l) {
|
|||
|
||||
/* Get the tile at (x, y) on layer l. Returns the tile ID or MAP_OUTSIDE if
|
||||
* she's not found. */
|
||||
return x>=0 && x < map_level->w && y>=0 && y < map_level->h ?
|
||||
return (x>=0 && x < map_level->w && y>=0 && y < map_level->h) ?
|
||||
map_level->layers[l][y * map_level->w + x] : MAP_OUTSIDE;
|
||||
}
|
||||
|
||||
|
@ -208,7 +208,7 @@ short int get_walkable(Game *game, int x, int y) {
|
|||
Map *map_level = game->map_level;
|
||||
/* Get the tile at (x, y). Returns the tile ID or MAP_OUTSIDE if she's not
|
||||
* found. */
|
||||
return x>=0 && x < map_level->w && y>=0 && y < map_level->h ?
|
||||
return (x>=0 && x < map_level->w && y>=0 && y < map_level->h) ?
|
||||
map_level->walkable[y * map_level->w + x] : MAP_OUTSIDE;
|
||||
}
|
||||
|
||||
|
@ -231,7 +231,7 @@ Map *get_map_for_coordinates( Game *game, int x, int y )
|
|||
i++;
|
||||
current = worldRPG[i];
|
||||
}
|
||||
while (current!=NULL)
|
||||
while (current!=NULL);
|
||||
|
||||
/* else we return NULL cause the point is a not within a map */
|
||||
return NULL;
|
||||
|
|
30
src/player.c
30
src/player.c
|
@ -41,6 +41,7 @@ void player_move(Game *game, Direction direction) {
|
|||
|
||||
/* If the player will collide with a hard tile or if the will go outside of
|
||||
* the map. */
|
||||
|
||||
if(player_collision(game, direction, P_CENTER)){
|
||||
|
||||
/* If the will collide with the center of the player. */
|
||||
|
@ -102,7 +103,32 @@ bool player_collision(Game *game, Direction direction,
|
|||
int player_tile_x = player->x+dx;
|
||||
int player_tile_y = player->y+dy;
|
||||
|
||||
/* Handle a negative position diffrently than a positive one. */
|
||||
/* check where the player is expected to go on the next move */
|
||||
/* if outside the map, we check if there is a map on the other */
|
||||
/* side of the current map*/
|
||||
if (get_walkable(game, player_tile_x, player_tile_y) == MAP_OUTSIDE)
|
||||
{
|
||||
// we compute the expected world coordinates accordingly
|
||||
// while taking care of the scaling between fx and cg models (PXSIZE)
|
||||
int worldX = (player->wx+dx) / PXSIZE;
|
||||
int worldY = (player->wy+dy) / PXSIZE;
|
||||
Map *map = get_map_for_coordinates(game, worldX, worldY );
|
||||
if (map!=NULL && map!=game->map_level)
|
||||
{
|
||||
game->map_level = map;
|
||||
|
||||
player->wx = worldX * PXSIZE;
|
||||
player->wy = worldY * PXSIZE;
|
||||
|
||||
player->x = (worldX - map->xmin ) * PXSIZE;
|
||||
player->y = (worldY - map->ymin ) * PXSIZE;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Handle a negative position differently than a positive one. */
|
||||
if(player_tile_x < 0) player_tile_x = player_tile_x/T_WIDTH-1;
|
||||
else player_tile_x = player_tile_x/T_WIDTH;
|
||||
|
||||
|
@ -111,7 +137,7 @@ bool player_collision(Game *game, Direction direction,
|
|||
|
||||
int on_walkable = get_walkable(game, player_tile_x, player_tile_y);
|
||||
|
||||
int speed = on_walkable >= 0 && on_walkable < WALKABLE_TILE_MAX ?
|
||||
int speed = (on_walkable >= 0 && on_walkable < WALKABLE_TILE_MAX) ?
|
||||
walkable_speed[on_walkable] : 0;
|
||||
|
||||
/* if he's on a hard tile */
|
||||
|
|
Loading…
Reference in a new issue