Leighのるび日記 RSSフィード

2008-01-18

[]PID制御予測弾 15:13 PID制御予測弾 - Leighのるび日記 を含むブックマーク はてなブックマーク - PID制御予測弾 - Leighのるび日記

厳密に言うとPID制御でもなく、予測弾でもないのですが、弾が面白い挙動を示したのでメモ。


  • bullet.rb
require 'mygame/boot'

class Bullet
 def initialize(x,y,aim_x,aim_y,v)
 	@x = x
 	@y = y
 	@v = v
	create_image
 	set_aim(aim_x,aim_y)
 end
 
 def create_image
 	@image = TransparentImage.new("img/bullet1.bmp")
 end

 def set_aim(aim_x,aim_y)
	@norm = Math::sqrt((aim_x - @x)*(aim_x - @x) + (aim_y - @y)*(aim_y - @y))
 	@v_x = @v*(aim_x - @x)/@norm
 	@v_y = @v*(aim_y - @y)/@norm
 	@ang = -90+180*Math::atan2((@y - aim_y),(@x - aim_x))/Math::PI
 	@image.angle = @ang
 end

 def set_v(nv)
 	@v_x = nv*@v_x/@v
 	@v_y = nv*@v_y/@v
 	@v = nv
 end
 
 def move
 	@x += @v_x
 	@y += @v_y
 	@image.x = @x
 	@image.y = @y
 end
 
 def render
	@image.render
 end
end


class Barrage
 def initialize(x,y,aim_x,aim_y,v,ang,n)
 	@x = x
 	@y = y
 	@aim_x = aim_x
 	@aim_y = aim_y
 	@v = v
	@ang = ang
	@n = n
	@bullet = []
	create_bullet
 end
 
 def create_bullet
 	sect = @ang*Math::PI/((@n-1)*180)
 	st = Math::atan2((@y - @aim_y),(@x - @aim_x))-@ang*Math::PI/(2*180)
 	@n.times do |i|
 	@bullet << Bullet.new(@x,@y,@x-Math::cos(st+sect*i),@y-Math::sin(st+sect*i),@v)
 	end
 end

 def move
 	@bullet.each{|x| x.move}
 end
 
 def render
 	@bullet.each{|x| x.render}
 end
end

  • main-PID.rb

require 'mygame/boot'
require 'bullet.rb'

#load image
mychar = TransparentImage.new("img/mychar.bmp")

#start config
move_speed = 4
inner_w = screen.h * screen.h / screen.w
min_x = (screen.w-inner_w + mychar.w)/2
min_y = mychar.h/2
max_x = (screen.w+inner_w - mychar.w)/2
max_y = screen.h - mychar.h/2
frame_width = (screen.w - inner_w)/2

mychar.x = inner_w / 2 + min_x
mychar.y = max_y * 3 / 4
mychar.angle =90

bl_x = inner_w / 2 + min_x
bl_y = -15
bl_speed = 10
bl_num = 30
bl_dly = 10
bl = []
bl_num.times do
 bl << Bullet.new(bl_x,bl_y,mychar.x,mychar.y,0)
end
counter = 0

I_gain = 0.4
D_gain = 6
exD_gain = 5

inte_t = 60
thita_history = []

inte_t.times do
	thita_history << Math::atan2((mychar.y-bl_y),(mychar.x-bl_x))
end

counter =0
bl_this = 0

box1 = FillSquare.new(0,0,(screen.w-inner_w)/2,screen.h,:color =>[64,64,64])
box2 = FillSquare.new((screen.w+inner_w)/2,0,(screen.w-inner_w)/2,screen.h,:color =>[64,64,64])

#main loop
main_loop(60) do

	#PID feedback
	r_now = Math::sqrt((mychar.y-bl_y)*(mychar.y-bl_y)+
						(mychar.x-bl_x)*(mychar.x-bl_x))
	thita_now = Math::atan2((mychar.y-bl_y),(mychar.x - bl_x))
	thita_def = thita_now - thita_history[inte_t-1]
	
	thita_history.shift
	thita_history << thita_now
	thita_ave = 0
	thita_history.each{|e| thita_ave += e}
	thita_ave /= thita_history.length
	
	thita_crr = thita_now + I_gain*(thita_ave-thita_now) + D_gain*thita_def + exD_gain*10*(thita_ave-thita_history[0]).abs*thita_def
	x_crr = r_now*Math::cos(thita_crr) + bl_x
	y_crr = r_now*Math::sin(thita_crr) + bl_y
	
	#move mychar
	mychar.y -= move_speed if key_pressed?(Key::UP)
	mychar.y += move_speed if key_pressed?(Key::DOWN)
	mychar.x -= move_speed if key_pressed?(Key::LEFT)
	mychar.x += move_speed if key_pressed?(Key::RIGHT)
	
	mychar.x = min_x if mychar.x < min_x
	mychar.y = min_y if mychar.y < min_y
	mychar.x = max_x if mychar.x > max_x
	mychar.y = max_y if mychar.y > max_y
	
	mychar.render
	
	#move bullet
	if counter % bl_dly == 0
		bl[bl_this]=Bullet.new(inner_w / 2 + min_x ,frame_width/2-20,x_crr,y_crr,bl_speed)
		if bl_this == bl_num
			bl_this = 0
		else
			bl_this += 1
		end
	end

	if counter > bl_num * bl_dly
		counter = 0
	else
		counter += 1
	end

	bl_num.times do |i|
		bl[i].move
		bl[i].render
	end

	#display FPS
	box1.render
	box2.render
	Font.render "FPS:#{real_fps()}", :x=> 0, :y=> 0
	Font.render "thita:#{thita_crr}", :x=> 0, :y=> 20
	Font.render "x:#{x_crr}", :x=> 0, :y=> 40
	Font.render "y:#{y_crr}", :x=> 0, :y=> 60
