パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

偏重型モニタの実装

2018-11-22 | DMB-8836(自作ゲーム機)
8x8のドットマトリックスでゲームを作ろうとしてもやはり狭すぎる。
なんとなく周辺のドットを荒くしてみればいいのではと実装してみました。

イメージ、太枠をLED一個とする。
複数ある箇所はその座標にある情報の中で一番輝度の高いものを選択する。



下のプログラムでwriteWorldメソッドがそれです。
このゲームは左右で回転して移動して輝く星を10個とるというものになっています、

この今回開発した謎モニタで遊んでみるとそれほど違和感なく遊べて、しかも明らかにクリアしやすくなりました。

「偏重型モニタ」名前は適当につけました。
これはちょっとした発明かも?と思っていたりしますが、きっとすでにある技術でしょう。


import time
import RPi.GPIO as GPIO
import threading
import copy
import pigpio as PIGP
import random


#RPiGPIO init
GPIO.setmode(GPIO.BCM)

#pigpio buzzer init
pigp = PIGP.pi()
soundpin = [13,18,19]

for p in soundpin:
  pigp.set_mode(p, PIGP.OUTPUT)
  pigp.hardware_PWM(p, 0, 0)

#buzzer
sstop=[0,0,0]
snum=0
sarr=[]

#onkai
hz=[0]
for i in range(120):
  hz+=[int(27.5*(1.05946364**i))]

#start sound
try:
  for j in range(1):
    for i in range(400,1000,10):
      for p in soundpin:
        pigp.hardware_PWM(p, i, 200000)
      time.sleep(0.01)
  for i in range(120):
    for p in soundpin:
      pigp.hardware_PWM(p, hz[i] ,500000)
    time.sleep(0.01)
except KeyboardInterrupt:
    pass

#moniter
vx=0
vy=0
vw=32
vh=24
vstop=0#1 thread stop
vram=[[0 for i in range(vw)] for j in range(vh)]

#dotmatrix GPIO pin
high=[2,3,4,17,27,22,10,9]
low=[24,25,8,7,12,16,20,21]

#button GPIO pin
for pin in [11,5,6,26,14,23]:
  GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_UP)

#dotmatrix GPIO pin
for pin in [2,3,4,17,27,22,10,9,24,25,8,7,12,16,20,21]:
  GPIO.setup(pin, GPIO.OUT) 

#### graphic ####
def dbox(x,y,w,h,n):
  for lx in range(x,x+w):
    for ly in range(y,y+h):
      dprint(lx,ly,n)
          
def dprint(x,y,n):
  global vram,vw,vh
  if 0>x or 0>y or x>vw-1 or y>vh-1:return
  vram[y][x]=n

def monitor():
  global vram,vx,vy,vstop,high,low
  while True:
    for t in [0,4,8,1,3,5,7,9,2,6]:
      for y in range(8):
        for x in range(8):
          if vstop==1:return
          if vram[y+vy][x+vx]>t:
             pinSet(high[x], 1)
          else:
             pinSet(high[x], 0)
        pinSet(low[y], 0)
        time.sleep(0.00001)
        pinSet(low[y], 1)

def pinSet(pin_num,sw):
  if pin_num in [2,3,4,17,27,22,10,9,24,25,8,7,12,16,20,21]:
    if sw==0:
      GPIO.output(pin_num, GPIO.LOW)
    else:
      GPIO.output(pin_num, GPIO.HIGH)

#### sound ####
def play(num,arr):
  global snum,sarr,sstop
  snum=num
  sarr=copy.deepcopy(arr)
  sstop[num]=1
  time.sleep(0.21)
  sstop[num]=0
  thread = threading.Thread(target=playsub)
  thread.start()

def  playsub():
  global snum,sarr,sstop,soundpin
  n=snum
  arr=copy.deepcopy(sarr)
  for  i in arr:
    if sstop[n]==1:
      pigp.hardware_PWM(soundpin[n], 0 ,0)
      break
    pigp.hardware_PWM(soundpin[n], hz[i] ,500000)
    time.sleep(0.2)
  pigp.hardware_PWM(soundpin[n], 0 ,0)

#### button ####
def button():
  r=""
  for b,p in zip("LUDRAB",[11,5,6,26,14,23]):
    if GPIO.input(p)==0:r+=b
  return r

#monitor start
thread_1 = threading.Thread(target=monitor)
thread_1.start()


#game
world=[[0 for i in range(100)] for j in range(100)]
back=[[0 for i in range(100)] for j in range(100)]
cx=50
cy=50
hx=[-1,0,1,1,1,0,-1,-1]
hy=[1,1,1,0,-1,-1,-1,0]
cr=5

for i in range(10):
  world[random.randint(30,70)][random.randint(30,70)]=1
for i in range(2000):
  back[random.randint(0,99)][random.randint(0,99)]=1


def writeWorld_old():
  for x in range(8):
    for y in range(8):
      if world[cy-3+y][cx-3+x]==1:
        vram[y][x]=9
      elif back[cy-3+y][cx-3+x]==1:
        vram[y][x]=1
      else:
        vram[y][x]=0

def getWorld(sx,sy,wx,wy):
  mx=0
  for x in range(sx,sx+wx):
    for y in range(sy,sy+wy):
      if world[y][x]==1:return 9
      if back[y][x]==1:mx=1
  return mx

def writeWorld():
  scx=[4,2,1,1,1,1,2,4]
  scy=[4,2,1,1,1,1,2,4]
  sy=cy-7
  for y in range(8):
    sx=cx-7
    for x in range(8):
      vram[y][x]=getWorld(sx,sy,scx[x],scy[y])
      sx+=scx[x]
    sy+=scy[y]

def hit():
  global cx,cy,world
  if world[cy][cx]==1:
    play(2,[j for j in range(40,80,2)])
    world[cy][cx]=0
        
  if world[cy+1][cx]==1:
    play(2,[j for j in range(50,90,2)])
    world[cy+1][cx]=0

  if world[cy][cx+1]==1:
    play(2,[j for j in range(45,85,2)])
    world[cy][cx+1]=0

  if world[cy+1][cx+1]==1:
    play(2,[j for j in range(35,75,2)])
    world[cy+1][cx+1]=0

def megahit():
  global cx,cy,world
  for x1 in range(cx-8,cx+8):
    for y1 in range(cy-8,cy+8):
      if world[y1][x1]==1:
        
        world[y1][x1]=0

tn=0
while True:
  tn+=1
  if "L" in button():
    if cr<7:cr=cr+1
    else:cr=0
  if "R" in button():
    if cr>0:cr=cr-1
    else:cr=7
  cx+=hx[cr]
  cy+=hy[cr]
  if button()=="UA":megahit()#testyou
  if 20>cx:cx=80
  if 20>cy:cy=80
  if cx>80:cx=20
  if cy>80:cy=20
  if "A" in button():
    play(1,[j for j in range(40,70)])
  if "B" in button():
    play(1,[j for j in range(70,40,-1)])
  if sum([sum(world[i]) for i in range(30,71)])==0:
    play(0,[j for j in range(40,120)])
    play(1,[j for j in range(42,120)])
    play(2,[j for j in range(44,120)])
    time.sleep(5)
    vstop=1
    time.sleep(0.02)
    break
  hit()
  if button()=="LUDR":
    vstop=1
    time.sleep(0.01)
    break
  writeWorld()
  time.sleep(0.05)

#end clear
GPIO.cleanup()
sstop=[1,1,1]
time.sleep(0.3)
for p in soundpin:
  pigp.hardware_PWM(p, 0, 0)
  pigp.set_mode(p, PIGP.INPUT)
pigp.stop()
    





最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。