絵を描いたりネットいろいろ
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
えでぃた

えでぃたを作るかどうか考え中

作るならリージョン使って
非矩形ウィンドウなんだけど

C#.NETの開発環境は入れられない、ので
WinAPI直うち、でウィンドウは作って
中身はRubyで動かすとか、

ruby-gtkでできるサンプルはあったけど、意味不明な事になってた
タイトルバーが見えてるけどふざけてんの?

内部作ってから非矩形にするのでもいいんだけどな
どうすっか
そっちのほうがいいか

モチベーションは大切にしよう
また明日
    5..
comっていうやつ
http://jp.rubyist.net/magazine/?0003-Win32OLE

require 'win32ole'

# puts WIN32OLE_TYPE.progids

ym = WIN32OLE.new("RDE.CodeWindow")
puts ym.ole_methods


適当に

遊んでた


IEやエクセルなら情報でてるけど
流石にRDEのCOM情報なんてWebで拾えるわけがなかった

oleメソッド一覧みたけど、よくわかんなかった
COMは確かに便利だと思うけど、はっきりいって外部から調べようがなくね

有名アプリケーション以外のCOMを操作するのはあきらめたほうがよさそう
つうか個人の作ったアプリのCOM利用はちょっと不安な技術、
そのうちWindowsが何とかするでしょこれ
COMていうものがありますよ~ってのは、中級レベルくらいになれば知る技術だと思うけど
ありますよ~ってだけで使える人は絶対に少ない、目に見えない機械語の塊を
関数オブジェクトと見て、プログラミングするっていう不安な技術
だから情報が出ない

COMの作り方はこんな感じらしい
http://www.dinop.com/vc/com003.html

これを見てわかるとおり、ただでさえCOMはソースコードの見えない機械語の塊を関数コールするようなもので
思い通りに動作しないときに、自分のCOMを扱うコードが間違っているか、COM側のコードが間違っているかがわからない

なのでWindowsに標準でついているアプリや有名アプリ以外のCOMを利用するのは
ちょっとあまりに不安すぎる

COMってこのままじゃちょっとダメだ
しいていうなら仕様の公開されていないdllライブラリを関数名と引数を調べながら
printfデバッグしながら使うような感じ
「ぁ、動いたw これでよさそうだw」 みたいな。
exe側のソースコードとかはすべて見えるようにして貰わないとこれは無理

もう必要のない概念。
COMを作る代わりにアプリケーション側が外部設定ファイルや
外部スクリプトを読み込めるように設計していればCOMいらなくなる
スクリプト言語なんて実行してられないレベルのpc実行速度の時代には
重宝した技術かも知れないね
普通に見えないソースコードをソースコードで包むなんてどう考えても危ないから、多分これもういらないはず
    0..
てs

a=[4,5,56].each_with_index.each_with_object(10).map do | ( a , i ) , b |
p i
p b
77
end

p a

    0..
初心者がよく逝っちゃうC++WinAPIゲーム作りを全力アンチする
とりあえずウィンドウ表示
まともに描くと長いから色々てきとーにかいているのでコンパイル通るかはわかりません

まともなWinprocは
http://www.geocities.jp/ky_webid/win32c/002.html
とかで


#include <windows.h>
#include <iostream>
using namespace std;

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
void mainloop();

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
WNDCLASSEX wc = { 0 };
MSG msg;
HWND hWnd;

wc.cbSize = sizeof(wc);
wc.lpfnWndProc = WndProc; // ウィンドウプロシージャ
wc.lpszClassName = "name";
RegisterClassEx( &wc );

// ウィンドウを作成する
hWnd = CreateWindow(wc.lpszClassName,"title",WS_OVERLAPPEDWINDOW, 0,0,0,0,0,0,0,0);
// ウィンドウを表示する
ShowWindow( hWnd, SW_SHOW );

