omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    Clear pixel art with FILTERING_NEAREST?

    Pythonista
    3
    6
    2473
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Vile
      Vile last edited by

      Recently I’ve been testing out my 64*64 pixel art with the pythonista scene module (which I’m more comfortable using).

      I have been able to get clear images by individually setting the filtering mode of each imported image to FILTERING_NEAREST, which is a very tedious process.

      Is there a way of setting the filtering mode of all the images in the whole scene to FILTERING_NEAREST, preferably in one line?

      Here’s a short example of my current code:

      import scene
      from scene import *
      
      x,y = get_screen_size()
      
      class MyScene(Scene):
      	def setup(self):
      		self.background_color = '#000000'
      		self.pixel = Texture('GameAssets/lizard_profile.png')
      		self.pixel.filtering_mode=FILTERING_NEAREST #imagine copying this for every image. very tedious. but it is the only method that i know which actually works.
      		self.pixelNode = SpriteNode(self.pixel)
      		self.pixelNode.position = (x/2,y/2)
      		self.pixelNode.size = self.pixelNode.size*6 #makes the 64*64 pixel art more visible.
      		self.add_child(self.pixelNode)
      	
      	def update(self):
      		filtering_mode=FILTERING_NEAREST #this does not work.
      
      scene.filtering_mode=FILTERING_NEAREST #this also does not work.
      scene.run(MyScene(),orientation=LANDSCAPE,frame_interval=1, anti_alias=False, show_fps=True, multi_touch=True)
      

      If there are no convenient methods for doing this, I’ll have to rescale my images at a higher resolution (although I’d prefer to stick with 64*64 PNGs due to the smaller file sizes).

      cvp 1 Reply Last reply Reply Quote 0
      • cvp
        cvp @Vile last edited by cvp

        @Vile Not sure that I correctly understand your question. If not, sorry and forget this post.
        Else, Texture object can't be subclassed thus you can try via a function, like:

        class MyScene(Scene):
            def MyTexture(self,image):
                texture = Texture(image)
                texture.filtering_mode=FILTERING_NEAREST
                return texture
            def setup(self):
                self.background_color = '#000000'
                self.pixel = self.MyTexture('pzl:Blue6')
        
        mikael Vile 2 Replies Last reply Reply Quote 0
        • mikael
          mikael @cvp last edited by mikael

          @cvp, heh, you were quicker. Here is my sample version of the traditional ”vector out boring setup into a factory function” pattern:

          from scene import *
          
          class MyScene(Scene):
            def setup(self):
              self.background_color = 'black'
              self.pixel_node = self.make_pixels('spc:PlayerShip3Green')
              self.pixel_node.position = self.size/2
              
            def make_pixels(self, file, parent=None):
              pixel = Texture(file)
              pixel.filtering_mode=FILTERING_NEAREST
              pixel_node = SpriteNode(pixel)
              pixel_node.size = pixel_node.size*6
              parent = parent or self
              parent.add_child(pixel_node)
              return pixel_node
          
          run(MyScene())
          
          Vile 1 Reply Last reply Reply Quote 2
          • Vile
            Vile @mikael last edited by

            @mikael, thanks for your help!

            Although making a function is longer than one line, this should cut down my production time in the long run.

            1 Reply Last reply Reply Quote 0
            • Vile
              Vile @cvp last edited by

              @cvp, I edited your code slightly because python was expecting a Node object:

              import scene
              from scene import *
              x,y=get_screen_size()
              class MyScene(Scene):
                  def MyTexture(self,image):
                      texture = Texture(image)
                      texture.filtering_mode=FILTERING_NEAREST
                      return texture
                  def setup(self):
                      self.background_color = '#000000'
                      self.pixel = self.MyTexture('pzl:Blue6')
                      self.pixelNode = SpriteNode(self.pixel)
                      self.pixelNode.position = (x/2,y/2)
                      self.add_child(self.pixelNode)
              run(MyScene())
              
              cvp 1 Reply Last reply Reply Quote 0
              • cvp
                cvp @Vile last edited by cvp

                @Vile He, my code was only a part of your code for the Texture, of course the remaining of the code for nodes is still needed.
                And the code of @mikael was even better if you want to define your nodes and their texture in one line.

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post
                Powered by NodeBB Forums | Contributors