156 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| /*
 | |
|  * Copyright 2018 Dan Field. All rights reserved.
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| import 'package:flat_buffers/flat_buffers.dart' as fb;
 | |
| import './monster_my_game.sample_generated.dart' as myGame;
 | |
| 
 | |
| // Example how to use FlatBuffers to create and read binary buffers.
 | |
| 
 | |
| void main() {
 | |
|   builderTest();
 | |
|   objectBuilderTest();
 | |
| }
 | |
| 
 | |
| void builderTest() {
 | |
|   final builder = new fb.Builder(initialSize: 1024);
 | |
|   final int weaponOneName = builder.writeString("Sword");
 | |
|   final int weaponOneDamage = 3;
 | |
| 
 | |
|   final int weaponTwoName = builder.writeString("Axe");
 | |
|   final int weaponTwoDamage = 5;
 | |
| 
 | |
|   final swordBuilder = new myGame.WeaponBuilder(builder)
 | |
|     ..begin()
 | |
|     ..addNameOffset(weaponOneName)
 | |
|     ..addDamage(weaponOneDamage);
 | |
|   final int sword = swordBuilder.finish();
 | |
| 
 | |
|   final axeBuilder = new myGame.WeaponBuilder(builder)
 | |
|     ..begin()
 | |
|     ..addNameOffset(weaponTwoName)
 | |
|     ..addDamage(weaponTwoDamage);
 | |
|   final int axe = axeBuilder.finish();
 | |
| 
 | |
|   // Serialize a name for our monster, called "Orc".
 | |
|   final int name = builder.writeString('Orc');
 | |
| 
 | |
|   // Create a list representing the inventory of the Orc. Each number
 | |
|   // could correspond to an item that can be claimed after he is slain.
 | |
|   final List<int> treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
 | |
|   final inventory = builder.writeListUint8(treasure);
 | |
|   final weapons = builder.writeList([sword, axe]);
 | |
| 
 | |
|   // Struct builders are very easy to reuse.
 | |
|   final vec3Builder = new myGame.Vec3Builder(builder);
 | |
| 
 | |
|   vec3Builder.finish(4.0, 5.0, 6.0);
 | |
|   vec3Builder.finish(1.0, 2.0, 3.0);
 | |
|   // Set his hit points to 300 and his mana to 150.
 | |
|   final int hp = 300;
 | |
|   final int mana = 150;
 | |
| 
 | |
|   final monster = new myGame.MonsterBuilder(builder)
 | |
|     ..begin()
 | |
|     ..addNameOffset(name)
 | |
|     ..addInventoryOffset(inventory)
 | |
|     ..addWeaponsOffset(weapons)
 | |
|     ..addEquippedType(myGame.EquipmentTypeId.Weapon)
 | |
|     ..addEquippedOffset(axe)
 | |
|     ..addHp(hp)
 | |
|     ..addMana(mana)
 | |
|     ..addPos(vec3Builder.finish(1.0, 2.0, 3.0))
 | |
|     ..addColor(myGame.Color.Red);
 | |
| 
 | |
|   final int monsteroff = monster.finish();
 | |
|   final buffer = builder.finish(monsteroff);
 | |
|   if (verify(buffer)) {
 | |
|     print(
 | |
|         "The FlatBuffer was successfully created with a builder and verified!");
 | |
|   }
 | |
| }
 | |
| 
 | |
| void objectBuilderTest() {
 | |
|   // Create the builder here so we can use it for both weapons and equipped
 | |
|   // the actual data will only be written to the buffer once.
 | |
|   var axe = new myGame.WeaponObjectBuilder(name: 'Axe', damage: 5);
 | |
| 
 | |
|   var monsterBuilder = new myGame.MonsterObjectBuilder(
 | |
|     pos: new myGame.Vec3ObjectBuilder(x: 1.0, y: 2.0, z: 3.0),
 | |
|     mana: 150,
 | |
|     hp: 300,
 | |
|     name: 'Orc',
 | |
|     inventory: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 | |
|     color: myGame.Color.Red,
 | |
|     weapons: [new myGame.WeaponObjectBuilder(name: 'Sword', damage: 3), axe],
 | |
|     equippedType: myGame.EquipmentTypeId.Weapon,
 | |
|     equipped: axe,
 | |
|   );
 | |
| 
 | |
|   var buffer = monsterBuilder.toBytes();
 | |
| 
 | |
|   // We now have a FlatBuffer we can store on disk or send over a network.
 | |
| 
 | |
|   // ** file/network code goes here :) **
 | |
| 
 | |
|   // Instead, we're going to access it right away (as if we just received it).
 | |
|   if (verify(buffer)) {
 | |
|     print(
 | |
|         "The FlatBuffer was successfully created with an object builder and verified!");
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool verify(List<int> buffer) {
 | |
|   // Get access to the root:
 | |
|   var monster = new myGame.Monster(buffer);
 | |
| 
 | |
|   // Get and test some scalar types from the FlatBuffer.
 | |
|   assert(monster.hp == 80);
 | |
|   assert(monster.mana == 150); // default
 | |
|   assert(monster.name == "MyMonster");
 | |
| 
 | |
|   // Get and test a field of the FlatBuffer's `struct`.
 | |
|   var pos = monster.pos;
 | |
|   assert(pos != null);
 | |
|   assert(pos.z == 3.0);
 | |
| 
 | |
|   // Get a test an element from the `inventory` FlatBuffer's `vector`.
 | |
|   var inv = monster.inventory;
 | |
|   assert(inv != null);
 | |
|   assert(inv.length == 10);
 | |
|   assert(inv[9] == 9);
 | |
| 
 | |
|   // Get and test the `weapons` FlatBuffers's `vector`.
 | |
|   var expected_weapon_names = ["Sword", "Axe"];
 | |
|   var expected_weapon_damages = [3, 5];
 | |
|   var weps = monster.weapons;
 | |
|   for (int i = 0; i < weps.length; i++) {
 | |
|     assert(weps[i].name == expected_weapon_names[i]);
 | |
|     assert(weps[i].damage == expected_weapon_damages[i]);
 | |
|   }
 | |
| 
 | |
|   // Get and test the `Equipment` union (`equipped` field).
 | |
|   assert(monster.equippedType.value == myGame.EquipmentTypeId.Weapon.value);
 | |
|   assert(monster.equippedType == myGame.EquipmentTypeId.Weapon);
 | |
| 
 | |
|   assert(monster.equipped is myGame.Weapon);
 | |
|   var equipped = monster.equipped as myGame.Weapon;
 | |
|   assert(equipped.name == "Axe");
 | |
|   assert(equipped.damage == 5);
 | |
| 
 | |
|   print(monster);
 | |
|   return true;
 | |
| }
 |