示例#1
0
def TimeEvent():
    global race_info

    # update effect status
    for player in players:
        Players.handleEffects(player)

    diff = (datetime.now() - start_time)
    race_info.Time = diff.seconds * 1000 + diff.microseconds / 1000
    sender.sendUpdate(race_info, "RaceInfo")

    if not shutdown:
        timer = Timer(0.1, TimeEvent)
        timer.start()
示例#2
0
def ControllerEvent(player, event, data, packet_id):
    global race_info
    global players
    global last_id
    global player_infos
    packet_id = int(packet_id)

    # did packet arrive in order?
    try:
        if packet_id < last_id:
            print "Discarding packet %d, last_received %d" % (packet_id, last_id)
            return
    except Exception as e:
        print e

    last_id = packet_id

    if (DEBUG and race_info.State != LAP_SELECT):
        try:
            print "Received controller event (Player %s State %d)" % (player, race_info.State)
        except Exception as e:
            print e

    player = int(player)

    #Bail if there's an invalid player
    if (player < 0 or player > Players.MAX_PLAYERS):
        if DEBUG:
            print "Invalid player, should be >= 0 and < %d" % Players.MAX_PLAYERS
        return

    event = int(event)
    data = int(data)

    #don't send a packet unless necessary
    send = False

    if race_info.State == JOINING:
        if DEBUG:
            print "Joining event=%d data=%d" % (event, data)

        # If player hasn't joined and pressed A, join them
        if event == BUT_A and data == 1 and players[player] == None:
            print "Player %d is now ready" % (player + 1)
            players[player] = Players.PlayerState()
            player_infos[player] = PlayerInfo(race_info.JoinedPlayers + 1)
            race_info.JoinedPlayers += 1
            sender.sendUpdate(race_info, "RaceInfo")

        # If joined player presses start, begin lap count selection
        if event == START and data == 1 and players[player] != None:
            print "Starting with current players"
            race_info.State = LAP_SELECT
            sender.sendUpdate(race_info, "RaceInfo")

        # Ignoring all other input in this state
        elif DEBUG:
            print "Ignoring input until race begins"
        return

    elif race_info.State == LAP_SELECT:
        # If player pressed up, increase lap count
        if event == UD and data == -32767 or event == DUP and data == 1:
            race_info.Laps += 1

        # If player pressed down, decrease lap count
        elif event == UD and data == 32767 or event == DDOWN and data == 1:
            race_info.Laps -= 1

            # Ensure at least one lap
            if race_info.Laps < 1:
                race_info.Laps = 1

        # If player pressed start, begin the countdown
        elif event == START and data == 1:
            race_info.State = COUNTDOWN
            sender.sendUpdate(race_info, "RaceInfo")
            print
            return

        # Erase the current line, and return to the beginning
        print "%s[2K\r" % chr(27),

        # Prompt for number of laps
        print "Please select number of Laps: %d" % race_info.Laps,
        # Force buffer to flush (needed because no newline terminating print)
        sys.stdout.flush()

        sender.sendUpdate(race_info, "RaceInfo")

    elif race_info.State == COUNTDOWN:
        return
    elif race_info.State == FINISHED:
        if event == START and data == 1:
            # reset all the players stats
            for pl in players:
                if pl != None:
                    pl.init()
            race_info.State = JOINING
            race_info.Time = 0
            sender.sendUpdate(race_info, "RaceInfo")
            return

    if (event == ACCEL):
        players[player].forward = data
        send = True
    if (event == BRAKE):
        players[player].reverse = data
        send = True
    if (event == LR):
        send = True
        # Parse xbox controller data
        if data == -32767:
            players[player].turn = -1
        if data == 0:
            players[player].turn = 0
        if data == 32767:
            players[player].turn = 1
        print "Player turn", players[player].turn, player, player_infos
        player_infos[player].Turn == players[player].turn
        print player_infos[player].Turn
        print "updated"
    if event == BUT_A and data == 1 and players[player].powerup != None:
        # Player fired a powerup
        triggerPowerup(player)

    print "F: %d R: %d" % (players[player].forward, players[player].reverse)
    if send:
        print "Beginning of controller event"
        speed2 = players[player].forward - players[player].reverse

        #Deal with player effects
        Players.handleEffects(player)
        players[player].speed_percent = Players.DEFAULT_SPEED_PERCENT

        speed2 = int(speed2 * players[player].speed_percent)

        #enforce speed boundaries
        if (speed2 > Players.MAX_SPEED):
            speed2 = Players.MAX_SPEED

        if (speed2 < Players.MIN_SPEED):
            speed2 = Players.MIN_SPEED

        #update speed info for the GUI
        player_infos[player].Speed = speed * 100.0 / (MAX_SPEED * DEFAULT_SPEED_PERCENT)
        sender.sendUpdate(player_infos[player], "PlayerInfo" + str(player_infos[player].Number))

        try:
            if (DEBUG):
                print "Player: %d, Speed=%d, Turn=%d" % (player, speed2, players[player].turn)
            sender.sendAsync("CarEvent", player=str(int(player_infos[player].Number)), speed=str(speed2), turn=str(players[player].turn))
            if (DEBUG):
                print "Packet Sent"
        except Exception as e:
            print e