end

JanainaJanaina2013/01/28 02:41If you're rdieang this, you're all set, pardner!

gxqdwiogigxqdwiogi2013/01/28 12:21lhDE4l <a href="http://lummccjsutye.com/">lummccjsutye</a>

fsqmjuzimfsqmjuzim2013/01/30 04:01uxYX11 , [url=http://keklfxhcjyxi.com/]keklfxhcjyxi[/url], [link=http://fzajlyrvvcpm.com/]fzajlyrvvcpm[/link], http://gqijoknzxtin.com/

wrslmmuywrslmmuy2013/01/30 13:22JARfnN <a href="http://oswmafmfywno.com/">oswmafmfywno</a>

ckzsklckzskl2013/01/31 16:22yataID , [url=http://tyeuarwzutxt.com/]tyeuarwzutxt[/url], [link=http://bsxapctefgug.com/]bsxapctefgug[/link], http://rwxtegupaxwi.com/

2008-01-16

[][]StarRuby 23:00 StarRuby - Leighのるび日記 を含むブックマーク はてなブックマーク - StarRuby - Leighのるび日記

Star Ruby - 2D ゲームライブラリ

なかなか良さそうなライブラリです。

RubySDLで作っていたものをちょっと移植してみようと思います。

LysaLysa2013/01/25 17:51At last! Soemnoe who understands! Thanks for posting!

2008-01-04

[]弾数制限STG 18:02 弾数制限STG - Leighのるび日記 を含むブックマーク はてなブックマーク - 弾数制限STG - Leighのるび日記

というのを思いついた。

リロードをシステムに入れるだけでもかなり雰囲気が変わると思います。

弾数制限というとガンフロンティアの最後を連想しますね。

ガンフロンティア - Wikipedia

リロードを必要にすることで連射するために技術が必要になるところがミソかなと思います。

RAY-KUDRYAVKAシリーズはリロードがありますけれど、弾数が多いため連射に切れ目ができること以外に存在感がないです。

実際のところ6発ぐらいですぐリロードにした方がシステム的におもしろそうな予感がします。

LeonardLeonard2014/06/10 09:52This is exactly what I was looking for. Thanks for wrtgini!

2007-11-24

[]MyGame使ってみた 11:22 MyGame使ってみた - Leighのるび日記 を含むブックマーク はてなブックマーク - MyGame使ってみた - Leighのるび日記

とりあえず、自機狙いのWay弾を実装してみた。

弾のクラスと弾幕のクラスを用意して弾の操作は弾幕クラスから行うようにした。

かなり適当に作ったので微妙。(ソースは後で上げます)


結論

  • 画像の回転を使うとかなり遅くなるので予め回転した画像を用意しておいた方が良い
  • 基本的に一画像一キャラなので大きいビットマップファイルからのきりだしはRuby/SDLを直接いじって自分でやる必要がある
  • けっこう遅いのでアルファブレンディングとかブラーとかあんまりしない方がよさそう

JomeiniJomeini2013/11/13 00:01What a plseaure to meet someone who thinks so clearly

MounikaMounika2013/11/13 11:03Wow! Great to find a post <a href="http://nnvknn.com">knkiocng</a> my socks off!

TitasTitas2013/11/14 22:31I can't bevilee I've been going for years without knowing that. http://zemqces.com [url=http://ufqwlelqdmz.com]ufqwlelqdmz[/url] [link=http://afpwtge.com]afpwtge[/link]

ElelwaniElelwani2013/11/15 23:44Tha'ts going to make things a lot easier from here on out.

DaisyDaisy2013/11/16 13:29It's a real <a href="http://xgpkli.com">plresuae</a> to find someone who can think like that

UlisesUlises2013/11/18 20:15Most help articles on the web are inaccurate or intrceoenh. Not this! http://dqpytjmekk.com [url=http://rksjlwpz.com]rksjlwpz[/url] [link=http://excipnszxn.com]excipnszxn[/link]