• 締切済み

四角形の当たり判定についての質問です。

四角い2つブロックの当たり判定をとりたいです。1つのブロックは十字キーによって移動することができ、もうひとつのブロックは画面中央に固定されたまま動くことはありません。2つの四角形が当たった時に擦りぬけないようにしたいのですが、ぶつかったときに十字キーで上下左右に動かしてもすりぬけないようにしたのですが、斜めに移動させるとおかしくなってしまいます。次のプログラムをどう修正すればいいでしょうか? 変数の説明 Player.x:動く四角形のX座標 Player.y:動く四角形のY座標 Player.width:動く四角形の幅 Player.height:動く四角形の高さ Wall.x:動く四角形のX座標 Wall.y:動く四角形のY座標 Wall.width:動く四角形の幅 Wall.height:動く四角形の高さ //2つの四角形がぶつかっていなかったら if(!(((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height)))) { //右キーを押していたら if(g_keyState[DIK_RIGHT] & 0x80 ) { Player.x += 3; if((((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height)))) Player.x = Wall.x - Player.width - 1; } //左キーを押していたら if(g_keyState[DIK_LEFT] & 0x80) { Player.x -= 3; if((((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height)))) Player.x = Wall.x + Wall.width + 1; } //上キーを押していたら if(g_keyState[DIK_UP] & 0x80) { Player.y -= 3; if((((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height)))) Player.y = Wall.y + Wall.height + 1; } //下キーを押していたら if(g_keyState[DIK_DOWN] & 0x80) { Player.y += 3; if((((Player.x > Wall.x && Player.x < Wall.x + Wall.width) || (Wall.x > Player.x && Wall.x < Player.x + Player.width)) && ((Player.y > Wall.y && Player.y < Wall.y + Wall.height) || (Wall.y > Player.y && Wall.y < Player.y + Player.height)))) Player.y = Wall.y - Player.height - 1; } }

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

ですから、あなたのいう「おかしい」というのがどうゆう現象かはっきりしてくれないと、どこを直していいのかわかりません。 今の状態だと、斜めにしていると、ぶつかった四角に沿って滑る感じになると思います。 その動き自体があなたの求めているものなのかどうなのか。違うのならどうなって欲しいのか。 それによって対処法も違ってきます。 あるいは、めり込んでしまう、のなら、なにか判定の見落しがあるのかもしれません。 それも「めりこむ」という現象が起るのかどうかでプログラムに検証方法も変わってきます。

snake777
質問者

補足

斜め移動させて、固定された四角形にぶつかって滑っていくと、四角形と四角形の角がぶつかったタイミングで四角形が別の個所に移動してしまいます。例えば、左から固定された四角形にぶつかり、下キーと右キーを入力したまま滑らすと、動く四角形の右上座標と固定された四角形の左上がかぶったときに動く四角形の右下座標が固定されている四角形の左上座標の所に移動してしまいます。説明わかりにくくてすいません。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

どんな風に変なのかがよくわからないけど このプログラムだと、(入力判定→移動→衝突判定→調整)を順番にやっているので、斜めへの移動は、横の移動→縦の移動と2回に分けて入力したのと同じです。この横移動→衝突→調整の後に縦移動、というのが、あなたの予想した動きとの違いになっていないでしょうか。 判定の不等号に=が必要な箇所がないか、補正させる場所はその計算でいいのか、あたりも確認しては? あと、こんな条件式を何度も書くのは、勧められません。 関数にすればスッキリするし、修正も楽です。

snake777
質問者

補足

