質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

1回答

1040閲覧

妙なことが起こった C#

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2022/12/30 17:07

編集2022/12/30 17:15

前提

this.ProcessControls();を含めると画面が4分の1サイズで表示されるように成る。
問題のコードを入れなければ、正常に表示される

実現したいこと

画面が正常に表示されるようにしたい

発生している問題・エラーメッセージ

有りません

該当のソースコード

C#

1public partial class FormPrincipal : Form 2 { 3 DispatcherTimer gameLoopTimer { get; set; } 4 5 DispatcherTimer enemySpawnTimer { get; set; } 6 7 Bitmap screenBuffer { get; set; } 8 9 Graphics screenPainter { get; set; } 10 11 BackGround backGround { get; set; } 12 13 Player player { get; set; } 14 15 List<GameObject> gameObjects { get; set; } 16 17 public Random random { get; set; } 18 19 public FormPrincipal() 20 { 21 InitializeComponent(); 22 23 24 this.random = new Random(); 25 this.ClientSize = Media.BackGround.Size; 26 this.screenBuffer = new Bitmap(Media.BackGround.Width, Media.BackGround.Height); 27 this.screenPainter = Graphics.FromImage(this.screenBuffer); 28 this.gameObjects = new List<GameObject>(); 29 this.backGround = new BackGround(this.screenBuffer.Size, this.screenPainter); 30 this.player = new Player(this.screenBuffer.Size, this.screenPainter); 31 32 this.gameLoopTimer = new DispatcherTimer(DispatcherPriority.Render); 33 this.gameLoopTimer.Interval = TimeSpan.FromMilliseconds(16.66666); 34 this.gameLoopTimer.Tick += GameLoop; 35 36 this.enemySpawnTimer = new DispatcherTimer(DispatcherPriority.Render); 37 this.enemySpawnTimer.Interval = TimeSpan.FromMilliseconds(1000); 38 this.enemySpawnTimer.Tick += SpawnEnemy; 39 40 this.gameObjects.Add(backGround); 41 this.gameObjects.Add(player); 42 43 StartGame(); 44 } 45 46 public void StartGame() 47 { 48 this.gameLoopTimer.Start(); 49 this.enemySpawnTimer.Start(); 50 } 51 52 public void SpawnEnemy(object sender, EventArgs e) 53 { 54 Point enemyPosition = new Point(this.random.Next(74, this.screenBuffer.Width - 10) - 62); 55 Enemy enemy = new Enemy(this.screenBuffer.Size, this.screenPainter, enemyPosition); 56 this.gameObjects.Add(enemy); 57 } 58 59 public void GameLoop(object sender, EventArgs e) 60 { 61 this.gameObjects.RemoveAll(x => !x.Active); 62 63 this.ProcessControls(); 64 65 foreach (GameObject go in this.gameObjects) 66 { 67 68 go.UpDateObject(); 69 70 if (go.IsOutOfBounds()) 71 { 72 go.Destroy(); 73 } 74 75 76 } 77 this.Invalidate(); 78 } 79 80 private void FormPrincipal_Paint(object sender, PaintEventArgs e) 81 { 82 e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 83 e.Graphics.DrawImage(this.screenBuffer, 0, 0); 84 } 85 86 private void ProcessControls() 87 { 88 if (Keyboard.IsKeyDown(Key.Left)) player.MoveLeft(); 89 if (Keyboard.IsKeyDown(Key.Right)) player.MoveRight(); 90 if (Keyboard.IsKeyDown(Key.Up)) player.MoveUp(); 91 if (Keyboard.IsKeyDown(Key.Down)) player.MoveDown(); 92 } 93 94 private void FormPrincipal_Load(object sender, EventArgs e) 95 { 96 97 } 98 }

試したこと

いろいろ試して、もう覚えてない

補足情

![スクリーンショット 1](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-31/ba69f01e-90db-491f-8afb-7811b6129e7a.png) ![スクリーンショット 2](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-31/a2ee0e1f-e224-42e3-9dde-ce917f316b57.png)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2022/12/31 00:53

> 退会済みユーザー おいおいマジかよorz
guest

回答1

0

[意見交換] 妙なことが起こった C# - Qiita

teratailでは、マルチポスト※の推奨はしていません。
やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。 また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。

ヘルプ|他のサービスにも質問投稿をしたい(してしまった)


あちらでWindowsフォームとWPFを「混ぜるな危険」と言われているのですから、混ぜなければいいんじゃないでしょうか?(通常混ぜて使うことはしません)

System.Windows.Threading.DispatcherTimerを、System.Windows.Forms.Timerに変更する。
DispatcherTimer クラス (System.Windows.Threading) | Microsoft Learn
Timer クラス (System.Windows.Forms) | Microsoft Learn

System.Windows.Input.Keyboardを使用せずに、KeyDownKeyUpで自前管理(↓のような)する。

cs

1private bool LeftIsDown, RightIsDown, UpIsDown, DownIsDown; 2 3private void ProcessControls() 4{ 5 if (LeftIsDown) player.MoveLeft(); 6 if (RightIsDown) player.MoveRight(); 7 if (UpIsDown) player.MoveUp(); 8 if (DownIsDown) player.MoveDown(); 9} 10 11private void FormPrincipal_KeyDown(object sender, KeyEventArgs e) 12{ 13 switch (e.KeyCode) 14 { 15 case Keys.Left: LeftIsDown = true; break; 16 case Keys.Right: RightIsDown = true; break; 17 case Keys.Up: UpIsDown = true; break; 18 case Keys.Down: DownIsDown = true; break; 19 } 20} 21private void FormPrincipal_KeyUp(object sender, KeyEventArgs e) 22{ 23 switch (e.KeyCode) 24 { 25 case Keys.Left: LeftIsDown = false; break; 26 case Keys.Right: RightIsDown = false; break; 27 case Keys.Up: UpIsDown = false; break; 28 case Keys.Down: DownIsDown = false; break; 29 } 30}

Keyboard クラス (System.Windows.Input) | Microsoft Learn
Control.KeyDown イベント (System.Windows.Forms) | Microsoft Learn
Control.KeyUp イベント (System.Windows.Forms) | Microsoft Learn


慣れないと何がWPF用のクラスかわかりにくいですが、リファレンスの「アセンブリ」を確認してください。

DispatcherTimer クラス
リファレンス
定義
名前空間: System.Windows.Threading
アセンブリ: WindowsBase.dll

WindowsBase.dll・PresentationCore.dll・PresentationFramework.dllどれかだったら、それはWPF用のクラスです。

あるいは逆にWPFで作るか?(どっちが変更が少ないかな^^;

投稿2022/12/30 23:26

TN8001

総合スコア9326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問