示例#1
0
文件: rock.py 项目: marychev/ride_me
class Rock(GameImage):
    img = Image(source=abstract_path('{}/img/rock-1.png'.format(_dir)))
    TEXTURE = img.texture
    texture = ObjectProperty(TEXTURE)

    def on_collision(self, bike):
        if bike.collide_widget(self):
            self._collision(bike)
            return True
        return False

    def _collision(self, bike):
        bike.speed = 0
        bike.power = 0
        bike.acceleration = 0
        bike.collected_currency = 0
        bike.finish_dt = time.time()
        bike.anim_collision()
        self.draw_collision_rectangle(bike)

        # show finish information
        road = ValidObject.road(GetObject.get_child(bike.parent, 'Road'))
        curtain = Curtain(road=road, font_size=FS.H1.value)
        curtain.text = curtain.collision_text_rock()
        curtain.add_to_game_screen()

    def draw_collision_rectangle(self, bike):
        with bike.canvas:
            Color(rgba=(1, 0, 0, .2), group="background")
            Rectangle(pos=bike.pos, size=bike.size, group="background")
示例#2
0
文件: start.py 项目: marychev/ride_me
class Start(GameImage):
    img = Image(source=abstract_path('objects/finish/img/finish.jpg'))
    TEXTURE = img.texture
    texture = ObjectProperty(TEXTURE)

    def __init__(self, **kwargs):
        super(Start, self).__init__(**kwargs)
        repeat_texture(self.texture, 8, 8)
示例#3
0
class AnimationBike(Image):
    source_go = StringProperty(abstract_path('bike/img/default.png'))
    source_relax = StringProperty(abstract_path('bike/img/default.png'))
    source_wait = StringProperty(abstract_path('bike/img/default.png'))
    source_stop = StringProperty(abstract_path('bike/img/default.png'))
    source_jump_up = StringProperty(abstract_path('bike/img/default.png'))
    source_landing = StringProperty(abstract_path('bike/img/default.png'))
    source_collision = StringProperty(abstract_path('bike/img/default.png'))

    def init_source_animation(self, item: BikeModel):
        self.source_go = item.source_go
        self.source_relax = item.source_relax
        self.source_wait = item.source_wait
        self.source_stop = item.source_stop
        self.source_jump_up = item.source_jump_up
        self.source_landing = item.source_landing
        self.source_collision = item.source_collision

    def anim_go(self):
        self.source = self.source_go
        anim = Animation(angle=8, duration=.2)
        anim.start(self)

    def anim_relax(self):
        self.source = self.source_relax
        anim = Animation(angle=0, duration=.2)
        anim.start(self)

    def anim_wait(self):
        self.source = self.source_wait
        anim = Animation(angle=0, duration=.2)
        anim.start(self)

    def anim_stop(self):
        self.source = self.source_stop
        anim = Animation(angle=-1, duration=.1)
        anim.start(self)

    def anim_jump_up(self):
        self.source = self.source_jump_up
        anim = Animation(angle=8, duration=.2)
        anim.start(self)

    def anim_landing(self):
        self.source = self.source_landing
        self.source = self.source_landing
        anim = Animation(angle=-8, duration=.2)
        anim.start(self)

    def anim_collision(self):
        self.source = self.source_collision
        anim = Animation(angle=180, duration=.2)
        anim.start(self)
示例#4
0
class Puddle(GameImage):
    img = Image(source=abstract_path('objects/puddle/img/puddle.png'))
    TEXTURE = img.texture
    texture = ObjectProperty(TEXTURE)

    def on_collision(self, bike):
        if bike.collide_widget(self):
            bike.anim_collision()
            if bike.speed > 0 or bike.power > 0:
                bike.acceleration -= bike.acceleration / 100
                bike.set_speed(bike.speed - (bike.max_speed / 1000))
                bike.set_power(bike.power - (bike.max_power / 1000))
            return True
        return False
示例#5
0
from kivy.uix.widget import Widget
from utils.dir import abstract_path
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from utils.color import Color
from utils.validation import ValidObject

Builder.load_file(abstract_path('devtools/devtools.kv'))


class DevTools(Widget):
    scene = ObjectProperty(None)
    road = ObjectProperty(None)

    def format_map_elem(self, elem, newline=False):
        name, pos = elem['name'], elem['pos']

        color = Color.RED
        if self.road.passed(pos):
            color = Color.RED_LIGHT
        elif self.road.visible(pos):
            color = Color.GREEN
        elif self.road.future(pos):
            color = Color.ORANGE

        res = '[color={}]{}[/color]:[size=9]{}[/size]'.format(
            color, name,
            str(pos).replace('(', '').replace(')', ''))
        return '\n' + res if newline else res

    def map_text(self):
示例#6
0
from kivy.lang import Builder
from objects import Start
from objects.currency.currency import Currency
from utils.dir import abstract_path

Builder.load_file(abstract_path('objects/finish/finish.kv'))


class Finish(Start):
    @staticmethod
    def curtain_text(road, bike):
        return '''
        [size=80]Finish[/size]
        Level:                      {}
        Total Way:             {}
        Total Time:           {:0.3f}
        {}:                        {}
        '''.format(
            road.level.name,
            road.total_way,
            bike.finish_dt - bike.start_dt,
            Currency.units, bike.currency)

    def get_x(self):
        bike = self.get_bike()
        road = self.get_road()
        return (road.total_way - road.distance_traveled) + bike.x + bike.width
示例#7
0
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from utils.dir import abstract_path

Builder.load_file(abstract_path('screen/game_screen.kv'))


class GameScreen(Screen):
    pass
示例#8
0
class Bike(AnimationBike):
    source = StringProperty(abstract_path('bike/img/default.png'))
    acceleration = NumericProperty(0.0)
    power = NumericProperty(0)
    max_power = NumericProperty(0)
    speed = NumericProperty(0)
    max_speed = NumericProperty(0)
    agility = NumericProperty(0)

    start_dt = NumericProperty(0)
    finish_dt = NumericProperty(0)

    collected_currency = NumericProperty(0)
    currency = NumericProperty(0)

    def __init__(self, **kwargs):
        super(Bike, self).__init__(**kwargs)
        self.init_app_config()

    def init_params(self, bike_model: BikeModel) -> None:
        self.source = bike_model.source
        self.max_power = bike_model.power
        self.max_speed = bike_model.speed
        self.acceleration = bike_model.acceleration
        self.agility = bike_model.agility

        self.init_source_animation(bike_model)

    def init_app_config(self) -> None:
        bike_title = app_config('bike', 'title')

        if bike_title:
            bike_model = get_by_bike_title(bike_title)
            self.init_params(bike_model)
        else:
            WarnBikeIsNotConfig(bike_title, self)

    @staticmethod
    def buy(bike_model: BikeModel) -> bool:
        res_rm = calc_rest_rm(bike_model.price)
        if res_rm > 0:
            Bike.set_config(bike_model, res_rm)
            return True
        return False

    @staticmethod
    def set_config(bike_model, rest_rm) -> None:
        Cache.remove('bike', 'rm')
        Cache.append('bike', 'rm', rest_rm)

        Cache.remove('bike', 'title')
        Cache.remove('bike', 'power')
        Cache.remove('bike', 'speed')
        Cache.remove('bike', 'acceleration')
        Cache.remove('bike', 'agility')

        Cache.append('bike', 'title', bike_model.title)
        Cache.append('bike', 'power', bike_model.power)
        Cache.append('bike', 'speed', bike_model.speed)
        Cache.append('bike', 'acceleration', bike_model.acceleration)
        Cache.append('bike', 'agility', bike_model.agility)

    def set_power(self, value: Union[int, float]) -> None:
        self.power = self._max_val(value, self.max_power)

    def set_speed(self, value: Union[int, float]) -> None:
        self.speed = self._max_val(value, self.max_speed)

    def _max_val(self, val: Union[int, float],
                 max_val: Union[int, float]) -> Union[int, float]:
        if val <= 0:
            return 0
        elif val > max_val:
            return max_val
        else:
            return val

    def is_in_sky(self) -> bool:
        road = self.get_road()
        if road:
            return road.line_points[-1] < self.y

    # Collisions

    def get_collisions(self, class_name: str) -> Optional[Widget]:
        children = [
            ro for ro in self.get_road().children[:]
            if ro.__class__.__name__ == class_name
        ]
        for w in children:
            if w and self.collide_widget(w): return w

    def on_collision_rock(self):
        rock = self.get_collisions('Rock')
        return rock and rock.on_collision(self)

    def on_collision_currency(self):
        currency = self.get_collisions('Currency')
        return currency and currency.on_collision(self)

    def on_collision_puddle(self) -> Optional[Widget]:
        puddle = self.get_collisions('Puddle')
        return puddle and puddle.on_collision(self)

    # Game objects

    def get_road(self) -> Optional[Widget]:
        return self.parent and ValidObject.road(
            GetObject.get_child(self.parent, 'Road'))
