On 16/7/14 17:41, kilon alios wrote:
Well not everything in there is an Enterprise solution so I think it would be better if renamed to "Pharo Bible" or "Pharo Encyclopedia" , for example Pharo Sound is not exactly Enterprise material, though its my favorite chapter :)
Yes it should be called Pharo Limbo and once chapters are ready to get out they should be dispatched to the corresponding book
By the way great work and thanks for reminding to try this out now, I keep forgetting.

This can go also inside our Updated PBE as a nice chapter, its after all ... an example ;)
I would prefer to keep Pharo by Example as close as the current one and produce
- Fun With Pharo
- Pharo for the entreprise
- Laser Game Tutorial





On Wed, Jul 16, 2014 at 6:03 PM, Stephan Eggermont <[email protected] <mailto:[email protected]>> wrote:

    Can we have another book? LaserGame would fit in fine too.

    I've started writing a chapter explaining PhlappyBird

    !PhlappyBird

    PhlappyBird is a smalltalk clone of the well-known little game. It
    is a nice example of building a small Morphic application and well
    suited for a tutorial.
    +file://figures/PhlappyBird.png+

    !! The top level window

    The top level window is a SystemWindow containing a game scene and
    a button to restart the game. The scene will be recreated when the
    button is pressed, and it is easiest to just have an instance
    variable refering to it.

    [[[
    SystemWindow subclass: #PhlappyBirdGame
            instanceVariableNames: 'scene'
            classVariableNames: ''
            category: 'PhlappyBird'
    ]]]

    The game can be started by typing ==PhlappyBirdGame play <DoIt>==.
    That creates a new game, opens it window in te world and sets its
    width and height.

    [[[
    PhlappyBirdGame class>>play
            PhlappyBirdGame new
                    openInWorld;
                    extent: 298@510.
    ]]]

    In Pharo, ==new== calls ==initialize==. In the initialization, the
    scene is created, the window is given a title and made
    unresizable, the scene is told that when the space key is pressed
    the bird should flap its wings and the restart button is added.

    [[[
    PhlappyBirdGame>>initialize
            super initialize.
            scene := self newScene.
            self
                    setLabel: 'Phlappy Bird';
                    beUnresizeable;
                    on: Character space do: [ scene flapTheBird ];
                    addMorph: self createRestartButton
                        frame: ([email protected] corner: 1@1)
    ]]].

    The ==addMorph:frame:== message is the morphic implementation of
    the composite pattern. All Morphs can be composites. Most Morphs
    use ==addMorph:fullFrame:== where the frame provides a layout
    object, but a SystemWindow adds a simpler variant where a
    proportional layout can be used with a rectangle with values
    between 0 and 1 for the relative size. The button takes the 8% of
    the bottom part of the user-draw area of the window.
    The scene takes the rest.

    [[[
    PhlappyBirdGame>>newScene
            | newScene |
            newScene := Scene new.
            self
                    addMorph: newScene
                    frame: (0@0 corner: [email protected]).
            ^ newScene
    ]]]

    !!! The restart button
    The button is a ==PluggableButtonMorph==. A PluggableButtonMorph
    is a themeable button, that takes colors, borders and corner
    radius from the currently selected theme.

    ;SystemWindow is also a theme-aware object.

    [[[
    PhlappyBirdGame>>createRestartButton
            ^ PluggableButtonMorph
                    on: self
                    getState: nil
                    action: #restartPressed
                    label: #restartButtonLabel
    ]]]

    The PluggableButtonMorph will react to being clicked by performing
    the ==restartPressed== action method on its model (self), and gets
    its label from the ==restartButtonLabel== method. The label is
    just a string. A PluggableButtonMorph can show a binary value, and
    by ==setState: nil== it is indicated that this is just a plain button.

    [[[
    PhlappyBirdGame>>restartButtonLabel
            ^ 'New Game'
    ]]]

    When the button is pressed, the current scene is removed as
    submorph from the window and a new one is created and added.
    [[[
    PhlappyBirdGame>>restartPressed
            scene delete.
            scene := self newScene.
    ]]]



Reply via email to