Floating chat messages and remote server
This commit is contained in:
parent
d301d597e8
commit
c01b8d1c59
20
game/chat.go
20
game/chat.go
@ -23,6 +23,7 @@ type Chat struct {
|
||||
isTyping bool
|
||||
cursorPos int
|
||||
scrollOffset int
|
||||
userData interface{}
|
||||
}
|
||||
|
||||
func NewChat() *Chat {
|
||||
@ -61,6 +62,25 @@ func (c *Chat) HandleServerMessages(messages []*pb.ChatMessage) {
|
||||
c.messages = c.messages[1:]
|
||||
}
|
||||
c.messages = append(c.messages, localMsg)
|
||||
|
||||
// Add floating message to the player
|
||||
if game, ok := c.userData.(*Game); ok {
|
||||
if msg.PlayerId == game.Player.ID {
|
||||
game.Player.Lock()
|
||||
game.Player.FloatingMessage = &types.FloatingMessage{
|
||||
Content: msg.Content,
|
||||
ExpireTime: time.Now().Add(6 * time.Second),
|
||||
}
|
||||
game.Player.Unlock()
|
||||
} else if otherPlayer, exists := game.OtherPlayers[msg.PlayerId]; exists {
|
||||
otherPlayer.Lock()
|
||||
otherPlayer.FloatingMessage = &types.FloatingMessage{
|
||||
Content: msg.Content,
|
||||
ExpireTime: time.Now().Add(6 * time.Second),
|
||||
}
|
||||
otherPlayer.Unlock()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
48
game/game.go
48
game/game.go
@ -1,6 +1,8 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gitea.boner.be/bdnugget/goonscape/assets"
|
||||
"gitea.boner.be/bdnugget/goonscape/types"
|
||||
pb "gitea.boner.be/bdnugget/goonserver/actions"
|
||||
@ -37,6 +39,7 @@ func New() *Game {
|
||||
Chat: NewChat(),
|
||||
}
|
||||
game.Player.UserData = game
|
||||
game.Chat.userData = game
|
||||
return game
|
||||
}
|
||||
|
||||
@ -122,6 +125,18 @@ func (g *Game) DrawPlayer(player *types.Player, model rl.Model) {
|
||||
|
||||
rl.DrawModel(model, playerPos, 16, rl.White)
|
||||
|
||||
if player.FloatingMessage != nil && time.Now().Before(player.FloatingMessage.ExpireTime) {
|
||||
screenPos := rl.GetWorldToScreen(rl.Vector3{
|
||||
X: playerPos.X,
|
||||
Y: playerPos.Y + 24.0,
|
||||
Z: playerPos.Z,
|
||||
}, g.Camera)
|
||||
|
||||
player.FloatingMessage.ScreenPos = screenPos
|
||||
} else if player.FloatingMessage != nil {
|
||||
player.FloatingMessage = nil
|
||||
}
|
||||
|
||||
if len(player.TargetPath) > 0 {
|
||||
targetTile := player.TargetPath[len(player.TargetPath)-1]
|
||||
targetPos := rl.Vector3{
|
||||
@ -144,16 +159,43 @@ func (g *Game) DrawPlayer(player *types.Player, model rl.Model) {
|
||||
func (g *Game) Render() {
|
||||
rl.BeginDrawing()
|
||||
rl.ClearBackground(rl.RayWhite)
|
||||
rl.BeginMode3D(g.Camera)
|
||||
|
||||
rl.BeginMode3D(g.Camera)
|
||||
g.DrawMap()
|
||||
g.DrawPlayer(g.Player, g.Player.Model)
|
||||
|
||||
for id, other := range g.OtherPlayers {
|
||||
g.DrawPlayer(other, g.Models[int(id)%len(g.Models)].Model)
|
||||
}
|
||||
|
||||
rl.EndMode3D()
|
||||
|
||||
drawFloatingMessage := func(msg *types.FloatingMessage) {
|
||||
if msg == nil || time.Now().After(msg.ExpireTime) {
|
||||
return
|
||||
}
|
||||
pos := msg.ScreenPos
|
||||
text := msg.Content
|
||||
textWidth := rl.MeasureText(text, 20)
|
||||
|
||||
for offsetX := -2; offsetX <= 2; offsetX++ {
|
||||
for offsetY := -2; offsetY <= 2; offsetY++ {
|
||||
rl.DrawText(text,
|
||||
int32(pos.X)-textWidth/2+int32(offsetX),
|
||||
int32(pos.Y)+int32(offsetY),
|
||||
20,
|
||||
rl.Black)
|
||||
}
|
||||
}
|
||||
rl.DrawText(text, int32(pos.X)-textWidth/2, int32(pos.Y), 20, rl.Yellow)
|
||||
}
|
||||
|
||||
if g.Player.FloatingMessage != nil {
|
||||
drawFloatingMessage(g.Player.FloatingMessage)
|
||||
}
|
||||
|
||||
for _, other := range g.OtherPlayers {
|
||||
drawFloatingMessage(other.FloatingMessage)
|
||||
}
|
||||
|
||||
rl.DrawFPS(10, 10)
|
||||
g.Chat.Draw(int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()))
|
||||
rl.EndDrawing()
|
||||
|
@ -28,6 +28,7 @@ type Player struct {
|
||||
LastUpdateTime time.Time
|
||||
InterpolationProgress float32
|
||||
UserData interface{} // Used to store reference to game
|
||||
FloatingMessage *FloatingMessage
|
||||
}
|
||||
|
||||
type ModelAsset struct {
|
||||
@ -41,6 +42,12 @@ type ChatMessage struct {
|
||||
Time time.Time
|
||||
}
|
||||
|
||||
type FloatingMessage struct {
|
||||
Content string
|
||||
ExpireTime time.Time
|
||||
ScreenPos rl.Vector2 // Store the screen position for 2D rendering
|
||||
}
|
||||
|
||||
const (
|
||||
MapWidth = 50
|
||||
MapHeight = 50
|
||||
@ -51,5 +58,6 @@ const (
|
||||
ServerTickRate = 600 * time.Millisecond
|
||||
ClientTickRate = 50 * time.Millisecond
|
||||
MaxTickDesync = 5
|
||||
ServerAddr = "localhost:6969"
|
||||
// ServerAddr = "localhost:6969"
|
||||
ServerAddr = "boner.be:6969"
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user