示例#9
0
from typing import Union
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from utils.dir import abstract_path
from kivy.properties import NumericProperty, StringProperty, BooleanProperty
from utils.color import Color as UColor

Builder.load_file(abstract_path('screen/ui/character_wrap.kv'))


class CharacterWrap(BoxLayout):
    key = StringProperty()
    title = StringProperty()
    value = NumericProperty()
    max = NumericProperty()
    has_value = BooleanProperty()

    def format_number(self, key=None, value=None, max=None):
        markup = "{key} [color=#{color_sub}][sub]{val}[/sub][/color]:[color=#{color_sup}][sup]{max}[/sup][/color]"
        return markup.format(key=key or self.key,
                             val=value or self.value,
                             max=max or self.max,
                             color_sub=UColor.GREEN,
                             color_sup=UColor.ORANGE)

    def format_string(self, value: Union[int, str, None] = None):
        return "{}: {}".format(self.key, value or self.value)
示例#10
0
import time
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.cache import Cache
from objects import Start, Finish, Lamp, Puddle, Rock, Currency
from utils.dir import abstract_path
from kivy.clock import Clock
from utils.get_object import GetObject
from kivy.logger import Logger

Builder.load_file(abstract_path('layout/scene.kv'))


CACHE_NAME = 'installed'
Cache.register(CACHE_NAME, limit=10000)


class Scene(FloatLayout):
    def __init__(self, **kwargs):
        super(Scene, self).__init__(**kwargs)
        Clock.schedule_interval(self.start_timer, 1)

    @staticmethod
    def get_cache(sid):
        return Cache.get(CACHE_NAME, sid)

    def add_to_road(self, map_elem, gowid, size):
        road = self.parent.ids['road']
        sid = gowid.init_sid(map_elem['pos'])
示例#11
0
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from utils.dir import abstract_path


Builder.load_file(abstract_path('screen/bikes_screen.kv'))


class BikesScreen(Screen):
    
    def __init__(self, **kwargs):
        super(BikesScreen, self).__init__(**kwargs)




示例#12
0
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from utils.dir import abstract_path
from kivy.properties import ObjectProperty

Builder.load_file(abstract_path('screen/shop_screen.kv'))


class ShopScreen(Screen):
    pass

示例#13
0
文件: rock.py 项目: marychev/ride_me
import time
from kivy.graphics import Color, Rectangle
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.image import Image
from objects.base.game_image import GameImage
from utils.dir import abstract_path
from utils.validation import ValidObject
from utils.get_object import GetObject
from label.curtain import Curtain
from utils.sizes import FontSize as FS

_dir = 'objects/rock'
Builder.load_file(abstract_path('{}/rock.kv'.format(_dir)))


class Rock(GameImage):
    img = Image(source=abstract_path('{}/img/rock-1.png'.format(_dir)))
    TEXTURE = img.texture
    texture = ObjectProperty(TEXTURE)

    def on_collision(self, bike):
        if bike.collide_widget(self):
            self._collision(bike)
            return True
        return False

    def _collision(self, bike):
        bike.speed = 0
        bike.power = 0
        bike.acceleration = 0
示例#14
0
文件: lamp.py 项目: marychev/ride_me
class Lamp(GameImage):
    img = Image(source=abstract_path('objects/lamp/img/lamp.png'))
    TEXTURE = img.texture
    texture = ObjectProperty(TEXTURE)
示例#15
0
from kivy.animation import Animation
from kivy.core.window import Window
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ObjectProperty, StringProperty, ListProperty, ReferenceListProperty, \
    NumericProperty, BooleanProperty, OptionProperty
from kivy.uix.button import Button
from utils.init import app_config
from utils.dir import abstract_path
from utils.sizes import FontSize as FS
from utils.sizes import GOSize as GOS


Builder.load_file(abstract_path('screen/ui/panel_button.kv'))


class MenuButton(Button):
    width = NumericProperty(GOS.WIDTH_MenuButton.value)
    height = NumericProperty(GOS.HEIGHT_MenuButton.value)
    size_hint_x = NumericProperty(None)
    size_hint_y = NumericProperty(None)
    size_hint = ReferenceListProperty(size_hint_x, size_hint_y)
    background_color = ListProperty([.4, .4, .4, 1])
    font_size = NumericProperty(FS.LEAD.value)
    app = ObjectProperty()

    def __init__(self, **kwargs):
        super(MenuButton, self).__init__(**kwargs)
        self.app = App.get_running_app()

    # def on_state(self, instance, value):