ソースを次のように変更してみたのですがうまくいきません。 移動前のPlayerの座標を別の変数に保存しておき、キー入力によって移動させます。 この時点でPlayerがWallに当たっている可能性があるので当たっていた場合はPlayerの座標を修正。この時移動後のPlayerの座標だけではWallに右から当たったのか左から当たったのかわからないため保存しておいた移動前のPlayerの座標を使います。 PrevPlayer = Player; if(g_keyState[DIK_UP] & 0x80) Player.y -= 3; if(g_keyState[DIK_RIGHT] & 0x80) Player.x += 3; if(g_keyState[DIK_DOWN] & 0x80) Player.y += 3; if(g_keyState[DIK_LEFT] & 0x80) Player.x -= 3; if(Player.y < Wall.y + Wall.height && Player.y + Player.height > Wall.y) { if(PrevPlayer.x < Player.x){ if((Player.x + Player.width) >Wall.x) Player.x = Wall.x - Player.width; } else if(PrevPlayer.x > Player.x) { if(Player.x < (Wall.x + Wall.width)) Player.x = Wall.x + Wall.width; } } if(Player.x < Wall.x + Wall.width && Player.x + Player.width > Wall.x) { if(PrevPlayer.y < Player.y) { if((Player.y + Player.height) >Wall.y) Player.y = Wall.y - Player.height; } else if(PrevPlayer.y > Player.y) { if(Player.y < (Wall.y + Wall.height)) Player.y = Wall.y + Wall.height; } }

