DOBON.NET DOBON.NETプログラミング掲示板過去ログ

旗揚げゲームの画面切り替え

環境/言語:[WindowsXP/VB.NET2008]
分類:[.NET]

初めまして、893と申します。.net歴2~3ヶ月くらいの初心者です。
早速質問なんですが、現在VB.NET2008で旗揚げゲームを作ってるんですが、画面の切り替えがうまくできません。

Private Sub btnAa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAa.Click

'赤上げて(赤下げない)単体で、絵が両方下げた状態の時。
If (TextBox1.Text = Aag OrElse TextBox1.Text = NAsg) AndAlso PB1.Image = My.Resources.neko0 Then
Call seikai()
PB1.Image = My.Resources.neko3
補足
Aag→赤上げて、NAsg→赤下げない。
neko0→両方の旗を下げている絵、neko3→赤旗のみを上げている絵。

上記のように、もし、テキストに「赤上げて(もしくは赤下げない)」と表示されていて、且つPB1(PictureBoX)のイメージが「両旗を下げている絵」の場合にボタンを押すと、PB1のイメージを「赤旗を上げている絵」に切りかえる。という風にしたいのですが、この場合だと、
「PB1.Image = My.Resources.neko0」の部分で「演算子 "=" は"System.Drawing.Image"および"System.Drawing.Bitmap"に対して定義されていません。」というエラーが出るんです。

"=" を "is" に変えてみたら、全問正解しているはずなのに何故か不正解扱いになり、ImageListを使ってみたら、切り替え後の画像のサイズがめっちゃ小さくなるし、この部分を消すと「白旗を上げている絵」の時、テキストに「赤上げて」と出た場合、「両旗を上げた絵」ではなく「赤旗のみを上げた絵」になってしまうんです。
もう頭がフットーしそうです。(つД;)
何方か解決法を教えて下さい。お願いしますOTL。
My.Resources.neko0を呼び出すたびに新しいオブジェクトを作成したいるため、Isで比較してもFalseになってしまうのでしょう。よって解決法としては、アプリケーション開始時にMy.Resources.neko0とneko3(画像がもっとあるならば全て)の内容をImage型のフィールドに格納しておき、その後はMy.Resourcesを使わずに、これらのフィールドを使ってPB1.Imageへの設定やPB1.Imageとの比較(Isで比較します)を行うといったことが考えられます。

または、現在表示している画像がどのような種類のものであるかを、列挙型のようなフィールドで覚えておくという方法もあります。
すみません。就職活動だとか合宿とかで忙しくて返事が遅れました。

>>アプリケーション開始時にMy.Resources.neko0とneko3(画像がもっとあるならば全て)の内容をImage型のフィールドに格納しておき、その後はMy.Resourcesを使わずに、これらのフィールドを使ってPB1.Imageへの設定やPB1.Imageとの比較(Isで比較します)を行うといったことが考えられます。

えと、Image型のフィールドって言うのは「Dim ○○ As Image」みたいな感じでよろしいのでしょうか?

とりあえず

Dim g0 As Image
 g0 = My.Resources.neko0

として、

If(省略)AndAlso PB1.Image Is g0 Then 

で試してみたんですが、今までと変わりませんでした。
やり方が違うのでしょうか?
> えと、Image型のフィールドって言うのは「Dim ○○ As Image」みたいな感じでよろしいのでしょうか?

そのような書き方でも良いのですが、どこに記述したのかが問題です。メソッドの中に書くと、ローカル変数になってしまいます。フィールドを知らずにプログラミングを行うというのはさすがに無謀だと思いますので、入門書等でご確認ください。

>>そのような書き方でも良いのですが、どこに記述したのかが問題です。メソッドの中に書くと、ローカル変数になってしまいます。

すみません。書き方が悪かったですね。一応クラスレベルの変数として扱っています。

Public Class Form1

Dim g0 As Image = My.Resources.neko0
Dim g1 As Image = My.Resources.neko1
Dim g2 As Image = My.Resources.neko2
Dim g3 As Image = My.Resources.neko3

 'この間は省略

