2016-10-19 6 views
0

В настоящее время, если вы щелкнули левой кнопкой мыши на устройстве, он становится «выбранным» (или «de-selected»), и вокруг него нарисован зеленый квадрат. Затем, когда вы щелкаете правой кнопкой мыши на экране, устройство аккуратно перемещается в квадрат в месте, которое вы нажали.Как я могу расширить логику выбора единицы в моей игре RTS для применения к нескольким единицам?

Также, если вы используете клавиши вверх, вниз, влево или вправо, он прокручивает экран.

import pygame 
import random 
pygame.init() 

#Define mouse position 
mouse_position_x = 525 
mouse_position_y = 315 

# Define colors 
green = (0,255,0) 
brown = (150,75,0) 

#Define border position 
border_x = 0 
border_y = 0 

#Define character selection box 
def character_selection_box(): 
    pygame.draw.line(screen,green,(character_location_x,character_location_y),(character_location_x+character_width,character_location_y),2) # Top bar 
    pygame.draw.line(screen,green,(character_location_x,character_location_y+character_height),(character_location_x+character_width,character_location_y+character_height),2) # Bottom bar 
    pygame.draw.line(screen,green,(character_location_x,character_location_y),(character_location_x,character_location_y+character_height),2) # Left bar 
    pygame.draw.line(screen,green,(character_location_x+character_width,character_location_y),(character_location_x+character_width,character_location_y+character_height+1),2) # Right bar 

#Define round 
def assign_square(n): 
    div = (n/35) 
    rou = round(div) 
    mul = (35*rou) 
    return int(mul) 

#Set window 
screen_width = 981 
screen_height = 700 
game_screen_width = 800 
game_screen_height = 700 
screen_size = (screen_width,screen_height) 
screen = pygame.display.set_mode(screen_size) 
pygame.display.set_caption("Warpath") 

#Set block character 
character_width = 35 
character_height = 35 
character_location_x = 525 
character_location_y = 315 
movement = 1 
unit_selected = 0 

#Load images 
orc_grunt_forward = pygame.image.load('orc_forward3.png') #(35 by 35 pixel image) 
character_image = orc_grunt_forward 

#Loop until the user clicks the close button 
shutdown = False 

#Set clock 
clock = pygame.time.Clock() 

#Set scroll limit 
scroll_x = 0 
scroll_y = 0 

# ---------- Main program loop ----------- 
while not shutdown: 

    # --- Main event loop --- 
    for event in pygame.event.get(): 

     # --- If quit button pressed, shutdown 
     if event.type == pygame.QUIT: 
      shutdown = True 

     # --- If mouse button pressed 
     elif event.type == pygame.MOUSEBUTTONDOWN: # If a mouse button is pressed 
      mouse_position = pygame.mouse.get_pos() # Get mouse position 
      button_type = pygame.mouse.get_pressed() # Check which button was pressed 

      # --- If left click pressed and the curser was on a character, select that character 
      if button_type[0] == 1 and mouse_position[0] >= character_location_x and mouse_position[0] <= character_location_x + character_width and mouse_position[1] >= character_location_y and mouse_position[1] <= character_location_y + character_height: 
       print("Unit selected",unit_selected) 
       print(button_type) 
       unit_selected += 1 
       unit_selected /= unit_selected #(Otherwise it will add up unit selected if you click more than once) 
       int(unit_selected) 

      # --- If right click pressed and a character was selected (and it's within the game screen), move the character to the location  
      elif button_type[2] == 1 and unit_selected == 1 and mouse_position[0] > 175: 
       mouse_position_x *= 0 
       mouse_position_y *= 0 

       if mouse_position[0] >= assign_square(mouse_position[0]): 
        mouse_position_x += assign_square(mouse_position[0]) 

       elif mouse_position[0] <= assign_square(mouse_position[0]): 
        mouse_position_x -= 35 
        mouse_position_x += assign_square(mouse_position[0]) 

       if mouse_position[1] >= assign_square(mouse_position[1]): 
        mouse_position_y += assign_square(mouse_position[1]) 

       elif mouse_position[1] <= assign_square(mouse_position[1]): 
        mouse_position_y -= 35 
        mouse_position_y += assign_square(mouse_position[1]) 

      # --- If left click pressed and the curser was not on a character, deselect the character   
      elif button_type[0] == 1 and mouse_position[0] < character_location_x or mouse_position[0] > character_location_x + character_width or mouse_position[1] < character_location_y or mouse_position[1] > character_location_y + character_height: 
       print("Unit not selected") 
       print(button_type) 
       unit_selected *= 0 
       int(unit_selected) 

     # --- If key pressed, scroll the screen 
     elif event.type == pygame.KEYDOWN: 

      if event.key == pygame.K_RIGHT and scroll_x > -10: 
       direction = "right" 
       character_location_x -= 35 
       mouse_position_x -= 35 
       border_x -= 35 
       scroll_x -= 1 

      if event.key == pygame.K_LEFT and scroll_x < 10: 
       direction = "left" 
       character_location_x += 35 
       mouse_position_x += 35 
       border_x += 35 
       scroll_x += 1 

      if event.key == pygame.K_UP and scroll_y < 10: 
       direction = "up" 
       character_location_y += 35 
       mouse_position_y += 35 
       border_y += 35 
       scroll_y += 1 

      if event.key == pygame.K_DOWN and scroll_y > -10: 
       direction = "down" 
       character_location_y -= 35 
       mouse_position_y -= 35 
       border_y -= 35 
       scroll_y -= 1 

    # --- Game logic --- 

    # --- Set character movement  
    if character_location_x < mouse_position_x: 
     character_location_x += movement 
    if character_location_x > mouse_position_x: 
     character_location_x -= movement 
    if character_location_y < mouse_position_y: 
     character_location_y += movement 
    if character_location_y > mouse_position_y: 
     character_location_y -= movement 

    # --- Drawing --- 
    screen.fill(brown) # Draw background 
    screen.blit(character_image,(character_location_x,character_location_y)) # Draw character 

    if unit_selected == 1: 
     character_selection_box() # Draw character selection box if unit is selected 

    clock.tick(30) 
    pygame.display.flip() 

#Shutdown 
if shutdown == True: 
    pygame.quit() 

Проблема заключается в том, что я не могу понять, как увеличить этот срок до нескольких единиц - в настоящее время, если я хочу, чтобы добавить больше единицы, я могу только либо умудряюсь:

а) Переместить их все когда

или

б) вставить и те же код нескольких раз регулировочных переменных символов (не надежное/масштабируемое решения)

Как отрегулировать м у кода, так что у меня есть масштабируемое решение, в котором:

1) можно выбрать один блок и переместить его, не перемещая каждую единицу сразу

2) можно выбрать несколько единиц, нажав на каждом индивидуально , и перемещайте их все сразу (не беспокоясь о поиске пути прямо сейчас)

Я также попытался использовать классы для достижения этого, но мне все еще казалось, что я копировал/вставлял несколько функций, а не имел надежное решение.

Я удалил любой код, который не касается проблемы при сохранении функционирующей программы.

Благодаря

+0

Чтобы иметь возможность обрабатывать более одного устройства, вы должны * создать класс 'unit'. Затем вы можете либо иметь логическое значение 'selected' для него, либо - возможно проще - список' selected', в который вы можете добавлять и удалять единицы. – usr2564301

ответ

1

Есть несколько вещей, чтобы сделать:

  1. Изменение переменных character_* объекта, который содержит все данные о блоке.
  2. Создать массив единиц/символов. Таким образом, каждая единица в массиве может иметь уникальное положение, скорость ets.
  3. Везде в коде, где вы проверяете character_*, измените на циклы, где вы перебираете массив символов, чтобы проверять каждое устройство.
  4. Следующим шагом должно быть добавление функций, таких как перемещение/стрельба в класс символов, чтобы сделать событие нажатия клавиши для нескольких единиц.

Это должно дать вам код, в котором вы можете выбрать несколько единиц (если они занимают одно и то же место) и перемещать их независимо от выбранных единиц.

+0

Теперь я изменил переменные на объект, который содержит координаты единицы, и я могу щелкнуть по каждому из них, чтобы переместить их. – pytheron

+0

Но я не могу выбрать выбранный для работы (см. Обновление) – pytheron