Skype Application-to-Application

前やったら成功した。実験用ソース乗せとく。
あと毎晩テスト期間中にもかかわらず実験に付き合ってくれたBlackManに多謝。

Skype Application-to-Applicationがなにかっていうと、要するに
Skypeをインフラにしてしまおう。っていう話。
電話ができてチャットができるんだったらゲームのデータ乗せたっていいじゃんっていう発想だと思う。
というわけでこれで通信対戦をもくろんでたりする。
誰か先を越したら教えてもらえると悔しい・・・でも・・・ってなると思う。というわけで教えて。
あと、自分でApplication-to-Applicationについて調べるときは、
「AP2AP」「App2App」「APtoAP」とかいろいろ試したほうがいい。

Required:Skype4Py, Pygame

import Skype4Py
from Skype4Py import *

def quit(event, app):
    if event.type == QUIT:
        pygame.quit()
        sys.exit(0)
        app.Delete()
    elif event.type == KEYDOWN and event.key == K_ESCAPE:
        pygame.quit()
        sys.exit(0)
        app.Delete()

import pygame
from pygame.locals import *

SCREEN_SIZE = (640, 480)

pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption('')

background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((255, 255, 255))

def tuple2str(t):
    return str(t[0]) + " " + str(t[1])
def str2tuple(s):
    temp = s.split(" ")
    return (int(temp[0]), int(temp[1]))

class Myself(pygame.sprite.Sprite):
    def __init__(self, app):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((32, 32))
        pygame.draw.circle(self.image, Color("red"), (16, 16), 16)
        self.image.set_colorkey(Color("black"))
        self.rect = self.image.get_rect()
        self.app = app
    def sendpos(self):
        self.app.SendDatagram(tuple2str(self.rect.center))
    def update(self):
        self.sendpos()

class Enemy(pygame.sprite.Sprite):
    def __init__(self, skype):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((32, 32))
        pygame.draw.circle(self.image, Color("red"), (16, 16), 16)
        self.image.set_colorkey(Color("black"))
        self.rect = self.image.get_rect()
        skype.OnApplicationDatagram = self.receivepos
    def receivepos(self, app, stream, text):
        print str2tuple(text)
        self.rect.center = str2tuple(text)

screen.blit(background, (0, 0))
pygame.display.flip()

skype = Skype4Py.Skype()
skype.Attach()
app = skype.Application("pythontest")
app.Create()

f = open("./name.txt", "r")
name = f.readline().replace("\n", "")
f.close()
print name

stream = app.Connect(name, True)

clock = pygame.time.Clock()

myselftest = Myself(app)
enemytest = Enemy(skype)

sprgrp = pygame.sprite.RenderPlain([myselftest, enemytest])

while 1:
    clock.tick(60)
    events = pygame.event.get()
    screen.blit(background, (0, 0))
    for e in events:
        quit(e, app)
    if pygame.key.get_pressed()[K_UP]:
        myselftest.rect.y -= 1
    if pygame.key.get_pressed()[K_DOWN]:
        myselftest.rect.y += 1
    if pygame.key.get_pressed()[K_LEFT]:
        myselftest.rect.x -= 1
    if pygame.key.get_pressed()[K_RIGHT]:
        myselftest.rect.x += 1

    sprgrp.update()
    sprgrp.draw(screen)
    pygame.display.flip()

起動するとカレントディレクトリ内にある(はずの)"test.txt"に書いてある接続先の
Skype名を読みにいく。ないと例外起こして爆発するので注意。
あと、接続が確立されるまで応答無しになって、タイトルバーにも「応答なし」ってでるけど
接続が確立されたら解除されるのでご安心を。仕様です。
通信飛んできたら速効で丸の位置を変更しに行くので、メインループから操作しづらい気がする。
実際に使うときは要求をリストかなんかにためてスタックにするといいかもわからん。
あとマルチスレッド?とか?かな?