feature/chat #2
20
game/chat.go
20
game/chat.go
@ -23,6 +23,7 @@ type Chat struct {
|
|||||||
isTyping bool
|
isTyping bool
|
||||||
cursorPos int
|
cursorPos int
|
||||||
scrollOffset int
|
scrollOffset int
|
||||||
|
userData interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewChat() *Chat {
|
func NewChat() *Chat {
|
||||||
@ -61,6 +62,25 @@ func (c *Chat) HandleServerMessages(messages []*pb.ChatMessage) {
|
|||||||
c.messages = c.messages[1:]
|
c.messages = c.messages[1:]
|
||||||
}
|
}
|
||||||
c.messages = append(c.messages, localMsg)
|
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
|
package game
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"gitea.boner.be/bdnugget/goonscape/assets"
|
"gitea.boner.be/bdnugget/goonscape/assets"
|
||||||
"gitea.boner.be/bdnugget/goonscape/types"
|
"gitea.boner.be/bdnugget/goonscape/types"
|
||||||
pb "gitea.boner.be/bdnugget/goonserver/actions"
|
pb "gitea.boner.be/bdnugget/goonserver/actions"
|
||||||
@ -37,6 +39,7 @@ func New() *Game {
|
|||||||
Chat: NewChat(),
|
Chat: NewChat(),
|
||||||
}
|
}
|
||||||
game.Player.UserData = game
|
game.Player.UserData = game
|
||||||
|
game.Chat.userData = game
|
||||||
return game
|
return game
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,6 +125,18 @@ func (g *Game) DrawPlayer(player *types.Player, model rl.Model) {
|
|||||||
|
|
||||||
rl.DrawModel(model, playerPos, 16, rl.White)
|
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 {
|
if len(player.TargetPath) > 0 {
|
||||||
targetTile := player.TargetPath[len(player.TargetPath)-1]
|
targetTile := player.TargetPath[len(player.TargetPath)-1]
|
||||||
targetPos := rl.Vector3{
|
targetPos := rl.Vector3{
|
||||||
@ -144,16 +159,43 @@ func (g *Game) DrawPlayer(player *types.Player, model rl.Model) {
|
|||||||
func (g *Game) Render() {
|
func (g *Game) Render() {
|
||||||
rl.BeginDrawing()
|
rl.BeginDrawing()
|
||||||
rl.ClearBackground(rl.RayWhite)
|
rl.ClearBackground(rl.RayWhite)
|
||||||
rl.BeginMode3D(g.Camera)
|
|
||||||
|
|
||||||
|
rl.BeginMode3D(g.Camera)
|
||||||
g.DrawMap()
|
g.DrawMap()
|
||||||
g.DrawPlayer(g.Player, g.Player.Model)
|
g.DrawPlayer(g.Player, g.Player.Model)
|
||||||
|
|
||||||
for id, other := range g.OtherPlayers {
|
for id, other := range g.OtherPlayers {
|
||||||
g.DrawPlayer(other, g.Models[int(id)%len(g.Models)].Model)
|
g.DrawPlayer(other, g.Models[int(id)%len(g.Models)].Model)
|
||||||
}
|
}
|
||||||
|
|
||||||
rl.EndMode3D()
|
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)
|
rl.DrawFPS(10, 10)
|
||||||
g.Chat.Draw(int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()))
|
g.Chat.Draw(int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()))
|
||||||
rl.EndDrawing()
|
rl.EndDrawing()
|
||||||
|
@ -28,6 +28,7 @@ type Player struct {
|
|||||||
LastUpdateTime time.Time
|
LastUpdateTime time.Time
|
||||||
InterpolationProgress float32
|
InterpolationProgress float32
|
||||||
UserData interface{} // Used to store reference to game
|
UserData interface{} // Used to store reference to game
|
||||||
|
FloatingMessage *FloatingMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
type ModelAsset struct {
|
type ModelAsset struct {
|
||||||
@ -41,6 +42,12 @@ type ChatMessage struct {
|
|||||||
Time time.Time
|
Time time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FloatingMessage struct {
|
||||||
|
Content string
|
||||||
|
ExpireTime time.Time
|
||||||
|
ScreenPos rl.Vector2 // Store the screen position for 2D rendering
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MapWidth = 50
|
MapWidth = 50
|
||||||
MapHeight = 50
|
MapHeight = 50
|
||||||
@ -51,5 +58,6 @@ const (
|
|||||||
ServerTickRate = 600 * time.Millisecond
|
ServerTickRate = 600 * time.Millisecond
|
||||||
ClientTickRate = 50 * time.Millisecond
|
ClientTickRate = 50 * time.Millisecond
|
||||||
MaxTickDesync = 5
|
MaxTickDesync = 5
|
||||||
ServerAddr = "localhost:6969"
|
// ServerAddr = "localhost:6969"
|
||||||
|
ServerAddr = "boner.be:6969"
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user