while( true )
{
if(PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)) {
if(!GetMessage(&msg, NULL, 0, 0)) break;
TranslateMessage( &msg );
DispatchMessage( &msg );
mainloop(); // メインループ
}
}
return msg.wParam;
}

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc( hWnd, msg, wp, lp );
}

//メインの処理をここにかく
void mainloop() {

}






WinAPIのこの手の最初のウィンドウ表示プログラムがネット上に何種類もあったり

tchar使ってたり意味わからない事になっているのは
WinAPIの歴史が長いから、「これからの時代はこうしたほうがいいかな?」「いや、これからの時代はこうかくべきでしょう」
みたいな、そんな主張がソースコードに込められて
意味わからないくらい無駄に多種多様になってしまいましたとさ

どれが一番いいのか
それは、もうどれもいらないっていう状況

今の時代に書くWinAPIのソースコードなんて
動けば何でもいいんです
歴史も長いので、コンパイラが大体融通きかせて何とかするからね。

WinAPIは.NETに置き換えられたので
C,C++からWinAPIでプログラミングするくらいなら、C#.NETでやるのが最善です
なので、WinAPIはこうかいたほうがいい!みたいな主張はもういらなくて、
本当は極力WinAPIのソースコードをかかないのがいいんです
それでも、いろんなしがらみ上、WinAPIを学びたいって人は、まだこれからもでてくるはずなので
WinAPIアンチとともに、WinAPIで(WinAPIの学習目的で)ゲーム作りたい人のために、
少し文章をかいていきます

WinAPIでゼロからゲームプログラムを作るなら、
以下のライブラリを自作する必要があります。

WinAPIでやるなら、まず最初にライブラリを作らないといけない
そうしないとバグが残ってしまう & ソースコードが冗長しすぎるんです
行数自慢とか古いんです。行数は少ないほうが良いに決まってる。