示例#16
0
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import ObjectProperty, NumericProperty
from kivy.uix.behaviors.button import ButtonBehavior
from kivy.uix.image import Image
from conf import SECOND_GAME
from label.status_bar import StatusBar
from utils.dir import abstract_path
from utils.get_object import GetObject
from utils.sizes import GOSize as GOS

Builder.load_file(abstract_path('button/left_button.kv'))


class LeftButtonWidget(ButtonBehavior, Image):
    height = NumericProperty(GOS.WH_BUTTON_LR.value)
    width = NumericProperty(GOS.WH_BUTTON_LR.value)
    road = ObjectProperty(None)
    bike = ObjectProperty(None)
    background = ObjectProperty(None)

    @classmethod
    def set_objects(cls):
        cls.status_bar = StatusBar()
        cls.road = cls.status_bar.get_road()
        cls.bike = cls.status_bar.get_bike()
        cls.background = cls.status_bar.get_background()

    def button_state_style(self):
        if 'down' in self.state:
            self.canvas.opacity = 0.5
示例#17
0
文件: road.py 项目: marychev/ride_me
from kivy.properties import NumericProperty, ObjectProperty, ListProperty, OptionProperty
from kivy.uix.widget import Widget

from bike.bike import Bike
from level.one.level_one import LevelOne
from road.events import RoadEvents
from utils.dir import abstract_path
from utils.exception import WarnTrySetBikeFromLayoutWarn, ErrBikeIsNotConfig, InfoBikeInstalledFor
from utils.get_object import GetObject
from utils.state import State
from utils.texture import repeat_texture, set_texture_uvpos, image_texture
from utils.validation import ValidObject
from utils.init import app_config
from level.maps import get_by_title as get_map_by_title

Builder.load_file(abstract_path('road/road.kv'))


class Road(Widget, RoadEvents):
    level = ObjectProperty()
    texture = ObjectProperty(image_texture('road/img/road-asphalt.png'))
    total_way = NumericProperty(0)  # todo: need to fix tests
    distance_traveled = NumericProperty(0)
    gravity = NumericProperty(9.0)
    state = OptionProperty(State.NONE, options=State.list_states())
    last_states = ListProperty()
    line_points = ListProperty([100, 100, 1000, 100])

    def __init__(self, **kwargs):
        super(Road, self).__init__(**kwargs)
        self.set_bike()
示例#18
0
from kivy.cache import Cache
from kivy.lang import Builder
# from kivy.logger import Logger
from kivy.properties import NumericProperty, StringProperty
from kivy.uix.widget import Widget

from bike.animation import AnimationBike
from bike.bikes import get_by_title as get_by_bike_title
from bike.model import BikeModel
from utils.dir import abstract_path
from utils.get_object import GetObject
from utils.init import app_config, calc_rest_rm
from utils.validation import ValidObject
from utils.exception import WarnBikeIsNotConfig

Builder.load_file(abstract_path('bike/bike.kv'))


class Bike(AnimationBike):
    source = StringProperty(abstract_path('bike/img/default.png'))
    acceleration = NumericProperty(0.0)
    power = NumericProperty(0)
    max_power = NumericProperty(0)
    speed = NumericProperty(0)
    max_speed = NumericProperty(0)
    agility = NumericProperty(0)

    start_dt = NumericProperty(0)
    finish_dt = NumericProperty(0)

    collected_currency = NumericProperty(0)
示例#19
0
from typing import Union

from kivy.core.text import Label
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.image import Image
from kivy.uix.screenmanager import Screen
from bike.bikes import get_by_title as get_bike_by_title
from bike.model import BikeModel
from level.maps import get_by_title as get_map_by_title
from level.model import MapModel
from utils.dir import abstract_path
from utils.init import app_config

Builder.load_file(abstract_path('screen/menu_screen.kv'))


class MenuScreen(Screen):
    bike_model = ObjectProperty()
    level = ObjectProperty()
    map_model = ObjectProperty(allownone=True)

    def __init__(self, **kwargs):
        super(MenuScreen, self).__init__(**kwargs)

        if app_config('bike', 'title'):
            self.init_bike()
        if app_config('map', 'title'):
            self.init_map()

    def init_bike(self):
示例#20
0
def image_texture(source):
    return Image(source=abstract_path(source)).texture