from kivy.uix.scrollview import ScrollView
from kivy.uix.label import Label
from kivy.uix.popup import Popup
-from kivy.graphics import Color, Rectangle
+from kivy.graphics import Rectangle
from kivy.utils import platform
from kivy.clock import Clock
from kivy.config import Config
self.level_list = level_list
self.level_obj = self.level_list.get_current_level()
self.level_obj.load_tiles()
- self.tiles = {}
self.app = app
cols, rows = self.level_obj.get_size()
self.player.pos = self.level_obj.enter_pos
self.keyboard = None
self._key_bound = False
+ self._background = None
def build(self):
if platform() != 'android' and not self.keyboard:
self._key_bound = True
self.keyboard.bind(on_key_down=self._on_key_down)
self.clear_widgets()
- self.tiles = {}
+ self._background = Widget(size=self.size, pos=(0, 0))
tiles = self.level_obj.get_tiles()
bx, by = 0, 0
for tile_line in tiles:
self.draw_tile((bx, by), tile)
bx += TILE_SIZE
by += TILE_SIZE
+ self.add_widget(self._background)
def draw_tile(self, pos, tile):
- if pos in self.tiles:
- self.remove_widget(self.tiles[pos])
- node = Widget(size=(TILE_SIZE, TILE_SIZE),
- pos=pos, size_hint=(None, None))
- self.add_widget(node)
- with node.canvas:
- Color(1, 1, 1)
- Rectangle(pos=node.pos, size=node.size,
+ with self._background.canvas:
+ Rectangle(pos=pos, size=(TILE_SIZE, TILE_SIZE),
texture=tile.texture)
- self.tiles[pos] = node
def fix_scroll_margins(self):
# We need to call this after app.root is set
self.player_tile = Widget(size=(TILE_SIZE, TILE_SIZE),
pos=sprite_pos)
with self.player_tile.canvas:
- Color(1, 1, 1)
Rectangle(pos=sprite_pos, size=self.player_tile.size,
texture=self.player.get_texture())
self.add_widget(self.player_tile)
if true_point[0] >= self.view.size[0]:
self.view.scroll_x += self.x_scroll_margin
true_point = self.to_parent(*check_point)
+ # Avoid an infinite loop that can happen we
+ # changing screens
+ if self.view.scroll_x > 0.99:
+ return
elif true_point[0] < 0:
self.view.scroll_x -= self.x_scroll_margin
true_point = self.to_parent(*check_point)
+ # See above
+ if self.view.scroll_x < 0.01:
+ return
elif true_point[1] >= self.view.size[1]:
self.view.scroll_y += self.y_scroll_margin
true_point = self.to_parent(*check_point)
+ # See above
+ if self.view.scroll_y > 0.99:
+ return
elif true_point[1] < 0:
self.view.scroll_y -= self.y_scroll_margin
true_point = self.to_parent(*check_point)
+ # See above
+ if self.view.scroll_y < 0.01:
+ return
def included(self, point, margin):
if point[0] < margin:
self.nemesis_tile = Widget(size=(TILE_SIZE, TILE_SIZE),
pos=sprite_pos)
with self.nemesis_tile.canvas:
- Color(1, 1, 1)
Rectangle(pos=sprite_pos, size=self.nemesis_tile.size,
texture=self.nemesis.get_texture())
self.add_widget(self.nemesis_tile)
# Do nothing on null moves
if not self.player.move(direction, self.level_obj):
return
- self.check_state()
+ if self.check_state():
+ return
self.do_nemesis_move()
def do_nemesis_move(self):
self.nemesis.move(self.level_obj, self.player.pos)
- self.check_state()
+ if self.check_state():
+ return
if self.move_counter > 4:
self.move_counter = 0
self.draw_nemesis()
self.nemesis.move(self.level_obj, self.player.pos)
- self.check_state()
+ if self.check_state():
+ return
else:
self.move_counter += 1
self.draw_nemesis()
def check_state(self):
if not self.level_obj:
- return
+ return True
if self.level_obj.at_exit(self.player.pos):
self.reset_level()
# Jump to next level
if not self.load_level():
self._closed()
self.app.game_over(True)
- return
+ return True
elif self.check_caught():
# Caught
if self.app.config.getdefault('bane', 'sound', '0') != '0':
self.reset_level()
self._closed()
self.app.game_over(False)
- return
+ return True
elif self.level_obj.is_button(self.player.pos):
self.level_obj.trigger_button(self.player.pos)
elif self.level_obj.is_button(self.nemesis.pos):
for map_pos, new_tile in self.level_obj.get_changed_tiles():
pos = (map_pos[0] * TILE_SIZE, map_pos[1] * TILE_SIZE)
self.draw_tile(pos, new_tile)
+ return False
def _calc_mouse_pos(self, pos):
pos = self.to_local(*pos)
return (int(pos[0] / TILE_SIZE), int(pos[1] / TILE_SIZE))
+ def _near_player(self, pos):
+ return (abs(pos[0] - self.player.pos[0]) < 2 and
+ abs(pos[1] - self.player.pos[1]) < 2)
+
def on_touch_down(self, touch):
pos = self._calc_mouse_pos(touch.pos)
- if pos == self.player.pos:
+ if self._near_player(pos):
self.mouse_move = True
self.mouse_start = pos