July 16, 2014
5:52 p.m.
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 <stephan@stack.nl > <mailto:stephan@stack.nl>> 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: (0@0.92 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: 1@0.92). > ^ 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. > ]]] > >