fix multiplayer simultaneous
This commit is contained in:
		
							parent
							
								
									067d22f3a9
								
							
						
					
					
						commit
						d25f9c987a
					
				@ -84,9 +84,9 @@ func GamesListen() {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatal(err)
 | 
							log.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						defer gameListener.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		defer gameListener.Close()
 | 
					 | 
				
			||||||
		conn, err := gameListener.Accept()
 | 
							conn, err := gameListener.Accept()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Println(err)
 | 
								log.Println(err)
 | 
				
			||||||
 | 
				
			|||||||
@ -17,12 +17,6 @@ type GameClient struct {
 | 
				
			|||||||
	Conn     net.Conn
 | 
						Conn     net.Conn
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var player1 GameClient
 | 
					 | 
				
			||||||
var player2 GameClient
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var ingress chan StateUpdate
 | 
					 | 
				
			||||||
var egress chan StateUpdate
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const posXBound = 52
 | 
					const posXBound = 52
 | 
				
			||||||
const negXBound = posXBound * -1
 | 
					const negXBound = posXBound * -1
 | 
				
			||||||
const posYBound = 50
 | 
					const posYBound = 50
 | 
				
			||||||
@ -30,8 +24,11 @@ const negYBound = posYBound * -1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func StartGame(conn1, conn2 net.Conn, username1, username2 string) {
 | 
					func StartGame(conn1, conn2 net.Conn, username1, username2 string) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	egress = make(chan StateUpdate)
 | 
						var player1 GameClient
 | 
				
			||||||
	ingress = make(chan StateUpdate)
 | 
						var player2 GameClient
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						egress := make(chan StateUpdate)
 | 
				
			||||||
 | 
						ingress := make(chan StateUpdate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	player1 = GameClient{
 | 
						player1 = GameClient{
 | 
				
			||||||
		Username: username1,
 | 
							Username: username1,
 | 
				
			||||||
@ -75,17 +72,17 @@ func StartGame(conn1, conn2 net.Conn, username1, username2 string) {
 | 
				
			|||||||
	broadcastUpdate(StateUpdate{
 | 
						broadcastUpdate(StateUpdate{
 | 
				
			||||||
		FieldPath: "Message",
 | 
							FieldPath: "Message",
 | 
				
			||||||
		Value:     []byte("Ready..."),
 | 
							Value:     []byte("Ready..."),
 | 
				
			||||||
	})
 | 
						}, player1, player2)
 | 
				
			||||||
	time.Sleep(1 * time.Second)
 | 
						time.Sleep(1 * time.Second)
 | 
				
			||||||
	broadcastUpdate(StateUpdate{
 | 
						broadcastUpdate(StateUpdate{
 | 
				
			||||||
		FieldPath: "Message",
 | 
							FieldPath: "Message",
 | 
				
			||||||
		Value:     []byte("Set..."),
 | 
							Value:     []byte("Set..."),
 | 
				
			||||||
	})
 | 
						}, player1, player2)
 | 
				
			||||||
	time.Sleep(1 * time.Second)
 | 
						time.Sleep(1 * time.Second)
 | 
				
			||||||
	broadcastUpdate(StateUpdate{
 | 
						broadcastUpdate(StateUpdate{
 | 
				
			||||||
		FieldPath: "Message",
 | 
							FieldPath: "Message",
 | 
				
			||||||
		Value:     []byte("Go!"),
 | 
							Value:     []byte("Go!"),
 | 
				
			||||||
	})
 | 
						}, player1, player2)
 | 
				
			||||||
	time.Sleep(1 * time.Second)
 | 
						time.Sleep(1 * time.Second)
 | 
				
			||||||
	bv := float32(rand.Intn(2)*2 - 1)
 | 
						bv := float32(rand.Intn(2)*2 - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -124,10 +121,10 @@ func StartGame(conn1, conn2 net.Conn, username1, username2 string) {
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	go gameLoop(&state)
 | 
						go gameLoop(&state, ingress, egress, player1, player2)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func gameLoop(state *GameState) {
 | 
					func gameLoop(state *GameState, ingress, egress chan (StateUpdate), player1, player2 GameClient) {
 | 
				
			||||||
	// Player 1 read loop
 | 
						// Player 1 read loop
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		for {
 | 
							for {
 | 
				
			||||||
@ -169,7 +166,7 @@ func gameLoop(state *GameState) {
 | 
				
			|||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		for {
 | 
							for {
 | 
				
			||||||
			msg := <-egress
 | 
								msg := <-egress
 | 
				
			||||||
			broadcastUpdate(msg)
 | 
								broadcastUpdate(msg, player1, player2)
 | 
				
			||||||
			if msg.FieldPath == "Winner" {
 | 
								if msg.FieldPath == "Winner" {
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -191,7 +188,7 @@ func gameLoop(state *GameState) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case _ = <-ticker.C:
 | 
							case _ = <-ticker.C:
 | 
				
			||||||
			update := process(state)
 | 
								update := process(state, player1, player2)
 | 
				
			||||||
			egress <- update
 | 
								egress <- update
 | 
				
			||||||
			if update.FieldPath == "Winner" {
 | 
								if update.FieldPath == "Winner" {
 | 
				
			||||||
				slog.Debug("Closing game loop")
 | 
									slog.Debug("Closing game loop")
 | 
				
			||||||
@ -201,7 +198,7 @@ func gameLoop(state *GameState) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func process(state *GameState) StateUpdate {
 | 
					func process(state *GameState, player1, player2 GameClient) StateUpdate {
 | 
				
			||||||
	// Move players
 | 
						// Move players
 | 
				
			||||||
	// Check if player edge is out of bounds
 | 
						// Check if player edge is out of bounds
 | 
				
			||||||
	//	If out of bounds reset velocity to zero and position to edge
 | 
						//	If out of bounds reset velocity to zero and position to edge
 | 
				
			||||||
@ -350,7 +347,7 @@ func handlePlayerRequest(update StateUpdate, state *GameState) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func broadcastUpdate(update StateUpdate) error {
 | 
					func broadcastUpdate(update StateUpdate, player1, player2 GameClient) error {
 | 
				
			||||||
	msg, err := json.Marshal(update)
 | 
						msg, err := json.Marshal(update)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user