newbee

package module
v0.0.59 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 6, 2023 License: MIT Imports: 9 Imported by: 1

README

Newbee

Golang 游戏基本框架。

安装

go get github.com/smartwalle/newbee

创建房间

var room = newbee.NewRoom(1)

实现游戏

定义一个结构体,实现 newbee.Game 接口

type Game struct {
}

func (this *Game) GetId() int64 {}
func (this *Game) GetState() newbee.GameState {}
func (this *Game) TickInterval() time.Duration {}
func (this *Game) OnTick() {}
func (this *Game) OnMessage(player newbee.Player, message interface{}) {}
func (this *Game) OnDequeue(message interface{}) {}
func (this *Game) OnRunInRoom(room newbee.Room) {}
func (this *Game) OnJoinRoom(player newbee.Player) {}
func (this *Game) OnLeaveRoom(player newbee.Player) {}
func (this *Game) OnCloseRoom(room newbee.Room) {}
func (this *Game) OnPanic(room newbee.Room, err error) {}

运行游戏

var game = &Game{}
room.Run(game)

添加玩家

var player = &Player{} // Player 结构体需要实现 newbee.Player 接口
room.AddPlayer(player)

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrRoomClosed     = errors.New("newbee: room is closed")
	ErrRoomRunning    = errors.New("newbee: room is running")
	ErrRoomNotRunning = errors.New("newbee: room is not running")
	ErrNilGame        = errors.New("newbee: game is nil")
	ErrPlayerExists   = errors.New("newbee: player already exists")
	ErrPlayerNotExist = errors.New("newbee: player not exist")
	ErrInvalidPlayer  = errors.New("newbee: invalid player")
	ErrNilPlayer      = errors.New("newbee: player is nil")
	ErrFailedToRun    = errors.New("newbee: failed to run the room")
	ErrBadSession     = errors.New("newbee: bad session")
	ErrBadInterval    = errors.New("newbee: bad interval")
)

Functions

This section is empty.

Types

type Game

type Game interface {
	// GetId 获取游戏 id
	GetId() int64

	// GetState 游戏状态
	GetState() GameState

	// TickInterval 返回刷新时间间隔,Room 将按照该时间间隔调用 OnTick() 方法,返回小于等于 0 的时候,将禁用定时刷新
	TickInterval() time.Duration

	// OnTick 定时器,Room 会定时调用,如果此方法返回 false,Room 将关闭
	OnTick()

	// OnMessage 处理客户端消息
	OnMessage(player Player, message interface{})

	// OnDequeue 处理自定义消息
	OnDequeue(message interface{})

	// OnRunInRoom Room 启动成功之后会调用此方法
	OnRunInRoom(room Room)

	// OnJoinRoom 玩家建立网络连接会调用此方法
	OnJoinRoom(player Player)

	// OnLeaveRoom 玩家断开网络连接会调用此方法
	OnLeaveRoom(player Player, err error)

	// OnCloseRoom 房间关闭的时候会调用此方法
	OnCloseRoom(room Room)

	// OnPanic 有未捕获异常的时候会调用此方法
	OnPanic(room Room, err error)
}

type GameState

type GameState uint16
const (
	GameStatePending GameState = iota // 游戏等待开始
	GameStateGaming                   // 游戏进行中
	GameStateOver                     // 游戏结束
	GameStateStop                     // 游戏停止
)

type Player

type Player interface {
	// GetId 获取玩家 id
	GetId() int64

	// Session 获取连接信息
	Session() net4go.Session

	// Connected 获取玩家在线状态
	Connected() bool

	// SendPacket 发送消息
	SendPacket(net4go.Packet)

	// AsyncSendPacket 异步发送消息
	AsyncSendPacket(net4go.Packet)

	// Close 关闭玩家
	// 注意:不要重写本方法,如果需要清理玩家信息,应该在 Game 的 OnLeaveRoom 中完成
	Close() error
}

func NewPlayer

func NewPlayer(id int64, sess net4go.Session) Player

type Room

type Room interface {
	// GetId 获取房间 id
	GetId() int64

	// GetToken 房间 token
	GetToken() string

	// GetState 获取房间状态
	GetState() RoomState

	// GetPlayer 获取玩家信息
	GetPlayer(playerId int64) Player

	// GetPlayers 获取所有玩家信息
	GetPlayers() map[int64]Player

	// RangePlayer 只读遍历玩家信息,在回调函数中,不可执行 Room 的其它可以影响玩家列表的操作
	RangePlayer(fn func(player Player))

	// GetPlayerCount 获取玩家数量
	GetPlayerCount() int

	// AddPlayer 添加玩家,如果玩家已经存在或者 player 参数为空,会返回相应的错误,如果连接不为空,则将该玩家和连接进行绑定
	AddPlayer(player Player) error

	// RemovePlayer 移除玩家
	RemovePlayer(playerId int64)

	// Run 启动
	Run(game Game) error

	// Enqueue 添加自定义消息
	Enqueue(message interface{})

	// SendPacket 向指定玩家发送消息
	SendPacket(playerId int64, packet net4go.Packet)

	// BroadcastPacket 向所有玩家广播消息
	BroadcastPacket(packet net4go.Packet)

	// Close 关闭房间
	Close() error
}

func NewRoom

func NewRoom(id int64, opts ...RoomOption) Room

type RoomOption

type RoomOption func(r *room)

func WithAsync

func WithAsync() RoomOption

WithAsync 网络消息和定时器消息为异步模式 网络消息会放入队列中,定时器消息不会放入队列中 定时器会定时触发,不管上一次的定时任务是否处理完成

func WithFrame

func WithFrame() RoomOption

WithFrame 网络消息和定时器消息为帧模式,同时网络消息的处理由定时器驱动 会启用一个定时器定时处理网络消息,网络消息处理完成之后,会触发游戏的 OnTick 方法

func WithSync

func WithSync() RoomOption

WithSync 网络消息和定时器消息为同步模式 网络消息和定时器消息会放入同一队列等待执行 定时任务放入队列之后,定时器就会暂停,需要等到队列中的定时任务执行之后才会再次激活定时器

func WithToken

func WithToken(token string) RoomOption

func WithWaiter

func WithWaiter(w Waiter) RoomOption

type RoomState

type RoomState uint32
const (
	RoomStateClose   RoomState = iota // 房间已关闭
	RoomStatePending                  // 等待游戏运行
	RoomStateRunning                  // 有游戏在运行(和游戏的状态无关,调用 Room 的 Run() 方法成功之后,就会将 Room 的状态调整为此状态)
)

type Waiter

type Waiter interface {
	Add(delta int)

	Done()

	Wait()
}

Directories

Path Synopsis
examples module

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL