2015年3月9日 星期一

pygtk cairo動畫(續),使用元件類別,讓各元件做出獨特動作


原碼下載:




在遊戲中飛碟王是用sub_picture.py模組來建立,讓各部元件有自己影像和移動方式,生命低於200,會伸出手臂,攻擊玩家,有教學文件,也有範例


move_object還提使用sub_picture.py模組來建立,讓各部元件有自己影像和移動方式,A和B其實用C都可取代掉的

  1.先import sub_image_fly如下
    from sub_fly_king import sub_image_fly
  2.建立主影像list,這裡只用一元素,可幾個都沒關係,在用move_object建立移動物這樣就OK,0,0是相對座標,如下:
    p=[sub_image("src/png/f1.png",0,0)]
    move_fly_king=move_object(self,self.darea,p,None,None,"RECEVER_collision_fly","SEND_move_fly",self.king2_life)#生命50
  3.隨時可用add_sub_image()來加入sub_image,如下:
                p1=[sub_image_fly1("src/png/fp.png",80,10),sub_image_fly1("src/png/fp.png",20,10),sub_image_fly1("src/png/fp.png",140,10)]#旋轉燈
                p2=[sub_image_fly("src/png/f2.png",-10,0,move_fly_king),sub_image_fly("src/png/f2.png",170,0,move_fly_king)]#攻擊手臂
                move_fly_king.add_sub_image(p1)#加入旋轉燈
                move_fly_king.add_sub_image(p2)#加入攻擊手臂
                move_fly_king.set_move_type("直線X")   
                move_fly_king.set_y(20)
  4.預設sub_image移動是跟move_object是一致,只是多相對座標,預設方法move_update,給主移動物x,y,又傳回去,沒改變甚,如下:
        def move_update(self,x,y):#想成移動物的x,y就可,要如何更新
        return x,y
         
    def get_surface_cr(self,cr,x,y):#給參考點回傳一個cr surface,會被move_object執行續一直呼叫
        self.x,self.y=self.move_update(x,y)[0]+self.x_r,self.move_update(x,y)[1]+self.y_r
        return cr.set_source_surface(self.p,self.x,self.y)
  5.假設我們要讓各部元件有自己移動方式,只要繼承sub_image,然後覆寫move_update這樣就OK,舉個例子上面第3點中sub_image_fly1("src/png/fp.png",80,10),
    就是繼承sub_image如下, 下面move_update,給主移動物x,y,然後每次角度多1度,造成這個部件,繞著主移動物的相對座標(80,10),以半徑10繞圈圈

     from sub_picture import sub_image
     import math,cairo
     class sub_image_fly1(sub_image):
         def __init__(self,image_path,x,y):
             #呼叫了父類別建構式
        super(sub_image_fly1,self).__init__(image_path,x,y)
        self.scale=0
         #super(sub_image_fly,self).__init__(image_path,x,y)
     #複寫父類別move_update
         def move_update(self,x,y):#想成移動物的x,y就可,要如何更新

            self.scale=self.scale+1
            if(self.scale>=360):self.scale=0
            offset_value=(float(self.scale))/180.0*math.pi
            x=x+10*math.cos(float(offset_value))
            y=y+10*math.sin(float(offset_value))
            return x,y

沒有留言: