Fix mouse click and UI bug

master
En Yi 2019-06-15 17:02:31 +01:00
parent 41e69fa5ca
commit a8cdfcace9
5 changed files with 58 additions and 45 deletions

10
UI.py
View File

@ -262,6 +262,7 @@ class ScrollList(GenericUI):
self.redraw()
def replace_list(self, texts):
self.reset_scroll()
self.texts = texts
self.text_rects = []
current_y = self.outline_thickness
@ -363,6 +364,13 @@ class CallPanel(GenericUI):
def cancelling(self, **kwargs):
self.confirm_output.emit(output='')
def change_lists_elements(self, left_list=None, right_list=None):
if left_list is not None:
self.list1.replace_list(left_list)
if right_list is not None:
self.list2.replace_list(right_list)
self.redraw()
class TestScreen(view.PygView):
@ -408,7 +416,7 @@ class TestScreen(view.PygView):
running = False
if event.key == pygame.K_o:
self.panel.list1.replace_list([str(i+1) for i in range(7)])
self.panel.change_lists_elements([str(i+1) for i in range(45)],['a','b'])
draw_update = True
for element in self.elements:

View File

@ -126,7 +126,7 @@ class Deck():
self.sort_order = sort_order
self.selectable = selectable
self.selected_card = -1
self.prev_selected = -1
self.prev_selected = [-1, -1, -1]
self.cards = []
self.line_width = 5
@ -291,11 +291,16 @@ class Deck():
return True, card_values.index(value)
return False, -1
def record_selected_history(self):
self.prev_selected = self.prev_selected[1:]
self.prev_selected.append(self.selected_card)
def deselect_card(self):
self.selected_card = -1
self.record_selected_history()
self.update_deck_display()
def get_selected_card(self, pos):
def get_selected_card(self, pos, double_clicking=False):
"""
Get the selected card based on the mouse pos, offset to give the relative position in the deck.
The selected card position is stored in the deck
@ -303,11 +308,10 @@ class Deck():
:return: bool: whether the card selected is the same as before
"""
if self.selectable:
double_select = False
relative_pos_x = pos[0] - self.x
relative_pos_y = pos[1] - self.y
mouse_pos = (relative_pos_x, relative_pos_y)
if self.selected_card >= 0:
self.prev_selected = self.selected_card
self.selected_card = -1
if not self.draw_from_last:
for i, card in enumerate(reversed(self.cards)):
@ -320,8 +324,17 @@ class Deck():
self.selected_card = i
break
if self.prev_selected[-1] == self.selected_card:
if not double_clicking:
self.selected_card = -1
self.record_selected_history()
self.update_deck_display()
return (self.prev_selected == self.selected_card)and self.selected_card >= 0
selected_history = [sel for sel in self.prev_selected if sel >= 0]
return (len(selected_history) == 2 and self.prev_selected.count(self.selected_card) == 2
and self.selected_card >= 0) and double_clicking
return False
@ -492,8 +505,8 @@ class TestScreen(view.PygView):
mouse_pos = pygame.mouse.get_pos()
for deck in self.test_decks:
if deck.rect.collidepoint(mouse_pos):
reselect = deck.get_selected_card(mouse_pos)
reselect = deck.get_selected_card(mouse_pos, self.double_clicking)
print('a', reselect)
if self.double_clicking:
pygame.time.set_timer(self.double_click_event, 0)
print('Double clicked')
@ -503,8 +516,6 @@ class TestScreen(view.PygView):
else:
self.double_clicking = True
pygame.time.set_timer(self.double_click_event, 200)
if reselect:
deck.deselect_card()
if event.type == self.double_click_event:
pygame.time.set_timer(self.double_click_event, 0)

10
main.py
View File

