8x8のドットマトリックスでゲームを作ろうとしてもやはり狭すぎる。
なんとなく周辺のドットを荒くしてみればいいのではと実装してみました。
イメージ、太枠をLED一個とする。
複数ある箇所はその座標にある情報の中で一番輝度の高いものを選択する。
下のプログラムでwriteWorldメソッドがそれです。
このゲームは左右で回転して移動して輝く星を10個とるというものになっています、
この今回開発した謎モニタで遊んでみるとそれほど違和感なく遊べて、しかも明らかにクリアしやすくなりました。
「偏重型モニタ」名前は適当につけました。
これはちょっとした発明かも?と思っていたりしますが、きっとすでにある技術でしょう。
なんとなく周辺のドットを荒くしてみればいいのではと実装してみました。
イメージ、太枠を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()