[XNA]-tut2-vấn đề cuộn map trong chuyển động của nhân vật

Posted: 06/05/2011 in XNA Game
Tags: ,

yêu cầu : trước khi đọc tut2 này thì cần phải đọc tut1 này đã
https://zstar2.wordpress.com/2011/05/06/xnachuy%E1%BB%83n-d%E1%BB%99ng-c%E1%BB%A7a-nhan-v%E1%BA%ADt-trong-xna-ph%E1%BA%A7n-1/
vì tut2 này mình phát triển từ tut1 lên (ngại code lại)
………………………………………….. …
map là gì ?
nôm na củ chuối thì nó bao gồm tất cả các item hiển thị trên game,các item mà bạn có thể nhìn thấy …..

vấn đề cuộn map trong game (2D)
-đặt vấn đề : cuộn map là gì ? giả sử cửa sổ game của bạn bé tí , còn map rộng bao trùm ra ngoài cửa sổ rất nhiều..vì vậy muốn nhân vật đi đến map nằm ngoài cửa sổ thì sẽ phải cuộn map…

cuộn như thế nào

xin nhắc lại trong tut1 1 chút , ở trong tut1 mình đã cho tọa độ của nhân vật thay đổi khi ấm phím <- ^ -> , còn tọa độ để biểu diễn map thì vẫn như vậy ,ko thay đổi => nhân vật chỉ đi được trong khung cửa sổ mà thôi, đi ra ngoài thì chịu,mà đi ra ngoài đc thì cũng mất hút luôn…

vậy với 1 map rộng thì ta ko làm như thế mà làm ngược lại, tức là cho nhân vật đứng yên, map thay đổi tọa độ nhân vật chỉ cho loe ngoe chân tay cho vui thôi , muốn nhân vật di chuyển sang phải thì map phải di chuyển sang trái…túm lại là muốn nhân vật di chuyển hướng nào thì map phải di chuyển theo hướng ngược lại

để làm đc điều này thì cần phải sửa đổi gì trong tut1 ??
-set tọa độ nhân vật cố định , new point(400,400) chẳng hạn,có thể tính toán để nó nằm ở giữa cửa sổ game
-Các item khác còn lại trong game(trừ nhân vật), phải cộng tọa độ của nó với 1 lượng tham số Point pt….vì sao lại thế ? đơn giản thôi , khi tôi muốn tất cả các item dịch sang trái chẳng hạn, tôi chỉ cần giảm pt.X là xong (nên nhớ nhân vật ko cộng với lượng này nên nó vẫn trơ trơ giữa cửa sổ)

-từ đó muốn nhân vật di chuyển sang trái (cảm giác đánh lừa mắt thôi nhé) 1 đoạn h pixels thì chỉ cần cho map chạy sang phải 1 đoạn h pixels=> tức là pt.X=pt.X+h …tương tự như vậy cho chiều Y

về code thì các lớp vẫn có các lớp như tut1
nhưng nội dung thay đổi như sau
lớp nhanvat.cs


using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace chuyen_dong_nhan_vat
{
public class NhanVat
{
private Game1 Game;
private Texture2D text;//sprite nhan vat
private Point khungnhin=new Point(0,0);//vi tri khung nhin
private Point gioihan=new Point(5,4);//gioi han khung nhin
private byte kichthuoc=60;//kich thuoc khung nhin 60x60
private int buocChay = 5;//do dai moi buoc nhan vat
public Point viTri = new Point(0,0);//vi tri nhan vat tren man hinh
public HuongChuyenDong huongChuyenDong;
private bool dangChay = false;
private System.Windows.Forms.Timer capNhat_X;


public NhanVat(Game1 game,Point toadomoi)
{

this.Game = game;
this.capNhat_X = new System.Windows.Forms.Timer();
this.capNhat_X.Interval = 100;
this.capNhat_X.Enabled = true;
capNhat_X.Tick += new EventHandler(capNhat_X_Tick);
//cho nhan vat vao gua man hinh
this.viTri = new Point(Game.Window.ClientBounds.Width/2-kichthuoc/2,Game.Window.ClientBounds.Height/2-kichthuoc/2);
}

private void capNhat_X_Tick(object sender, EventArgs e)
{
//X chay tu 0->4
//cap nhat dong tac nhan vat
if (dangChay)
{
if (this.khungnhin.X < this.gioihan.X - 1)
{
this.khungnhin.X += 1;
}
else this.khungnhin.X = 0;
}
else this.khungnhin.X = 0;
}
public void LoadContent(ContentManager Content)
{
this.text = Content.Load<Texture2D>("man");
}
public void Update(ref Point toadomoi)
{
KeyboardState keys = Keyboard.GetState();
if (keys.IsKeyDown(Keys.Left))
{
//di chuyen tu phai qua trai
huongChuyenDong = HuongChuyenDong.PhaiQuaTrai;
DiChuyen(ref toadomoi);
return;
}
if (keys.IsKeyDown(Keys.Right))
{
//di chuyen tu trai qua phai
huongChuyenDong = HuongChuyenDong.TraiQuaPhai;
DiChuyen(ref toadomoi);
return;
}
if (keys.IsKeyDown(Keys.Up))
{
//di chuyen tu duoi len tren
huongChuyenDong = HuongChuyenDong.DuoiLenTren;
DiChuyen(ref toadomoi);
return;
}
if (keys.IsKeyDown(Keys.Down))
{
//di chuyen tu tren xuong
huongChuyenDong = HuongChuyenDong.TrenXuongDuoi;
DiChuyen(ref toadomoi);
return;
}
this.dangChay = false;
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(this.text, new Rectangle(this.viTri.X, this.viTri.Y,this.kichthuoc,this.kichthuoc), new Rectangle(this.khungnhin.X * this.kichthuoc, this.khungnhin.Y * this.kichthuoc,this.kichthuoc,this.kichthuoc), Color.White, 0, Vector2.Zero, SpriteEffects.None, 0);
}
private void DiChuyen(ref Point toadomoi)
{
this.dangChay = true;
//Y chay tu 0->3


//cap nhat huong chay
if (huongChuyenDong == HuongChuyenDong.DuoiLenTren)
{
//this.viTri.Y -= this.buocChay;
//toadomoi.Y += this.buocChay;
toadomoi = new Point(toadomoi.X, toadomoi.Y + 1);
this.khungnhin.Y = 0;
}
else if (huongChuyenDong == HuongChuyenDong.TrenXuongDuoi)
{
//this.viTri.Y += this.buocChay;
toadomoi = new Point(toadomoi.X, toadomoi.Y - 1);
this.khungnhin.Y = 2;
}
else if (huongChuyenDong == HuongChuyenDong.TraiQuaPhai)
{
//this.viTri.X += this.buocChay;
toadomoi = new Point(toadomoi.X-1, toadomoi.Y);
this.khungnhin.Y = 1;
}
else if (huongChuyenDong == HuongChuyenDong.PhaiQuaTrai)
{
//this.viTri.X -= this.buocChay;
toadomoi = new Point(toadomoi.X+1, toadomoi.Y);
this.khungnhin.Y = 3;
}
raNgoaiBanDo(ref toadomoi);

}
private void raNgoaiBanDo(ref Point toadomoi)
{
//int xMax = this.Game.Window.ClientBounds.Width;
//int yMax = this.Game.Window.ClientBounds.Height;
//if (viTri.X < 0) this.viTri.X += buocChay;
//if (viTri.X > xMax-kichthuoc) this.viTri.X -= buocChay;
//if (viTri.Y < 0) this.viTri.Y += buocChay;
//if (viTri.Y + buocChay > yMax-kichthuoc) this.viTri.Y -= buocChay;

//ra ngoai ban do bay gio thuc ra phai chech toa do cua map so voi nhan vat

Point map = new Point(1315,864);//kich thuoc cua nen
if (toadomoi.X > this.viTri.X) toadomoi.X -= buocChay;
if (toadomoi.Y > this.viTri.Y) toadomoi.Y -= buocChay;
if (toadomoi.X + map.X < this.viTri.X) toadomoi.X += buocChay;
if (toadomoi.Y + map.Y < this.viTri.Y) toadomoi.Y += buocChay;


}


}
}

game1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace chuyen_dong_nhan_vat
{

public class Game1 : Microsoft.Xna.Framework.Game
{
private GraphicsDeviceManager graphics;
private SpriteBatch spriteBatch;
private NhanVat nhanVat;
private Texture2D nen;
private Texture2D tree;
private SpriteFont font;
//
private Point toadomoi = new Point();
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
nhanVat = new NhanVat(this,this.toadomoi);
}

protected override void Initialize()
{

base.Initialize();
}


protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
this.nen = Content.Load<Texture2D>("nen");
this.tree = Content.Load<Texture2D>("tree");
this.font = Content.Load<SpriteFont>("font1");
this.nhanVat.LoadContent(this.Content);//load sprite cua nhan vat
}

protected override void UnloadContent()
{

}


protected override void Update(GameTime gameTime)
{

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
this.nhanVat.Update(ref toadomoi);//update chuyen dong nhan vat
base.Update(gameTime);
}


protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
spriteBatch.Begin();
spriteBatch.Draw(this.nen,new Vector2(toadomoi.X,toadomoi.Y),Color.White);

spriteBatch.DrawString(font, "Nhan vat :" + this.nhanVat.huongChuyenDong.ToString(), new Vector2(this.nhanVat.viTri.X - 20, this.nhanVat.viTri.Y - 25), Color.Red);
this.nhanVat.Draw(this.spriteBatch);//ve nhan vat len man hinh
//ve nhieu cay cung luc
spriteBatch.Draw(this.tree, new Vector2(toadomoi.X + 20, toadomoi.Y + 90), Color.White);
spriteBatch.Draw(this.tree, new Vector2(toadomoi.X + 100, toadomoi.Y + 530), Color.White);
spriteBatch.Draw(this.tree, new Vector2(toadomoi.X + 400, toadomoi.Y + 330), Color.White);
spriteBatch.Draw(this.tree, new Vector2(toadomoi.X + 50, toadomoi.Y + 200), Color.White);
spriteBatch.Draw(this.tree, new Vector2(toadomoi.X + 10, toadomoi.Y + 700), Color.White);
spriteBatch.Draw(this.tree, new Vector2(toadomoi.X + 400, toadomoi.Y + 430), Color.White);
spriteBatch.Draw(this.tree, new Vector2(toadomoi.X + 420, toadomoi.Y + 130), Color.White);
spriteBatch.Draw(this.tree, new Vector2(toadomoi.X + 300, toadomoi.Y + 10), Color.White);
//
spriteBatch.End();
base.Draw(gameTime);
}
}
}

kết quả :


làm 1 ứng dụng game đập nhện

Comments
  1. CongHits says:

    anh cho em hỏi có phải item ở đây gồm cả cái ảnh nền đám cỏ phải không.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s