Академический Документы
Профессиональный Документы
Культура Документы
Introduction�����������������������������������������������������������������������������������������������������������xvii
iii
Table of Contents
iv
Table of Contents
v
Table of Contents
vi
Table of Contents
Animations�������������������������������������������������������������������������������������������������������������������������������� 284
Movement��������������������������������������������������������������������������������������������������������������������������������� 285
Changes in Movement��������������������������������������������������������������������������������������������������������� 290
Map and Initial Collidables�������������������������������������������������������������������������������������������������������� 292
Collisions Between the Player and Objects������������������������������������������������������������������������������� 294
Second Implementation������������������������������������������������������������������������������������������������������� 299
Third Implementation���������������������������������������������������������������������������������������������������������� 302
Fourth Implementation�������������������������������������������������������������������������������������������������������� 306
Fifth Implementation: Double Collision�������������������������������������������������������������������������������� 308
Limit Player Movement to the Map������������������������������������������������������������������������������������������� 313
Player Position�������������������������������������������������������������������������������������������������������������������������� 315
Hitbox Size�������������������������������������������������������������������������������������������������������������������������������� 317
Run�������������������������������������������������������������������������������������������������������������������������������������������� 317
vii
Table of Contents
viii
Table of Contents
ix
Table of Contents
Index��������������������������������������������������������������������������������������������������������������������� 559
x
About the Author
Andrés Cruz Yoris has more than ten years’ experience in the development of web
applications. He works with PHP, Python, and client-side technologies like HTML,
JavaScript, CSS, and Vue among others and server-side technologies like Laravel, Flask,
Django, and CodeIgniter. I am also a developer in Android Studio, Xcode, and Flutter
with which he creates native applications for Android and iOS.
xi
About the Technical Reviewer
Lukas Klingsbo (spydon) is part of the Blue Fire open
source collective and is the top contributor and maintainer
of the Flame game engine.
When not improving Flame, you can see him giving talks
and holding workshops on Flutter all over the world.
xiii
Acknowledgments
Thanks to everyone on my publishing team. Thanks to my father, who was always there
for me. And thanks to my mom for her support.
xv
Introduction
This book is intended to get you started with Flame using Flutter; with this, we are going
to clarify two things:
1. It is not a book which provides 100% knowledge of Flame or takes
you from being a beginner to an expert, since it would be too big
an objective for the scope of this book. What it offers is knowledge
about the main aspects of Flame, such as sprites, collision
systems, tiled inputs, and much more, and how to apply them to
2D game development.
This book applies a practical approach, from knowing the key aspects of the
technology to putting them into practice, gradually implementing small features and
functionalities that can be adapted to a real game.
To follow this book, you need to have a computer running Windows, Linux,
or MacOS.
xvii
CHAPTER 1
$ cd <ProjectName>
Finally, we open VSC or the editor you use to develop in Flutter; for this, you can
do the manual process (open the project we created earlier from VSC) or use the VSC
command (in case you have it configured):
$ code .
1
© Andrés Cruz Yoris 2024
A. Cruz Yoris, Flame Game Development, https://doi.org/10.1007/979-8-8688-0063-4_1
CHAPTER 2
Flame Basics
In this chapter we will know the key elements of Flame and its organization,
components, and key structures. This chapter purely acts as a reference; do not worry
if you do not understand all the terms explained. The following chapters offer a
more practical scheme in which we build an application step-by-step, and when you
encounter one of the classes and functions introduced in this chapter, you can return to
this chapter to review what was explained about it.
You can create a project called “testsflame” following the process shown in the
previous chapter.
1. The main class, which is the one that allows all the modules of the
application to communicate and uses Flame’s own processes such
as the collision and input system (keyboard, gestures, etc.)
2. The components, which are the elements of our game, such as a
background, a player, an enemy, etc.
To make the idea easier to understand, you can see Flame’s Game class as Flutter’s
MaterialApp and the Flame components as each of the pages that make up a Flutter
application.
3
© Andrés Cruz Yoris 2024
A. Cruz Yoris, Flame Game Development, https://doi.org/10.1007/979-8-8688-0063-4_2
Chapter 2 Flame Basics
Components
One of the great aspects of Flame is that we can use the different features of Flame with
the help of its component system. A component can be many things like a player, an
enemy, a background, particle effects, texts, or a joystick, among others, with which we
can incorporate more features such as the use of collisions, updates, and interactions
with keys, like drag and drop, tap, etc. As you can see, Flame has a very similar approach
to Flutter, but in this case with components instead of widgets and based on games.
In essence, a game entity, such as a player, is represented by a component, which
is a class. Through the Game class of our application, which is a Game-type class, the
components can communicate with each other, for example, in entries or collisions,
which gives us a very modular and scalable environment for the application.
We have many types of components. In this book, we will see some like
• SpriteComponent
• SpriteAnimationComponent
• PositionComponent
• TextComponent
4
Chapter 2 Flame Basics
import 'package:flame/components.dart';
import 'package:flame/game.dart';
import 'package:flutter/material.dart';
5
Chapter 2 Flame Basics
@override
void onLoad() async {
sprite = await Sprite.load('image.png');
}
}
main() {
runApp(GameWidget(game: MyGame()));
}
assets/images/image.png
pubspec.yaml
assets:
- assets/images/image.png
And the sprite will have a size of 16 pixels as specified in the class’s constructor:
size: Vector2.all(16)
add(MySprite());
Once an image is registered in your project, you will see a result like the following.
6
Chapter 2 Flame Basics
lib/main.dart
import 'package:flame/components.dart';
import 'package:flame/game.dart';
import 'package:flame/palette.dart';
import 'package:flutter/material.dart';
@override
void onLoad() async {}
@override
void render(Canvas canvas) {
canvas.drawCircle(const Offset(10, 10), 10, BasicPalette.red.paint());
main() {
runApp(GameWidget(game: MyGame()));
}
In this other example, we have the same application, but using the Game class
instead:
lib/main.dart
import 'package:flame/palette.dart';
import 'package:flutter/material.dart';
import 'package:flame/game.dart';
@override
void render(Canvas canvas) {
canvas.drawCircle(const Offset(10, 10), 10, BasicPalette.red.paint());
8
Chapter 2 Flame Basics
@override
void update(double deltaTime) {}
}
If you run either program with the Game or FlameGame class, you will see an output
like the following.
As you can conclude, this approach of organizing the code in classes allows us to
reuse the components more easily, as well as extend them or create others; therefore,
these examples reinforce the reason it is used. Apart from that, with the FlameGame
class, we have access to other features of the Flame API.
The FlameGame class maintains a list of all game components, and these can
be dynamically added to the game as needed; for example, we could add many
enemy SpriteComponents to the game and then remove them from the game as
the player kills the enemies. The FlameGame class will then iterate over these
components telling each component to update and render itself.
The GameWidget class represents the constructor we usually use to instantiate the
game in Flame and set it to the widget tree in Flutter.
As a recommendation, Ctrl/Command-click the FlameGame, Game,
PositionComponent, SpriteComponent, and the rest of the classes to see their details
and what properties they implement, as in the following:
9
Chapter 2 Flame Basics
ScaleProvider,
CoordinateTransform {
PositionComponent({
Vector2? position,
Vector2? size,
Vector2? scale,
double? angle,
this.nativeAngle = 0,
Anchor? anchor,
super.children,
***
You can also see the functions that you can implement and what parameters you can
send and their type, as in the case of Canvas, and test them and evaluate the result.
For example, to draw a rectangle, we can do it by defining two points on the screen:
import 'package:flame/components.dart';
import 'package:flame/game.dart';
import 'package:flame/palette.dart';
import 'package:flutter/material.dart';
10
Chapter 2 Flame Basics
@override
void onLoad() async {}
@override
void render(Canvas canvas) {
canvas.drawCircle(
Offset(circlePos, circlePos),
10,
_paint
);
@override
void update(double dt) {
super.update(dt);
circlePos++;
}
}
main() {
runApp(GameWidget(game: MyGame()));
}
11
Chapter 2 Flame Basics
import 'package:flame/palette.dart';
import 'package:flutter/material.dart';
import 'package:flame/game.dart';
@override
void onLoad() async {
super.onLoad();
// init
}
@override
void render(Canvas canvas) {
canvas.drawCircle(
Offset(circlePos, circlePos), 10, BasicPalette.red.paint());
@override
void update(double dt) {
circlePos++;
}
}
In the Game class, the game component, in this case the circle, is implemented
directly in the Game class, while for the implementation with the FlameGame class,
we can make use of a separate class (component) in which we handle all the logic of
said component, in this case moving the circle, which leaves us with a much cleaner
12
Chapter 2 Flame Basics
https://docs.flame-engine.org/latest/flame/components.html#circlecomponent
Or if you want to draw a rectangle, you can uncomment this code shown previously:
13
Chapter 2 Flame Basics
These two processes are known as the game loop, which is explained in the
following.
G
ame Loop
Flame’s module called GameLoop or the game loop is nothing more than a simple
abstraction of the game loop concept. Basically, most of the video games are based on
two methods:
• The render method takes the canvas to draw the current state of
the game.
• The update method receives the time (delta) since the last update
and allows the game to go to the next state, that is, updates the
game state.
That is, we have a method to initialize the game and another to perform updates.
Flame follows these principles, and we have a couple of methods that allow us to
perform such operations.
R
ender Method
The render() function receives an object-type parameter that refers to the canvas:
@override
void render(Canvas canvas) {
canvas.drawRect(squarePos, squarePaint);
}
This is just like with other technologies like HTML5; it’s nothing more than a blank
canvas to draw on. Here, we can draw anything, for example, a circle:
@override
void render(Canvas canvas) {
canvas.drawCircle(const Offset(10, 10), 10, BasicPalette.red.paint());
}
14
Chapter 2 Flame Basics
Update Method
The elements that are in the game need to be constantly redrawn according to the
current state of the game; to understand this more clearly, let’s see an example.
Suppose that a game element is represented by a sprite (an image), which in this
example we will call as a “player.” When the user clicks a button, then the player must
update its position; this update is applied in-game via a function called update().
As we saw in the example of the moving circle, it is this function that is responsible
for updating the position of the circle on the screen.
The update() method is, as its name indicates, an update function, which receives
a parameter called “delta time” (dt) that tells us the time that has elapsed since the
previous frame was drawn. You should use this variable to make your component move
at the same speed on all devices.
When updating any aspect of the game through the update() function, it is
automatically reflected through the render() function, and with this, the game updates
at a graphical level.
The game loop is used by all implementations of Game classes and their
components:
https://docs.flame-engine.org/latest/flame/game.html
15
Chapter 2 Flame Basics
16
CHAPTER 3
Flame Fundamentals
In this chapter, the main elements that we must know to work with Flame will be
discussed. We will see how to create the components, which are the key pieces or
elements of our game. We will look at the basic structure of a game with Flame and the
use of inputs (keyboard, joystick, etc.), which is the way in which the user can interact
with the application.
SpriteComponent: Components
for Rendering Images
One of the fundamental components that we have is the SpriteComponent. A sprite
sheet is a series of images joined in the same file next to each other.
Figure 3-1. Sprite sheet for the player, who can walk in all directions (https://
pipoya.itch.io/pipoya-free-rpg-character-sprites-nekonin)
17
© Andrés Cruz Yoris 2024
A. Cruz Yoris, Flame Game Development, https://doi.org/10.1007/979-8-8688-0063-4_3
Chapter 3 Flame Fundamentals
Figure 3-2. Sprite sheet for the player, who can move horizontally or up by
jumping (www.gameart2d.com/free-dino-sprites.html)
18
Chapter 3 Flame Fundamentals
pubspec.yaml
assets/images/tiger.png
pubspec.yaml
assets:
- assets/images/tiger.png
And we are going to create a new file to handle this image, which will have the
following structure:
lib/components/player_image_sprite_component.dart
import 'package:flame/components.dart';
import 'package:flutter/material.dart';
@override
void onLoad() async {
screenWidth = MediaQueryData.fromWindow(window).size.width;
screenHeight = MediaQueryData.fromWindow(window).size.height;
We obtain the size of the window, both its width and height. With this, we have all
the space that we can use to draw:
MediaQueryData.fromWindow(window).size
And we set the sizes, specifically the width and the height:
screenWidth = MediaQueryData.fromWindow(window).size.width;
screenHeight = MediaQueryData.fromWindow(window).size.height;
20
Chapter 3 Flame Fundamentals
Currently, getting the size this way is deprecated, which means that its use is
discouraged. In case you have access to the application context, you can get the window
size with
screenWidth = MediaQueryData.fromView(View.of(context)).size.width;
screenHeight = MediaQueryData.fromView(View.of(context)).size.height;
Or if you’re in a Flame component, where we don’t have access to the context, you
can use Flame’s game object that we can get as an import reference in the component,
for example:
game
game.size
screenWidth = game.size.x;
screenHeight = game.size.y;
We are going to want to place the image in the middle of the window. To do this, we
calculate the middle of the window:
(screenWidth/2)
(screenHeight/2)
Regardless of the scheme you want to use, we calculate the space occupied by the
image. Therefore, we subtract half the size of the image; with this, the image will appear
centered:
21
Chapter 3 Flame Fundamentals
And with this, we can calculate the position, to set it in the position property of the
SpriteComponent class. We need to indicate the position by means of a 2D vector in
which it is specified, the position that was previously calculated through the centerX and
centerY properties:
We indicate the total size of the image. As with the position, it is indicated by a two-
dimensional vector:
Remember that all the processes that require access to the storage memory of
the device are asynchronous processes; in this case, it is necessary to access the
storage memory, which is where the image we want to load is located.
To use the previously created component, we add it to the scene from main:
lib/main.dart
import 'package:flame/game.dart';
import 'package:flutter/material.dart';
import 'package:testsflame/components/player_image_sprite_component.dart';
22
Chapter 3 Flame Fundamentals
The image is in the specified size, which would be about 512 pixels; for a little
challenge, you can try resizing the image and placing it in different positions on
the screen.
This small example that we created is a base case that we must understand since any
Flame component has a logic similar to this; that is, create a component class with the
structure and logic and add it to the Game class to be able to use it in the application.
Going back to our application, we are going to update the position vector using the
update() function. For this example, we will not use the delta time:
23
Chapter 3 Flame Fundamentals
@override
void update(double dt) {
// TODO: implement update
super.update(dt);
}
This results in the constant movement of the image when executing the application.
With this, the next step that we have pending is to add interactivity with the user,
that is, the user can somehow interact with the application (the game) and something
happens, such as moving the sprite.
Here’s the code if we wanted to update the position of the sprite:
24
Chapter 3 Flame Fundamentals
25
Chapter 3 Flame Fundamentals
To avoid loading an image one by one in the project, managing them independently,
and, with this, increasing the consumption of resources (since, at the project level, each
image should be loaded individually), we are going to do all these steps at once; this
format is known as a “sprite sheet.” For this task, you can use any image editing program,
but, to facilitate the process, it is recommended to use programs such as the following:
www.codeandweb.com/texturepacker
The preceding program called TexturePacker allows us to create a sprite sheet
for the images; you can install the program on Linux, Windows, and MacOS. For this
process, you can download any image kit you want, although on the website www.
gameart2d.com/freebies.html, you will find several sprites that you can use for free.
Once the program is installed and your image kit has been downloaded, we are
going to create the sprite sheet. To do this, we drag and drop the images we want to work
with into the area shown in the following figure; in this book, they are the images shown
previously.
26
Chapter 3 Flame Fundamentals
You can use the “Zoom” option located in the lower-left corner to fully view the
sprite sheet.
You can indicate the FPS (speed) of the animation (remember to select all loaded
sprites).
27
Chapter 3 Flame Fundamentals
28
Chapter 3 Flame Fundamentals
And we will have our sprite sheet that we will call dino.png.
Then, we will copy the sprite sheet into the project in Flutter and reference it at the
project level to be able to use it:
pubspec.yaml
assets:
- assets/images/dino.png
Finally, at the level of our code, we will create the following class:
lib/components/player_sprite_sheet_component.dart
import 'package:flame/sprite.dart';
import 'package:flutter/material.dart';
import 'package:flame/flame.dart';
import 'package:flame/components.dart';
29
Chapter 3 Flame Fundamentals
@override
void onLoad() async {
//sprite = await Sprite.load('tiger.png');
screenWidth = game.size.x;
screenHeight = game.size.y;
30
Chapter 3 Flame Fundamentals
It is important to note that you must specify the size according to the sprite you
are using.
We load the sprite sheet:
And we define the sprite sheet so that it can be manipulated through a property; it is
in this step that we use the individual dimensions of each state:
Finally, it is now possible to consult the position of each step of the sprite sheet
individually:
31
Another random document with
no related content on Scribd:
Climate
The Capital
Individual States
The Coastal States follow with the Island State, and Lara, which
is neither coast, llano, nor mountain, though having some hills. The
coast line extends over 1800 miles.
Zulia, the large State (23,000 square miles) occupying the
northwest corner of the Republic, has Colombia on the west and
northwest, the Gulf of Venezuela northeast, Falcón, Lara, and Trujillo
east, and Mérida with a little of Táchira south. This State, of which
Maracaibo is the capital, is one of the wealthiest in the Republic,
though still sparsely inhabited. The Maracaibo Plain, the most
conspicuous and important section occupying the greater portion of
the State, lies between the two great branches of the East Cordillera.
The lake itself is a sheet of water about 150 miles long and half as
wide, the water sweet in the southern half of the lake, but brackish
towards the north. The precipitation in this district amounts to 70
inches annually. Thus an enormous amount of fresh water from the
Cordillera is continually entering the lake through its various
affluents; of these the Catatumbo with its tributary Zulia, and the
Escalante, are navigable for steamboats. The lake has a depth of 30
feet and is served by several lines of steamers as well as by sailing
craft. A few small towns on the lake receive agricultural products
from their vicinity; along the shore cacao is cultivated with great
profit. There is a fine goat farming district; fishing is carried on; there
are many settlements of Indians inhabiting huts on piles in the lake in
the ancient fashion. North of the city, Maracaibo, are salinas or salt
deposits, from which several thousand tons are taken annually.
Southwest of Maracaibo, a peculiar tree is found in the forest, the
arbol de vaca, or palo de leche, the sap of which, though slightly
thicker, may be used in every way as cow’s milk. In the forests are
valuable timber, useful creepers, and trees which furnish various
gums or resins. Around the lake are found outcrops of coal, also
petroleum and asphalt.
COLOMBIA, VENEZUELA, GUIANA, ECUADOR, NORTH BRAZIL
The capital city, Maracaibo, is a busy place, and prosperous. With
some good buildings, and other ordinary requirements, it is in need
of better paving, a suitable drainage system, and a good water
supply, in order to lower its high death rate and to measure up to its
favorable location, although this may be called hot.
Falcón, east of Zulia, extends along the coast of the Gulf of
Venezuela (also called Maracaibo) past the Paraguana Peninsula,
which it includes, and around to the east, so far that the next coast
State, Yaracuy, is on the south together with the State of Lara farther
west; these three States include the Segovian Highlands; the first
two, coast lands also. This section is the oldest part of Venezuela
except for the town of Cumaná.
An immensely profitable industry here followed is the raising of
goats, which feed on the cactus plains. The extensive coal deposits
and salinas count for little in comparison. The northern part of the
State is rather barren, but the highlands at the south are forest clad,
with fertile valleys raising a variety of agricultural products, chiefly for
home consumption. There is one considerable river, the Tocuyo,
several hundred miles long, which rises in the mountains of Lara,
flows north, then east through Yaracuy and Falcón to the sea. With
many affluents, the two of importance are the Carora and the
Baragua on the left. The Rio Tocuyo comes down through a long
valley, while many short rivers rising on the outer range descend
rapidly to the sea. The situation is excellent for the cultivation of
cocuiza and other aloes from which sacks and hammocks are now
being made. Other industries are soap making and cigarettes; in
some sections excellent tobacco is raised.
Coro, the capital of Falcón, the second oldest town in the
Republic, contains the first cathedral in the new world. Located on
the plains at the base of the Paraguana Peninsula, it is 8 miles from
its seaport La Vela and 200 miles west of Caracas.
The important port Tucacas is at the mouth of the Tocuyo River.
The Dutch island, Curaçao, lies not far off the coast, with which it
has close connection; some smuggling is said to be carried on.
Yaracuy, a small State with a very short coastal strip, is between
Falcón on the north and Carabobo southeast, with Lara southwest. It
is noted for its copper mines at Aroa.
Besides the capital, San Felipe, where a cloth factory has lately
been organized, the chief towns are Nirgua, population 3000, at the
south, amid fertile plains with varied agricultural products, and
Yaritagua 20 miles west, where good tobacco is raised, as well as
sugar and coffee which grow everywhere.
Lara, an interior State, borders on Falcón, Yaracuy, Cojedas,
Portuguesa, Trujillo, finishing with Zulia on the west. Besides the
usual agricultural products, there is fibre from aloes, employed in
manufacturing sacks, hammocks, and bridles, for which
Barquisimeto is noted. The fertile hills and slopes, many now
undeveloped, the virgin forests of valuable timber, with areas where
petroleum is indicated, will receive attention now that better
transportation is afforded.
Barquisimeto, the capital, 2000 feet above the sea, and 90 miles
from Puerto Cabello, is the most important city of this section, a
centre of traffic for the northern Andes region as well as for the State
of Lara.
Llano States
Territories
La Guaira, the chief port of the Centro, and the best known of
Venezuela, is rivaled by Puerto Cabello, which has a better natural
harbor. La Guaira, population 18,000 including its suburbs, as the
port of the capital, Caracas, attracts more travelers and at present
more trade, much of it coming from or going to other parts of the
country. The harbor, a rather open roadstead, was improved at great
expense by port works. Though these facilitate the increasing traffic,
ships at times are still exposed to heavy swells. The town is hot and
unhealthful with a mean temperature of 84.5°, but it has good rail
connection with its pleasant suburbs, cooler and more sanitary. The
port has good piers, vessels lying alongside. The depth of water is
28-30 feet.
Puerto Cabello, 65 miles west, in the State of Carabobo,
population 20,000, is said to have the best harbor, its depth 28 feet,
on the North Coast of South America. With a slightly lower
temperature than La Guaira, it has a higher death rate. To this port
comes most of the produce of its own State, of Yaracuy, of the Llano
States Cojedes and Portuguesa, and some from the Andes region.
The enterprise of the Venezuela Meat Syndicate, with new buildings
here, promotes stock farming and the traffic of the port. A floating
dock receives vessels of 2000 tons; a new one will accommodate
ships of 4000 tons.
Carúpano, far to the east of La Guaira, is the only other port of
importance which is visited by large ocean steamers. Although as
warm as Puerto Cabello, it has a much more healthful climate. With
no real harbor, merely an open roadstead, serving the State of
Sucre, it is a port of call for several lines of steamers. The cargo
must be transported in lighters.
Ciudad Bolívar, though far up the Orinoco River, as the official
port of entry for half the country, serves an extensive region. It
communicates with the outside world by weekly steamers of shallow
draught to the Port of Spain, as also by coasting vessels. The
steamers returning cross the Gulf of Paria, follow up the Caño
Macareo to the Orinoco, and up that river to Bolívar.
Maracaibo, the fifth port with foreign trade, though called a
seaport is not exactly on the sea; being located on the west shore of
a broad channel 6-12 miles wide and 30 long which connects Lake
Maracaibo with the Gulf of Venezuela. The city has fine wharves on
a beautiful bay, a smooth roadstead with water 30 feet deep; but
unfortunately the sand bar at the entrance of the channel confines
the passage to ships drawing only 11 feet, with conditions growing
worse. As the city is now the second port of the country with the
largest export trade including some from Colombia, it has been
proposed either to dredge one of the entrance channels, or to make
use of the fine natural harbor of Cojoro on the Gulf, capable of
accommodating the largest steamers, and to connect this port with
Maracaibo by a railway about 100 miles long. At present the foreign
trade is carried on by national, Dutch, and Spanish steamers, and by
American boats of the Red D Line. Freight not destined for the
United States is largely carried to the Dutch Island Curaçao, where
transfer is made to ships of other lines. Sailing vessels also carry
much produce.
These primary ports, except Carúpano, all have docks where
ships come alongside. A new freight and passenger service from
New Orleans to Venezuelan ports has been installed by the W. R.
Grace Company.
A number of smaller ports are served generally by smaller craft,
steam or sailing vessels, which transfer freight to the primary ports
for ocean traffic. Some of these are: La Vela (56 miles from
Curaçao), the port of Coro, capital of Falcón; Tucacas, in the same
State, important as serving the copper mines of Aroa; Carenero, in
Miranda, east of Caracas; Guanta, long the port of Barcelona and
neighboring coal mines; Cumaná in Sucre, a mile from the mouth of
the Manzanares River; and Pampatar on Margarita Island. At
Turiamo, a natural harbor between La Guaira and Puerto Cabello, a
public bonded warehouse is to be erected, and connection will be
made with the Grand Central Railway. At Ocumare de la Costa port
and harbor works are to be constructed by the Government and a
railway connecting the port with Maracay, 43 miles distant.
Inland Transportation