C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[20]: キー入力でゲーム作成


(過去ログ 22 を表示中)

[トピック内 39 記事 (1 - 20 表示)]  << 0 | 1 >>

■9260 / inTopicNo.1)  キー入力でゲーム作成
  
□投稿者/ ken (9回)-(2007/10/23(Tue) 20:47:47)

分類:[C#] 

キー入力をして例えばロケットが、数字の4を押したら右に移動して、5のキーを押すと左に移動、スペースキーを押すと
ミサイルが飛び出すようなゲームを作りたいと思っていますが、キー入力をしたときに発生するイベントのコードの書き方が
いまいちわかりません。すべてを教えてくださいとはもうしません。せめて、数字の4をおしたら、円が描画されるコードを
記述していただければと思います。c#2005
引用返信 編集キー/
■9346 / inTopicNo.2)  Re[1]: キー入力でゲーム作成
□投稿者/ ken (10回)-(2007/10/24(Wed) 21:54:08)
No9260 (ken さん) に返信
キー入力で画像を動かすにはDirectXの機能を使わないと無理なのでしょうか?

引用返信 編集キー/
■9351 / inTopicNo.3)  Re[2]: キー入力でゲーム作成
□投稿者/ επιστημη (621回)-(2007/10/25(Thu) 00:44:30)
επιστημη さんの Web サイト
> キー入力で画像を動かすにはDirectXの機能を使わないと無理なのでしょうか?

んなことないけど、ちゃんとゲーム作るんならDirectXなりXNA使うのがよさげですよ。

つ【http://www.clks.jp/csg/dx003.html
引用返信 編集キー/
■9463 / inTopicNo.4)  Re[3]: キー入力でゲーム作成
□投稿者/ ken (11回)-(2007/10/27(Sat) 20:55:17)
No9351 (επιστημη さん) に返信
>>キー入力で画像を動かすにはDirectXの機能を使わないと無理なのでしょうか?
>
> んなことないけど、ちゃんとゲーム作るんならDirectXなりXNA使うのがよさげですよ。
>
> つ【http://www.clks.jp/csg/dx003.html
ありがとうございました。自己解決しました。DirectXなりXNAはかなり大変そうなのでもう少し簡単になってからチャレンジしてみようと考えています。
解決済み
引用返信 編集キー/
■9465 / inTopicNo.5)  Re[4]: キー入力でゲーム作成
□投稿者/ επιστημη (624回)-(2007/10/27(Sat) 23:41:54)
επιστημη さんの Web サイト
> ありがとうございました。自己解決しました。

できることならその自己解決とやらの詳細を添えてもらえるとみんなが幸せになれるんですけど。

解決済み
引用返信 編集キー/
■9470 / inTopicNo.6)  Re[5]: キー入力でゲーム作成
□投稿者/ ken (12回)-(2007/10/28(Sun) 10:08:24)
No9465 (επιστημη さん) に返信
>>ありがとうございました。自己解決しました。
>
> できることならその自己解決とやらの詳細を添えてもらえるとみんなが幸せになれるんですけど。
>

下記のように作ったのですが、一つ問題が発生しました。というのは、 pictureBox1のプロパティDockをnoneにすると動きますがFillにすると動かなくなります。これはなぜでしょうか?

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
pictureBox1.Left += 10;
if (e.KeyCode == Keys.Right)
pictureBox1.Left -= 10;
if (e.KeyCode == Keys.Up)
pictureBox1.Top -=10;

if (e.KeyCode == Keys.Down)
pictureBox1.Top += 10;


}

private void Form1_Load(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
pictureBox1.Image = bmp;

Graphics g = Graphics.FromImage(pictureBox1.Image);

g.DrawEllipse(Pens.Black,0, 20,100, 100);
g.Dispose();
pictureBox1.Refresh();

}

}
}
引用返信 編集キー/
■9471 / inTopicNo.7)  Re[6]: キー入力でゲーム作成
□投稿者/ ken (13回)-(2007/10/28(Sun) 10:16:39)
No9470 (ken さん) に返信
>>
> 下記のように作ったのですが、一つ問題が発生しました。というのは、 pictureBox1のプロパティDockをnoneにすると動きますがFillにすると動かなくなります。これはなぜでしょうか?