関連するQ&A

  • 敵との当たり判定

    現在VisualC++2008でゲームを製作してるんですが 自分と敵との当たり判定がわかりません。 どのようにすればいいか教えてもらえないでしょうかm(_ _)m #define SCREEN_WIDTH (640) // 画面の横幅 #define SCREEN_HEIGHT (480) // 画面の縦幅 #define CHIP_SIZE (32) // 一つのチップのサイズ #define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅 #define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅 #define CHAR_SIZE (30) // プレイヤーのサイズ float PlX, PlY ; // プレイヤーの座標(中心座標) int ActMain( void ) { // プレイヤーの座標を初期化 PlX = 100.0F ; PlY = 1.0F ; // マップ { int i, j ; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { // 1のところだけ描画 if( MapData[i][j] == 1 ) { DrawBox( j * CHIP_SIZE, i * CHIP_SIZE, j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE, GetColor( 0, 0, 0 ), TRUE ) ; } } } } //プレイヤーの描写 DrawBox( ( int )( PlX - CHAR_SIZE * 0.5F ), ( int )( PlY - CHAR_SIZE * 0.5F ), ( int )( PlX + CHAR_SIZE * 0.5F ) + 1, ( int )( PlY + CHAR_SIZE * 0.5F ) + 1, GetColor( 255, 0, 0 ), TRUE ) ; Cr = GetColor( 255 , 255, 255 ) ; //敵の描写 DrawGraph(teki[0].x,teki[0].y,teki[0].img,TRUE); //初期化 void SYOKIKA(void){ teki[0].x=500; teki[0].y=200; teki[0].img=LoadGraph("red_player.bmp"); //当たり判定をつくったつもりですが反応せず・・・。一応あたったらPlXを0に移動させようとしています。 if(PlX==teki[0].x) PlX=0; if(PlX==teki[0].y) PlX=0; if(PlY==teki[0].x) PlX=0; if(PlY==teki[0].y) PlX=0; がソースです(文字数が足りないのであたり判定に関係ありそうな(敵と自分の座標関連)ところだけ抜きました)今のところ敵、自分、マップ表示や自分の移動などはできているのですが、敵に触れても反応せず、ときおり敵のいないまったく関係のない場所でPlXが0に移動したりしてしまいます ソースみづらくて申し訳ありません。

  • Java ブロック崩し 当たり判定

    こんにちは、Java初心者の者です。 今週の末に、文化祭があるので、その際の出し物で「ブロック崩し」を出すことにしたのですが、 ブロックの当たり判定がおかしいのです。 おかしいというか、正確にはブロックとの当たり判定自体はあるのですが、ブロックと当たったらブロックが消えるようにしているはずが、消えないのです。 一応、消えてはくれるのですがボールとブロックが離れたらまた元の色に戻ってしまいます。 フラグ管理を使っての処理で、ボールとブロックが触れたらフラグを「偽」。そしたらそれに該当するブロックを描画しないようにする仕組みなのですが、どうも上手くいきません。 以下コードです。 ~~~~中略~~~~ //ブロックの座標の設定 int k=0; for(int j=0;j<block_r;j++) { for(int i=0;i<block_g;i++) { block_x[k] = i*block_w; block_y[k] = j*block_h; block[k] = 1; flag[k] = true; k++; } } //ブロックに当たった時の処理 for(int i=0;i<30;i++) { if(flag[i] == true) { if(y + ball_y >= block_y[i] && y <= block_y[i]+block_h && x + ball_x >= block_x[i] && x <= block_x[i] + block_w) { vy = -vy; flag[i] = false; } } } //ブロックの描画 for(int i=0;i<30;i++) { if(flag[i] == true ) { //ブロックの描画 offg.setColor(Color.yellow); offg.fillRect(block_x[i],block_y[i],block_w,block_h); //ブロックの枠線 offg.setColor(Color.black); offg.drawRect(block_x[i],block_y[i],block_w,block_h); } } ~~~~中略~~~~~ paintメソッドの部分だけ載せてます。 どこかおかしいところがあれば、アドバイスを頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • マップチップの当たり判定の出し方

    キャラの座標をposx、posyとして宣言し、キー入力でその値をプラスやマイナスをして動かせるようにし、またマップをint map[16][16]として宣言し、for文でmap[x][y]として回して絵画しているのですが、キャラの移動変数と連動して当たり判定を作ろうとすると、「キャラの移動変数が配列になっていない」というエラーが出ます。 しかし、キャラ座標を配列にする訳にもいかないのでどうすればいいのか困っています。

  • Appletのrepaint()が動作しません

    import java.applet.*; import java.awt.*; /*<applet code="zxy" width="1000" height="1000"></applet>*/ class Object extends Applet { protected int x; /* オブジェクトのx座標 */ protected int y; /* オブジェクトのy座標 */ protected int width; protected int height; Image buffer; Graphics buffer_g; Dimension d = getSize(); public Object() { x = 0; y = 0; width = 0; height = 0; } } /* 楕円クラス */ class Oval extends Object implements Runnable { public Oval() { width = (int)(Math.random() * 56 + 10); height = (int)(Math.random() * 56 + 10); } public void run() { while( true ){ try{ repaint(); Thread.sleep(50); } catch( Exception e ){} } } public void paint( Graphics g ) { if( buffer_g == null ) buffer_g = buffer.getGraphics(); Dimension d = getSize(); buffer_g.setColor( Color.white ); buffer_g.fillRect( 0, 0, d.width, d.height ); buffer_g.setColor( Color.black ); buffer_g.drawOval( x, y, width, height ); x += (int)(Math.random() * 10); y += (int)(Math.random() * 10); g.drawImage( buffer, 0, 0, this ); } } public class A extends Applet { Image buffer; Graphics buffer_g; Oval ov1 = new Oval(); Thread thOv1 = new Thread( ov1 ); public void start() { thOv1.start(); Dimension d = getSize(); buffer = createImage( d.width, d.height ); } } 上記プログラムを実行しても、paint()の中が実行されずにtryブロックを繰り返すだけになってしまいます。paint()を実行するにはどうすればいいでしょうか?

  • コードの最適化について質問です。以下の2つのコードにおいて、最適化が可能なポイントを教えていただけませんか?

    *gccコンパイラを通します。 ///code1/// void filter_optimized(int width, int height, int numcol, int rw, int gw, int bw) { int x, y, z; for (z=0; z<numcol; z++) for (x=0; x<height; x++) for (y=0; y<width; y++) if (z==0) c[x][y][z] = bw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); else if(z==1) c[x][y][z] = gw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); else c[x][y][z] = rw*((bw*a[x][y][0]+gw*a[x][y][1]+rw*a[x][y][2])/(rw+gw+bw)); return; } ///code2/// void edge_optimized(int width, int height, int numcol) { int x, y, z; int tmp; for (y = 0; y < width; y++) for (x = 0; x < height; x++) for (z = 0; z < numcol; z++) b[x][y][z] = (a[x][y][0]+a[x][y][1]+a[x][y][2])/3; for (y = 0; y < width; y++) for (x = 0; x < height; x++) for (z = 0; z < numcol; z++) { tmp = computeGx(width, height, x, y, z, b); if (tmp < 0) tmp = -tmp; if (tmp > 255) tmp = 255; c[x][y][z] = tmp; tmp = computeGy(width, height, x, y, z, b); if (tmp < 0) tmp = -tmp; if (tmp + c[x][y][z] > 255) c[x][y][z] = 255; else c[x][y][z] += tmp; c[x][y][z] = 255 - c[x][y][z]; if ((x==0)||(y==0)||(x==height-1)||(y==width-1)) c[x][y][z] = 255; } return; }

  • 当たり判定の処理がわかりません。

    CとDXライブラリでSTGを作っているのですが、あたり判定がわかりません。前、斜め右上、斜め右下の3方向に飛ぶ弾の処理を行いたいのですが、どうすればいいのでしょうか? 画面に出力することはできたのですが、ななめに飛ぶ弾だけ判定できずに困っています。 ―――――――――ソースの一部――――――――――― //拡散する弾 void JitamaMove2(){ //弾の発射 int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); if( (key & PAD_INPUT_A) && (trigger == 0) ) { for( int i = 0; i < 3; i++ ){ if (jitama[i].life == 0){ jitama[i].life = 1; jitama[i].x = jikidata.x+24; jitama[i].y = jikidata.y+8; jitama[i].y1 = jikidata.y+8; jitama[i].y2 = jikidata.y+8; float dy = jikidata.y; float d = sqrt(dy*dy); jitama[i].yobi = dy/d*idouryou[4]*10; break; } } trigger = 20; } if(trigger>0) trigger = trigger - 1; //弾の移動 for(int i=0; i<3; i=i+1){ if(jitama[i].life > 0){ jitama[i].x = jitama[i].x + idouryou[10]; DrawGraph(jitama[i].x, jitama[i].y,*(jitama[i].ghandle), TRUE); float idouy = (float)jitama[i].yobi / 10; jitama[i].y2 = jitama[i].y2 - idouy; DrawGraph(jitama[i].x, jitama[i].y2 - 10, *(jitama[i].ghandle), TRUE); //斜め下に対する弾の描写 jitama[i].y1 = jitama[i].y1 + idouy; DrawGraph(jitama[i].x, jitama[i].y1 + 10, *(jitama[i].ghandle), TRUE); //斜め上に対する弾の描写 //画面外に出たときの処理 if(jitama[i].x>640) jitama[i].life = 0; } } } /*当たり判定を計算する関数*/ int IsAtari(CharaData *a, CharaData *b){ int retval = 0; int ax1 = a->x + (a->image_w - a->bounds_w)/2; int ay1 = a->y + (a->image_h - a->bounds_h)/2; int ax2 = a->x + (a->image_w + a->bounds_w)/2; int ay2 = a->y + (a->image_h + a->bounds_h)/2; int bx1 = b->x + (b->image_w - b->bounds_w)/2; int by1 = b->y + (b->image_h - b->bounds_h)/2; int bx2 = b->x + (b->image_w + b->bounds_w)/2; int by2 = b->y + (b->image_h + b->bounds_h)/2; if( (ax1<bx2) && (bx1<ax2) && (ay1<by2) && (by1<ay2) ){ switch (a->amode){ case A_NORMAL: //キャラ消滅 a->life = 0; break; case A_HARD: //耐久力-1 a->life = a->life -1; break; } switch (b->amode){ case A_NORMAL: //キャラ消滅 b->life = 0; break; case A_HARD: //耐久力-1 b->life = b->life -1; if(b->life > 0) SetHanten(b->x, b->y, b->image_w, b->image_h); break; } if(b->life == 0) SetBakuen(b->x, b->y); retval = 1; } return(retval); } //当たり判定の処理 int AtariHantei(){ for(int i=0; i<50; i=i+1){ if(tekidata[i].life > 0 && tekidata[i].amode != A_GHOST){//A_GHOS・・・判定なし //自機と敵の判定 if(IsAtari(&jikidata, &tekidata[i])==1) return(1); //弾と敵の判定 for(int j=0; j<3; j=j+1){ if(jitama[j].life > 0 && jitama[j].amode != A_GHOST){ IsAtari(&jitama[j], &tekidata[i]); } } } } for( int i = 0; i < 50; i++ ){ if(tekitama[i].life > 0){ if(IsAtari(&jikidata, &tekitama[i]) == 1) return(1); } } return(0); }

  • シューティングゲームの当たり判定

    現在directxを用いた(DXライブラリは使わない)インベーダーゲームを作っているのですが、当たり判定の部分がなぜかうまくいきません。自機と敵の弾の当たり判定部分のコードを載せるのでどなたかご享受ください。 //============敵の攻撃======================== if(enemy[rand_atk].tamaflag == 0 && shot_save % 100 == 0 ){ __enemy[rand_atk].tamaflag = 1; __enemy_atk[rand_atk].x = enemy[rand_atk].x+17; __enemy_atk[rand_atk].y = enemy[rand_atk].y+17; } for(i = 0; i < 11; i++){ __if(enemy[i].tamaflag == 1){ ____enemy_atk[i].y+=1; ____if(enemy_atk[i].y >= 480){ ______enemy[i].tamaflag = 0; ______enemy_atk[i].y = -20; //画面外へ ____} ____if( ( move.x - 7 < enemy_atk[i].x && move.x + 32 > enemy_atk[i].x ) && ________( move.y - 13 < enemy_atk[i].y && move.y + 24 > enemy_atk[i].y ) ){ ______move.zanki--; ______enemy[i].tamaflag = 0; ______enemy_atk[i].y = -20; //画面外へ ____} __} } move.x,move.yは自機のx,y座標で横32縦24 敵の弾の大きさは横7縦13 rand_atkはrand_atk = timeGetTime() % 11;でランダムに攻撃させようとしています。

  • direct3dで当たり判定

    現在direct3dでフライトゲームを作っており、当たり判定部分を考えているのですがうまくいきません。メタセコイアでxファイルを作成し、ビルボードで表示している(敵も自弾も)のですが、そもそも基準点はどこに来るのか、プログラム上で指定する縦横高さがわからないなど当たり判定以前の問題のような気もするのですが・・・。とりあえず、該当部分のコードを載せるのでご享受お願いします。 ↓ゲームメインの攻撃部分↓ if(GetKeyboardTrigger(DIK_Z)){ _for(int i = 0; i < ATTACKNUM; i++){ __if( man_bullet[i].flag.bullet == 0){ ___man_bullet[i].flag.bullet = 1; ___//自機の座標セット ___mat_world[15+i]._41 = mat_world[0]._41; ___mat_world[15+i]._42 = mat_world[0]._42+2; ___mat_world[15+i]._43 = mat_world[0]._43; ___break; __} _} } for(int i = 0; i < ATTACKNUM; i++){ _if(man_bullet[i].flag.bullet == 1){ __mat_world[15+i]._43 ++; __man_bullet[i].cnt.bullet++; __if(man_bullet[i].cnt.bullet >= 100){ ___man_bullet[i].flag.bullet = 0; ___man_bullet[i].cnt.bullet = 0; ___mat_world[15+i]._42 = -100; __} __for(int j = 0; j < ENEMYNUM; j++){ ___man_bullet[i].flag.atk_result = ___Hit_Judging(&mat_world[5+j]._41, &mat_world[5+j]._42, &mat_world[5+j]._43, ________enemy[j].x, enemy[j].y, enemy[j].z, ________&mat_world[15+i]._41 , &mat_world[15+i]._42, &mat_world[15+i]._43, ________man_bullet[i].x, man_bullet[i].y, man_bullet[i].z ); ___if(man_bullet[i].flag.atk_result == 1){ ____man_bullet[i].flag.atk_result = 0; ____man_bullet[i].flag.bullet = 0; ____man_bullet[i].cnt.bullet = 0; ____mat_world[5+j]._43 = 150; ____mat_world[15+i]._42 = -100; ____break; ___} __} _} } ↓当たり判定部分↓ int Hit_Judging( float *xpos1 , float *ypos1 , float *zpos1 , ________float x1, float y1, float z1, ________float *xpos2 , float *ypos2 , float *zpos2 , ________float x2, float y2, float z2 ) { _for(int i = 0; i < ATTACKNUM; i++){ __if(man_bullet[i].flag.bullet == 1){ ___for(int j = 0; j < ENEMYNUM; j++){ ____if( ((xpos1[j] - (x1/2) ) < (xpos2[i] + (x2/2) ) && ______(xpos1[j] + (x1/2) ) > (xpos2[i] - (x2/2) )) && ______((ypos1[j] + y1 ) < ypos2[i] && ypos1[j] > (ypos2[i] + y2 )) && _______(zpos1[j] == zpos2[i]) ){ _____return 1; ____}else _____return 0; ___} __} _} }

  • 障害物に対する衝突判定

    こんばんは。WinXP、Flash8Proにてオーサリングしています。 hitTestにて衝突判定を行っているのですが、 RPGの場合、キャラクターが障害物に衝突する際の 処理に頭を悩めております。 _global.obje_hit=function(){ if(_global.key_cord=='d'){ _root.main_mc.player_mc._x -= 20; }else if(_global.key_cord=='a'){ _root.main_mc.player_mc._x += 20; }else if(_global.key_cord=='w'){ _root.main_mc.player_mc._x += 20; }else if(_global.key_cord=='s'){ _root.main_mc.player_mc._y -= 20; } _root.main_mc.player_mc.gotoAndPlay(1); } *キャラクターの移動は他のFunctionにて キー入力により、ASで位置やMCの動きを制御しています。 W,S,A,Dのそれぞれのキーで上下左右の向きのMCを再生させて、場所移動によって動かしているのですが、 現時点では、プレイヤーのMCが障害物と反発する事でしか、障害物による静止処理ができていません。 跳ね返らずに、一般的なRPGの様に”行き止まる”様にしたいのですが、 ASだけでするには、どのようにしたら良いのでしょうか。 やはり、キャラクターの行動しているMCから調節しなくてはいけないのでしょうか。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Flash
  • VB.net フォームをなめらかに移動する方法

    フォームをなめらかに移動する方法はないでしょうか? 以下のコードのように、Locationで位置を変更すると、カクカク移動してしまいます。 ご存知の方おしえてください。どうぞよろしくお願いいたします。 Private Sub Form1_Mousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove Dim WorkingArea As Rectangle = Screen.PrimaryScreen.WorkingArea Dim MousePos As Point = Me.PointToClient(Windows.Forms.Cursor.Position) '上に移動 If Me.Size.Height * 0.8 < MousePos.Y And Me.Location.Y > 0 Then Me.Location = New Point(Me.Location.X, Me.Location.Y - 20) End If '下に移動 If Me.Size.Height * 0.2 > MousePos.Y And (Me.Location.Y + Me.Size.Height) < WorkingArea.Height Then Me.Location = New Point(Me.Location.X, Me.Location.Y + 20) End If '左に移動 If Me.Size.Width * 0.8 < MousePos.X And Me.Location.X > 0 Then Me.Location = New Point(Me.Location.X - 20, Me.Location.Y) End If '右に移動 If Me.Size.Width * 0.2 > MousePos.X And (Me.Location.X + Me.Size.Width) < WorkingArea.Width Then Me.Location = New Point(Me.Location.X + 20, Me.Location.Y) End If End Sub