@ -8,8 +8,8 @@ This script is to run the game. It would process any input argument and pass int
"""
if __name__ == '__main__':
AUTOPLAY = True
VIEW_ALL_CARDS = True
AUTOPLAY = False
VIEW_ALL_CARDS = False
TERMINAL = False
if len(sys.argv) > 1:
@ -36,9 +36,9 @@ if __name__ == '__main__':
with open('last_game_rng.rng', 'wb') as f:
pickle.dump(rng_state, f)
with open('seeds/test_seed.rng', 'rb') as f:
rng_state = pickle.load(f)
random.setstate(rng_state)
#with open('seeds/test_seed.rng', 'rb') as f:
# rng_state = pickle.load(f)
#random.setstate(rng_state)
main_view = game.GameScreen(800, 600, clear_colour=(255, 0, 0),
autoplay=AUTOPLAY, view_all_cards=VIEW_ALL_CARDS, terminal=TERMINAL)

View File

@ -234,14 +234,14 @@ class MainPlayer(Player):
def make_a_play(self, substate, game_events=None):
card = None
msg = ""
msg = None
if game_events:
for event in game_events:
if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
mouse_pos = pygame.mouse.get_pos()
if self.rect.collidepoint(mouse_pos):
reselect = self.get_selected_card(mouse_pos)
if self.selected_card >= 0:
reselect = self.get_selected_card(mouse_pos, double_clicking=self.double_clicking)
if not reselect:
card = 1
if self.double_clicking:
@ -253,14 +253,14 @@ class MainPlayer(Player):
else:
card = 1
msg = "Invalid card play"
self.deselect_card()
self.double_clicking = False
else:
self.double_clicking = True
pygame.time.set_timer(DOUBLE_CLICK_EVENT, DOUBLE_CLICK_TIMING)
if reselect:
self.deselect_card()
card = 1
#if reselect:
# self.deselect_card()
# card = 1
return card, msg
if event.type == DOUBLE_CLICK_EVENT:
pygame.time.set_timer(DOUBLE_CLICK_EVENT, 0)

View File

@ -370,13 +370,12 @@ class Table:
self.update_player_bid(self.current_player, 11, update_now=False)
msg = 'Bid Leader: Player {0:d}'.format((self.current_player - self.passes -
1 * (not self.first_player)) % NUM_OF_PLAYERS)
self.write_message(msg, line=2, delay_time=1)
self.write_message(msg, line=2, delay_time=0.5)
if not self.terminal_play:
self.calling_panel.list1.replace_list([str(i+1) for i in range(7)])
self.calling_panel.list2.replace_list(['Clubs', 'Diamonds', 'Hearts', 'Spades', 'No Trump'])
self.calling_panel.cancel_button.visible = True
self.calling_panel.redraw()
self.calling_panel.change_lists_elements([str(i+1) for i in range(7)],
['Clubs', 'Diamonds', 'Hearts', 'Spades', 'No Trump'])
def start_bidding(self, game_events):
"""
@ -396,12 +395,12 @@ class Table:
player_bid = self.players[self.current_player].make_decision(self.game_state, 0)
else:
player_bid, msg = self.players[self.current_player].make_decision(self.game_state, 0, game_events)
if msg:
self.write_message(msg, delay_time=0, update_now=True)
#if msg:
#self.write_message(msg, delay_time=1, update_now=True)
if player_bid < 0:
return False
self.require_player_input = False
self.write_message("", delay_time=0, update_now=True)
#self.write_message("", delay_time=0, update_now=False)
if not self.terminal_play:
self.calling_panel.visible = False
self.update_table.emit()
@ -432,10 +431,9 @@ class Table:
time.sleep(0.5)
if self.passes == NUM_OF_PLAYERS - 1 or self.table_status["bid"] == 75:
if not self.terminal_play:
self.calling_panel.list1.replace_list(['2','3','4','5','6','7','8','9','10','J','Q','K','A'])
self.calling_panel.list2.replace_list(['Clubs', 'Diamonds', 'Hearts', 'Spades'])
self.calling_panel.cancel_button.visible = False
self.calling_panel.redraw()
self.calling_panel.change_lists_elements(['2','3','4','5','6','7','8','9','10','J','Q','K','A'],
['Clubs', 'Diamonds', 'Hearts', 'Spades'])
return False
else:
if not self.require_player_input:
@ -498,12 +496,12 @@ class Table:
:return: None
"""
if not any(self.table_status["played cards"]):
# Leading player starts with the leading card, which determines the leading suit
if not self.require_player_input:
if self.table_status['trump broken']:
self.write_message("Trump has been broken!", delay_time=0)
else:
self.write_message("Trump is not broken", delay_time=0)
# Leading player starts with the leading card, which determines the leading suit
if not self.require_player_input:
self.current_player = self.table_status['leading player']
self.display_current_player(self.current_player)
if not self.players[self.current_player].AI:
@ -513,8 +511,8 @@ class Table:
card = self.players[self.current_player].make_decision(self.game_state, 0)
else:
card, msg = self.players[self.current_player].make_decision(self.game_state, 0, game_events)
if msg:
self.write_message(msg, delay_time=0, update_now=True)
#if msg:
# self.write_message(msg, delay_time=0, update_now=True)
if not type(card) is cards.Card:
if card:
self.update_table.emit()
@ -534,8 +532,8 @@ class Table:
card = self.players[self.current_player].make_decision(self.game_state, 1)
else:
card, msg = self.players[self.current_player].make_decision(self.game_state, 1, game_events)
if msg:
self.write_message(msg, delay_time=0, update_now=False)
#if msg:
# self.write_message(msg, delay_time=0, update_now=False)
if not type(card) is cards.Card:
if card:
self.update_table.emit()
@ -586,11 +584,6 @@ class Table:
return
if self.table_status['trump broken']:
self.write_message("Trump has been broken!", delay_time=0)
else:
self.write_message("Trump is not broken", delay_time=0)
# Break trump if the trump suit is played
if not self.table_status['trump broken']:
self.table_status['trump broken'] = card.suit() == self.table_status['trump suit']
@ -606,6 +599,7 @@ class Table:
self.current_player += 1
self.current_player %= NUM_OF_PLAYERS
self.update_table.emit()
time.sleep(0.5)
def write_message(self, text, delay_time=0.5, line=0, update_now=True):