1 ダブルバッファリング ( 画面をちらつかせない為に
2 スプライト ( 画像の透明化などをする
3 PlgBlt関数 ( 画像の回転
4 GC等 ( WinAPIは無駄にいろんなオブジェクトが多いので、
  実際に少し大きなソースコードを書こうとしたら、自分でGC等を作ってそれを使わないとすぐメモリリークで死ねる
5 デバッグ用の表示関数 
6 sin / cos / tan 使ってオブジェクトの移動処理
7 当たり判定各種

WinAPIは、調べていけば一応Windows上でのすべての事ができます。
でも、WinAPI関数はたまに「なんでこんな引数なの・・・・」とか、そういうひどい関数にも時より巡りあう
( ウィンドウプロシージャのところが既にそうだと思う )

1 ダブルバッファリング
2 スプライト 画像の透明化
3 PlgBlt関数 画像の回転
6 sin / cos / tan 使ってオブジェクトの移動処理
7 当たり判定各種
このあたりは、ゲームライブラリで標準で備わってる

WinAPIでかくと、その1~7だけで1000行程度にはなるでしょうね
設計がど下手でしかもWinAPIを丁寧に書いちゃう人だと、これだけで下手すると10000行とかいくはずです。カワイソ
結局、最終的にはそうやって自分でライブラリを作って

Window.draw(hdc2 , 0, 0 );
とか
Sprite.draw(g , 100 , 200 );

なんていうソースコードを描くだけなので
ライブラリ側をWinAPIで作るか、最初から用意されてるライブラリを使うかの違いです
もしライブラリ側で、備わっているのであれば、
丁寧にC++WinAPIで1万行かけたソースコードは、数十行になります

一番大きな点は、4で
WinAPIだと、かなりの時間をかけなければ
ちゃんとWinAPIをラップできないんです( WinAPI直うちしてると普通にバグが残る )
だから、(無駄な)オブジェクトの取得開放が、WinAPI以外のライブラリでは
WinAPIほどは気にしなくていいので、メモリリークがずっと少なくなるはずです
はっきりいってWinAPIでメモリリークなしにプログラムを完成させれる人は
自分でGC等を作れるか、よほど慣れているかのどちらかです
WinAPI以外でプログラミングする時にも、GC等はあったほうがいいんだけど、WinAPIほどオブジェクトの取得開放が
キチガイ染みてるライブラリは無いと思うので、なくても何とかなるレベルです
そういうところがWinAPIでゲームつくりは無駄ですよって思うところ

ようはなるべく、自分でゼロからソースコードを書くというのだけは本当に一番最初の頃だけ
「自分はまだまだ初心者かな」って思う時だけにして、少しできるようになったら
極力自分ではソースコードを書かずに、Webから既に作られたライブラリを探して
それを使うようにすべきです

自分が、ゲームプログラミングしようとした頃は、
検索すると、C++とWinAPIとDirectXの資料ばっかり出てきたので
あ、これでいいのかなって思って
C++/WinAPIで普通に作っていた時期がありました
数万行の無駄過ぎるソースコードがHDDに眠ってます


上に上げた1~7のライブラリに加えて、
そこら辺のゲームライブラリにある機能は、だいたいすべて何もかもWinAPIで実装してしまいました
なんていうかライブラリっていうか、フレームワークって呼んでもいいレベルですけど
 
もうC++使わないし、WinAPIも使わないので
すべていま無駄になっています^^

あひゃひゃ


こんなことにならないように、WinAPIはやめましょうってことをいいたい

一応、経験にはなったけどねwwwwwwwwwwwww



だから何を使えばいいかって事だけど、的確に答える自信がない
っていうか、自分から言わせれば2012年にはいいものが何もない
ゲームライブラリのほとんどは、C++かC#で使うものだけど、
C++,C#をあまり勧める気にはならない

スクリプト言語側では、Rubyがかなり完成度高いから
速度必要のないゲーム作るんだったらそれでいいんだけど
速度を必要とするゲームを作ろうとした場合は
ネイティブ言語側には、2012年の時点でまだ完成度の高い言語が存在していない
なので数年置きに「どの言語を使えばいいのか?」なんていう問いへの答えはどんどん変わっていくって事でした
確かにC++よりは良くて、今はC#がいいみたいに言われてるけど、C#が誕生したせいでVBが使われなくなった事を知っていれば
C#があと5年先も存在してるかどうか怪しい事は・・・わかるよね、どんなに長くてもC#は10年後には絶対に非推奨の言語になってるだろう
結局まだ今の時代はまだ色んな物が発展途中だから、流行りの言語やLibを使っていくしかないかも
とりあえずWinAPIでゲームプログラミングだけはやめておくべき

勉強目的や、WinAPIが、いかにカスみたいな実装されているかを知りたければ
やってみてもいいと思う
いずれにせよ、.NETがもう少しC#以外の言語からも使いやすいようにされてくれば
WinAPIは完全に使われなくなっていくはずで、初心者が迷い込むことなくなると思うんだけど
まだ他言語から.NETがっぜんぜん触りにくいんだよMS仕事してほしい

少し時間がたてばまた意見は変わると思うけど
2012年2月時点で、もし自分がまともにゲーム作りをするなら
C++/Ruby/DirectXでやりますね
C#のほうがC++より言語仕様はいいんだけど・・・、
どうせ将来成長も止まって使われなくなる事が決定してるような言語でソースコードの遺産を作ろうとは思わない
MSはもうD作り始めてるからね,C#捨てる気満々ですよ
一応C++はまだ成長し続けてるから、C#よりは先の未来を期待できる
    0..
クロージャ、ラムダ >>>>超えられない壁>>>>クラス、オブジェクト指向>>>>関数型
世界の9割のコードがキチガイかと思った
    0..
ruby win32ole IE操作  あと  rubyからwsh

なんかちょうどいいのあったので、
でも古かったから、ちょっと手直しして動くようにした

http://www.tech-notes.dyndns.org/win32ole/ie_lib_document.html



require 'win32ole'

class IE_Wrapper
def initialize(raw_object, ie_obj=nil)
@ie = ie_obj
@raw_object = raw_object
end


def raw
@raw_object
end

private

def method_missing(m_id, *params)
missing_method_name = m_id.to_s
# downcase method name
if methods.include?(m_id.to_s.downcase)
send(m_id.to_s.downcase.intern, *params)
else
begin
@raw_object.send(m_id, *params)
rescue
raise $!,$!.message, caller
end
end
end

def inspect()
self.class
end

def set_ie(ie_obj)
@ie = ie_obj
end

COMPLETE_STATE = 4
def wait_until_stable(ie)
return unless ie
while ie.busy == true
sleep 0.5
end

loop do
break if ie.readyState == COMPLETE_STATE
sleep 0.5
end
end


end

# ========================
# IE
# ========================
class IE < IE_Wrapper
def initialize(visible_flag = true)
@raw_object = WIN32OLE.new("InternetExplorer.Application")
@ie = @raw_object
if visible_flag
@ie.visible = true
end
end

def document()
doc = Document.new(@ie.document, @ie)
end

def navigate(url)
@ie.navigate(url)
wait_until_stable(@ie)
end

def wait_stable()
wait_until_stable(@ie)
end

# ========================
# IE.Document
# ========================
class Document < IE_Wrapper
def frames(index=nil)
if index
return(nil) if index >= @raw_object.frames.length
Frames.new(@raw_object.frames, @ie)[index]
else
Frames.new(@raw_object.frames, @ie)
end

end

def all()
TagElementCollection.new(@raw_object.all, @ie)
end

def tags(tag_name)
TagElementCollection.new(@raw_object.all.tags(tag_name), @ie)
end

def head()
TagElementCollection.new(@raw_object.all.tags("HEAD"), @ie)[0]
end

def body()
TagElementCollection.new(@raw_object.all.tags("BODY"), @ie)[0]
end
end


# ========================
# TAG Element Collection
# ========================
class TagElementCollection < IE_Wrapper
def [](index)
if index.class == Fixnum
return(nil) if index >= @raw_object.length
TagElement.new(@raw_object.item(index), @ie)
elsif index.class == Range
raise "Range Not Support for TagElementCollection#[]"
end
end

def size
@raw_object.length
end

def each
@raw_object.each {|tag_element|
yield TagElement.new(tag_element, @ie)
}
end

def get_tag_by_title(target_str)
get_tag_by_key(target_str, "VALUE")
end
def get_tag_by_value(target_str)
get_tag_by_key(target_str, "VALUE")
end

def get_tag_by_text(target_str)
get_tag_by_key(target_str, "INNERTEXT")
end

def get_tag_by_name(target_str)
get_tag_by_key(target_str, "NAME")
end

def get_tag_by_option(target_str)
get_tag_by_key(target_str, "INNERHTML")
end

def inspect()
element_inspect_list = []
self.each {|tag_element|
element_inspect_list.push tag_element.inspect
}
"#{self.class},#{element_inspect_list.join('/')}"
end

private

def get_tag_by_key(target_str, key_type)
tag_list = []
@raw_object.each {|tag_element|
case key_type
when "INNERTEXT"
key_string = tag_element.innerText.gsub(/\s/, "")
when "VALUE"
key_string = tag_element.value.gsub(/\s/, "")
when "NAME"
key_string = tag_element.name
when "INNERHTML"
key_string = tag_element.innerHTML.gsub(/\s/, "")
else
return nil
end
if key_string =~ /#{target_str}/
tag_list.push TagElement.new(tag_element, @ie)
end
}
case tag_list.size
when 0
return nil
when 1
return tag_list[0]
else
return tag_list
end
end
end

# ========================
# TAG Element
# ========================
class TagElement < IE_Wrapper
def tagname
@raw_object.tagName
end

def text=(set_text)
case tagName
when "SELECT"
option_list = tags("OPTION")
option_list.each {|option_element|
if option_element.innerText == set_text
option_element.selected = true
break
end
}
else
@raw_object.value = set_text
end
end

def inspect()
case tagName
when "SELECT"
innerHTML = replace_cr_code(self.innerHTML)
"#{self.class}:<#{tagName}>:[#{self.innerHTML}]"
when "INPUT", "IMG", "A"
outerHTML = replace_cr_code(self.outerHTML)
"#{self.class}:<#{tagName}>:[#{self.outerHTML}]"
when "TR", "TD"
innerText = replace_cr_code(self.innerText)
"#{self.class}:<#{tagName}>:[#{innerText}]"
else
"#{self.class}:<#{tagName}>"
end
end

def to_s
@raw_object.value
end

def click
@raw_object.click
wait_until_stable(@ie)
end

def tags(tag_name)
TagElementCollection.new(@raw_object.all.tags(tag_name), @ie)
end

def all
TagElementCollection.new(@raw_object.all, @ie)
end

private
def replace_cr_code(text)
replcae_text = text.gsub(/\r/, '\r')
replcae_text.gsub!(/\n/, '\n')
return replcae_text
end
end


# ========================
# IE.Document.Frames
# ========================
class Frames < IE_Wrapper
def [](index)
return(nil) if index >= @raw_object.length
Frame.new(@raw_object.item(index), @ie)
end

def size
@raw_object.length
end

def each
index = 0
while index < @raw_object.length
raw_frame = @raw_object.item(index)
ie_frame = Frame.new(raw_frame, @ie)
yield(ie_frame)
index += 1
end
end
end

# ========================
# IE.Document.Frames.item(n)
# ========================
class Frame < IE_Wrapper
def document
Document.new(@raw_object.document, @ie)
end
end
end




ie = IE.new false
# true だとIE可視化で起動
#ie.navigate("http://www.google.com/")
ie.navigate("http://hayabusa.2ch.net/test/read.cgi/news4vip/1328169422/l50")


input_list = ie.document.body.tags("input")
input_list.each {|element|
p element
}

input_list.get_tag_by_name('FROM').text = "歳納京子ちゃんぺろぺろ"
input_list.get_tag_by_name('mail').text = "sage"

input_list2 = ie.document.body.tags("textarea")
input_list2.each {|element|
p element
}
input_list2.get_tag_by_name('').text = "ぺろぺろ"

input_list.get_tag_by_title("書き込む").click



これはIEのクッキーそのまま使う感じなので
mechanizeとはまた違うね

2chへの書き込みも余裕になった

これ  p element
 で表示してるときは
IE::TagElement:こうなってるけど
input_list2.get_tag_by_name('MESSAGE').text = "ぺろぺろ"

でも、いけた
elemetn表示のほうがミスってるのかもね
FORMに複数のtextarea あるときは、タグのnameから名前引っ張ってきて指定




wsh
-------------------------------


require 'win32ole'
wsh = WIN32OLE.new('WScript.Shell')
wsh.SendKeys "{TAB}"
wsh.SendKeys " "
sleep 1


__END__

Set objShell = WScript.CreateObject("WScript.Shell")
WScript.Sleep 1000
objShell.SendKeys "{TAB}"

objShell.SendKeys " "



エンドレスバトルがレベル上がって飽きてきたので
さらに色々自動化をしちゃう
なにがたのしいの・・・


さいきん絵かいてない
ぁああぁぁぁあぁかかないとゆゆゆゆ
    0..
ruby if 複数行

p \
\
9

if true \
||
true
p 8

end


なにこれ
マニュアルのどこにも載ってなかった気がするんだけど
\で複数行に出来るようです

プログラミングのつまんね


つまんないと思う理由は
 言語 ライブラリ エディタ OS が効率でないから
    0..
kakikomi
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。