def updateScreen(self,fullUpdate=True): start=20; gap=18; if(fullUpdate or self.forceRefresh): self.forceRefresh=False; # draw background & buttons self.screen.blit(self.musicImage,(0,0)); pygame.draw.line(self.screen,(0,0,150,200),(0,120),(320,120),2) self.screen.blit(self.buttonPlay,(0,20)); self.screen.blit(self.buttonPrev,(0,53)); self.screen.blit(self.buttonNext,(0,86)); self.screen.blit(self.buttonLoad,(0,120)); self.screen.blit(self.buttonSave,(0,150)); self.screen.blit(self.buttonAdd,(0,180)); self.screen.blit(self.buttonNew,(0,210)); #song/artist/album etc.. infos self.screen.blit(self.cdImg,(65,25,75,75)) self.drawText(self.meta['artist'],(0,250,0,200),(145,start)); self.drawText(self.meta['album'],(150,150,250,200),(145,start+gap)); self.drawText(self.meta['tracknumber']+": "+self.meta['title'],(250,50,50,200),(145,start+gap*2)); self.drawText(self.meta['date'],(200,200,200,200),(145,start+gap*3)); #TODO: show volume somewhere self.main.paintMenuBar(); #playlist self.playlist.drawPane(self,(70,130)); else: # clear the areas that need to refresh (progressbar & indicator); pygame.draw.rect(self.screen,(0,0,0,255),(145,start+gap*4,160,10)); pygame.draw.rect(self.screen,(0,0,0,255),(70,105,240,11)); # needs to be done wether full or light update # progress bar pygame.draw.line(self.screen,(100,100,100,200),(75,110),(305,110),10) pygame.draw.line(self.screen,(200,200,250,200),(75,110),(305,110),2) posX=75; length=self.meta['length']; progress=str(music.get_pos()/60000)+":"+str(music.get_pos()/1000%60)+" / --:--"; if(length>0): if(music.get_busy()): posX=75+(305-75)/1000.0*music.get_pos()/length progress=str(music.get_pos()/60000)+":"+str(music.get_pos()/1000%60)+" / "+str(int(length/60))+":"+str(int(length%60)) pygame.draw.line(self.screen,(150,150,250,255),(posX,105),(posX,115),5) self.drawText(progress+" Vol:50%",(200,100,200,200),(145,start+gap*4)); pygame.display.flip();
def is_over(self): if not music.get_busy(): return True elif self.endat and music.get_pos() > self.endat * 1000: music.stop() return True else: return False
def time_scale_tick(self, root_: tk_Tk): """Method synchronizes time scale with music progression""" if pygame_music.get_pos() != -1: if (abs(pygame_music.get_pos() // 1000 - int(self._time_offset) - self._time_scale_var.get()) > 1): self._time_offset = float(pygame_music.get_pos() / 1000 - self._time_scale_var.get()) self._time_scale_var.set(pygame_music.get_pos() // 1000 - int(self._time_offset)) elif self._play_button['text'] == 'Stop': self._play_button['text'] = 'Play' self._time_scale_var.set(0) root_.after(100, self.time_scale_tick, root_)
def get_current_time_in_millis(self) -> int: result: int = int(pygame_music.get_pos() - self._time_offset * 1000) if result < 0: return 0 else: return result
def update(self, dt): pos = music.get_pos() / 1000 """ if int(pos) != self.ids.progress.value and int(10*round((music.get_pos()/1000)%1,2)) >= 1: music.rewind() music.set_pos(self.ids.progress.value) print("Hello: "+str(self.ids.progress.value)+' - '+str(music.get_pos())) """ current_time = Song().time(int(pos)) self.ids.duration.text = current_time + '/' + self.ids.duration.text.split( '/')[1] self.ids.progress.value = 60 * int(current_time.split('.')[0]) + int( current_time.split('.')[1])
def _play_button_hit(self): """Method contains actions when play button hit""" if pygame_music.get_pos() == -1: pygame_music.load(self._filepath) current_track = pygame_Sound(self._filepath) self._time_scale['to'] = current_track.get_length() self._play_button['text'] = 'Stop' pygame_music.play() pygame_music.set_pos(float(self._time_scale_var.get())) elif self._paused: self._play_button['text'] = 'Stop' pygame_music.unpause() self._paused = False else: self._play_button['text'] = 'Play' pygame_music.pause() self._paused = True
def get_events(self): events, nevents = [], [] idx = self.event_idx nidx = self.nevent_idx time = self.curtime = float(music.get_pos())/1000.0 while (idx < len(self.events) and self.events[idx].when <= time + 2 * toRealTime(self.events[idx].bpm, 1)): events.append(self.events[idx]) idx += 1 bpm = self.playingbpm self.event_idx = idx while (nidx < len(self.events) and self.events[nidx].appear <= time): self.playingbpm = self.events[nidx].bpm nevents.append(self.events[nidx]) nidx += 1 self.nevent_idx = nidx return events, nevents, time, bpm
def get_events(self): events, nevents = [], [] idx = self.event_idx nidx = self.nevent_idx time = self.curtime = float(music.get_pos())/1000.0 while (idx < len(self.events) and self.events[idx].when <= time + 2 * toRealTime(self.events[idx].bpm, 1)): events.append(self.events[idx]) idx += 1 bpm = self.playingbpm self.event_idx = idx while (compare_less(nidx, len(self.events)) and compare_less_equal(self.events[nidx].appear, time)): self.playingbpm = self.events[nidx].bpm nevents.append(self.events[nidx]) nidx += 1 self.nevent_idx = nidx return events, nevents, time, bpm
def on_end(self) -> None: self.offset = (pgmusic.get_pos() / 1000) self.status = Status.stopped
def dance(screen, song, players, prevscr, ready_go, game): songFailed = False # text group, e.g. judgings and combos tgroup = RenderUpdates() # lyric display group lgroup = RenderUpdates() background = pygame.Surface([640, 480]) if song.movie != None: backmovie = BGMovie(song.movie) else: backmovie = None background.fill(colors.BLACK) screen.fill(colors.BLACK) if ready_go: ready_go_time = min(100, *[plr.ready for plr in players]) tgroup.add(ReadyGoSprite(ready_go_time)) if mainconfig['showbackground'] > 0: if backmovie is None: bgkludge = pygame.image.load(song.background).convert() bgkrect = bgkludge.get_rect() if (bgkrect.size[0] == 320) and (bgkrect.size[1] == 240): bgkludge = pygame.transform.scale2x(bgkludge) else: bgkludge = pygame.transform.scale(bgkludge, [640, 480]) bgkludge.set_alpha(mainconfig['bgbrightness'], RLEACCEL) q = mainconfig['bgbrightness'] / 256.0 # FIXME for i in range(0, 101, 5): p = i / 100.0 prevscr.set_alpha(256 * (1 - p) * q, RLEACCEL) screen.fill(colors.BLACK) screen.blit(prevscr, [0, 0]) screen.blit(bgkludge, [0, 0]) pygame.display.update() pygame.time.delay(1) background.blit(bgkludge, [0, 0]) else: pygame.display.update() else: pygame.display.update() if mainconfig["strobe"]: tgroup.add(Blinky(song.bpm)) if mainconfig["fpsdisplay"]: fpstext = FPSDisp() timewatch = TimeDisp() tgroup.add([fpstext, timewatch]) else: fpstext = None if mainconfig['showlyrics']: lgroup.add(song.lyricdisplay.channels()) fontfn, basesize = FontTheme.Dance_title_artist songtext = fontfx.zztext(song.title, 480, 12, basesize, fontfn) grptext = fontfx.zztext(song.artist, 160, 12, basesize, fontfn) songtext.zin() grptext.zin() tgroup.add([songtext, grptext]) song.init() if song.crapout != 0: error.ErrorMessage( screen, _("The audio file for this song ") + song.filename + _(" could not be found.")) return False # The player didn't fail. if mainconfig['assist']: music.set_volume(0.6) else: music.set_volume(1.0) song.play() for plr in players: plr.start_song() autofail = mainconfig['autofail'] screenshot = False ui.ui.clear() while True: if autofail: songFailed = True for plr in players: if not plr.lifebar.gameover: songFailed = False break if songFailed: song.kill() for plr in players: plr.get_next_events(song) if song.is_over(): break else: curtime = music.get_pos() / 1000.0 key = [] ev = ui.ui.poll_dance() while ev[1] != ui.PASS: if ev[1] == ui.CANCEL: for p in players: p.escaped = True return False elif ev[1] == ui.SCREENSHOT: screenshot = True elif ev[1] == ui.LEFT: key.append((ev[0], 'l')) elif ev[1] == ui.DOWNLEFT: key.append((ev[0], 'w')) elif ev[1] == ui.UPLEFT: key.append((ev[0], 'k')) elif ev[1] == ui.RIGHT: key.append((ev[0], 'r')) elif ev[1] == ui.UPRIGHT: key.append((ev[0], 'z')) elif ev[1] == ui.DOWNRIGHT: key.append((ev[0], 'g')) elif ev[1] == ui.UP: key.append((ev[0], 'u')) elif ev[1] == ui.DOWN: key.append((ev[0], 'd')) elif ev[1] == ui.CENTER: key.append((ev[0], 'c')) elif ev[1] == -ui.LEFT: key.append((ev[0], '-l')) elif ev[1] == -ui.DOWNLEFT: key.append((ev[0], '-w')) elif ev[1] == -ui.UPLEFT: key.append((ev[0], '-k')) elif ev[1] == -ui.RIGHT: key.append((ev[0], '-r')) elif ev[1] == -ui.UPRIGHT: key.append((ev[0], '-z')) elif ev[1] == -ui.DOWNRIGHT: key.append((ev[0], '-g')) elif ev[1] == -ui.UP: key.append((ev[0], '-u')) elif ev[1] == -ui.DOWN: key.append((ev[0], '-d')) elif ev[1] == -ui.CENTER: key.append((ev[0], '-c')) ev = ui.ui.poll_dance() for ev in key: if game.double: pid = ev[0] / 2 else: pid = ev[0] if pid >= 0 and pid < len(players): if ev[1][0] != '-': players[pid].handle_keydown(ev, curtime) else: players[pid].handle_keyup((ev[0], ev[1][1:]), curtime) rectlist = [] if backmovie: backmovie.update(curtime) if backmovie.changed or (fpstext.fps() > 30): backmovie.resetchange() screen.blit(backmovie.image, [0, 0]) for plr in players: rectlist.extend(plr.game_loop(curtime, screen)) lgroup.update(curtime) tgroup.update(curtime) rectlist.extend(tgroup.draw(screen)) rectlist.extend(lgroup.draw(screen)) if backmovie is None: pygame.display.update(rectlist) else: pygame.display.update() if screenshot: fn = os.path.join(rc_path, "screenshot.bmp") print(_("Saving a screenshot to"), fn) pygame.image.save(screen, fn) screenshot = False if backmovie is None: lgroup.clear(screen, background) tgroup.clear(screen, background) for plr in players: plr.clear_sprites(screen, background) if ((curtime > players[0].length - 1) and (songtext.zdir == 0) and (songtext.zoom > 0)): songtext.zout() grptext.zout() if fpstext: print(_("Average FPS for this song was %d.") % fpstext.fps()) return songFailed
def elapsed(self, new_pos: float) -> None: new_pos = clamp(0, new_pos, self.length) pgmusic.set_pos(new_pos) self.offset = (pgmusic.get_pos() / 1000) - new_pos
def main(): if len(sys.argv) != 4: print("usage:\n\t{0} MUSIC_FILE TWERK_LENGTH PAUSE_LENGTH") sys.exit(1) twerkLength = int(sys.argv[2]) pauseLength = int(sys.argv[3]) pygame.init() pygame.display.set_mode((10, 10)) twerkLeft = int(twerkLength*0.5) twerkRight = int(twerkLength*0.5) music.load(sys.argv[1]) print("Ready to go, press ESCAPE to stop") music.play() pygame.event.set_blocked(None) pygame.event.set_allowed([pygame.KEYDOWN, pygame.KEYUP]) twerkList = [] while True: keysdown = pygame.event.get(pygame.KEYDOWN) keysup = pygame.event.get(pygame.KEYUP) if pygame.key.get_pressed()[pygame.K_ESCAPE]: break if keysdown: stamp = music.get_pos() twerkList.append(Twerk(stamp-twerkLeft, stamp+twerkRight, 1, 1)) if len(twerkList) == 0: return print("Twerks:") for twerk in twerkList: print(twerk) print("\nTwerk twerkLengths") countTwerkIntervals(twerkList) compressedTwerks = [twerkList[0]] for twerk in twerkList[1:]: if twerk.start <= compressedTwerks[-1].stop: compressedTwerks[-1].stop = twerk.stop compressedTwerks[-1].count += 1 else: compressedTwerks.append(twerk) print("\nCompressed Twerks:") for twerk in compressedTwerks: print(twerk) print("\nCompressed Twerks twerkLengths") countTwerkIntervals(compressedTwerks) print("\nFinal intervals") t = Twerk(0, compressedTwerks[0].start, 0, 0) print(t.toQML()) for n, t in enumerate(compressedTwerks): print(t.toQML()) if n < len(compressedTwerks) -1: if compressedTwerks[n+1].start - t.stop < pauseLength: gap = Twerk(t.stop, compressedTwerks[n+1].start, 1, 2) else: gap = Twerk(t.stop, compressedTwerks[n+1].start, 1, 0) print(gap.toQML())
def dance(screen, song, players, prevscr, ready_go, game): songFailed = False # text group, e.g. judgings and combos tgroup = RenderUpdates() # lyric display group lgroup = RenderUpdates() background = pygame.Surface([640, 480]) if song.movie != None: backmovie = BGMovie(song.movie) else: backmovie = None background.fill(colors.BLACK) screen.fill(colors.BLACK) if ready_go: ready_go_time = min(100, *[plr.ready for plr in players]) tgroup.add(ReadyGoSprite(ready_go_time)) if mainconfig['showbackground'] > 0: if backmovie is None: bgkludge = pygame.image.load(song.background).convert() bgkrect = bgkludge.get_rect() if (bgkrect.size[0] == 320) and (bgkrect.size[1] == 240): bgkludge = pygame.transform.scale2x(bgkludge) else: bgkludge = pygame.transform.scale(bgkludge, [640, 480]) bgkludge.set_alpha(mainconfig['bgbrightness'], RLEACCEL) q = mainconfig['bgbrightness'] / 256.0 # FIXME for i in range(0, 101, 5): p = i / 100.0 prevscr.set_alpha(256 * (1 - p) * q, RLEACCEL) screen.fill(colors.BLACK) screen.blit(prevscr, [0, 0]) screen.blit(bgkludge, [0, 0]) pygame.display.update() pygame.time.delay(1) background.blit(bgkludge, [0, 0]) else: pygame.display.update() else: pygame.display.update() if mainconfig["strobe"]: tgroup.add(Blinky(song.bpm)) if mainconfig["fpsdisplay"]: fpstext = FPSDisp() timewatch = TimeDisp() tgroup.add([fpstext, timewatch]) else: fpstext = None if mainconfig['showlyrics']: lgroup.add(song.lyricdisplay.channels()) fontfn, basesize = FontTheme.Dance_title_artist songtext = fontfx.zztext(song.title, 480, 12, basesize, fontfn) grptext = fontfx.zztext(song.artist, 160, 12, basesize, fontfn) songtext.zin() grptext.zin() tgroup.add([songtext, grptext]) song.init() if song.crapout != 0: error.ErrorMessage(screen, _("The audio file for this song ") + song.filename + _(" could not be found.")) return False # The player didn't fail. if mainconfig['assist']: music.set_volume(0.6) else: music.set_volume(1.0) song.play() for plr in players: plr.start_song() autofail = mainconfig['autofail'] screenshot = False pad.empty() while True: if autofail: songFailed = True for plr in players: if not plr.lifebar.gameover: songFailed = False break if songFailed: song.kill() for plr in players: plr.get_next_events(song) if song.is_over(): break else: curtime = music.get_pos()/1000.0 key = [] ev = pad.poll() for i in range(len(players)): if (pad.states[(i, pad.START)] and pad.states[(i, pad.SELECT)]): ev = (0, pad.QUIT) break else: pass while ev[1] != pad.PASS: if ev[1] == pad.QUIT: for p in players: p.escaped = True break elif ev[1] == pad.SCREENSHOT: screenshot = True elif ev[1] == pad.LEFT: key.append((ev[0], 'l')) elif ev[1] == pad.DOWNLEFT: key.append((ev[0], 'w')) elif ev[1] == pad.UPLEFT: key.append((ev[0], 'k')) elif ev[1] == pad.RIGHT: key.append((ev[0], 'r')) elif ev[1] == pad.UPRIGHT: key.append((ev[0], 'z')) elif ev[1] == pad.DOWNRIGHT: key.append((ev[0], 'g')) elif ev[1] == pad.UP: key.append((ev[0], 'u')) elif ev[1] == pad.DOWN: key.append((ev[0], 'd')) elif ev[1] == pad.CENTER: key.append((ev[0], 'c')) ev = pad.poll() if ev[1] == pad.QUIT: return False for ev in key: if game.double: pid = ev[0] / 2 else: pid = ev[0] if pid < len(players): players[pid].handle_key(ev, curtime) rectlist = [] if backmovie: backmovie.update(curtime) if backmovie.changed or (fpstext.fps() > 30): backmovie.resetchange() screen.blit(backmovie.image, [0, 0]) for plr in players: rectlist.extend(plr.game_loop(curtime, screen)) lgroup.update(curtime) tgroup.update(curtime) rectlist.extend(tgroup.draw(screen)) rectlist.extend(lgroup.draw(screen)) if backmovie is None: pygame.display.update(rectlist) else: pygame.display.update() if screenshot: fn = os.path.join(rc_path, "screenshot.bmp") print _("Saving a screenshot to"), fn pygame.image.save(screen, fn) screenshot = False if backmovie is None: lgroup.clear(screen, background) tgroup.clear(screen, background) for plr in players: plr.clear_sprites(screen, background) if ((curtime > players[0].length - 1) and (songtext.zdir == 0) and (songtext.zoom > 0)): songtext.zout() grptext.zout() if fpstext: print _("Average FPS for this song was %d.") % fpstext.fps() return songFailed
def do(self,argument): Map.readMap(argument[0],argument[1]) readMusic() self.register=[] if MAPINFO: print(vars(Map.songMap)) background=loadBackground() reg=Register((self.size-background.get_size())//2,surface=background) self.register.append(reg) trace['Width']=trace['Skin'][0].get_size()[0] for i in range(trace['Number']): #根據先前設定好的軌道數量,利用相對位置生成整齊的軌道圖片 if i==0: reg=Animation(((self.size[0]-trace['BoxWidth']*(trace['Number']-1)-trace['Number']*trace['Width'])//2,0),surface=trace['Skin'][0]) else: reg=Animation((self.register[-1].rect.topright[0]+trace['BoxWidth'],0),surface=trace['Skin'][0]) reg.animation(trace['Skin']) self.register.append(reg) TraceSkin=self.register[-trace['Number']::]#保存位置,以後方便使用 #生成判定線 reg=Register((TraceSkin[0].rect.topleft[0],trace['Judge']),(TraceSkin[-1].rect.topright[0]-TraceSkin[0].rect.topleft[0],5)) reg.surface.fill(trace['Color']) self.register.append(reg) TraceJudge=self.register[-1] TraceJudgeLineY=TraceJudge.rect.centery #生成掉落方塊 note=pygame.image.load_extended(path.join(skinDir,'mania-note1.png')).convert_alpha() noteX,noteY=note.get_size() hnote=pygame.image.load_extended(path.join(skinDir,'mania-note1L-0.png')).convert_alpha() hnote=pygame.transform.scale(hnote,(TraceSkin[0].size[0]//2,1)) noteType={ 'Hold':0, 'Down':1, 'Up':2 } hnoteX,hnoteY=hnote.get_size() hnoteD=2*trace['Speed'] area=TraceJudge.size reg=Register(((self.size[0]-area[0])//2,0),(area[0],self.size[1])) self.register.append(reg) Notes=self.register[-1] mania300=[pygame.image.load_extended(path.join(skinDir,'hit300-'+str(i)+ '.png')).convert_alpha() for i in range(30)] mania100=[pygame.image.load_extended(path.join(skinDir,'hit100-'+str(i)+ '.png')).convert_alpha() for i in range(30)] mania50=[pygame.image.load_extended(path.join(skinDir,'hit50-'+str(i)+ '.png')).convert_alpha() for i in range(30)] mania0=[pygame.image.load_extended(path.join(skinDir,'hit0-'+str(i)+ '.png')).convert_alpha() for i in range(35)] #設定擊中時的動畫效果 for i in range(trace['Number']): reg=AnimationMultipleEffectCenter((TraceSkin[i].rect.center[0],trace['Judge'])) reg.animation(mania300) reg.animation(mania100) reg.animation(mania50) reg.animation(mania0) self.register.append(reg) TracePoint=self.register[-trace['Number']:] moveTime=1500/trace['Speed']#設定物體掉落的速度(EX:若1倍速,則物體掉落的時間為1.5sec) music.set_volume(Map.songMap.timing_points[0].volume/100) hit_obj=Map.songMap._hit_objects.copy()#copy掉落物件的屬性 hit_obj.reverse()#把list反轉,提高讀取速度(由最後一個往前讀取) hit_objTime=hit_obj[-1].time.total_seconds()*1000 timeBoard={'Perfect':75,'Great':150,'Good':350,'Miss':500} scoreBoard={'Perfect':0,'Great':0,'Good':0,'Miss':0,'Combo':[0]} comboBoard=ScoreBoard()#顯示連擊數 comboBoard.color=(0,255,255) self.register.append(comboBoard) self.KEY=[True for i in range(trace['Number'])] music.play() music.set_endevent(MUSIC_END) while 1: time=music.get_pos() NotesClear=[] event_get=pygame.fastevent.get() for event in event_get: if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if not AUTO: if event.unicode in trace['BtnKey']:#取得以設定的按鍵值(EX: D F J K) index=trace['BtnKey'][event.unicode] #把值給變數index TraceSkin[index].frame=1 if self.KEY[index]: for i,v in enumerate(Notes.register): if v.trace != index or v.type != noteType['Down']: continue for i0,k in enumerate(timeBoard.keys()): if -timeBoard[k]<=time-v.time<=timeBoard[k]:#判斷按下去時,是得到perfect great good miss if k!='Miss': scoreBoard['Combo'][-1]+=1 #增加combo else: #結束combo scoreBoard['Combo'][-1]=int(scoreBoard['Combo'][-1]) scoreBoard['Combo'].append(0) if scoreBoard['Combo'][-1]>0: #有combo才顯示combo數 comboBoard.content=str(int(scoreBoard['Combo'][-1])) TracePoint[index].begin(i0) scoreBoard[k]+=1 NotesClear.append(i) break else: continue break self.KEY[index]=False if event.unicode =='\x1b': music.stop() return if event.type==KEYUP: if not AUTO: if event.unicode in trace['BtnKey']: index=trace['BtnKey'][event.unicode] TraceSkin[index].frame=0 self.KEY[index]=True for i,v in enumerate(Notes.register): if v.trace!=index: continue if v.type!=noteType['Up']: break for i0,k in enumerate(timeBoard.keys()): if -timeBoard[k]<=time-v.time<=timeBoard[k]: if k!='Miss': scoreBoard['Combo'][-1]+=1 else: scoreBoard['Combo'][-1]=int(scoreBoard['Combo'][-1]) scoreBoard['Combo'].append(0) if scoreBoard['Combo'][-1]>0: comboBoard.content=str(int(scoreBoard['Combo'][-1])) TracePoint[index].begin(i0) scoreBoard[k]+=1 NotesClear.append(i) break else: continue break TracePoint[index].end() if event.type == music.get_endevent(): print(scoreBoard) return if EVENT_PRINT: print(event) def compute(dt): #計算位置 return TraceJudgeLineY*dt//moveTime if AUTO: for index in range(trace['Number']): for i,v in enumerate(Notes.register): k='Perfect' if v.type==noteType['Hold'] and time>=v.starttime: length=compute(v.endtime-time) v.surface.set_clip(pygame.Rect((0,0),(v.size[0],length))) if v.trace==index and time>=v.endtime: scoreBoard['Combo'][-1]+=1 comboBoard.content=str(int(scoreBoard['Combo'][-1])) TracePoint[index].trigger(0) scoreBoard[k]+=1 NotesClear.append(i) if len(hit_obj)>0 and time>hit_objTime-moveTime: t=assignTrace(hit_obj[-1].position[0]) #取得軌道 length=TraceJudgeLineY-compute(hit_objTime-time) pos=TraceSkin[t].rect.centerx-Notes.pos[0] if type(hit_obj[-1]) is slider.beatmap.HoldNote:#判斷現在讀取的hit_obj屬性是否為hold_note,然後生成出register endtime=eval(hit_obj[-1].addition.split(':')[0]) endlength=TraceJudgeLineY-compute(endtime-time) totalL=int((length-endlength)) reg=Register((pos-hnoteX//2,totalL-hnoteY//2),surface=pygame.transform.scale(hnote,(hnoteX,totalL))) reg.starttime=hit_objTime reg.endtime=endtime reg.time=(reg.starttime+endtime)//2 reg.height=reg.rect.centery reg.trace=t reg.type=noteType['Hold'] Notes.register.append(reg) reg=Register((pos-noteX//2,length-noteY//2),surface=note) reg.starttime=hit_objTime reg.endtime=hit_objTime reg.time=hit_objTime reg.height=reg.rect.centery reg.trace=t reg.type=noteType['Down'] Notes.register.append(reg) reg=Register((pos-noteX//2,endlength-noteY//2),surface=note) reg.starttime=endtime reg.endtime=endtime reg.time=endtime reg.height=reg.rect.centery reg.trace=t reg.type=noteType['Up'] Notes.register.append(reg) else: #判斷現在讀取的hit_obj屬性是否為note,然後生成出register reg=Register((TraceSkin[t].rect.centerx-noteX//2-Notes.pos[0],length-noteY//2),surface=note) reg.starttime=hit_objTime reg.endtime=hit_objTime reg.time=hit_objTime reg.height=reg.rect.centery reg.trace=t reg.type=noteType['Down'] Notes.register.append(reg) hit_obj.pop() try: #先嘗試計算下一個欲掉落物件的時間 hit_objTime=hit_obj[-1].time.total_seconds()*1000 except: pass for index,key in enumerate(self.KEY): TracePoint[index].update(10) if not key: #如果按鍵按下 for i,v in enumerate(Notes.register): if v.trace!=index or v.type != noteType['Hold']: #判斷掉落物件是否為hold屬性 continue if v.type==noteType['Hold'] and time>=v.starttime: length=TraceJudgeLineY*(v.endtime-time)//moveTime v.surface.set_clip(pygame.Rect((0,0),(v.size[0],length))) #把超出範圍的圖形,利用set_clip切割掉不顯示 if time >v.endtime: TracePoint[index].trigger(0) #觸發特效(0代表perfect) NotesClear.append(i) #把要刪除的index丟入垃圾桶 break for i,v in enumerate(Notes.register): #判定掉落物件是否超出判定線 v.rect.centery=TraceJudgeLineY-compute(v.time-time) if v.rect.centery>=TraceJudge.rect.centery and time-v.endtime>timeBoard['Miss']: #判定物件位置超出Miss的預設值 scoreBoard['Miss']+=1 if scoreBoard['Combo'][-1]>0:scoreBoard['Combo'].append(0) #combo設定為0 comboBoard.content="" NotesClear.append(i) NotesClear.sort(reverse=1) #把欲清除的list排列 for i in NotesClear: del Notes.register[i] #清理垃圾桶 comboBoard.pos=(self.size-comboBoard.size)//2 #置中comboBoard comboBoard.update() Notes.clear() Notes.blit() if not all(self.size-screen.get_size()):#判斷self.size與預設大小1366*768是否相同,若相同則直接把內容顯示出來 screen.fill((128,128,128)) screen.blits([(sur.surface,sur.pos,sur.surface.get_clip(),BLEND_ALPHA_SDL2) for sur in self.register]) else:#調整視窗大小,避免因調整而座標系統跑掉 self.clear() self.blit() BlitToWindow(self.surface) pygame.display.flip()
def get_music_pos(self): return music.get_pos()
def elapsed(self) -> float: # If we ff or rw, it doesn't change the get_pos(), so gotta store an offset return max(0, pgmusic.get_pos() / 1000 - self.offset)
def _time_scale_moved(new_position): """Method contains actions when time scale moved""" if pygame_music.get_pos() != -1: pygame_music.set_pos(float(new_position))