Private Sub btnAa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAa.Click

'赤上げて(赤下げない)単体で、絵が両方下げた状態の時。
If (TextBox1.Text = Aag OrElse TextBox1.Text = NAsg) AndAlso PB1.Image Is g0 Then
Call seikai()
PB1.Image = My.Resources.neko3

'赤上げて(赤下げない)単体で、絵が白のみ上げている状態の時。
ElseIf (TextBox1.Text = Aag OrElse TextBox1.Text = NAsg) AndAlso PB1.Image Is g2 Then
Call seikai()
PB1.Image = My.Resources.neko1

'赤上げて(赤下げない)単体で、絵が赤を上げている状態の時。
ElseIf (TextBox1.Text = Aag OrElse TextBox1.Text = NAsg) AndAlso PB1.Image Is g1 Then
Call seikai()
PB1.Image = My.Resources.neko1
ElseIf (TextBox1.Text = Aag OrElse TextBox1.Text = NAsg) AndAlso PB1.Image Is g3 Then
Call seikai()
PB1.Image = My.Resources.neko3
Else
Call huseikai()
End If
End Sub

上記のような感じで書いていますがうまくいきません。OTL

>>フィールドを知らずにプログラミングを行うというのはさすがに無謀だと思いますので、入門書等でご確認ください。

すみません。今まで変数という言い方に慣れていたのでピンと来なくて・・・。
はじめに私の書いた「その後はMy.Resourcesを使わずに、これらのフィールドを使ってPB1.Imageへの設定やPB1.Imageとの比較(Isで比較します)を行う」という部分が無視されているようですが...。
すみません、返事が遅れました。

>>はじめに私の書いた「その後はMy.Resourcesを使わずに、これらのフィールドを使ってPB1.Imageへの設定やPB1.Imageとの比較(Isで比較します)を行う」という部分が無視されているようですが...。

すみません。PB1.Imageへの設定という部分がいまいちよくわからなくて・・・。
その設定の仕方をどうやるのかっていうのが・・・。

とりあえず文章を見てPB1.Imageと比較する時、そのまんまの意味でMy.Resourcesの部分を変数(g0やg1とか)に置き換えてIsで比較するものかと思い、あのような書き方をしたんですが、おかしかったでしょうか?
2008/10/17(Fri) 02:48:35 編集(投稿者)

> すみません。PB1.Imageへの設定という部分がいまいちよくわからなくて・・・。

設定というのは、代入の意味です。

893さんの返信を読ませていただくと、なぜこのような問題が起こるのかというもっとも大事な点が分かっていらっしゃらないように思えます(もしこれが分かれば、解決法はすぐにお分かりいただけるはずですので)。まずその点を理解しようとすべきではないでしょうか。

もしこれがどうしても理解できないと言うことであれば、フラグを立てる方法の方がよいでしょう。というより実は、フラグを立てる方法にした方が良いです。今旗を揚げているか下げているかといった状態をフィールドに保存しておき、その値で現在の状態を調べられるようにします。例えば、赤旗を上げているならばTrueになるようなBoolean型のフィールドを用意し、旗の上げ下げが行われたときに、その値を更新します。

#説明不足で誤解を招きそうですので、補足します。同じ画像を取得するのにMy.Resourcesを何回も呼び出すのは非効率的ですので、My.Resourcesは一度だけしか使わないようにして、その上、現在の状態を調べるためにフラグを使用する(画像同士をIsで比較するのではなく)のがベストです。

どのような方法を使うことになったとしても、なぜうまくいかないのかという理由は知っておいた方が良いと思います。
if文の処理のPB1.Image = My.Resources.neko3をPB1.Image = g3という風に変えたらすんなりできました!

なるほど、「My.Resourcesを使わずに〜・・・」っていうのはこっちのことも言ってたんですね・・・。
自分はずっと、IfとThenの間の部分の話をしているものだと勘違いしてました。
中身の方がおかしかったのか・・・。気づかなくてすみませんでした・・・。OTL

管理人様
お忙しい中、このような初心者のしょぼい質問にお答え下さり、誠にありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板