From 297f8b3115ee9ee5c0e36e2d792053f63f6b045d Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Fri, 3 Feb 2012 00:50:32 +0000 Subject: [PATCH] Better smooth movement git-svn-id: http://svn.net-core.org/repos/t-engine4@4817 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/engines/default/engine/Map.lua | 14 ++++--- game/engines/default/engine/Target.lua | 3 +- game/modules/tome/class/Game.lua | 1 + game/modules/tome/class/Player.lua | 3 ++ .../tome/class/interface/PlayerExplore.lua | 2 +- src/map.c | 37 +++++++++++-------- 6 files changed, 37 insertions(+), 23 deletions(-) diff --git a/game/engines/default/engine/Map.lua b/game/engines/default/engine/Map.lua index 08300a3d27..3ca848f443 100644 --- a/game/engines/default/engine/Map.lua +++ b/game/engines/default/engine/Map.lua @@ -325,6 +325,8 @@ end --- Redisplays the map, storing seen information function _M:redisplay() + self:checkMapViewBounded() + self._map:setScroll(self.mx, self.my, 0) for i = 0, self.w - 1 do for j = 0, self.h - 1 do self._map:setSeen(i, j, self.seens(i, j)) self._map:setRemember(i, j, self.remembers(i, j)) @@ -769,7 +771,8 @@ function _M:checkMapViewBounded() if self.w < self.viewport.mwidth then self.mx = math.floor((self.w - self.viewport.mwidth) / 2) centered = true self.changed = true end if self.h < self.viewport.mheight then self.my = math.floor((self.h - self.viewport.mheight) / 2) centered = true self.changed = true end - self._map:setScroll(self.mx, self.my, centered and 0 or self.smooth_scroll) +-- self._map:setScroll(self.mx, self.my, centered and 0 or self.smooth_scroll) + self._map:setScroll(self.mx, self.my, self.smooth_scroll) end --- Scrolls the map in the given direction @@ -778,7 +781,7 @@ function _M:scrollDir(dir) self.mx, self.my = util.coordAddDir(self.mx, self.my, dir) self.mx = util.bound(self.mx, 0, self.w - self.viewport.mwidth) self.my = util.bound(self.my, 0, self.h - self.viewport.mheight) - self._map:setScroll(self.mx, self.my, self.smooth_scroll) + self:checkMapViewBounded() end --- Gets the tile under the mouse @@ -813,8 +816,8 @@ end --- Get the screen offset where to start drawing (upper corner) function _M:getScreenUpperCorner() local sx, sy = self._map:getScroll() - local x = -self.mx * self.tile_w * self.zoom + self.display_x + sx * self.tile_w * zoom - local y = -self.my * self.tile_h * self.zoom + self.display_y + sy * self.tile_h * zoom + local x = -self.mx * self.tile_w * self.zoom + self.display_x + sx * zoom + local y = -self.my * self.tile_h * self.zoom + self.display_y + sy * zoom return x, y end @@ -1135,10 +1138,11 @@ end function _M:displayEmotes(nb_keyframes) local del = {} local e = next(self.emotes) + local sx, sy = self._map:getScroll() while e do -- Dont bother with obviously out of screen stuff if e.x >= self.mx and e.x < self.mx + self.viewport.mwidth and e.y >= self.my and e.y < self.my + self.viewport.mheight and self.seens(e.x, e.y) then - e:display(self.display_x + (e.x - self.mx + 0.5) * self.tile_w * self.zoom, self.display_y + (e.y - self.my - 0.9) * self.tile_h * self.zoom) + e:display(self.display_x + sx + (e.x - self.mx + 0.5) * self.tile_w * self.zoom, self.display_y + sy + (e.y - self.my - 0.9) * self.tile_h * self.zoom) end for i = 1, nb_keyframes do diff --git a/game/engines/default/engine/Target.lua b/game/engines/default/engine/Target.lua index 4ae6fbbcdb..0c436dcbb8 100644 --- a/game/engines/default/engine/Target.lua +++ b/game/engines/default/engine/Target.lua @@ -74,7 +74,8 @@ function _M:display(dispx, dispy) self.target.y = self.target.y or self.source_actor.y local ox, oy = self.display_x, self.display_y - self.display_x, self.display_y = dispx or self.display_x, dispy or self.display_y + local sx, sy = game.level.map._map:getScroll() + self.display_x, self.display_y = dispx or sx or self.display_x, dispy or sy or self.display_y -- self.cursor:toScreen(self.display_x + (self.target.x - game.level.map.mx) * self.tile_w * Map.zoom, self.display_y + (self.target.y - game.level.map.my) * self.tile_h * Map.zoom, self.tile_w * Map.zoom, self.tile_h * Map.zoom) diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 040f91b3d4..b74a15472e 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -726,6 +726,7 @@ function _M:changeLevel(lev, zone, keep_old_lev, force_down, auto_zone_stair) end self.player:onEnterLevel(self.zone, self.level) + self.player:resetMoveAnim() local musics = {} local keep_musics = false diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index 14027a9bb3..d9d3ec99ec 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -543,6 +543,9 @@ end --- Tries to get a target from the user function _M:getTarget(typ) if self:attr("encased_in_ice") then + if type(typ) ~= "table" then + return self.x, self.y, self + end local orig_range = typ.range typ.range = 0 local x, y, act = game:targetGetForPlayer(typ) diff --git a/game/modules/tome/class/interface/PlayerExplore.lua b/game/modules/tome/class/interface/PlayerExplore.lua index 004d8360fd..880f5cbf0c 100644 --- a/game/modules/tome/class/interface/PlayerExplore.lua +++ b/game/modules/tome/class/interface/PlayerExplore.lua @@ -708,7 +708,7 @@ function _M:autoExplore() elseif terrain.mindam or terrain.maxdam then move_cost = move_cost + 32 is_slow = true - elseif terrain.air_level and terrain.air_level < 0 and not self.can_breath.water then + elseif terrain.air_level and terrain.air_level < 0 and not ((self.can_breath.water or 0) > 0) then move_cost = move_cost + 15 is_slow = true end diff --git a/src/map.c b/src/map.c index 65bf7ce1ab..22d41adde3 100644 --- a/src/map.c +++ b/src/map.c @@ -980,8 +980,8 @@ static int map_draw_seen_texture(lua_State *L) int my = map->my; // x -= map->tile_w * (map->used_animdx + map->used_mx); // y -= map->tile_h * (map->used_animdy + map->used_my); - x -= map->tile_w * (map->used_animdx + map->mx); - y -= map->tile_h * (map->used_animdy + map->my); + x -= map->tile_w * (map->used_animdx + map->oldmx); + y -= map->tile_h * (map->used_animdy + map->oldmy); tglBindTexture(GL_TEXTURE_2D, map->seens_texture); @@ -1044,13 +1044,18 @@ static int map_set_scroll(lua_State *L) // Already moving, compute starting point else { - map->oldmx = map->oldmx - map->used_animdx; - map->oldmy = map->oldmy - map->used_animdy; + map->oldmx = map->oldmx + map->used_animdx; + map->oldmy = map->oldmy + map->used_animdy; } - map->move_step = 0; - map->move_max = smooth; + } else { + map->oldmx = x; + map->oldmy = y; } + map->move_step = 0; + map->move_max = smooth; + map->used_animdx = 0; + map->used_animdy = 0; map->mx = x; map->my = y; map->seen_changed = TRUE; @@ -1060,8 +1065,8 @@ static int map_set_scroll(lua_State *L) static int map_get_scroll(lua_State *L) { map_type *map = (map_type*)auxiliar_checkclass(L, "core{map}", 1); - lua_pushnumber(L, -map->used_animdx); - lua_pushnumber(L, -map->used_animdy); + lua_pushnumber(L, -map->tile_w*(map->used_animdx + map->oldmx - map->mx)); + lua_pushnumber(L, -map->tile_h*(map->used_animdy + map->oldmy - map->my)); return 2; } @@ -1313,15 +1318,15 @@ static int map_to_screen(lua_State *L) { float adx = (float)map->mx - map->oldmx; float ady = (float)map->my - map->oldmy; - animdx = adx * map->move_step / (float)map->move_max - adx; - animdy = ady * map->move_step / (float)map->move_max - ady; - mx = map->mx + (int)(adx * map->move_step / (float)map->move_max - adx); - my = map->my + (int)(ady * map->move_step / (float)map->move_max - ady); + animdx = adx * map->move_step / (float)map->move_max; + animdy = ady * map->move_step / (float)map->move_max; + mx = (int)(map->oldmx + animdx); + my = (int)(map->oldmy + animdy); } changed = TRUE; } - x -= map->tile_w * animdx; - y -= map->tile_h * animdy; + x -= map->tile_w * (animdx + map->oldmx); + y -= map->tile_h * (animdy + map->oldmy); map->used_animdx = animdx; map->used_animdy = animdy; @@ -1337,8 +1342,8 @@ static int map_to_screen(lua_State *L) { if ((i < 0) || (j < 0) || (i >= map->w) || (j >= map->h)) continue; - int dx = x + (i - map->mx) * map->tile_w; - int dy = y + (j - map->my) * map->tile_h; + int dx = x + i * map->tile_w; + int dy = y + j * map->tile_h; map_object *mo = map->grids[i][j][z]; if (!mo) continue; -- GitLab