我ながらおかしな質問をしてしまったことに気がつきました。キー操作で動かしているのはpictureBoxコントロールでしたからFillにすると動かないのは当たり前ですよね。では、Form上に描画した図形を移動させるには、どうしたらよいのでしょうか?図形の位置を書き換えていくことまではわかりますが……
引用返信 編集キー/
■9472 / inTopicNo.8)  Re[7]: キー入力でゲーム作成
□投稿者/ επιστημη (626回)-(2007/10/28(Sun) 12:32:33)
επιστημη さんの Web サイト
> Form上に描画した図形を移動させるには、どうしたらよいのでしょうか?
> 図形の位置を書き換えていくことまではわかりますが……

PictureBoxを移動させるんじゃあかんのですか?

引用返信 編集キー/
■9473 / inTopicNo.9)  Re[8]: キー入力でゲーム作成
□投稿者/ ken (14回)-(2007/10/28(Sun) 14:20:08)
No9472 (επιστημη さん) に返信
> PictureBoxを移動させるんじゃあかんのですか?

以下のように書き換えてみましたが図形が移動しません。何か基本的な誤りがあるのでしょうか?
int x, y;

private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;

g.DrawEllipse(Pens.Black, 100, 50, 100, 100);
g.Dispose();

}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
x += 10;
if (e.KeyCode == Keys.Right)
x -= 10;
if (e.KeyCode == Keys.Up)
y -= 10;

if (e.KeyCode == Keys.Down)
y += 10;
引用返信 編集キー/
■9474 / inTopicNo.10)  Re[9]: キー入力でゲーム作成
□投稿者/ ken (15回)-(2007/10/28(Sun) 14:21:08)
No9473 (ken さん) に返信
>訂正します。
> int x, y;
>
> private void Form1_Paint(object sender, PaintEventArgs e)
> {
> Graphics g = e.Graphics;
>
> g.DrawEllipse(Pens.Black, x, y0, 100, 100);
> g.Dispose();
>
> }
> private void Form1_KeyDown(object sender, KeyEventArgs e)
> {
> if (e.KeyCode == Keys.Left)
> x += 10;
> if (e.KeyCode == Keys.Right)
> x -= 10;
> if (e.KeyCode == Keys.Up)
> y -= 10;
>
> if (e.KeyCode == Keys.Down)
> y += 10;
引用返信 編集キー/
■9475 / inTopicNo.11)  Re[10]: キー入力でゲーム作成
□投稿者/ ken (16回)-(2007/10/28(Sun) 14:22:54)
No9474 (ken さん) に返信

すみませんあらためて訂正しました。

int x, y;

private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;

g.DrawEllipse(Pens.Black, x, y, 100, 100);
g.Dispose();

}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
x += 10;
if (e.KeyCode == Keys.Right)
x -= 10;
if (e.KeyCode == Keys.Up)
y -= 10;

if (e.KeyCode == Keys.Down)
y += 10;
引用返信 編集キー/
■9476 / inTopicNo.12)  Re[11]: キー入力でゲーム作成
□投稿者/ ダッチ (165回)-(2007/10/28(Sun) 15:40:08)
2007/10/28(Sun) 15:42:41 編集(投稿者)

> 以下のように書き換えてみましたが図形が移動しません。何か基本的な誤りがあるのでしょうか?
再描画されていないだけだと思います。

Form1_KeyDown 処理の最後に Invalidate メソッドを呼んで再描画してください。

 Control.Invalidate メソッド
 http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.invalidate(VS.80).aspx

Invalidate メソッド 以外にも再描画させるメソッドが用意されています。
その違いなどについてはこちらが参考になるともいます。

 Refresh、Update、Invalidateメソッドの違い
 http://dobon.net/vb/dotnet/control/refreshupdateinvalidate.html

それと Form.Paint イベント内で e.Graphics に対して Dispose メソッドを呼んでいますが、
不要だと思います。
引用返信 編集キー/
■9482 / inTopicNo.13)  Re[12]: キー入力でゲーム作成
□投稿者/ ken (17回)-(2007/10/28(Sun) 19:47:55)
No9476 (ダッチ さん) に返信
> 2007/10/28(Sun) 15:42:41 編集(投稿者)
ありがとうございました。おかげさまで動きました。

> Form1_KeyDown 処理の最後に Invalidate メソッドを呼んで再描画してください。
 なぜ再描画させなければならないのでしょうか?
 このあたりは複雑でよくわかりません。

> それと Form.Paint イベント内で e.Graphics に対して Dispose メソッドを呼んでいますが、
> 不要だと思います。

