TODO: Add sticks and D-Pad

This commit is contained in:
Astatin3
2024-03-17 21:16:06 -06:00
parent b132ce342c
commit 7cd65ba647
3 changed files with 178 additions and 95 deletions
+155 -89
View File
@@ -1,4 +1,6 @@
import math import math
import copy
import json
render = None render = None
pathEditor = None pathEditor = None
@@ -44,7 +46,6 @@ buttonPositions = {
'RT': ((1096,67),150) 'RT': ((1096,67),150)
} }
controllerCount = 2
def getKeyframeAtPos(index): def getKeyframeAtPos(index):
@@ -121,9 +122,30 @@ def getSurroundingPosFrames(index):
def getLeftButtonFrame(index):
for i in range(index,0,-1):
frame = getKeyframeAtPos(i)
if frame != None and frame['type'] == 'controller':
return frame
return None
def getButtonFrameAtPos(index):
for i in range(len(keyFrames)):
frame = keyFrames[i]
if frame != None and frame['type'] == 'controller':
return frame
return None
def getRobotAtIndex(index): def getRobotAtIndex(index):
prevFrame, nextFrame = getSurroundingPosFrames(index) prevFrame, nextFrame = getSurroundingPosFrames(index)
if prevFrame == None and nextFrame == None:
return (0,0), 0
if prevFrame == None: if prevFrame == None:
return nextFrame['position'], nextFrame['rotation'] return nextFrame['position'], nextFrame['rotation']
elif nextFrame == None: elif nextFrame == None:
@@ -193,7 +215,6 @@ def reloadBar(pos):
if keyFrames[dragFrameIndex]['type'] == 'position': if keyFrames[dragFrameIndex]['type'] == 'position':
prevFrame, nextFrame = getSurroundingPosFrames(ogDragFramePos) prevFrame, nextFrame = getSurroundingPosFrames(ogDragFramePos)
# print(prevFrame['timeIndex'] == nextFrame['timeIndex'])
if prevFrame == nextFrame: if prevFrame == nextFrame:
pass pass
elif prevFrame == None: elif prevFrame == None:
@@ -218,7 +239,7 @@ def reloadBar(pos):
def clickBar(pos, doubleClick): def clickBar(pos):
for i in range(displayTicks): for i in range(displayTicks):
x1 = i * (render.width/(displayTicks)) x1 = i * (render.width/(displayTicks))
x2 = (render.width/(displayTicks)) x2 = (render.width/(displayTicks))
@@ -229,23 +250,89 @@ def clickBar(pos, doubleClick):
global dragFrameIndex global dragFrameIndex
global ogDragFramePos global ogDragFramePos
selFrame = i selFrame = i
if not doubleClick and dragFrameIndex == -1: if dragFrameIndex == -1:
dragFrameIndex = getFrameIndex(getKeyframeAtPos(i)) dragFrameIndex = getFrameIndex(getKeyframeAtPos(i))
ogDragFramePos = i ogDragFramePos = i
if doubleClick and getKeyframeAtPos(i) == None:
keyFrames.append({
'type': 'controller',
'timeIndex': i
})
return return
# def getControllerRects():
# rects = []
# for i in range(controllerCount): def createBlankController():
# rects.append() returnArr = []
for i in range(len(controllerRects)):
returnArr.append({
'A': False,
'B': False,
'X': False,
'Y': False,
'Dpad_Up': False,
'Dpad_Down': False,
'Dpad_Left': False,
'Dpad_Right': False,
'Menu': False,
'Windows': False,
'Left_Stick': False,
'Right_Stick': False,
'LB': False,
'RB': False,
'LT': False,
'RT': False
})
return returnArr
def toggleControllerButton(btnStr, controllerIndex):
global keyFrames
lastFrame = getLeftButtonFrame(selFrame)
if lastFrame == None:
keyFrames.append({
"type": "controller",
"timeIndex": selFrame,
"controllers": createBlankController()
})
frame = keyFrames[len(keyFrames)-1]
elif lastFrame['timeIndex'] != selFrame:
keyFrames.append({
"type": "controller",
"timeIndex": selFrame,
"controllers": copy.deepcopy(lastFrame['controllers'])
})
frame = keyFrames[len(keyFrames)-1]
else:
frame = lastFrame
if not btnStr in ['Dpad_Up', 'Dpad_Down', 'Dpad_Left', 'Dpad_Right']:
frame['controllers'][controllerIndex][btnStr] = not frame['controllers'][controllerIndex][btnStr]
# Dpad Stuff
elif frame['controllers'][controllerIndex][btnStr] == True:
for btn in ['Dpad_Up', 'Dpad_Down', 'Dpad_Left', 'Dpad_Right']:
frame['controllers'][controllerIndex][btn] == False
else:
for btn in ['Dpad_Up', 'Dpad_Down', 'Dpad_Left', 'Dpad_Right']:
frame['controllers'][controllerIndex][btn] == False
frame['controllers'][controllerIndex][btnStr] = True
def getControllerButtons(controllerIndex):
frame = getLeftButtonFrame(selFrame)
if frame == None:
return createBlankController()[0]
else:
return frame['controllers'][controllerIndex]
def renderXboxControllers(): def renderXboxControllers():
for rect in controllerRects: for i in range(len(controllerRects)):
rect = controllerRects[i]
offsetSize = rect[2]/buttonImages['Controller'].get_width() offsetSize = rect[2]/buttonImages['Controller'].get_width()
@@ -254,31 +341,22 @@ def renderXboxControllers():
rect2 = ((pos[0]-(size/2), pos[1]-(size/2), size, size)) rect2 = ((pos[0]-(size/2), pos[1]-(size/2), size, size))
return (rect[0]+(rect2[0])*offsetSize,rect[1]+(rect2[1])*offsetSize,rect2[2]*offsetSize,rect2[2]*offsetSize) return (rect[0]+(rect2[0])*offsetSize,rect[1]+(rect2[1])*offsetSize,rect2[2]*offsetSize,rect2[2]*offsetSize)
render.image(buttonImages['Controller'], rect) render.image(buttonImages['Controller'], rect)
render.image(buttonImages['A'], offsetControllerButton('A')) btns = getControllerButtons(i)
render.image(buttonImages['B'], offsetControllerButton('B'))
render.image(buttonImages['X'], offsetControllerButton('X'))
render.image(buttonImages['Y'], offsetControllerButton('Y'))
render.image(buttonImages['Dpad'], offsetControllerButton('Dpad')) for btn in ['A','B','X','Y','Menu','Windows','LB','RB','LT','RT']:
if btns[btn]:
render.image(buttonImages['Menu'], offsetControllerButton('Menu')) render.image(render.invert(buttonImages[btn]), offsetControllerButton(btn))
render.image(buttonImages['Windows'], offsetControllerButton("Windows")) else:
render.image(buttonImages[btn], offsetControllerButton(btn))
render.image(buttonImages['Left_Stick'], offsetControllerButton('Left_Stick'))
render.image(buttonImages['Right_Stick'], offsetControllerButton('Right_Stick'))
render.image(buttonImages['LB'], offsetControllerButton('LB'))
render.image(buttonImages['RB'], offsetControllerButton('RB'))
render.image(buttonImages['LT'], offsetControllerButton("LT"))
render.image(buttonImages['RT'], offsetControllerButton('RT'))
def controllerClick(pos): def controllerClick(pos):
for rect in controllerRects: for i in range(len(controllerRects)):
rect = controllerRects[i]
offsetSize = rect[2]/buttonImages['Controller'].get_width() offsetSize = rect[2]/buttonImages['Controller'].get_width()
@@ -287,33 +365,9 @@ def controllerClick(pos):
rect2 = ((pos[0]-(size/2), pos[1]-(size/2), size, size)) rect2 = ((pos[0]-(size/2), pos[1]-(size/2), size, size))
return (rect[0]+(rect2[0])*offsetSize,rect[1]+(rect2[1])*offsetSize,rect2[2]*offsetSize,rect2[2]*offsetSize) return (rect[0]+(rect2[0])*offsetSize,rect[1]+(rect2[1])*offsetSize,rect2[2]*offsetSize,rect2[2]*offsetSize)
for btn in ['A','B','X','Y','Menu','Windows','LB','RB','LT','RT']:
if render.isInRect(pos, offsetControllerButton('A')): if render.isInRect(pos, offsetControllerButton(btn)):
print('A!') toggleControllerButton(btn, i)
elif render.isInRect(pos, offsetControllerButton('B')):
pass
elif render.isInRect(pos, offsetControllerButton('X')):
pass
elif render.isInRect(pos, offsetControllerButton('Y')):
pass
elif render.isInRect(pos, offsetControllerButton('Dpad')):
pass
elif render.isInRect(pos, offsetControllerButton('Menu')):
pass
elif render.isInRect(pos, offsetControllerButton('Windows')):
pass
elif render.isInRect(pos, offsetControllerButton('Left_Stick')):
pass
elif render.isInRect(pos, offsetControllerButton('Right_Stick')):
pass
elif render.isInRect(pos, offsetControllerButton('LB')):
pass
elif render.isInRect(pos, offsetControllerButton('RB')):
pass
elif render.isInRect(pos, offsetControllerButton('LT')):
pass
elif render.isInRect(pos, offsetControllerButton('RT')):
pass
class buttonEditor: class buttonEditor:
name = "Button Editor" name = "Button Editor"
@@ -332,42 +386,42 @@ class buttonEditor:
global buttonImages global buttonImages
buttonImages = { buttonImages = {
"Controller": render.pg.image.load('images/XboxOne_Diagram_Simple.png').convert_alpha(), "Controller": render.loadImg('images/XboxOne_Diagram_Simple.png'),
"A": render.pg.image.load('images/XboxOne_A.png').convert_alpha(), "A": render.loadImg('images/XboxOne_A.png'),
"B": render.pg.image.load('images/XboxOne_B.png').convert_alpha(), "B": render.loadImg('images/XboxOne_B.png'),
"X": render.pg.image.load('images/XboxOne_X.png').convert_alpha(), "X": render.loadImg('images/XboxOne_X.png'),
"Y": render.pg.image.load('images/XboxOne_Y.png').convert_alpha(), "Y": render.loadImg('images/XboxOne_Y.png'),
"Dpad": render.pg.image.load('images/XboxOne_Dpad.png').convert_alpha(), "Dpad": render.loadImg('images/XboxOne_Dpad.png'),
"Dpad_Up": render.pg.image.load('images/XboxOne_Dpad_Up.png').convert_alpha(), "Dpad_Up": render.loadImg('images/XboxOne_Dpad_Up.png'),
"Dpad_Down": render.pg.image.load('images/XboxOne_Dpad_Down.png').convert_alpha(), "Dpad_Down": render.loadImg('images/XboxOne_Dpad_Down.png'),
"Dpad_Left": render.pg.image.load('images/XboxOne_Dpad_Left.png').convert_alpha(), "Dpad_Left": render.loadImg('images/XboxOne_Dpad_Left.png'),
"Dpad_Right": render.pg.image.load('images/XboxOne_Dpad_Right.png').convert_alpha(), "Dpad_Right": render.loadImg('images/XboxOne_Dpad_Right.png'),
"Menu": render.pg.image.load('images/XboxOne_Menu.png').convert_alpha(), "Menu": render.loadImg('images/XboxOne_Menu.png'),
"Windows": render.pg.image.load('images/XboxOne_Windows.png').convert_alpha(), "Windows": render.loadImg('images/XboxOne_Windows.png'),
"Left_Stick": render.pg.image.load('images/XboxOne_Left_Stick.png').convert_alpha(), "Left_Stick": render.loadImg('images/XboxOne_Left_Stick.png'),
"Left_Stick_Click": render.pg.image.load('images/XboxOne_Left_Stick_Click.png').convert_alpha(), "Left_Stick_Click": render.loadImg('images/XboxOne_Left_Stick_Click.png'),
"Right_Stick": render.pg.image.load('images/XboxOne_Right_Stick.png').convert_alpha(), "Right_Stick": render.loadImg('images/XboxOne_Right_Stick.png'),
"Right_Stick_Click": render.pg.image.load('images/XboxOne_Right_Stick_Click.png').convert_alpha(), "Right_Stick_Click": render.loadImg('images/XboxOne_Right_Stick_Click.png'),
"LB": render.pg.image.load('images/XboxOne_LB.png').convert_alpha(), "LB": render.loadImg('images/XboxOne_LB.png'),
"RB": render.pg.image.load('images/XboxOne_RB.png').convert_alpha(), "RB": render.loadImg('images/XboxOne_RB.png'),
"LT": render.pg.image.load('images/XboxOne_LT.png').convert_alpha(), "LT": render.loadImg('images/XboxOne_LT.png'),
"RT": render.pg.image.load('images/XboxOne_RT.png').convert_alpha() "RT": render.loadImg('images/XboxOne_RT.png')
} }
ControllerSize = (render.width/2, render.width*(buttonImages['Controller'].get_height()/buttonImages['Controller'].get_width())/2) ControllerSize = (render.width/2, render.width*(buttonImages['Controller'].get_height()/buttonImages['Controller'].get_width())/2)
ControllerYOffset = (render.height-ControllerSize[1])/2 ControllerYOffset = (render.height-ControllerSize[1])/2
global controllerRects global controllerRects
controllerRects = { controllerRects = [
(0, render.topBarHeight+ControllerYOffset, ControllerSize[0], ControllerSize[1]), (0, render.topBarHeight+ControllerYOffset, ControllerSize[0], ControllerSize[1]),
(ControllerSize[0], render.topBarHeight+ControllerYOffset, ControllerSize[0], ControllerSize[1]) (ControllerSize[0], render.topBarHeight+ControllerYOffset, ControllerSize[0], ControllerSize[1])
} ]
def refresh(self): def refresh(self):
render.clear() render.clear()
@@ -395,11 +449,11 @@ class buttonEditor:
def mouseDown(self, pos): def mouseDown(self, pos):
if buttonMode: if buttonMode and pos[1] < bottomBarRect[1]:
controllerClick(pos) controllerClick(pos)
self.refresh() self.refresh()
elif pos[1] > bottomBarRect[1]: elif pos[1] > bottomBarRect[1]:
clickBar(pos, False) clickBar(pos)
self.refresh() self.refresh()
@@ -424,26 +478,31 @@ class buttonEditor:
def doubleClick(self, pos): def doubleClick(self, pos):
if pos[1] > bottomBarRect[1]: if pos[1] > bottomBarRect[1]:
clickBar(pos, True) clickBar(pos)
self.refresh() self.refresh()
def keyDown(self, key): def keyDown(self, key):
global selFrame global selFrame
global buttonMode
if key == render.pg.K_LEFT and selFrame > 0: if key == render.pg.K_LEFT and selFrame > 0:
selFrame -= 1 selFrame -= 1
self.refresh() self.refresh()
elif key == render.pg.K_RIGHT and selFrame < displayTicks-1: elif key == render.pg.K_RIGHT and selFrame < displayTicks-1:
selFrame += 1 selFrame += 1
self.refresh() self.refresh()
elif key == render.pg.K_e: elif buttonMode and key == render.pg.K_DELETE and selFrame != -1:
global buttonMode frame = getKeyframeAtPos(selFrame)
if frame != None and frame['type'] != 'position':
global keyFrames
keyFrames.remove(frame)
self.refresh()
elif selFrame != -1 and key == render.pg.K_e:
buttonMode = not buttonMode buttonMode = not buttonMode
self.refresh() self.refresh()
def updateNodes(self, loadKeyframes): def updateNodes(self, loadKeyframes):
global ogNodes global ogNodes
global ogCtrlNodes global ogCtrlNodes
@@ -464,7 +523,9 @@ class buttonEditor:
def load(self): def load(self):
global selFrame global selFrame
global buttonMode
selFrame = -1 selFrame = -1
buttonMode = False
global ogNodes global ogNodes
global ogCtrlNodes global ogCtrlNodes
@@ -473,7 +534,13 @@ class buttonEditor:
if len(ogNodes) != len(pathEditor.nodes): if len(ogNodes) != len(pathEditor.nodes):
global keyFrames global keyFrames
keyFrames = []
for i in range(len(keyFrames)-1,-1,-1):
print(i)
if keyFrames[i]['type'] == 'position':
keyFrames.pop(i)
print('end')
self.updateNodes(False) self.updateNodes(False)
@@ -489,7 +556,6 @@ class buttonEditor:
"position": ogNodes[i], "position": ogNodes[i],
"rotation": ogRotNodes[i] "rotation": ogRotNodes[i]
}) })
# print(keyFrames)
else: else:
self.updateNodes(True) self.updateNodes(True)
+2
View File
@@ -10,6 +10,8 @@ class export:
global render global render
render = tmprender render = tmprender
# render.addButton()
def mouseDown(self, pos): def mouseDown(self, pos):
pass pass
+18 -3
View File
@@ -1,4 +1,5 @@
import math import math
import os
from pygame.locals import * from pygame.locals import *
import numpy as np import numpy as np
@@ -14,6 +15,15 @@ nodeSquareWidth = 3
nodeTickLength = 5 nodeTickLength = 5
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
class render(): class render():
@@ -30,14 +40,14 @@ class render():
self.font = self.pg.font.Font(None, 25) self.font = self.pg.font.Font(None, 25)
self.fieldImg = pg.image.load("images/Field.png").convert_alpha() self.fieldImg = self.loadImg("images/Field.png")
self.offsetSize = self.fieldImg.get_width() / self.width self.offsetSize = self.fieldImg.get_width() / self.width
self.fieldImg = pg.transform.scale(self.fieldImg, (self.width, self.height)) self.fieldImg = pg.transform.scale(self.fieldImg, (self.width, self.height))
self.elements = [] self.elements = []
def invert(img): def invert(self, img):
inv = pygame.Surface(img.get_rect().size, pygame.SRCALPHA) inv = self.pg.Surface(img.get_rect().size, self.pg.SRCALPHA)
inv.fill((255,255,255,255)) inv.fill((255,255,255,255))
inv.blit(img, (0,0), None, BLEND_RGB_SUB) inv.blit(img, (0,0), None, BLEND_RGB_SUB)
return inv return inv
@@ -70,6 +80,11 @@ class render():
def loadImg(self, path):
return self.pg.image.load(resource_path(path)).convert_alpha()
def robotSquare(self, pos, rot): def robotSquare(self, pos, rot):
pos1 = ((math.sin(rot + math.pi*-0.25)*nodeSquareRadius/self.offsetSize) + pos[0], pos1 = ((math.sin(rot + math.pi*-0.25)*nodeSquareRadius/self.offsetSize) + pos[0],
(math.cos(rot + math.pi*-0.25)*nodeSquareRadius/self.offsetSize) + pos[1]) (math.cos(rot + math.pi*-0.25)*nodeSquareRadius/self.offsetSize) + pos[1])