我做了乙個c#的winform程式的小遊戲,遊戲是這樣的:介面上有若干小點和乙個小人,所有小點每三秒鐘隨機變化一次位置,如果小點碰到小人就算遊戲結束了,在這三秒鐘內你也可以用滑鼠拖動小人來選擇乙個你覺得可能不會被碰撞的位置。其實這個遊戲堅持的時間長短完全是靠運氣,畢竟小點位置是隨機的,並不是有規律可言的。下面記錄我在做這個小遊戲過程遇到的問題和解決的方式,如果有對這個遊戲感興趣的朋友私我要**,其實很簡單,會了下面我說的這幾點知識你一定也可以做出來。
1、執行緒間操作無效: 從不是建立控制項「***」的執行緒訪問它。
先來看一段程式:
public partial class form1 : form
public void setlocation(picturebox p)
private void button1_click(object sender, eventargs e)
}
通過乙個按鈕來新增乙個picturebox控制項,然後通過乙個新的執行緒來修改該控制項的位置,執行程式就會提示「執行緒間操作無效: 從不是建立控制項「***」的執行緒訪問它」。因為你通過乙個不是建立該控制項的執行緒來修改此控制項的狀態了,這是在.net2之後不允許的。因為多執行緒同時操作某一控制項的狀態可能導致該控制項處於不一致的狀態。
解決辦法有兩個:
在窗體的建構函式中新增:control.checkforillegalcrossthreadcalls = false
;
public form1()
這樣可以使系統不去檢查你是否跨執行緒訪問控制項了,但是這並不是標準的解決方法,因為系統之所以會去檢查是因為怕你在後面的程式中出錯,比如你兩個執行緒同時修改同乙個控制項的狀態;而你不讓系統去檢查,那麼當你後續程式執行真的有多執行緒同時操作某一控制項的狀態的情況時,會出現更大的錯誤。
通過委託來實現:
public partial class form1 : form
public delegate void setdelegate(picturebox p);
public void setlocation(picturebox p));}
else
}private void button1_click(object sender, eventargs e)
}
2、定時器timer類:
網上使用方式很多,我這裡主要介紹一種定時器繫結的事件帶有引數的(非系統引數):
public partial class initialize : form
public void movement(object source, system.timers.elapsedeventargs e,picturebox arr)//movement函式引數列表
}
想關閉定時器的方法為:atimer.stop();
系統自定義的elapsedeventhandler為:
public delegate void elapsedeventhandler(
object sender,
elapsedeventargs e
)
c#.net 定時器類及使用方法寫得非常好,c#程式中三種定時器類的介紹都有,還有具體用法。
3、用滑鼠拖動控制項:
以拖動button為例,當滑鼠按下button時記錄滑鼠與button的實際座標,並用乙個bool變數記錄當前滑鼠狀態為mousedown;
然後在滑鼠移動事件中拿當前滑鼠實際座標,與mousedown時記錄的座標的偏差來加上button原座標,便是現在的座標;在滑鼠抬起時,
清除狀態。
//是否在拖拽
bool isdrag = false;
//滑鼠相對於button控制項左上角的座標
point contextbtnpoint = point.empty;
//將被拖動的控制項
private control control;
private void button1_mousedown(object sender, mouseeventargs e)
}private void button1_mousemove(object sender, mouseeventargs e)
}private void button1_mouseup(object sender, mouseeventargs e)
}
關於獲取滑鼠座標的方法有下面三種:
point screenpoint = control.mouseposition;//滑鼠相對於螢幕左上角的座標
point formpoint = this.pointtoclient(control.mouseposition);//滑鼠相對於窗體左上角的座標
point contextmenupoint = contextmenustrip1.pointtoclient(control.mouseposition); //滑鼠相對於contextmenustrip1左上角的座標
4、長方形是否相交問題:
rectangle rectangle1 = new rectangle(50, 50, 200, 100);//引數分別為長方形的橫座標,縱座標,寬度,高度rectangle rectangle2 = new rectangle(70, 20, 100, 200);
if (rectangle1.intersectswith(rectangle2))//相交
else
//不相交
c winform貪吃蛇小遊戲
關於貪吃蛇需要用的物件 1.蛇 snake 2.食物 food 3.記錄蛇身的位置 snake body x,y 4 食物位置food x,y 簡單業務 1.蛇身移動 2.隨機食物 3.蛇頭與食物重疊 4.窗體檢測上下左右方向,控制蛇身體移動方向 好了,廢話不多說,開始 在頁面拖入panle1,兩個...
小遊戲製作 打氣球小遊戲
打氣球小遊戲 package private function 遊戲開始 event mouseevent void private function 複製 event timerevent public function 重新整理分值 分值 number 事件 private function 點...
C winform 經典小遊戲貪吃蛇V2 0(二)
我們的蛇已經能跑能吃,但是還是存在著許多的問題,這裡列出來的只是一部分的問題,也是我們這個版本主要解決的問題!由於原先的介面為單調的純白,這樣不僅加大了遊戲難度,玩家的體驗也極差,所以我在遊戲的介面新增了網格線,讓玩家可以更加精準的找到食物和蛇相對應的行列。原來介面 更改後的介面 是不是感覺好多了?...