piictureBoxに描画するのと、Form.Paint イベント内に描画する違いがよくわかりかねます。
もしよろしかったらおしえてください。
引用返信 編集キー/
■9484 / inTopicNo.14)  Re[13]: キー入力でゲーム作成
□投稿者/ ダッチ (166回)-(2007/10/28(Sun) 20:47:56)
>>Form1_KeyDown 処理の最後に Invalidate メソッドを呼んで再描画してください。
>  なぜ再描画させなければならないのでしょうか?
>  このあたりは複雑でよくわかりません。
KeyDown イベントの中でフォームに表示される楕円の形を変更するような処理を行っていますよね。
でも KeyDown で変更しているのは、楕円の始点となる位置情報を変更しているだけです。
楕円を描画はしていません。なのでフォームに表示されている楕円の形は変わりません。

では、いつ形が変更された楕円が表示されるかというと、次にフォームが描画されるときです。
次というのは Windows まかせで、通常は楕円を描画するフォームの上を他のフォームが通り過ぎた時などです。
でも今は KeyDown イベントの処理が終わった後にすぐに楕円の形を変更したいので、すぐに描画してやらなければいけません。
そのためにフォームに対して再描画するような命令(Invalidate メソッド)を出しています。

>>それと Form.Paint イベント内で e.Graphics に対して Dispose メソッドを呼んでいますが、
>>不要だと思います。
>
> piictureBoxに描画するのと、Form.Paint イベント内に描画する違いがよくわかりかねます。
> もしよろしかったらおしえてください。
ちょっと私の発言に対する引用している内容と質問が食い違っているような感じがします。

> piictureBoxに描画するのと、Form.Paint イベント内に描画する違いがよくわかりかねます。
これは描画先が PictureBox でも Form でも描画は描画ですので、同じ考え方で言いと思います。

>それと Form.Paint イベント内で e.Graphics に対して Dispose メソッドを呼んでいますが、
>不要だと思います。
Form.Paint イベントが一つのメソッドだけに関連づいているとは限りません。
二つ以上のメソッドに関連づいている可能性もあります。
そのほかにも Form.Paint イベントの処理の後に Form 自身も Graphics オブジェクトを扱っているかもしれません。

そのような状況で e.Graphics を Dispose してしまったら、
その後の処理で e.Graphics を扱うことができません。
もし扱ってしまった場合は例外が発生してしまいます。

Graphics オブジェクトを生成した人が Dispose する、と思っていただければわかりやすいと思います。
今回の場合、Graphics オブジェクトは ken さんは作成されていません。
Form の内部で作成されていますので、Dispose するのは Form に任せればいいです。
引用返信 編集キー/
■9485 / inTopicNo.15)  Re[13]: キー入力でゲーム作成
□投稿者/ ken (18回)-(2007/10/28(Sun) 20:52:59)
No9482 (ken さん) に返信
> ■No9476 (ダッチ さん) に返信
>>Form1_KeyDown 処理の最後に Invalidate メソッドを呼んで再描画してください。
>  なぜ再描画させなければならないのでしょうか?
>  このあたりは複雑でよくわかりません。

おしえて君ではいけないと思い、色々調べてみましたが、要するにこれはC#の仕様と解釈するしかないのですね。

>>それと Form.Paint イベント内で e.Graphics に対して Dispose メソッドを呼んでいますが、
>>不要だと思います。
>
> piictureBoxに描画するのと、Form.Paint イベント内に描画する違いがよくわかりかねます。
> もしよろしかったらおしえてください。
こちらは、もしアクションゲームを作る場合、画面がちらついたりすることがあるそうですが、直接フォームに描画する方が
ちらつきは大きくなるのでしょうか?ちなみにDirectXをつかうと、そうした現象は発生しなくなるのですね。
間違いがありましたらおしえてください。
引用返信 編集キー/
■9486 / inTopicNo.16)  Re[14]: キー入力でゲーム作成
□投稿者/ ken (19回)-(2007/10/28(Sun) 20:57:55)
>>■No9476 (ダッチ さん) に返信
胸のつかえが落ちたようでスッキリよくわかりました。ありがとうございました。
ちなみに上記のレスは、ダッチさんのレスが記述される直前に投稿したものです。
解決済み
引用返信 編集キー/
■9517 / inTopicNo.17)  Re[15]: キー入力でゲーム作成
□投稿者/ PATIO (33回)-(2007/10/29(Mon) 16:44:14)
No9486 (ken さん) に返信
> >>■No9476 (ダッチ さん) に返信
> 胸のつかえが落ちたようでスッキリよくわかりました。ありがとうございました。
> ちなみに上記のレスは、ダッチさんのレスが記述される直前に投稿したものです。

