Crashing while playing mini-game, click and hold

Discuss how to use the Ren'Py engine to create visual novels and story-based games. New releases are announced in this section.
Forum rules
This is the right place for Ren'Py help. Please ask one question per thread, use a descriptive subject like 'NotFound error in option.rpy' , and include all the relevant information - especially any relevant code and traceback messages. Use the code tag to format scripts.
Post Reply
Message
Author
Emperoxxx Anime
Newbie
Posts: 10
Joined: Wed Jul 12, 2023 6:48 am
Projects: KonoSuba - The Harem Adventures
Deviantart: emperoxxxanime
Discord: emperoxxx
Contact:

Crashing while playing mini-game, click and hold

#1 Post by Emperoxxx Anime »

While most of the players didn't face this issue, still some players reported that the game suddenly closed when this mini-game, click and hold started.
The script for calling the game is -

Code: Select all

scene black with slowdiz
        
        $ mg_lantern_win = 0
        $ total_lanterns = 0
        $ mg_lantern_win2 = 0
        $ guild_event2_total_room_price = 0
        "Master your precision: Hold down the mouse button to align the bar flawlessly within the small box."
        
        play music music_action
        jump mg_lantern_label
#####BELOW LABEL IS THE MINIGAME START AND HERE GAME CRASHES#####
label mg_lantern_label:
    show mg_lantern_unlit
    
    python:
        total_lanterns += 1
        randfloat = renpy.random.random() * 2.0 + 0.5
        ui.add(mg_lantern_screen(2.5,randfloat))
        winner = ui.interact(suppress_overlay=True, suppress_window=True)

    window show None
    python:
        if winner < 0.1:
            mg_lantern_win+=1 
    if mg_lantern_win>mg_lantern_win2:
        $ mg_lantern_win2 = mg_lantern_win  
        hide mg_lantern_unlit
        show mg_lantern_lit
    "You fixed [mg_lantern_win] lanterns out of 3 lanterns."
    hide mg_lantern_lit

    if total_lanterns < 3:
        jump mg_lantern_label
    "{b}{size=*1.2}Final - You fixed [mg_lantern_win] lanterns out of 3 lanterns."
    
    jump guild_event2_after_lantern


here is the game mechanism:

Code: Select all

init:
    python:
        import math

        from vec2d import vec2d
        class mg_lantern_screen(renpy.Displayable):
            def __init__(self, time_limit, time_target):
                renpy.Displayable.__init__(self)
                
                self.time_limit = time_limit
                self.time_target = time_target
                
                
                # Some displayables we use.
                self.panel = Image("images/mini_game_lantern/mg_lantern_panel.png")
                self.meter = Image("images/mini_game_lantern/mg_lantern_meter.png")
                self.arrow = Image("images/mini_game_lantern/mg_lantern_arrow.png")
                self.ctb = Text("Click and Hold to repair the lantern.", size=36, drop_shadow=(2,2), drop_shadow_color="#C0C0C0")
                
                # The sizes of some of the images.
                self.METER_WIDTH = 50.0
                self.METER_HEIGHT = 400.0
                
                # Started.
                self.started = False
                
                # The time of the past render-frame.
                self.oldst = None
                self.time_passed = 0.0
                
            def score(self):
                return math.fabs(self.time_target-self.time_passed)
                
            # draws the screen.
            def render(self, width, height, st, at):
                # Figure out the time elapsed since the previous frame.
                if self.oldst is None and self.started:
                    self.oldst = st
                if self.started:    
                    self.time_passed = st - self.oldst
                # The Render object we'll be drawing into.
                r = renpy.Render(width, height)
                
                
                # pixel_height = self.METER_HEIGHT * (self.time_passed/self.time_limit)
                pixel_height = min(self.METER_HEIGHT * (self.time_passed/self.time_limit), self.METER_HEIGHT)
                target_height = self.METER_HEIGHT - (self.METER_HEIGHT * (float(self.time_target)/float(self.time_limit)))
                
                
                eileen = renpy.render( self.panel, width, height, st, at)
                ew, eh = eileen.get_size()
                r.blit(eileen, (width*0.75 - ew / 2, height/2 - eh/ 2))
                
                
                temp_meter = im.Crop(self.meter,0,self.METER_HEIGHT-pixel_height,self.METER_WIDTH,pixel_height)
                eileen = renpy.render( temp_meter, width, height, st, at)
                r.blit(eileen, (width*0.75 - self.METER_WIDTH / 2, height/2 + self.METER_HEIGHT/ 2-pixel_height))
                       
                meter = renpy.render( self.arrow, width, height, st, at)
                ew, eh = meter.get_size()
                r.blit(meter, (width*0.75 - self.METER_WIDTH / 2, (height/2) - (self.METER_HEIGHT/ 2) + target_height - (eh / 2)))
                
                # Show the "Click to Begin" label.
                if self.started == False:
                    ctb = renpy.render(self.ctb, 800, 600, st, at)
                    cw, ch = ctb.get_size()
                    r.blit(ctb, (width*0.5 - cw / 2, height*0.25 - ch/2)) 
                    

                # Ask that we be re-rendered ASAP, so we can show the next
                # frame.
                renpy.redraw(self, 0)
                
                # Return the Render object.
                return r
            
            # Handles events.
            def event(self, ev, x, y, st):
                import pygame
                
                # Mousebutton down == start the game by setting stuck to
                # false.
                if ev.type == pygame.MOUSEBUTTONDOWN and ev.button == 1:
                    self.started = True
                if ev.type == pygame.MOUSEBUTTONUP and ev.button == 1 and self.started:
                    return  self.score()
                if self.started:
                    if self.time_passed < self.time_limit:
                        raise renpy.IgnoreEvent()
                    else:
                        return self.score()
                else:
                    raise renpy.IgnoreEvent()

There's a vec2d file as well, if anyone wanna take a look, please just ask.

Does anyone have any clue why some players are experiencing this issue?

User avatar
Alex
Lemma-Class Veteran
Posts: 3098
Joined: Fri Dec 11, 2009 5:25 pm
Contact:

Re: Crashing while playing mini-game, click and hold

#2 Post by Alex »

Emperoxxx Anime wrote: Mon Aug 07, 2023 2:48 am ...
Just comment out this line

Code: Select all

from vec2d import vec2d
since 'vec2d' is not used in this code sample.

Emperoxxx Anime
Newbie
Posts: 10
Joined: Wed Jul 12, 2023 6:48 am
Projects: KonoSuba - The Harem Adventures
Deviantart: emperoxxxanime
Discord: emperoxxx
Contact:

Re: Crashing while playing mini-game, click and hold

#3 Post by Emperoxxx Anime »

Alright Noted! Thanks for the reply.

Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot]