roguev6 > guirogue.py


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

きもちわるいドットが動き回るだけ。

まだまだ。

1.コマンド待機モード

(メニュー開いてアイテムの観覧、使用について、キャラの向き変え、移動、攻撃)

2.決定したコマンドを利用してroguecoreのターンを増加

[result] = roguecore.appendterm

3.増加した差分によってフィールド上のanimationを行う。ここはボタンスキップ可能。


schene内にもpygameが食い込むのはちょっとイヤだす。

#coding:shift_jis
import pygame
from pygame.locals import *
import rogue

class VPad:
  instance=None
  def __init__(self):
    if VPad.instance:
      raise Exception(u'Singletonにおいてインスタンスが2度作られた')
    self.paddata={
        'a':False,
        'b':False,
        'start':False,
        'select':False,
        'up':False,
        'down':False,
        'left':False,
        'right':False}
    self.oldpad = self.paddata.copy()
  @staticmethod
  def get_instance():
    if VPad.instance == None:
      VPad.instance = VPad()
    return VPad.instance
  def __getitem__(self,key):
    if not key in self.paddata:
      return False
    return self.paddata[key]
  def updatekeys(self):
    keytables={
        K_z:'a',
        K_x:'b',
        K_b:'select',
        K_SPACE:'start',
        K_UP:'up',
        K_DOWN:'down',
        K_LEFT:'left',
        K_RIGHT:'right',
        }
    self._saveold()
    state = pygame.key.get_pressed()
    for key in keytables:
      if state[key]:
        self.paddata[keytables[key]]=True
      else:
        self.paddata[keytables[key]]=False
  def _saveold(self): 
    for key in self.paddata:
      self.oldpad[key] = self.paddata[key]
  def on(self,key):
    return (not self.oldpad[key]) and (self.paddata[key])
  def off(self,key):
    return (self.oldpad[key]) and (not self.paddata[key])

class SequenceBase:
  def __init__(self):
    pass
  def update(self):
    print u'シーケンスを実装してください'
    raise Exception()
  def draw(self,back):
    print u'シーケンスを実装してください'

import random
class TitleScene:
  def __init__(self):
    def make_powder():
      return [random.randint(0,160),
              random.randint(0,120),
              random.random()*2-1,
              random.random()*2-1]
    self.powder=[]
    [self.powder.append(make_powder()) for x in range(32)]
  def update(self):
    pad = VPad.get_instance()
    if pad['a']:
      return NextScene()
    for p in self.powder:
      if p[0] < 0 or p[0] > 160:
        p[2]*=-1
      if p[1] < 0 or p[1] > 120:
        p[3]*=-1
      p[0]+=p[2]
      p[1]+=p[3]
    return self
  def draw(self,screen):
    for p in self.powder:
      pygame.draw.rect(screen,0x000000,(p[0],p[1],2,2))

class NextScene:
  def update(self):
    return self
  def draw(self,screen):
    pass

class MainScene:
  def __init__(self):
    self.current = TitleScene()
  def update(self):
    next_frame = self.current.update()
    if next_frame != self.current:
      self.current = next_frame
  def draw(self,screen):
    self.current.draw(screen)

screen_size=(640,480)
def entry(game):
  pygame.init()
  primary = pygame.display.set_mode(screen_size)
  back = pygame.Surface((160,120))
  tf = pygame.transform
  clock = pygame.time.Clock()
  key = VPad.get_instance()
  while True:
    for event in pygame.event.get():
      if event.type == QUIT:
        return
    key.updatekeys()
    game.update()
    back.fill(0xFFFFFF)
    game.draw(back)
    primary.blit(tf.scale(back,screen_size),(0,0))
    pygame.display.flip()


if __name__=='__main__':
  entry(MainScene() )