解決済みになっちゃってますが、
C#の仕様と言うよりもWindowsでの描画の仕組みと考えた方が良いと思いますよ。
言語が変わったとしても基本的にこの仕組みは同じはずなので。

解決済み
引用返信 編集キー/
■9524 / inTopicNo.18)  Re[16]: キー入力でゲーム作成
□投稿者/ ken (20回)-(2007/10/29(Mon) 20:51:38)
No9517 (PATIO さん) に返信
>上のゲームにpicutureBoxもいれてみましたが、picutureBoxにインポートした画像が動きません。
どこか間違えているのでしょうか?

int x=0, y=100,z;
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawEllipse(Pens.Black, x, y, 100, 100);
g.FillEllipse(Brushes.Red, x, y, 100, 100);
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
x += 10;
if (e.KeyCode == Keys.Right)
y -= 10;
if (e.KeyCode == Keys.Space)
z -= 10;
this.Invalidate();

}

private void Form1_Load(object sender, EventArgs e)
{
z = pictureBox1.Left;

}

}
引用返信 編集キー/
■9525 / inTopicNo.19)  Re[17]: キー入力でゲーム作成
□投稿者/ ken (21回)-(2007/10/29(Mon) 20:53:37)

上のゲームにpicutureBoxもいれてみましたが、picutureBoxにインポートした画像が動きません。
どこか間違えているのでしょうか?

int x=0, y=100,z;
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawEllipse(Pens.Black, x, y, 100, 100);
g.FillEllipse(Brushes.Red, x, y, 100, 100);
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
x += 10;
if (e.KeyCode == Keys.Right)
y -= 10;
if (e.KeyCode == Keys.Space)
z -= 10;
this.Invalidate();

}

private void Form1_Load(object sender, EventArgs e)
{
z = pictureBox1.Left;

}

}
引用返信 編集キー/
■9528 / inTopicNo.20)  Re[18]: キー入力でゲーム作成
 
□投稿者/ mあ@反省中 (3回)-(2007/10/29(Mon) 22:21:02)
2007/10/29(Mon) 23:22:48 編集(投稿者)
No9525 (ken さん) に返信
C# よりも、VB の方がいいんじゃない?
簡単だよ。
Public Class Form1

    Private pic As New PictureBox

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        pic.Image = My.Resources.sep_50.ToBitmap
        pic.Size = New Size(My.Resources.sep_50.Width, My.Resources.sep_50.Height)

        Controls.Add(pic)

        AddHandler Me.KeyUp, AddressOf me_Keyup

    End Sub

    Private Sub me_Keyup(ByVal s As Object, ByVal e As KeyEventArgs)
        Select Case e.KeyCode
            Case Keys.Left
                pic.Location = New Point(pic.Left - 10, pic.Top)
            Case Keys.Right
                pic.Location = New Point(pic.Left + 10, pic.Top)
            Case Keys.Up
                pic.Location = New Point(pic.Left, pic.Top - 10)
            Case Keys.Down
                pic.Location = New Point(pic.Left, pic.Top + 10)

        End Select

    End Sub
End Class

感じるところがあれば、ご自分のPGへ取り込んで下さい。
上記は、VBですが、上下左右の矢印キーでsep_50.ico が動くことを確認しました。

C# も載せます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace GameCs
{
    public partial class Form1 : Form
    {
        private PictureBox pic = new PictureBox();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Controls.Add(pic);

            pic.Paint += pic_Paint;
            this.KeyUp += me_Keyup;          
        }

        private void pic_Paint(Object s, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(Pens.AliceBlue,new Rectangle(10,10,40,40));
            e.Graphics.FillRectangle(Brushes.Aqua, new Rectangle(10, 10, 40, 40));
        }

        private void me_Keyup(object s, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Up:
                    pic.Top = pic.Top - 10;
                    break;
                case Keys.Down:
                    pic.Top = pic.Top + 10;
                    break;
                case Keys.Left:
                    pic.Left = pic.Left - 10;
                    break;
                case Keys.Right:
                    pic.Left = pic.Left + 10;
                    break;
                default:
                    break;
            };
        }

    }
}

C#はかなり怪しいですが、一応動いているようです。

がんばってください。


引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -