2017-03-26 30 views
1

私はPygameで簡単なタイルベースのゲームを作っています。Pygameタイルマップ上のハイライトタイル

現在、ランダムに選択されたタイルの10x10グリッドが表示されます。その部分は完璧に動作していますが、私は強調表示に問題があります。

タイルの上にマウスを置くと、約半分の不透明度で灰色のタイルが読み込まれます。ロードされますが、不透明度が正しく機能していません。タイルの上にマウスを置くと、不透明度とすべてが正しく読み込まれます。しかし、マウスをタイルの周りに動かすと、それは不透明ではなく通常の状態になります。

イベントが発生するたびに強調表示されたタイルがロードされていると思われますが、それを修正する方法がわかりません。

タイルマップを生成して描画するために作成したTilemapというクラスを使用しています。私はそれがこのすべてを引き起こしているdraw()機能の何かだと思う。

import pygame 
import sys 
import random 
from pygame.locals import * 

running = True 

class Tilemap: 
    tilemap = [] 
    ht = None # ht = highlight texture 

    def __init__(self, height, width, tilesize, textures): 
     self.height = height # How many tiles high it is 
     self.width = width # How many tiles wide it is 
     self.tilesize = tilesize # How many pixels each tile is 
     self.textures = textures # The textures 
     self.size = (self.width*self.tilesize,self.height*self.tilesize) 

    def generate_random(self): 
     # Generate a random tilemap 
     self.tilemap = [[random.randint(0, len(
      self.textures)-1) for e in range(self.width)] for e in range(
       self.height)] 

    def draw(self, display, mouse=None): 
     mouse = mouse 
     # Draw the map 
     for row in range(self.width): 
      for column in range(self.height): 



       texture = self.textures[self.tilemap[row][column]] 
       # Highlight a tile (this is where the problem is) 
       if self.ht != None: 
        if mouse[0] >= (column*self.tilesize) and mouse[0] <= (
         column*self.tilesize)+self.tilesize: 
         if mouse[1] >= (row*self.tilesize) and mouse[1] <= (
          row*self.tilesize)+self.tilesize: 
          texture = self.ht 

       display.blit(texture, 
          (column*self.tilesize, row*self.tilesize)) 




tilemap = Tilemap(10,10,40, 
        # Load the textures 
        {0: pygame.image.load("tile1.png"), 
        1: pygame.image.load("tile2.png") 
        } 
       ) 

tilemap.generate_random() # Generate a random tilemap 

pygame.init() 
DISPLAYSURF = pygame.display.set_mode((tilemap.size)) 
# Load the highlighter 
tilemap.ht = pygame.image.load("highlight.png").convert_alpha() 

while running: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 

     # Draw the tilemap 
     tilemap.draw(DISPLAYSURF, pygame.mouse.get_pos()) 

    pygame.display.update() 

さらに詳しい説明が必要な場合はお気軽にお問い合わせください。あなただけwhile running:

# Load the highlighter 
tilemap.ht = pygame.image.load("highlight.png").convert(8) 
tilemap.ht.set_alpha(64) 

前に行tilemap.ht.set_alpha(<VALUE>)を追加する場合

答えて

2

タイルは透明になります。値は0〜255(両端を含む)です。 convert_alpha()convert(8)に変更して、8ビットにしました。

出典:

how to use pygame set_alpha() on a picture

追加注:新しいタイルが選択されるまで、それが再び描画されないように、正方形が強調表示されているの追跡を実装することをお勧めします。この時点で、マウスが動かされると、選択されたタイルの上に四角形が描かれ続け、透明度が低くなります。

例:継続的な選択

1

あなたはpygameの内表面に描くたび対

enter image description here

初期選択、前のフレームのデータが消えません。 アルファを描画しているので、部分的に透明な以前の図は同じ位置にあり、部分的に透明なタイルを各フレームとともに同じ場所に描画しています。それにより、その正方形が最終的な色に近づき、近づきます。あなたが典型的にやることは、あなたがブリッティングしている領域を消去してから再描画することです。この場合、あなたはあなたのdisplay.blit前にこれをしたいと思います:これはあまりにも長い間、あなたの背景が黒であるとして動作します

display.fill((0,0,0), (0, 0, column*self.tilesize, row*self.tilesize)) 
display.blit(texture, (column*self.tilesize, row*self.tilesize)) 

。あなたが背景のイメージを持つことになったら、その代わりに背景イメージスライスをblitするだけです。

サンプルコードはありませんので、このコードはテストされていませんが、問題がある場合はお知らせください。回答を更新します。

関連する問題