Games [XUI2D] Flappy Bird Example

Erel

Administrator
Staff member
Licensed User

Example of a "flappy bird" game. The images and sounds are based on Clumsy Bird open source project: https://github.com/ellisonleao/clumsy-bird (GPL license)

Interesting points:

- The moving ground required some work to correctly adjust its position. It moves a bit backwards and then jump forward.
- The pipes are all drawn from the same two images, one for the top pipes and one for the bottom pipes. The default behavior of the built-in graphic cache is to draw the full image. A delegate class was added and it creates the drawing task with the specific part.
- I've added another ImageView named ivMessages. It is used for the "get ready" and "game over" messages.
- The bird is rotated based on its velocity vector direction:
B4X:
bw.Body.SetTransform(bw.Body.Position, ATan2(bw.Body.LinearVelocity.y, bw.Body.LinearVelocity.X))
Example projects included in the examples pack: https://www.b4x.com/android/forum/threads/xui2d-example-pack.96454/
 
Last edited:

ivan.tellez

Active Member
Licensed User
Really FUN to play with the code. A little frustraiting the collition in the game

It feel betther with a circle Fixture instead of a rectangle in the Create_Bird sub:

B4X:
    'Dim rect As B2PolygonShape
    'rect.Initialize
    Dim size As B2Vec2 = X2.GraphicCache.GetGraphicSizeMeters(wrapper.GraphicName, 0)
    'rect.SetAsBox(size.X / 2, size.Y / 2)
    'wrapper.Body.CreateFixture2(rect, 0.2)
  
    Dim bShape As B2CircleShape
    bShape.Initialize(size.Y / 2)
  
    Dim fix As B2FixtureDef
    fix.Shape = bShape
    fix.Density = 0.2
  
    wrapper.Body.CreateFixture(fix)
 
Last edited:

Erel

Administrator
Staff member
Licensed User
Another bug: by default bodies are deleted once they are not visible. This can be disabled by setting BodyWrapper.DestroyIfInvisible to False.

However if we use a custom delegate class for the body then we need to take care of it ourselves. The Pipe class is missing this code from the Tick:
B4X:
    If bw.IsVisible = False Then
       bw.Delete(GS)
       Return
   End If
 
Top